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