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

    % 清除内存,计时开始  SUI3 信道,先映射后扩频
clear 
tic;
%设置参数
totalwords=20;
numusers=4;
wordsize=2;
linktype=0;   %上行链路
NumCarr=16;
procgain=16;  %扩频码的长度
frameguard=NumCarr;  % 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=[];
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);
    Data=reshape(basesignal0,NumCarr,length(basesignal0)/NumCarr);
   %Find the time waveform using IFFT
    BaseSig = ifft(Data);       %ifft是对列进行ifft变换。
    BaseSignal = reshape(BaseSig,1,size(BaseSig,1)*size(BaseSig,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)=[fade(1) zeros(1,Delay(k,2)-1) fade(2) zeros(1,Delay(k,3)-Delay(k,2)-1) fade(3)].';
    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)].',NumCarr);
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
        Rec=reshape(RxSignal,NumCarr,length(RxSignal)/NumCarr);
        %=======================================Estimation===============================================
        C = walsh(procgain,'+-');		%Find all walsh codes
        CC=ifft(C).';%时域扩频码
        seqnum=seqnumlist(kk);%取得用户k的扩频码
        LL=C(seqnum,:)
        Lch=Delay(kk,3);
        for i=1:(Lch+1)
            Ckk(:,i)=[zeros(1,i-1) LL zeros(1,Lch-(i-1))].';
        end;
        Ckk0=Ckk(Lch+1:procgain,:);
        XX=Rec(Lch+1:NumCarr,:);
        [U,S,V]=svd(XX);
        minnum=procgain-Lch-numusers;
        Snum=min(size(S,1),size(S,2));
        UN=U( :,(Snum-minnum+1):Snum);  
        ??hk=inv(UN'*Ckk0);
        %计算MSE
        mse1=[mse1,mse(abs(hk-h_real(:,kk)))]
        %fft变换
        Yf=fft(Rec);
        HH1=fft(hk,NumCarr);
        H1=repmat(HH1,[1 length(RxSignal)/NumCarr]);
        Hmse=H_real(:,kk);
        H_real11=repmat(H_real(:,kk),[1 length(RxSignal)/NumCarr]); 
        Rx1=Yf./H1.*abs(H1);
        Rxreal=Yf./H_real11.*abs(H_real11);
        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));%理想估计值
        %解扩
        seqnum = seqnumlist(kk);
        [data10,subsignal1]=recCDMA(DemSignal1,procgain,seqnum,linktype);
        [datareal0,subsignalreal]=recCDMA(DemSignalreal,procgain,seqnum,linktype);
        %去掉映射
        Datarx1=invmapping(subsignal1,mapping,wordsize);
        Datarxreal=invmapping(subsignalreal,mapping,wordsize);
        %计算误码率
        ber10=erruplink(Datatx(kk,:),Datarx1,totalwords);
        berreal0=erruplink(Datatx(kk,:),Datarxreal,totalwords);
        ber1=[ber1,ber10];
        berreal=[berreal,berreal0];
    end;
    BER1=BER1+ber1;
    BERreal=BERreal+berreal;
    MSE1=MSE1+mse1;
end;
BER1=BER1./(numusers*totalwords)
BERreal=BERreal./(numusers*totalwords)
MSE1=MSE1/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('帧头1','帧头2','平均','理想')
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('帧头1','帧头2','平均')
set (gcf,'color',[1 1 1])
set(gca,'xtick',[0:5:30])
hold off
toc