www.gusucode.com > MC-CDMA系统的仿真matlab源码程序 > mc-cdma/sui3/1users/preambleLSQpsk1user.m
% 清除内存,计时开始 SUI3 信道 clear tic; %设置参数 totalwords=1920*5; numusers=1; wordsize=2; linktype=0; %下行链路 seqnum=3; %1~8之间取值 NumCarr=256; procgain=8; %扩频码的长度 guardtime=32; guardtype=2; delay=2; frameguard=NumCarr+guardtime; % Guard Time between successive frames (one symbol period) % 产生要发送的双极性二进制随机数 seed=1234; rand('seed',seed); % Set to new seed datatx = floor(rand(1,totalwords)*2); datatx = datatx-1; index = find(datatx>=0); datatx(index) = datatx(index)+1; %扩频 basesignal=trancdma(datatx,procgain,seqnum,linktype); index = find(basesignal<0); basesignal(index) = basesignal(index)+1; %符号转换,将双极性信号变为单极性信号 %将二进制转换为2×wordsize进制,以备映射 B=bin2high(basesignal,wordsize); %ofdm调制 %============= % 每载波要传输多少数据 %============= Numsymb = ceil(length(B)/192); %如果传输的数据不是载波的整数倍,则在后面补零 if length(B)/192 ~= Numsymb, DataPad = zeros(1,Numsymb*192); 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; %生成数据和导频图案 Pattern=ones(NumCarr,Numsymb+2); % the position of data is set as 1. Pattern(129,:)=0; % DC=0 Pattern([1:28,230:256],:)=0; % guard band=0 Pattern([45:24:213],:)=4;% the position of pilot is set as 4. Pattern(:,[1,2])=0; Data_Pattern=find(Pattern==1); %the pattern of data %生成数据矩阵 w=round(rand(1,Numsymb)); % generate Wk Data=zeros(size(Pattern)); for n=3:Numsymb Data([45,93,189,213],n)=1-2*w(n); % [-84,-36,60,84]=1-2W Data([69,117,141,165],n)=2*w(n)-1; % [-60,-12,12,36]=1-2W' end Data(Data_Pattern)=ModSignal; %插入用户数据 clear ModSignal; % 插入帧头 Data([29:229],1)=2*[1+j,0,0,0,1+j,0,0,0,1+j,0,0,0,1-j,0,0,0,-1+j,0,0,0,1+j,0,0,0,1+j,0,0,0,1+j,0,0,0,1-j,0,0,0,-1+j,0,0,0,1+j,0,0,0,1+j,0,0,0,1+j,0,0,0,1-j,0,0,0,-1+j,0,0,0,1-j,0,0,0,1-j,0,0,0,1-j,0,0,0,-1-j,0,0,0,1+j,... 0,0,0,-1+j,0,0,0,-1+j,0,0,0,-1+j,0,0,0,1+j,0,0,0,-1-j,0,0,0,0,0,0,0,-1-j,0,0,0,1-j,0,0,0,1+j,0,0,0,-1-j,0,0,0,-1+j,0,0,0,1-j,0,0,0,1+j,0,0,0,-1+j,0,0,0,1-j,0,0,0,-1-j,0,0,0,1+j,0,0,0,-1+j,0,0,0,-1-j,0,0,0,1+j,0,0,0,1-j,0,0,0,-1-j,0,0,0,1-j,0,0,0,1+j,0,0,0,-1-j,0,0,0,-1+j,0,0,0,-1+j,0,0,0,-1-j,0,0,0,1-j,0,0,0,-1+j,0,0,0,1+j]'; Data([29:229],2)=2*[1,0,-1,0,-1,0,-1,0,1,0,1,0,1,0,1,0,-1,0,1,0,-1,0,-1,0,-1,0,1,0,-1,0,1,0,1,0,1,0,1,0,-1,0,1,0,1,0,1,0,-1,0,1,0,-1,0,1,0,1,0,-1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,1,0,-1,0,1,0,1,0,-1,0,-1,0,-1,0,1,0,-1,0,-1,0,-1,0,-1,0,-1,0,1,0,1,0,0,0,1,0,-1,0,-1,0,1,0,-1,0,1,0,1,0,1,0,1,0,-1,0,1,0,1,0,1,0,1,0,-1,0,1,0,-1,0,-1,0,-1,0,-1,0,1,0,1,0,-1,0,1,0,-1,0,-1,0,-1,0,-1,0,-1,0,-1,0,-1,0,-1,0,1,0,1,0,1,0,-1,0,-1,0,-1,0,1,0,1,0,-1,0,-1,0,-1,0,1,0,-1,0,-1,0,1,0,-1,0,-1,0,-1]'; %================================== %Find the time waveform using IFFT %================================== BaseSignal = ifft(Data); %ifft是对列进行ifft变换。 %================================= %Add a Guard Period %================================= BaseSignal0=[BaseSignal((end-guardtime+1):end,:); BaseSignal]; BaseSignal = reshape(BaseSignal0,1,size(BaseSignal0,1)*size(BaseSignal0,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。 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*2)]; path12=[zeros(1,delay) path2 zeros(1,delay)]; path13=[zeros(1,delay*2) path3]; RxSignal0=path11+path12+path13; RxSignal0=RxSignal0(1:length(path1)); H_real=fft([fade(1) zeros(1,delay-1) fade(2) zeros(1,delay-1) fade(3)].',256); H_real= H_real([29:229]); H_real1=repmat(H_real,[1 Numsymb+2]); ber1=[]; ber2=[]; ber3=[]; berreal=[]; mse1=[]; mse2=[]; mse3=[]; for SNR=0:2:16 RxSignal=awgn(RxSignal0,10^(SNR/10),'measured',1234,'linear'); %================== % RECEIVER SECTION %================== % remove cyclic prefix symbwaves=reshape(RxSignal,frameguard,Numsymb+2); symbwaves = symbwaves(guardtime+1:frameguard,:); % Strip off the guard interval %fft变换 Yf=fft(symbwaves); %=======================================Estimation=============================================== %估计导频处的信道频域响应 H_Pilot1=Yf([29:4:125,133:4:229],1)./Data([29:4:125,133:4:229],1); H_Pilot2=Yf([29:2:127,131:2:229],2)./Data([29:2:127,131:2:229],2); x1=[1:4:97,105:4:201].'; y1=[1:201]'; H01=INTERP1(x1,H_Pilot1,y1,'linear'); % 帧头1估计值内插 x2=[1:2:99,103:2:201].'; H02=INTERP1(x2,H_Pilot2,y1,'linear'); % 帧头2估计值内插 % 两个帧头的平均 H03=(H01+H02)/2; H1=repmat(H01,[1 Numsymb+2]); H2=repmat(H02,[1 Numsymb+2]); H3=repmat(H03,[1 Numsymb+2]); mse1=[mse1,mse(abs(H_real-H01))] mse2=[mse2,mse(abs(H_real-H02))] mse3=[mse3,mse(abs(H_real-H03))] Rx1=Yf; Rx2=Yf; Rx3=Yf; Rxreal=Yf; Rx1([29:229],:)=Rx1([29:229],:)./H1; Rx2([29:229],:)=Rx2([29:229],:)./H2; Rx3([29:229],:)=Rx3([29:229],:)./H3; Rxreal([29:229],:)=Rxreal([29:229],:)./H_real1; DemSig1=Rx1(Data_Pattern); DemSig2=Rx2(Data_Pattern); DemSig3=Rx3(Data_Pattern); DemSigreal=Rxreal(Data_Pattern); DemSignal1=reshape(DemSig1,1,size(DemSig1,1)*size(DemSig1,2)); % complex signal to be de demapped 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)); %去掉映射 Datarx1=invmapping(DemSignal1,mapping,wordsize); Datarx2=invmapping(DemSignal2,mapping,wordsize); Datarx3=invmapping(DemSignal3,mapping,wordsize); Datarxreal=invmapping(DemSignalreal,mapping,wordsize); %将2^wordsize进制转换为二进制, Datarx10=high2bin(Datarx1); Datarx20=high2bin(Datarx2); Datarx30=high2bin(Datarx3); Datarxreal0=high2bin(Datarxreal); %解扩 [datarx1, subsignal1]=reccdma(Datarx10,procgain,seqnum,linktype); [datarx2, subsignal2]=reccdma(Datarx20,procgain,seqnum,linktype); [datarx3, subsignal3]=reccdma(Datarx30,procgain,seqnum,linktype); [datarxreal, subsignalreal] = reccdma(Datarxreal0,procgain,seqnum,linktype); %计算误码率 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:2:16 semilogy(k,ber1,'-rh') hold on semilogy(k,ber2,'-ro') semilogy(k,ber3,'-rx') semilogy(k,berreal,'-.b') grid on axis([0 16 10^(-4) 0.5]) xlabel('SNR/dB'),ylabel('BER') legend('帧头1','帧头2','平均','理想') set (gcf,'color',[1 1 1]) set(gca,'xtick',[0:2:16]) hold off subplot(1,2,2) k=0:2:16 semilogy(k,mse1,'-rh') hold on semilogy(k,mse2,'-ro') semilogy(k,mse3,'-rx') grid on axis([0 16 10^(-4) 1]) xlabel('SNR/dB'),ylabel('MSE') legend('帧头1','帧头2','平均') set (gcf,'color',[1 1 1]) set(gca,'xtick',[0:2:16]) hold off toc