www.gusucode.com > MC-CDMA系统的仿真matlab源码程序 > mc-cdma/blind/NOCP.m
% 清除内存,计时开始 SUI3 信道,先映射后扩频 clear tic; %设置参数 totalwords=20; numusers=4; wordsize=2; linktype=0; %上行链路 NumCarr=16; procgain=16; %扩频码的长度 frameguard=NumCarr; % Guard Time between successive frames (one symbol period) % 产生要发送的双极性二进制随机数 seed=1234; rand('seed',seed); % Set to new seed seqnumlist = randperm(procgain); Datatx = zeros(numusers,totalwords); H_real=zeros(NumCarr,numusers); Rxx=[]; for k = 1:numusers Datatx(k,:)=floor(rand(1,totalwords)*2^wordsize);%产生2^wordsize进制发送数据 %进行映射 mapping=get80216map(2^wordsize); B=Datatx(k,:); for i=1:length(B) Datatx1(i)=mapping(1+B(i)); end; seqnum=seqnumlist(k);%取得用户k的扩频码 %扩频 basesignal0=tranCDMA(Datatx1,procgain,seqnum,linktype); Data=reshape(basesignal0,NumCarr,length(basesignal0)/NumCarr); %Find the time waveform using IFFT BaseSig = ifft(Data); %ifft是对列进行ifft变换。 BaseSignal = reshape(BaseSig,1,size(BaseSig,1)*size(BaseSig,2)); %先取第一列,再取第二列,…… %=============== % CHANNEL MODEL, channel have delay %=============== % generate channel parameter which is unknown to receiver % 抽样频率f=4MHz,周期0.25us,信道延迟Delay=[0 0.4 0.9]us,故延迟的抽样为 % 0.4/0.25=1.6,0.9/0.25=3.6,即2和4。 Delay1=[0 0.4+0.1*(k-1) 0.9+0.4*(k-1)]; Delay(k,:)=round(Delay1/0.25); P = [0 -5 -10]; %db P = 10.^(P/10); % calculate linear power K=[1 0 0]; s2=P./(K+1); m2=P.*(K./(K+1)); fade1=sqrt(s2)*sqrt(1/2)*(1+j); fade2=m2; fade=fade1+fade2; path1=BaseSignal*fade(1); path2=BaseSignal*fade(2); path3=BaseSignal*fade(3); path11=[path1 zeros(1,Delay(k,3))]; path12=[zeros(1,Delay(k,2)) path2 zeros(1,Delay(k,3)-Delay(k,2))]; path13=[zeros(1,Delay(k,3)) path3]; RxSignal0=path11+path12+path13; Rxx(k,:)=RxSignal0(1:length(path1)); h_real(:,k)=[fade(1) zeros(1,Delay(k,2)-1) fade(2) zeros(1,Delay(k,3)-Delay(k,2)-1) fade(3)].'; H_real(:,k)=fft([fade(1) zeros(1,Delay(k,2)-1) fade(2) zeros(1,Delay(k,3)-Delay(k,2)-1) fade(3)].',NumCarr); end BER1=zeros(1,7); BER2=zeros(1,7); BER3=zeros(1,7); BERreal=zeros(1,7); MSE1=zeros(1,7); MSE2=zeros(1,7); MSE3=zeros(1,7); for kk=1:numusers ber1=[]; ber2=[]; ber3=[]; berreal=[]; mse1=[]; mse2=[]; mse3=[]; for SNR=0:5:30 RxSignal=zeros(1,size(Rxx,2)); for k=1:numusers RxSignal=RxSignal+awgn(Rxx(k,:),10^(SNR/10),'measured',1234,'linear'); end; %================== % RECEIVER SECTION %================== % remove cyclic prefix Rec=reshape(RxSignal,NumCarr,length(RxSignal)/NumCarr); %=======================================Estimation=============================================== C = walsh(procgain,'+-'); %Find all walsh codes CC=ifft(C).';%时域扩频码 seqnum=seqnumlist(kk);%取得用户k的扩频码 LL=C(seqnum,:) Lch=Delay(kk,3); for i=1:(Lch+1) Ckk(:,i)=[zeros(1,i-1) LL zeros(1,Lch-(i-1))].'; end; Ckk0=Ckk(Lch+1:procgain,:); XX=Rec(Lch+1:NumCarr,:); [U,S,V]=svd(XX); minnum=procgain-Lch-numusers; Snum=min(size(S,1),size(S,2)); UN=U( :,(Snum-minnum+1):Snum); ??hk=inv(UN'*Ckk0); %计算MSE mse1=[mse1,mse(abs(hk-h_real(:,kk)))] %fft变换 Yf=fft(Rec); HH1=fft(hk,NumCarr); H1=repmat(HH1,[1 length(RxSignal)/NumCarr]); Hmse=H_real(:,kk); H_real11=repmat(H_real(:,kk),[1 length(RxSignal)/NumCarr]); Rx1=Yf./H1.*abs(H1); Rxreal=Yf./H_real11.*abs(H_real11); DemSig1=Rx1(Data_Pattern); DemSigreal=Rxreal(Data_Pattern); DemSignal1=reshape(DemSig1,1,size(DemSig1,1)*size(DemSig1,2)); %帧头1估计值 DemSignalreal=reshape(DemSigreal,1,size(DemSigreal,1)*size(DemSigreal,2));%理想估计值 %解扩 seqnum = seqnumlist(kk); [data10,subsignal1]=recCDMA(DemSignal1,procgain,seqnum,linktype); [datareal0,subsignalreal]=recCDMA(DemSignalreal,procgain,seqnum,linktype); %去掉映射 Datarx1=invmapping(subsignal1,mapping,wordsize); Datarxreal=invmapping(subsignalreal,mapping,wordsize); %计算误码率 ber10=erruplink(Datatx(kk,:),Datarx1,totalwords); berreal0=erruplink(Datatx(kk,:),Datarxreal,totalwords); ber1=[ber1,ber10]; berreal=[berreal,berreal0]; end; BER1=BER1+ber1; BERreal=BERreal+berreal; MSE1=MSE1+mse1; end; BER1=BER1./(numusers*totalwords) BERreal=BERreal./(numusers*totalwords) MSE1=MSE1/numusers figure subplot(2,2,1) k=0:5:30 semilogy(k,BER1,'-rh') hold on semilogy(k,BER2,'-ro') semilogy(k,BER3,'-rx') semilogy(k,BERreal,'-.b') grid on axis([0 30 10^(-4) 1]) xlabel('SNR/dB'),ylabel('BER') legend('帧头1','帧头2','平均','理想') set(gcf,'color',[1 1 1]) set(gca,'xtick',[0:5:30]) subplot(2,2,2) k=0:5:30 semilogy(k,MSE1,'-rh') hold on semilogy(k,MSE2,'-ro') semilogy(k,MSE3,'-rx') grid on axis([0 30 10^(-4) 1]) xlabel('SNR/dB'),ylabel('MSE') legend('帧头1','帧头2','平均') set (gcf,'color',[1 1 1]) set(gca,'xtick',[0:5:30]) hold off toc