www.gusucode.com > MC-CDMA系统的仿真matlab源码程序 > mc-cdma/ideal(AWGN信道)/mccdma0.m

    % 清除内存,计时开始 %多用户理想信道,先扩频后映射
clear 
tic;
%设置参数
totalwords=256;
numusers=4;
wordsize=2;
linktype=0;   %下行链路
%seqnum=3;     %1~64之间取值
ifftsize=256;
procgain=16;  %扩频码的长度
guardtime=32;
guardtype=2;
frameguard=ifftsize+guardtime;  % Guard Time between successive frames (one symbol period)
% 产生要发送的双极性二进制随机数
seed=1234;
rand('seed',seed);	                    	% Set to new seed
seqnumlist = randperm(procgain);
Datatx = zeros(numusers,totalwords);
basesignal0=zeros(1,totalwords*procgain);
for k = 1:numusers,
	Datatx(k,:) = genrand(1,1,totalwords,'+-');
    seqnum = seqnumlist(k);
%扩频
    basesignal_0=tranCDMA(Datatx(k,:),procgain,seqnum,linktype);
    basesignal0=basesignal0+basesignal_0; %各个用户的扩频信号进行合并
end
  basesignal=basesignal0+numusers;
%将十进制转换为2^wordsize进制,以备映射
B=dec2QOH(basesignal,numusers,wordsize);
%ofdm调制
NumCarr =ifftsize;	    %取得载波数
%=============
% 每载波要传输多少数据
%=============
numsymb = ceil(length(B)/NumCarr);
%numsymb = ceil(length(basesignal)/NumCarr);
%如果传输的数据不是载波的整数倍,则在后面补零
if length(B)/NumCarr ~= numsymb,
	DataPad = zeros(1,numsymb*NumCarr);
	DataPad(1:length(B)) = B;
	B = DataPad;
end
clear DataPad;

% Mapping to the signal constellation follow
mapping=get80216map(2^wordsize);
for i=1:length(B),
    ModSignal(i)=mapping(1+B(i));
end;
Xf=reshape(ModSignal,NumCarr,numsymb);
%Xf=reshape(basesignal,NumCarr,numsymb);	
%==================================
%Find the time waveform using IFFT
%==================================
BaseSignal = ifft(Xf);       %ifft是对列进行ifft变换。
%=================================
%Add a Guard Period
%=================================
BaseSignal=[BaseSignal((end-guardtime+1):end,:); BaseSignal];
BaseSignal = reshape(BaseSignal,1,size(BaseSignal,1)*size(BaseSignal,2));   %先取第一列,再取第二列,……

%===============
% CHANNEL MODEL
%===============
ber=[];
for SNR=0:1:10
RxSignal=awgn(BaseSignal,10^(SNR/10),'measured',1234,'linear');
%==================
% RECEIVER SECTION
%==================
% remove cyclic prefix
symbwaves=reshape(RxSignal,frameguard,numsymb);
symbwaves=symbwaves(guardtime+1:frameguard,:); % Strip off the guard interval
%fft变换
DemSig=fft(symbwaves);
DemSig=reshape(DemSig,1,size(DemSig,1)*size(DemSig,2));
%去映射
Datarx0=invmapping(DemSig,mapping,wordsize);
%解扩
%将2^wordsize进制二进制转换为十进制
Datarx=QOH2dec(Datarx0,numusers,wordsize);
datarx=[];
for k=1:numusers
    seqnum = seqnumlist(k);
[datarx0, subsignal] = recCDMA(Datarx,procgain,seqnum,linktype);
datarx=[datarx;datarx0];
end
errs=totalwords*numusers;
for i=1:totalwords*numusers,
    if Datatx(i)==datarx(i),
        errs=errs-1;
    end;
end;
ber=[ber,errs/(totalwords*numusers)]
end;

k=0:1:10
semilogy(k,ber,'-b*');
hold on
xlabel('SNR/dB'),ylabel('BER')
%legend('users=2','users=4')
grid on
axis([0 10 10^(-4) 1])
toc