www.gusucode.com > MC-CDMA系统的仿真matlab源码程序 > mc-cdma/sui3/trancdma.m

    function basesignal_0 = trancdma(datatx,procgain,seqnum,linktype)
%TRANCDMA Generates a CDMA waveform from an input data.
%	  basesignal_0 = tranCDMA(datatx,procgain,seqnum,wordsize,linktype)
%
%	  This function generates a CDMA time waveform based on the input parameters
%	  and the data given. The data is transmformed into a single frame CDMA signal. 
%	  This for comparsion with the simulation of a COFDM phone system.
%
%	  INPUTS:
%	  ========
%	  datatx     : Input data to transmit, in the format of a single row vector.
%	  procgain   : Process gain of the CDMA signal.
%	  seqnum     : Sequence number of the pseudo random sequence used to spread the
%		       signal.
%	  wordsize   : Optional, Determines whether to transmit using BPSK (1) or QPSK (2)
%		       (4) 16PSK, (8) 256PSK.
%	  linktype   : Sets whether to simulate the forward link, or the reverse link
%		       linktype = 0, forward link (using orthogonal Walsh codes)
%		       linktype = 1, reverse link (uncorrelated non-orthogonal codes)
%		       This is an optional parameter, with the default being
%		       the forward link.
%			
%	  OUTPUTS:
%	  ========
%	  BaseSignal_0 : This is the output time signal for the CDMA waveform. The format
%		       of the output is a row vector.
%	  
%	  Copyright (c) Eric Lawrey 1997
%
%	  See:	RECCDMA.

%===================================
%	Required external functions:
%	(They just have to be in the same directory, or in the Matlab path)
%	genrand.m
%	walsh.m
%
%	Modifications:
%	8/6/97	Redo of the previous simulation script. (based on distort.m)
%	15/6/97	Continuing work on this function, currently not finished
%	16/6/97 Continued work on function, it is now finished and works, but not all 
%		the features have been tested.
%		I have tested the windowing and the zeroed guard period. The code has also
%		been optimized a bit and runs ~10 times faster then it used to, plus
%		it can handle much bigger files (tested upto 87kbytes, wordsize=4), in 35sec
%		It appears to work as a function.
%		The function needs to be changed so that it does not read the file directly
%		but instead get the data as input.
%	17/6/97	Modified the function so that it does read the input file from within 
%		the transmit function. This is so that the file can be read else where
%		then split up into smaller frames, then processed by transmit.
%		Fixed up some logical errors in the program, and removed the output phase
%		variable as it can be easily calculated from the data being transmitted.
%	6/7/97	Modified from the COFDM transmit into a CDMA transmit. 
%		The function is finished and tested to work. The output time waveform is
%		a vector of 1,-1,1,-1,-1 etc
%	9/7/97	Modified it so that the function can generate QPSK data. So far it has been
%		written and appears to work, but has not been tested with the receiver yet.
%	10/7/97	Fixed bugs in the code so that it now works for any word size.
%	7/8/97	Added the link type parameter so that both the forward link and
%		reverse link can be simulated.
%	9/8/97	3:40pm	trancdma.m
%		MAJOR CHANGE. The simulations were giving BER twice what was expected
%		and the use of QPSK and phase modulation was not an appropriate
%		way to model the CDMA transmission, So I modifed all the functions
%		removing the variable word size, and changed it back to just
%		amplitude modulation. The reverse link generation was simplified.
if nargin < 4,
	linktype = 0;	%Set the default to use the forward link.
end


%Make sure procgain is a power of 2, so that it matches the length of the Walsh codes
procgain = 2^(ceil(log(procgain)/log(2)));

if linktype == 0,
%==========================
%Simulate the FORWARD LINK
%==========================

	W = walsh(procgain,'+-');		%Find all walsh codes
	W = W(seqnum,:);			%Select the walsh code to use,第seqnum行的数据 %W(1*16)

	L = ceil(log(length(datatx)+1)/log(2));	%Number of doublings of the walsh 
						%function to make it
						%as long as the datatx
	basesignal_0 = zeros(1,length(datatx)*procgain);
	for k = 1:length(datatx),
		mint = (k-1)*procgain+1;
		maxt = mint+procgain-1;
		basesignal_0(mint:maxt) = datatx(k)*W;%basesignal_0(1:16),(17:32),(33:...)...%用户数据与扩频码相乘
	end
else
%==========================
%Simulate the REVERSE LINK
%==========================
	signal = zerohold(datatx,procgain);%每个数据复制procgain个
	seed = rand('seed');			%save the previous seed
	rand('seed',seqnum*1321);		%make the random seq based on the seqnum
	prs = genrand(1,1,length(signal),'+-');	%generate the random seq to use,length(signal)=1920*16
	rand('seed', seed);			%restore the previous seed
	basesignal_0 = prs.*signal;
end