www.gusucode.com > MC-CDMA系统的仿真matlab源码程序 > mc-cdma/rayleigh(移动信道)/poly_wenxian.m
% 清除内存,计时开始 6径Rayleigh信道,导频数不能取太小,取20效果较好 clear tic; %设置参数 order=3; MAXSIZE=8; totalwords=90; numusers=4; wordsize=2; linktype=0; %下行链路 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,:)=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的扩频码 %扩频 basesignal_0=tranCDMA(Datatx1,procgain,seqnum,linktype); basesignal0=basesignal0+basesignal_0; %各个用户的扩频信号进行合并 end %ofdm调制 NumCarr =180; %数据载波数 %============= % 每载波要传输多少数据 %============= Numsymb = ceil(length(basesignal0)/NumCarr); %如果传输的数据不是数据载波的整数倍,则在后面补零 if length(basesignal0)/NumCarr ~= Numsymb, DataPad = zeros(1,Numsymb*NumCarr); DataPad(1:length(basesignal0)) = basesignal0; basesignal0 = DataPad; end clear DataPad; %PilotIndex=[45 69 93 117 141 165 189 213]; % pilot interval=24 %生成数据和导频图案 Pilot_number=20; Pattern=ones(ifftsize,Numsymb); % the position of data is set as 1. Pattern(129,:)=0; % DC=0 Pattern([1:28,230:256],:)=0; % guard band=0 Pattern([34:10:224],:)=4; % the position of pilot is set as 4. PilotIndex=find(Pattern==4); % the pattern of pilot DataIndex=find(Pattern==1); %the pattern of data %生成导频数据 pilotini=randsrc(length(PilotIndex),1,[1 -1;0.5 0.5])*sqrt(2); %生成数据矩阵 Data=zeros(size(Pattern)); Data(PilotIndex)=pilotini; Data(DataIndex)=basesignal0; %================================== %Find the time waveform using IFFT %================================== BaseSignal = ifft(Data); %ifft是对列进行ifft变换。 %将后guardtime拷贝,作为循环前缀,即:L=guardtime,N=EndSignal。 BaseSignal=[BaseSignal((end-guardtime+1):end,:); BaseSignal]; %BaseSignal = reshape(BaseSignal,1,size(BaseSignal,1)*size(BaseSignal,2)) %先取第一列,再取第二列,…… %=============== % CHANNEL MODEL %=============== %fc=3.5e9; %V=75; %V km/h fdmax=200;%V*fc/3e8/3.6 %fmax=V*fc/C % channel have delay fade=Rayleigh(fdmax); % fade=Rayleigh_CH2(fdmax); path1=ones(frameguard,1)*fade(1,[1+5000:Numsymb+5000]).*BaseSignal; path2=ones(frameguard,1)*fade(2,[1+5000:Numsymb+5000]).*BaseSignal; path3=ones(frameguard,1)*fade(3,[1+5000:Numsymb+5000]).*BaseSignal; path4=ones(frameguard,1)*fade(4,[1+5000:Numsymb+5000]).*BaseSignal; path5=ones(frameguard,1)*fade(5,[1+5000:Numsymb+5000]).*BaseSignal; path6=ones(frameguard,1)*fade(6,[1+5000:Numsymb+5000]).*BaseSignal; path01=reshape(path1,1,size(path1,1)*size(path1,2)); path02=reshape(path2,1,size(path2,1)*size(path2,2)); path03=reshape(path3,1,size(path3,1)*size(path3,2)); path04=reshape(path4,1,size(path4,1)*size(path4,2)); path05=reshape(path5,1,size(path5,1)*size(path5,2)); path06=reshape(path6,1,size(path6,1)*size(path6,2)); %the delay is [0 0.31 0.71 1.09 1.73 2.51] us path11=[path01 zeros(1,10)]; % the largest delay is 10 sample path12=[zeros(1,1) path02 zeros(1,9)]; path13=[zeros(1,3) path03 zeros(1,7) ]; path14=[zeros(1,4) path04 zeros(1,6)]; path15=[zeros(1,7) path05 zeros(1,3)]; path16=[zeros(1,10) path06]; RxSignal0=path11+path12+path13+path14+path15+path16; RxSignal0=RxSignal0(1:length(path01)); H_real=zeros(ifftsize,Numsymb); % the real channel impulse response for k=1:ifftsize H_real(k,:)=H_real(k,:)+fade(1,[1+5000:Numsymb+5000])*exp(-j*2*pi*(k-1)*0/ifftsize)+fade(2,[1+5000:Numsymb+5000])*exp(-j*2*pi*(k-1)*1/ifftsize)+... fade(3,[1+5000:Numsymb+5000])*exp(-j*2*pi*(k-1)*3/ifftsize)+fade(4,[1+5000:Numsymb+5000])*exp(-j*2*pi*(k-1)*4/ifftsize)+... fade(5,[1+5000:Numsymb+5000])*exp(-j*2*pi*(k-1)*7/ifftsize)+fade(6,[1+5000:Numsymb+5000])*exp(-j*2*pi*(k-1)*10/ifftsize); end; H_real1= H_real([29:229],:); H_real2=H_real(PilotIndex); h_real=ifft(H_real2); h_real=reshape(h_real,Pilot_number,Numsymb); ber1=[]; ber2=[]; ber3=[]; berreal=[]; mse1=[]; mse2=[]; mse3=[]; for SNR=0:5:30 RxSignal=awgn(RxSignal0,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变换 Yf=fft(symbwaves); %=======================================Estimation=============================================== %提取导频数据 Rec_Pilot=Yf(PilotIndex); %估计导频处的信道频域响应 H_Pilot=Rec_Pilot./pilotini; H_Pilot=reshape(H_Pilot,Pilot_number,Numsymb);%20*1600 X=6:10:196; XI=1:201; H_ls=INTERP1(X,H_Pilot,XI,'linear','extrap');%201*1600 h_ls=ifft(H_Pilot); h_p=h_ls;%20*1600 h_p1=abs(h_p).^2; Pw=(sum(h_p1'))'/Numsymb;%20*1 [A1,I1]=sort(Pw); h_p(I1(1:Pilot_number-MAXSIZE),:)=0;%h_MST h_MST=h_p; H_MST=fft(h_p,201); %h_MST=ifft(H_MST); C=h_p(I1(Pilot_number-MAXSIZE+1:Pilot_number),:);%6*1600 B=ones(order+1,Numsymb); B(2,:)=(0:Numsymb-1); if order>1 for kk=2:order B(kk+1,:)=B(2,:).^kk; end end A=C*B'*inv(B*B'); for ii=0:Numsymb-1 for jj=1:size(A,1) switch order case 1 h_poly(I1((Pilot_number-MAXSIZE+1)+(jj-1)),ii+1)=A(jj,2)*(ii^1)+A(jj,1); case 2 h_poly(I1((Pilot_number-MAXSIZE+1)+(jj-1)),ii+1)=A(jj,3)*(ii^2)+A(jj,2)*(ii^1)+A(jj,1); case 3 h_poly(I1((Pilot_number-MAXSIZE+1)+(jj-1)),ii+1)=A(jj,4)*(ii^3)+A(jj,3)*(ii^2)+A(jj,2)*(ii^1)+A(jj,1); case 4 h_poly(I1((Pilot_number-MAXSIZE+1)+(jj-1)),ii+1)=A(jj,5)*(ii^4)+A(jj,4)*(ii^3)+A(jj,3)*(ii^2)+A(jj,2)*(ii^1)+A(jj,1); end end end h_poly(I1(1:Pilot_number-MAXSIZE),:)=0; H_poly=fft(h_poly,201); %h_poly=ifft(H_poly); mse1=[mse1,mse(abs(h_real-h_ls))]; mse2=[mse2,mse(abs(h_real-h_poly))]; mse3=[mse3,mse(abs(h_real-h_MST))]; Rx1=Yf; Rx2=Yf; Rx3=Yf; Rxreal=Yf; Rx1([29:229],:)=Rx1([29:229],:)./H_ls.*abs(H_ls); Rx2([29:229],:)=Rx2([29:229],:)./H_poly.*abs(H_poly);%最大合并比,×第i个子载波处的随机幅度 Rx3([29:229],:)=Rx3([29:229],:)./H_MST.*abs(H_MST); Rxreal([29:229],:)=Rxreal([29:229],:)./H_real1.*abs(H_real1); % extract data DemSig1=Rx1(DataIndex); DemSig2=Rx2(DataIndex); DemSig3=Rx3(DataIndex); DemSigreal=Rxreal(DataIndex); DemSignal1=reshape(DemSig1,1,size(DemSig1,1)*size(DemSig1,2)); DemSignal2=reshape(DemSig2,1,size(DemSig2,1)*size(DemSig2,2)); DemSignal3=reshape(DemSig3,1,size(DemSig3,1)*size(DemSig3,2)); DemSignalreal=reshape(DemSigreal,1,size(DemSigreal,1)*size(DemSigreal,2));%理想估计值 %解扩 subsignal1=[]; subsignal2=[]; subsignal3=[]; subsignalreal=[]; for k=1:numusers seqnum = seqnumlist(k); [data1,subsignal10]=recCDMA(DemSignal1,procgain,seqnum,linktype); subsignal1=[subsignal1;subsignal10]; [data2,subsignal20]=recCDMA(DemSignal2,procgain,seqnum,linktype); subsignal2=[subsignal2;subsignal20]; [data3,subsignal30]=recCDMA(DemSignal3,procgain,seqnum,linktype); subsignal3=[subsignal3;subsignal30]; [datareal0,subsignalreal0]=recCDMA(DemSignalreal,procgain,seqnum,linktype); subsignalreal=[subsignalreal;subsignalreal0]; end %去掉映射 Datarx1=invmapping(subsignal1,mapping,wordsize); Datarx2=invmapping(subsignal2,mapping,wordsize); Datarx3=invmapping(subsignal3,mapping,wordsize); Datarxreal=invmapping(subsignalreal,mapping,wordsize); %计算误码率 ber10=err(Datatx,Datarx1,totalwords,numusers); ber20=err(Datatx,Datarx2,totalwords,numusers); ber30=err(Datatx,Datarx3,totalwords,numusers); berreal0=err(Datatx,Datarxreal,totalwords,numusers); ber1=[ber1,ber10]; ber2=[ber2,ber20]; ber3=[ber3,ber30]; berreal=[berreal,berreal0]; end figure subplot(1,2,1) k=0:5:30 semilogy(k,ber1,'-b*') grid on hold on semilogy(k,ber2,'-bo') semilogy(k,ber3,'-rx') semilogy(k,berreal,'-.r') axis([0 30 10^(-4) 1]) xlabel('SNR/dB'),ylabel('BER') legend('LS','多项式','MST','理想') set (gcf,'color',[1 1 1]) subplot(1,2,2) k=0:5:30 semilogy(k,mse1,'-b*') grid on hold on semilogy(k,mse2,'-bo') semilogy(k,mse3,'-rx') axis([0 30 10^(-4) 1]) xlabel('SNR/dB'),ylabel('MSE') legend('LS','多项式','MST') toc