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

    % 清除内存,计时开始  SUI3 信道
%前两点,后一点
clear 
tic;
%设置参数
totalwords=19200;
numusers=4;
wordsize=2;
linktype=0;   %下行链路
ifftsize=256;
procgain=16;  %扩频码的长度
guardtime=16;
guardtype=2;
delay=2;
frameguard=ifftsize+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);
basesignal0=zeros(1,totalwords*procgain);
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的扩频码
%扩频
    basesignal_0=tranCDMA(Datatx1,procgain,seqnum,linktype);
    basesignal0=basesignal0+basesignal_0; %各个用户的扩频信号进行合并
 end
%扩频
%ofdm调制
NumCarr =192;	    %取得载波数
%=============
% 每载波要传输多少数据
%=============
numsymb = ceil(length(basesignal0)/NumCarr);%numsymb=1600

%如果传输的数据不是载波的整数倍,则在后面补零
if length(basesignal0)/192 ~= numsymb,
	DataPad = zeros(1,numsymb*NumCarr);
	DataPad(1:length(basesignal0)) = basesignal0;
	basesignal0 = DataPad;
end
clear DataPad;
%PilotIndex=[45 69 93 117 141 165 189 213];     % pilot interval=24
Data=ones(256,numsymb);  % the position of data is set as 1.
Data(129,:)=0;                 % DC=0
Data([1:28,230:256],:)=0;      % guard band=0
Data([45:24:213],:)=4;       % the position of pilot is set as 4.
Data_Pilot=find(Data==4);   % the pattern of pilot
Data_Pattern=find(Data==1);   %the pattern of data
Data(Data_Pattern)=basesignal0; %插入数据
%插入导频数据
Wk=[1 0 1 0 0 0 1 1]';              % DownLink pilotini
pilotini=1-2*Wk;                    % BPSK modulation for pilot
Pilot_Data=repmat(pilotini,[1,numsymb]);
Pilot_Data=reshape(Pilot_Data,8*numsymb,1);
Data(Data_Pilot)=Pilot_Data;   % pilot insertion
%==================================
%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
%===============
% generate channel parameter which is unknown to receiver
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*2)];                                                                                                                              
path12=[zeros(1,delay) path2 zeros(1,delay)];
path13=[zeros(1,delay*2) path3];
RxSignal0=path11+path12+path13;
RxSignal0=RxSignal0(1:length(path1));

H_real=fft([fade(1) zeros(1,delay-1) fade(2) zeros(1,delay-1) fade(3)].',256);
H_real= H_real([29:229]);
H_real1=repmat(H_real,[1 numsymb]);

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

for SNR=0:4:20
RxSignal=awgn(RxSignal0,10^(SNR/10),'measured',1234,'linear');

%==================
% RECEIVER SECTION
%==================
% remove cyclic prefix
symbwaves=reshape(RxSignal,frameguard,numsymb);
symbwaves = symbwaves(guardtime+1:frameguard,:); % Strip off the guard interval
%fft变换
Yf=fft(symbwaves);
%提取导频数据
	Rec_Pilot=Yf(Data_Pilot);
%估计导频处的信道频域响应
	H_Pilot=Rec_Pilot./Pilot_Data;
    H_Pilot=reshape(H_Pilot,8,numsymb);
    Gp=fft(H_Pilot,8);
   
    Gp1=Gp(1:2,:);%改进前
    Gp2=Gp(8,:);
    Gp3=zeros(201,numsymb);
    Gp3(1:2,:)=Gp1;
    Gp3(201,:)=Gp2;
    H=ifft(Gp3,201);
    
    aa=(abs(Gp).^2);%8*1600
    bb=sum(aa(3:7,:))/5;%1*1600
    delta1=sqrt(bb);
    delta2=repmat(delta1,[2 1]);%2*1600
    Gp10=Gp1-delta2;%改进后
    Gp20=Gp2-delta1;
    Gp30=zeros(201,numsymb);
    Gp30(1:2,:)=Gp10;
    Gp30(201,:)=Gp20;
    H0=ifft(Gp30,201);
    
    %ls估计
    X=17:24:185;
    XI=1:201;
    H_ls = INTERP1(X,H_Pilot,XI,'linear','extrap');
    
%计算mse
esterr1=H_ls-H_real1;        % LS estimation error
esterr2=H-H_real1;   
esterr3=H0-H_real1; 
mse1=[mse1,mse(abs(esterr1))]  % Mean Square Error of LS estimation
mse2=[mse2,mse(abs(esterr2))]  % Mean Square Error of LMMSE estimation
mse3=[mse3,mse(abs(esterr3))] 

Rx1=Yf;
Rx2=Yf;
Rx3=Yf;
Rxreal=Yf;
Rx1([29:229],:)=Rx1([29:229],:)./H_ls;
Rx2([29:229],:)=Rx2([29:229],:)./H;
Rx3([29:229],:)=Rx3([29:229],:)./H0;
Rxreal([29:229],:)=Rxreal([29:229],:)./H_real1;
   
DemSig1=Rx1(Data_Pattern);
DemSig2=Rx2(Data_Pattern);
DemSig3=Rx3(Data_Pattern);
DemSigreal=Rxreal(Data_Pattern); 
DemSignal1=reshape(DemSig1,1,size(DemSig1,1)*size(DemSig1,2));  % complex signal to be de demapped
DemSignal2=reshape(DemSig2,1,size(DemSig2,1)*size(DemSig2,2));
DemSignal3=reshape(DemSig3,1,size(DemSig2,1)*size(DemSig3,2));
DemSignalreal=reshape(DemSigreal,1,size(DemSigreal,1)*size(DemSigreal,2));
%解扩
subsignal1=[];
subsignal2=[];
subsignal3=[];
subsignalreal=[];
for k=1:numusers
    seqnum = seqnumlist(k);
[datarx1, subsignal10] = reccdma(DemSignal1,procgain,seqnum,linktype);
subsignal1=[subsignal1;subsignal10];
[datarx2, subsignal20] = reccdma(DemSignal2,procgain,seqnum,linktype);
subsignal2=[subsignal2;subsignal20];
[datarx3, subsignal30] = reccdma(DemSignal3,procgain,seqnum,linktype);
subsignal3=[subsignal3;subsignal30];
[datarxreal, subsignalreal0]=reccdma(DemSignalreal,procgain,seqnum,linktype);
subsignalreal=[subsignalreal;subsignalreal0];
end;
%去掉映射
Datarx1=invmapping(subsignal1,mapping,wordsize);
Datarx2=invmapping(subsignal2,mapping,wordsize);
Datarx3=invmapping(subsignal3,mapping,wordsize);
Datarxreal=invmapping(subsignalreal,mapping,wordsize);
%计算误码率
ber10=err(Datatx,Datarx1,totalwords,numusers);
ber20=err(Datatx,Datarx2,totalwords,numusers);
ber30=err(Datatx,Datarx3,totalwords,numusers);
berreal0=err(Datatx,Datarxreal,totalwords,numusers);
ber1=[ber1,ber10]
ber2=[ber2,ber20]
ber3=[ber3,ber30]
berreal=[berreal,berreal0]
end
figure
subplot(1,2,1)
k=0:4:20
semilogy(k,ber1,'-r*')
hold on
semilogy(k,ber2,'-rs')
semilogy(k,ber3,'-bx')
semilogy(k,berreal,'-.b')
grid on
axis([0 20 10^(-4) 0.5])
xlabel('SNR/dB'),ylabel('BER')
legend('LS','变换域','改进后','理想')
set (gcf,'color',[1 1 1])
set(gca,'xtick',[0:4:20])
hold off

subplot(1,2,2)
k=0:4:20
semilogy(k,mse1,'-r*')
hold on
semilogy(k,mse2,'-rs')
semilogy(k,mse3,'-ro')
grid on
axis([0 20 10^(-4) 1])
xlabel('SNR/dB'),ylabel('MSE')
legend('LS','变换域','改进后')
set (gcf,'color',[1 1 1])
set(gca,'xtick',[0:4:20])
hold off

toc