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

    % 清除内存,计时开始  SUI3 信道,先映射后扩频
clear 
tic;
%设置参数
totalwords=1920;
numusers=4;
wordsize=2;
linktype=0;   %上行链路
NumCarr=256;
procgain=16;  %扩频码的长度
guardtime=32;
guardtype=2;
frameguard=NumCarr+guardtime;  % Guard Time between successive frames (one symbol period)
% 产生要发送的双极性二进制随机数
seed=1234;
rand('seed',seed);	                    	% Set to new seed
seqnumlist = randperm(procgain);
Datatx = zeros(numusers,totalwords);
H_real=zeros(NumCarr,numusers);
Rxx=[];
WW1=randsrc(256,1,[1 -1;0.5 0.5])*sqrt(2);
WW2=randsrc(256,1,[1 -1;0.5 0.5])*2;
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的扩频码
    %扩频
    basesignal0=tranCDMA(Datatx1,procgain,seqnum,linktype);
    %=============
    % 每载波要传输多少数据
    %=============
    Numsymb = ceil(length(basesignal0)/192);
    %如果传输的数据不是数据载波的整数倍,则在后面补零
    if length(basesignal0)/192 ~= Numsymb
        DataPad = zeros(1,Numsymb*192);
        DataPad(1:length(basesignal0)) = basesignal0;
        basesignal0 = DataPad;
    end
    clear DataPad;
    %生成数据和导频图案
    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)=basesignal0;   %插入用户数据
    % 插入帧头
    for m=1:NumCarr
        p1(m,k)=WW1(m)*exp(-j*2*pi*(k-1)*guardtime*(m-1)/NumCarr);
        p2(m,k)=WW2(m)*exp(-j*2*pi*(k-1)*guardtime*(m-1)/NumCarr);
    end;        
    Data(:,1)=p1(:,k);
    Data(:,2)=p2(:,k);
    %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。
    Delay1=[0 0.4+0.1*(k-1) 0.9+0.4*(k-1)];
    Delay(k,:)=round(Delay1/0.25);
    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(k,3))];
    path12=[zeros(1,Delay(k,2)) path2 zeros(1,Delay(k,3)-Delay(k,2))];
    path13=[zeros(1,Delay(k,3)) path3];
    RxSignal0=path11+path12+path13;
    Rxx(k,:)=RxSignal0(1:length(path1));
    
    H_real(:,k)=fft([fade(1) zeros(1,Delay(k,2)-1) fade(2) zeros(1,Delay(k,3)-Delay(k,2)-1) fade(3)].',256);
end
BER1=zeros(1,7);
BER2=zeros(1,7);                                                                                                                                                                                                                                                                                                                                                                   
BER3=zeros(1,7);
BERreal=zeros(1,7);
MSE1=zeros(1,7);
MSE2=zeros(1,7);
MSE3=zeros(1,7);
for kk=1:numusers

ber1=[];
ber2=[];                                                                                                                                                                                                                                                                                                                                                                   
ber3=[];
berreal=[];
mse1=[];
mse2=[];
mse3=[];

for SNR=0:5:30
    RxSignal=zeros(1,size(Rxx,2));
    for k=1:numusers
        RxSignal=RxSignal+awgn(Rxx(k,:),10^(SNR/10),'measured',1234,'linear');
    end;
    %==================
    % 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===============================================
    %估计导频处的信道频域响应
    H01=(Yf(:,2)./WW2+Yf(:,1)./WW1)/2;
    
    %LMMSE 参数设置
    switch wordsize
        case 2
            beita=1;         % beita=E{|Ck|^2}*E{1/|Ck}^2}=constant
        case 4
            beita=17/9;      % beita=17/9 for 16-QAM , and beita=1 for QPSK
        case 6
            beita=2.6854;    % beita=2.6854 for 64-QAM
        otherwise
            error('error mapping type!')
    end

     L=Delay(kk,3);
     ratio=L/NumCarr;
     for ri=1:256    %相关函数
         for ci=1:256
             if ri==ci
                 Rhh(ri,ci)=1;
             else
                 Rhh(ri,ci)=(1-exp(-j*2*pi*ratio*(ri-ci)))/(j*2*pi*ratio*(ri-ci));  % attention !!!
             end
         end
     end
    %LS
    h01=ifft(H01);
    hh1=zeros(1,256);
    hh1(1:guardtime)=h01((kk-1)*guardtime+1:kk*guardtime);
    HH1=fft(hh1).';
    %LMMSE           
     C=beita/10^(SNR/10);     % constant coefficient 
     M=[1:256];
     N=[1:256];
     Rpp=Rhh(N,N);
     Rhp=Rhh(M,N);
     Wt=Rhp*inv(Rpp+C*eye(length(N)));            % weight matrix of LMMSE estimation
     HH2=Wt*HH1;
     %ML
     Nc=256;
     n=(0:Nc-1)';
     k=0:Nc-1;
     F=1/sqrt(Nc)*exp(-j*2*pi*n*k/Nc); % generate an Nc by Nc unitary FFT matrix, satisfy:F'=inv(F)
     Nh=Delay(kk,3)+1;
     Fhh=F(M,1:Nh);
     Fuh=F(N,1:Nh);
     HH3=Fhh*pinv(Fuh)*HH1;
    
    H1=repmat(HH1,[1 Numsymb+2]);
    H2=repmat(HH2,[1 Numsymb+2]);
    H3=repmat(HH3,[1 Numsymb+2]);
    H_real11=repmat(H_real(:,kk),[1 Numsymb+2]); 
    
    Hmse=H_real(:,kk);
    mse1=[mse1,mse(abs(Hmse-HH1))];
    mse2=[mse2,mse(abs(Hmse-HH2))];
    mse3=[mse3,mse(abs(Hmse-HH3))];
        
    Rx1=Yf./H1.*abs(H1);
    Rx2=Yf./H2.*abs(H2);
    Rx3=Yf./H3.*abs(H3);
    Rxreal=Yf./H_real11.*abs(H_real11);
    DemSig1=Rx1(Data_Pattern);
    DemSig2=Rx2(Data_Pattern);
    DemSig3=Rx3(Data_Pattern);
    DemSigreal=Rxreal(Data_Pattern);
    NN=size(DemSig1,1)*size(DemSig1,2);
    DemSignal1=reshape(DemSig1,1,NN);   %lS估计值
    DemSignal2=reshape(DemSig2,1,NN);   %MMSE估计值
    DemSignal3=reshape(DemSig3,1,NN);   %ML估计值
    DemSignalreal=reshape(DemSigreal,1,NN);%理想估计值
    %解扩
    seqnum = seqnumlist(kk);
    [data10,subsignal1]=recCDMA(DemSignal1,procgain,seqnum,linktype);
    [data20,subsignal2]=recCDMA(DemSignal2,procgain,seqnum,linktype);
    [data30,subsignal3]=recCDMA(DemSignal3,procgain,seqnum,linktype);
    [datareal0,subsignalreal]=recCDMA(DemSignalreal,procgain,seqnum,linktype);
    %去掉映射
    Datarx1=invmapping(subsignal1,mapping,wordsize);
    Datarx2=invmapping(subsignal2,mapping,wordsize);
    Datarx3=invmapping(subsignal3,mapping,wordsize);
    Datarxreal=invmapping(subsignalreal,mapping,wordsize);
    %计算误码率
    ber10=erruplink(Datatx(kk,:),Datarx1,totalwords);
    ber20=erruplink(Datatx(kk,:),Datarx2,totalwords);
    ber30=erruplink(Datatx(kk,:),Datarx3,totalwords);
    berreal0=erruplink(Datatx(kk,:),Datarxreal,totalwords);
    ber1=[ber1,ber10];
    ber2=[ber2,ber20];
    ber3=[ber3,ber30];
    berreal=[berreal,berreal0];
end;
BER1=BER1+ber1
    BER2=BER2+ber2
    BER3=BER3+ber3
    BERreal=BERreal+berreal
    MSE1=MSE1+mse1
    MSE2=MSE2+mse2
    MSE3=MSE3+mse3
end;
BER1=BER1./(numusers*totalwords)
BER2=BER2./(numusers*totalwords)
BER3=BER3./(numusers*totalwords)
BERreal=BERreal./(numusers*totalwords)
MSE1=MSE1/numusers
MSE2=MSE2/numusers
MSE3=MSE3/numusers

figure
subplot(2,2,1)
k=0:5:30
semilogy(k,BER1,'-rh')
hold on
semilogy(k,BER2,'-ro')
semilogy(k,BER3,'-rx')
semilogy(k,BERreal,'-.b')
grid on
axis([0 30 10^(-4) 1])
xlabel('SNR/dB'),ylabel('BER')
legend('LS','MMSE','ML','理想')
set (gcf,'color',[1 1 1])
set(gca,'xtick',[0:5:30])

subplot(2,2,2)
k=0:5:30
semilogy(k,MSE1,'-rh')
hold on
semilogy(k,MSE2,'-ro')
semilogy(k,MSE3,'-rx')
grid on
axis([0 30 10^(-4) 1])
xlabel('SNR/dB'),ylabel('MSE')
legend('LS','MMSE','ML')
set (gcf,'color',[1 1 1])
set(gca,'xtick',[0:5:30])
hold off
toc