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