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

    function [datarx, subsignal] = recCDMA(TimeSignal,procgain,seqnum,linktype,numusers,H3,i)
%RECCDMA Decodes a COFDM time waveform back into its data
%	Datarx = receive(TimeSignal,procgain,seqnum,wordsize)
%
%	INPUTS:
%	========
% 	TimeSignal : This is the input time signal for the COFDM waveform. The format
%		     of the output is a row vector.
%	procgain   : Process gain of the CDMA signal.
%	seqnum     : Sequence number of the pseudo random sequence used to spread the
%		     signal.
%	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:
%	========
%	Datarx     : This is the output data that has been decoded from the 'TimeSignal'
%	      	     Its format is in words the same size as 'wordsize'. Each row of 
%	      	     Datarx is the data from one symbol.
%
%	Copyright (c) Eric Lawrey 1997
%
%	See:	TRANSMIT, WRFILE, CHANNEL

%===================================
%	Required external functions:
%	(They just have to be in the same directory, or in the Matlab path)
%	walsh.m
%	genrand.m
%	subsamp.m


%======================
%	Modifications:
%	16/6/97	Started working on the function, it isn't finished yet.
%	17/6/97 Continued work on the receive function, it is now mostly finished
%		and has been partly tested.
%	18/6/97	Changed the way thay the DiffPhTx is generated, so that the phase out is based
%		on the phase locations. This was done so the phase error can be easily 
%		calculated. Negative phase errors centered around the 0deg phasor are no
%		longer 359.6 deg for example but -0.4 deg. Fixed a bug due to having 
%		guardtype = 0
%	6/7/97	Modified from the COFDM receive function to a CDMA receiver. Finished and tested
%	9/7/97	Modified to handle QPSK reception. The QPSK reception is not yet complete,
%		most of the code needs a work over so that is will handle the complex numbers
%		for QPSK.
%	10/7/97	Finished & tested the code, which 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	reccdma.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. Changed the demodulation of the received signal,
%		to averaging the signal (subsampling) the squaring it up (was the signal
%		bigger or smaller then zero).
if nargin <4,
	linktype = 0;	%Set the default link type to be the forward link
end

%=======================================================
% Generate the random sequence the transmitter used
%=======================================================
procgain = 2^(ceil(log(procgain)/log(2)));
if linktype == 0,
%=====================
%Simulate FORWARD LINK
%=====================
	W = walsh(procgain,'+-');
	W = W(seqnum,:);

	L = ceil(log(length(TimeSignal)/procgain)/log(2));	
				%Number of doublings of the walsh 
				%function to make it as long as the datatx
   for k3=1:procgain
       W(k3)=W(k3)*conj(H3(k3))/(abs(H3(k3))^2*numusers);
   end;
	randseq = W;
	for k = 1:L,
		randseq = [randseq randseq];
	end
	randseq = randseq(1:length(TimeSignal)); 	%clip the sequence back to the data length required
else
%=====================
%Simulate REVERSE LINK
%=====================
	seed = rand('seed');	%Save the random seed so it isn't modified
	rand('seed',seqnum*1321);	%Set the random based on the sequence number
	randseq = genrand(1,1,length(TimeSignal),'+-');	%generate the random seq to use
	rand('seed',seed);				%Restore the seed from before
	
end	

%=========================================================================
%Strip back the number of samples to make it a multiple of the symbol size
%=========================================================================
TimeSignal = TimeSignal(1:(length(TimeSignal)-rem(length(TimeSignal),procgain)));

DataSignal = TimeSignal.*randseq;

%===========================================================
% Decode the data by averaging the signal over a data symbol
%===========================================================
subsignal = subsamp(DataSignal,procgain);
datarx = ones(1,length(subsignal));	%initialize the received signal
index = find(subsignal<0);		%square up the received signal
datarx(index) = ones(1,length(index))*(-1);