www.gusucode.com > MC-CDMA系统的仿真matlab源码程序 > mc-cdma/blind/blindestimation1.m

    % 清除内存,计时开始 多用户,理想信道
clear 
tic;
%设置参数
totalwords=200;
%numusers=4;
linktype=1;   %下行链路
%seqnum=3;     %1~64之间取值
ifftsize=16;
procgain=16;  %扩频码的长度
guardtime=8;
delay=3;
frameguard=ifftsize+guardtime;  % Guard Time between successive frames (one symbol period)
% 产生要发送的双极性二进制随机数
ber=[];
ber1=[];
ber2=[];
berreal=[];
mse0=[];
mse1=[];
mse2=[];
for numusers=2:1:10
seed=1234;
rand('seed',seed);	
seqnumlist = randperm(procgain);
Datatx = zeros(numusers,totalwords);
RxSignal1=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,size(basesignal,2)/ifftsize);
BaseSignal = ifft(Data);       %ifft是对列进行ifft变换。
%=================================
%Add a Guard Period
%=================================
%将后guardtime拷贝,作为循环前缀,即:L=guardtime,N=EndSignal。
BaseSignal=[BaseSignal((end-guardtime+1):end,:); BaseSignal];
BaseSignal = reshape(BaseSignal,1,size(BaseSignal,1)*size(BaseSignal,2));   %先取第一列,再取第二列,……
%===============
% CHANNEL MODEL, channel have delay
%===============
path1=[BaseSignal zeros(1,delay*3)];                                                                                                                              
path2=[zeros(1,delay) BaseSignal zeros(1,delay*2)] ;
path3=[zeros(1,delay*2) BaseSignal zeros(1,delay)];
path4=[zeros(1,delay*3) BaseSignal];
path=path1+path2+path3+path4;
path=path(:,1:length(BaseSignal));
RxSignal1=RxSignal1+path;
end;
h_real=[1 zeros(1,delay-1) 1 zeros(1,delay-1) 1 zeros(1,delay-1) 1].';
H_real1=fft(h_real,ifftsize);
H_real=repmat(H_real1,[1 numsymb]);
%==================
% RECEIVER SECTION
%==================
% remove cyclic prefix
SNR=20
RxSignal2=awgn(RxSignal1,10^(SNR/10),'measured',1234,'linear');
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;
R=Ryy-Rxx;
%R(1,1)=R(ifftsize,1);
for k1=2:size(R,1),
    R(k1,k1)=abs(R(k1-1,k1));
end;
C=ones(ifftsize,1);
Rc=R*C;
H10=Rc/sqrt(abs(Rc.'*C));
h01=ifft(H10);
L=delay*3+1;
h1=h01(1:L,1);
H1=fft(h1,ifftsize);
H1=repmat(H1,[1 numsymb]);
esterr=h1-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=h02(1:L,1);
H2=fft(h2,ifftsize);
H2=repmat(H2,[1 numsymb]);
esterr=h2-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);
WL=F(:,1:L);
hhH=WL'*R*WL/ifftsize^2;
[V,D]=eig(hhH);
h_estimation=V(:,1);
h3=V(:,1);
esterr=h3-h_real;%  estimation error
mse0=[mse0,mse(abs(esterr))]% Mean Square Error of  estimation
H3=WL*h_estimation;
H3=repmat(H3,[1 numsymb]);
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=recCDMA2(DemSig,procgain,seqnum,linktype,numusers,H3,i);
datarxreal=recCDMA2(DemSigreal,procgain,seqnum,linktype,numusers,H3,i);
%计算误码率
ber10=err(Datatx(1,:),datarx,totalwords,1);
ber=[ber,ber10]
berreal0=err(Datatx(1,:),datarxreal,totalwords,1);
berreal=[berreal,berreal0]
end
figure
subplot(2,2,1)
k=2:1:10
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([2 10 10^(-4) 1])
subplot(2,2,2)
plot(k,mse0,'-.g*');
hold on
plot(k,mse1,'-.bh');
plot(k,mse2,'-.rx')
grid on
xlabel('用户数'),ylabel('MSE');
set(gcf,'color',[1 1 1])
toc