www.gusucode.com > MC-CDMA系统的仿真matlab源码程序 > mc-cdma/blind/blindhhH.m
% 清除内存,计时开始 多用户,盲估计,hhH clear tic; %设置参数 totalwords=2000; numusers=4; linktype=1; %上行链路 ifftsize=64; procgain=64; %扩频码的长度 guardtime=16; delay=3; frameguard=ifftsize+guardtime; % Guard Time between successive frames (one symbol period) % 产生要发送的双极性二进制随机数 seed=1234; rand('seed',seed); seqnumlist = randperm(procgain); Datatx = zeros(numusers,totalwords); RxSignal3=zeros(1,totalwords*frameguard); for k = 1:numusers, Datatx(k,:) = genrand(1,1,totalwords,'+-'); %产生发送数据 seqnum = seqnumlist(k); basesignal=tranCDMA(Datatx(k,:),procgain,seqnum,linktype);%扩频 %ofdm调制 NumCarr =ifftsize; %取得载波数 %============= % 每载波要传输多少数据 %============= numsymb = ceil(length(basesignal)/NumCarr); %如果传输的数据不是载波的整数倍,则在后面补零 if length(basesignal)/NumCarr ~= numsymb, DataPad = zeros(1,numsymb*NumCarr); DataPad(1:length(basesignal)) = basesignal; basesignal = DataPad; end clear DataPad; %生成数据 %Data=ones(ifftsize,numsymb); % the position of data is set as 1. %Data(129,:)=0; % DC=0 %Data([1:28,230:256],:)=0; % guard band=0 %DataIndex=find(Data==1); %Data(DataIndex)=ModSignal; %================================== %Find the time waveform using IFFT %================================== Data=reshape(basesignal,ifftsize,length(basesignal)/ifftsize); BaseSignal0 = ifft(Data); %ifft是对列进行ifft变换。 %================================= %Add a Guard Period %================================= %将后guardtime拷贝,作为循环前缀,即:L=guardtime,N=EndSignal。 BaseSignal=[BaseSignal0((end-guardtime+1):end,:); BaseSignal0]; BaseSignal = reshape(BaseSignal,1,size(BaseSignal,1)*size(BaseSignal,2)); %先取第一列,再取第二列,…… %=============== % CHANNEL MODEL, channel have delay %=============== % generate channel parameter which is unknown to receiver % 抽样频率f=4MHz,周期0.25us,信道延迟Delay=[0 0.4 0.9 1.4]us,故延迟的抽样为 % 0.4/0.25=1.6,0.9/0.25=3.6,即2和4。 P = [0 -5 -10 -20]; %db P = 10.^(P/10); % calculate linear power K=[1 1 1 1]; s2=P./(K+1); m2=P.*(K./(K+1)); fade1=sqrt(s2)*sqrt(1/2)*(1+j)*0.503; fade2=m2*0.5; fade=fade1+fade2; %fade=(rand(1,4).*(1+j)+rand(1,4)*0.025)*0.25; path1=BaseSignal*fade(1); path2=BaseSignal*fade(2); path3=BaseSignal*fade(3); path4=BaseSignal*fade(4); path11=[path1 zeros(1,delay*3)]; path12=[zeros(1,delay) path2 zeros(1,delay*2)] ; path13=[zeros(1,delay*2) path3 zeros(1,delay)]; path14=[zeros(1,delay*3) path4]; RxSignal0=path11+path12+path13+path14; RxSignal0=RxSignal0(1:length(path1)); RxSignal3=RxSignal3+RxSignal0; end; %H_real1=fft([fade(1) zeros(1,delay-1) fade(2) zeros(1,delay-1) fade(3)].',ifftsize); %H_real= H_real([29:229]); h_real=[fade(1) zeros(1,delay-1) fade(2) zeros(1,delay-1) fade(3) zeros(1,delay-1) fade(4) ].'; H_real1=fft(h_real,ifftsize); H_real=repmat(H_real1,[1 numsymb]); %================== % RECEIVER SECTION %================== ber=[]; ber1=[]; ber2=[]; berreal=[]; mse0=[]; mse1=[]; mse2=[]; for SNR=0:2:20 RxSignal2=awgn(RxSignal3,10^(SNR/10),'measured',1234,'linear'); % remove cyclic prefix symbwaves=reshape(RxSignal2,frameguard,numsymb); symbwaves=symbwaves(guardtime+1:frameguard,:); % Strip off the guard interval %fft变换 x=fft(symbwaves); DemSig01=reshape(x,1,size(x,1)*size(x,2)); %解扩 seqnum = seqnumlist(1);%接收第一个用户的数据 datarx1 = recCDMA1(DemSig01,procgain,seqnum,linktype); %估计 K=length(datarx1)/ifftsize; y=reshape(datarx1,ifftsize,K); Rxx=zeros(ifftsize,ifftsize); Ryy=zeros(ifftsize,ifftsize); for k=1:K, Rxx=Rxx+x(:,k)*x(:,k)'; Ryy=Ryy+y(:,k)*y(:,k)'; end; Rxx=Rxx/K; Ryy=Ryy/K; R1=Ryy-Rxx; %R(1,1)=R(ifftsize,1); for k1=2:size(R1,1), R1(k1,k1)=abs(R1(k1-1,k1)); end; C=ones(ifftsize,1); Rc=R1*C; H10=Rc/sqrt(abs(Rc.'*C)); h01=ifft(H10); L=delay*3+1; h1=zeros(ifftsize,1); h1(1:L,1)=h01(1:L,1); H1=fft(h1,ifftsize); H1=repmat(H1,[1 numsymb]); esterr=h1(1:L,1)-h_real; % estimation error mse1=[mse1,mse(abs(esterr))] % Mean Square Error of estimation DemSig1=x./H1; DemSig1=reshape(DemSig1,1,size(DemSig1,1)*size(DemSig1,2)); datarx1 = recCDMA(DemSig1,procgain,seqnum,linktype);%接收第一个用户的数据 ber10=err(Datatx(1,:),datarx1,totalwords,1); ber1=[ber1,ber10] Rc2=Ryy*C; H20=Rc2/sqrt(abs(Rc2.'*C)); h02=ifft(H20); h2=zeros(ifftsize,1); h2(1:L,1)=h02(1:L,1); H2=fft(h2,ifftsize); H2=repmat(H2,[1 numsymb]); esterr=h2(1:L,1)-h_real; % estimation error mse2=[mse2,mse(abs(esterr))] % Mean Square Error of estimation DemSig2=x./H2; DemSig2=reshape(DemSig2,1,size(DemSig2,1)*size(DemSig2,2)); datarx2 = recCDMA(DemSig2,procgain,seqnum,linktype);%接收第一个用户的数据 ber20=err(Datatx(1,:),datarx2,totalwords,1); ber2=[ber2,ber20] F=dftmtx(ifftsize); L=delay*3+1; WL=F(:,1:L); hhH=WL'*R1*WL; [V,D]=eig(hhH); h_estimation=V(:,1); esterr=h_real-h_estimation; % estimation error mse0=[mse0,mse(abs(esterr))] % Mean Square Error of estimation H3=WL*h_estimation; H3=repmat(H3,[1 numsymb]); %DemSig1=DemSig0([29:229],:); DemSig=x./H3; DemSig=reshape(DemSig,1,size(DemSig,1)*size(DemSig,2)); DemSigreal=x./H_real; DemSigreal=reshape(DemSigreal,1,size(DemSigreal,1)*size(DemSigreal,2)); %解扩 datarx = recCDMA(DemSig,procgain,seqnum,linktype);%接收第一个用户的数据 datarxreal = recCDMA(DemSigreal,procgain,seqnum,linktype); %计算误码率 ber0=err(Datatx(1,:),datarx,totalwords,1); ber=[ber,ber0] berreal0=err(Datatx(1,:),datarxreal,totalwords,1); berreal=[berreal,berreal0] end figure subplot(2,2,1) k=0:2:20 semilogy(k,ber,'-g*'); hold on semilogy(k,ber1,'-bh'); semilogy(k,ber2,'-rx'); semilogy(k,berreal,'-rs'); xlabel('SNR/dB'),ylabel('BER'); grid on axis([0 20 10^(-4) 1]) subplot(2,2,2) plot(k,mse0,'-.g*'); hold on plot(k,mse1,'-.bh'); plot(k,mse2,'-.rx') grid on set(gcf,'color',[1 1 1]) toc