www.gusucode.com > MC-CDMA系统的仿真matlab源码程序 > mc-cdma/rayleigh(移动信道)/preamble.m
% 清除内存,计时开始 5径瑞利信道 %jakes clear tic; %设置参数 totalframe=1; %帧长 totalwords=totalframe*100*12;%每帧60个数据符号,每个符号里12个用户数据 %numsymb=totalframe*64;%每帧共64个符号,4个导频符号,60个数据符号 numusers=1; wordsize=2; linktype=0; %上行链路 NumCarr=256; procgain=16; %扩频码的长度 guardtime=64; guardtype=2; frameguard=NumCarr+guardtime; % Guard Time between successive frames (one symbol period) Fc = 900e+06; % carrier frequency (Hz) --> ISM band wc = 2*pi*Fc; % carrier frequency (rad/sec) V = 3000/3600; % mobile speed (= 3 Km/hr) in m/sec N0 = 24; % The number of paths lambda = 3e+08/Fc; % wavelength at Fc Fm = V/lambda % Doppler shift Fs = 8*Fm; % sampling frequency M = 10000; % number of samples paths = 16; Ts = 1/Fs; % sampling period t = [0:Ts:(M-1)*Ts]; % time array fading = jakes(Fm,Fs,M,N0,paths); % 产生要发送的双极性二进制随机数 seed=1234; rand('seed',seed); % Set to new seed seqnumlist = randperm(procgain); Datatx = zeros(numusers,totalwords); RxSignal0=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); % 插入帧头 w1=floor(rand(256,4)*4); %第一个用户的4个帧头 for i=1:(size(w1,1)*size(w1,2)) w1(i)=mapping(1+w1(i)); end; pm=zeros(256,4); %4个用户,每列一个用户的导频 for m=1:NumCarr pm(m,:)=w1(m,:)*exp(-j*2*pi*(k-1)*guardtime*(m-1)/NumCarr); end; pm(:,2)=pm(:,2)*sqrt(2); pm(:,4)=pm(:,4)*2; numsymb = ceil(length(basesignal_0)/200); %如果传输的数据不是数据载波的整数倍,则在后面补零 if length(basesignal_0)/200 ~= numsymb, DataPad = zeros(1,numsymb*200); DataPad(1:length(basesignal_0)) = basesignal_0; basesignal_0 = DataPad; end clear DataPad; %ofdm调制 %============= % 每载波要传输多少数据 %============= %生成数据和导频图案 numsymb=numsymb+4*totalframe; Pattern=ones(NumCarr,numsymb); % the position of data is set as 1. Pattern(129,:)=0; % DC=0 Pattern([1:28,230:256],:)=0; % guard band=0 Pattern(:,[1:4])=0; Data_Pattern=find(Pattern==1); %the pattern of data Data=zeros(size(Pattern)); Data(Data_Pattern)=basesignal_0; %插入用户数据 Data(:,1)=pm(:,1); Data(:,2)=pm(:,2); Data(:,3)=pm(:,3); Data(:,4)=pm(:,4); %================================== %Find the time waveform using IFFT %================================== BaseSignal = ifft(Data); %ifft是对列进行ifft变换。 %================================= %Add a Guard Period %================================= BaseSignal=[BaseSignal((end-guardtime+1):end,:); BaseSignal]; %BaseSignal = reshape(BaseSignal0,1,size(BaseSignal0,1)*size(BaseSignal0,2)); %先取第一列,再取第二列,…… %=============== % CHANNEL MODEL, channel have delay %=============== fc=3.5e9; V=5; %V km/h fdmax=V*fc/3e8/3.6 %fmax=V*fc/C fade=Rayleigh(fdmax); path1=ones(frameguard,1)*fade(1,[1+1000:numsymb+1000]).*BaseSignal; path2=ones(frameguard,1)*fade(2,[1+1000:numsymb+1000]).*BaseSignal; path3=ones(frameguard,1)*fade(3,[1+1000:numsymb+1000]).*BaseSignal; path4=ones(frameguard,1)*fade(4,[1+1000:numsymb+1000]).*BaseSignal; path5=ones(frameguard,1)*fade(5,[1+1000:numsymb+1000]).*BaseSignal; path6=ones(frameguard,1)*fade(6,[1+1000:numsymb+1000]).*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] us,[0 2 3 5 7]; % time delay spread(in sample) of each path 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]; RxSignal00=path11+path12+path13+path14+path15+path16; RxSignal1=RxSignal00(1:length(path01)); RxSignal0=RxSignal1+RxSignal0; end; H_real=zeros(NumCarr,numsymb); % the real channel impulse response for k=1:NumCarr H_real(k,:)=H_real(k,:)+fade(1,[1+1000:numsymb+1000])*exp(-j*2*pi*(k-1)*0/NumCarr)+fade(2,[1+1000:numsymb+1000])*exp(-j*2*pi*(k-1)*1/NumCarr)+... fade(3,[1+1000:numsymb+1000])*exp(-j*2*pi*(k-1)*3/NumCarr)+fade(4,[1+1000:numsymb+1000])*exp(-j*2*pi*(k-1)*4/NumCarr)+... fade(5,[1+1000:numsymb+1000])*exp(-j*2*pi*(k-1)*7/NumCarr)+fade(6,[1+1000:numsymb+1000])*exp(-j*2*pi*(k-1)*10/NumCarr); end 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=============================================== PL=repmat(pm(:,2),1,numsymb); Htotal=Yf./PL; htotal=ifft(Htotal); hl=htotal; HL=fft(hl); mse1=[mse1,mse(abs(H_real-HL))] Rx1=Yf; Rxreal=Yf; Rx1=Rx1./HL; Rxreal=Rxreal./H_real; 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));%理想估计值 %解扩 subsignal1=[]; subsignalreal=[]; for k=1:numusers seqnum = seqnumlist(k); [data10,subsignal10]=recCDMA(DemSignal1,procgain,seqnum,linktype); subsignal1=[subsignal1;subsignal10]; [datareal0,subsignalreal0]=recCDMA(DemSignalreal,procgain,seqnum,linktype); subsignalreal=[subsignalreal;subsignalreal0]; end %去掉映射 Datarx1=invmapping(subsignal1,mapping,wordsize); Datarxreal=invmapping(subsignalreal,mapping,wordsize); %计算误码率 ber10=err(Datatx,Datarx1,totalwords,numusers); berreal0=err(Datatx,Datarxreal,totalwords,numusers) ber1=[ber1,ber10] berreal=[berreal,berreal0] end; figure subplot(2,2,1) k=0:5:30 semilogy(k,ber1,'-rh') hold on semilogy(k,berreal,'-.b') grid on axis([0 30 10^(-3) 1]) xlabel('SNR/dB'),ylabel('BER') legend('用户1','理想') set (gcf,'color',[1 1 1]) set(gca,'xtick',[0:5:30]) subplot(2,2,2) k=0:5:30 semilogy(k,mse1,'-rh') grid on axis([0 30 10^(-3) 1]) xlabel('SNR/dB'),ylabel('MSE') set (gcf,'color',[1 1 1]) set(gca,'xtick',[0:5:30]) toc