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

    % 清除内存,计时开始  SUI3 信道,先映射后扩频
%最佳GCL与标准Preamble比较
clear 
tic;
%设置参数
totalwords=1920;
numusers=4;
wordsize=2;
linktype=0;   %下行链路
NumCarr=256;
procgain=16;  %扩频码的长度
guardtime=16;
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);
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调制
%=============
% 每载波要传输多少数据
%=============
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;   %插入用户数据

% 插入帧头
u=40;
NG=201;
Su=zeros(1,NG);
for k=1:1:NG,
    Su(k)=exp(-j*2*pi*u*k*(k-1)/2/NG);
end    %产生GCL序列
Su=[Su(2:101) 0 Su(102:201)];
%Data([29:229],1)=Su';
Data([29:229],1)=2*[1+j,0,0,0,1+j,0,0,0,1+j,0,0,0,1-j,0,0,0,-1+j,0,0,0,1+j,0,0,0,1+j,0,0,0,1+j,0,0,0,1-j,0,0,0,-1+j,0,0,0,1+j,0,0,0,1+j,0,0,0,1+j,0,0,0,1-j,0,0,0,-1+j,0,0,0,1-j,0,0,0,1-j,0,0,0,1-j,0,0,0,-1-j,0,0,0,1+j,...
0,0,0,-1+j,0,0,0,-1+j,0,0,0,-1+j,0,0,0,1+j,0,0,0,-1-j,0,0,0,0,0,0,0,-1-j,0,0,0,1-j,0,0,0,1+j,0,0,0,-1-j,0,0,0,-1+j,0,0,0,1-j,0,0,0,1+j,0,0,0,-1+j,0,0,0,1-j,0,0,0,-1-j,0,0,0,1+j,0,0,0,-1+j,0,0,0,-1-j,0,0,0,1+j,0,0,0,1-j,0,0,0,-1-j,0,0,0,1-j,0,0,0,1+j,0,0,0,-1-j,0,0,0,-1+j,0,0,0,-1+j,0,0,0,-1-j,0,0,0,1-j,0,0,0,-1+j,0,0,0,1+j]';
%Data([29:229],2)=2*[1,0,-1,0,-1,0,-1,0,1,0,1,0,1,0,1,0,-1,0,1,0,-1,0,-1,0,-1,0,1,0,-1,0,1,0,1,0,1,0,1,0,-1,0,1,0,1,0,1,0,-1,0,1,0,-1,0,1,0,1,0,-1,0,-1,0,1,0,-1,0,1,0,-1,0,1,0,1,0,-1,0,1,0,1,0,-1,0,-1,0,-1,0,1,0,-1,0,-1,0,-1,0,-1,0,-1,0,1,0,1,0,0,0,1,0,-1,0,-1,0,1,0,-1,0,1,0,1,0,1,0,1,0,-1,0,1,0,1,0,1,0,1,0,-1,0,1,0,-1,0,-1,0,-1,0,-1,0,1,0,1,0,-1,0,1,0,-1,0,-1,0,-1,0,-1,0,-1,0,-1,0,-1,0,-1,0,1,0,1,0,1,0,-1,0,-1,0,-1,0,1,0,1,0,-1,0,-1,0,-1,0,1,0,-1,0,-1,0,1,0,-1,0,-1,0,-1]';
%Data([29:229],1)=2*[1-j,1-j,-1-j,1+j,1-j,1-j,-1+j,1-j,1-j,1-j,...
 %                   1+j,-1-j,1+j,1+j,-1-j,1+j,-1-j,-1-j,1-j,-1+j,...
  %                  1-j,1-j,-1-j,1+j,1-j,1-j,-1+j,1-j,1-j,1-j,...
   %                 1+j,-1-j,1+j,1+j,-1-j,1+j,-1-j,-1-j,1-j,-1+j,...
    %                1-j,1-j,-1-j,1+j,1-j,1-j,-1+j,1-j,1-j,1-j,...
     %               1+j,-1-j,1+j,1+j,-1-j,1+j,-1-j,-1-j,1-j,-1+j,...
      %              1+j,1+j,1-j,-1+j,1+j,1+j,-1-j,1+j,1+j,1+j,...
       %             -1+j,1-j,-1+j,-1+j,1-j,-1+j,1-j,1-j,1+j,-1-j,...
        %            -1-j,-1-j,-1+j,1-j,-1-j,-1-j,1+j,-1-j,-1-j,-1-j,...
         %           1-j,-1+j,1-j,1-j,-1+j,1-j,-1+j,-1+j,-1-j,1+j,...
          %          0,...
           %         -1-j,1+j,-1+j,-1+j,-1-j,1+j,1+j,1+j,-1-j,1+j,...
            %        1-j,1-j,1-j,-1+j,-1+j,-1+j,-1+j,1-j,-1-j,-1-j,...
             %       -1+j,1-j,1+j,1+j,-1+j,1-j,1-j,1-j,-1+j,1-j,...
              %      -1-j,-1-j,-1-j,1+j,1+j,1+j,1+j,-1-j,-1+j,-1+j,...
               %     1+j,-1-j,1-j,1-j,1+j,-1-j,-1-j,-1-j,1+j,-1-j,...
                %    -1+j,-1+j,-1+j,1-j,1-j,1-j,1-j,-1+j,1+j,1+j,...
                 %   -1-j,1+j,-1+j,-1+j,-1-j,1+j,1+j,1+j,-1-j,1+j,...
                  %  1-j,1-j,1-j,-1+j,-1+j,-1+j,-1+j,1-j,-1-j,1-j,...
                   % 1-j,-1+j,-1-j,-1-j,1-j,-1+j,-1+j,-1+j,1-j,-1+j,...
                    %1+j,1+j,1+j,-1-j,-1-j,-1-j,-1-j,1+j,1-j,1-j]';
Data([29:229],2)=2*[1.51-0.99j,-1.29-1.26j,0.85+1.59j,-1.67+0.68j,-1.66-0.71j,-1.64+0.75j,1.16+1.38j,-0.59-1.71j,1.78-0.29j,1.68+0.65j,...
                  1.8-0.07j,-0.6-1.7j,0.48+1.74j,-1.74-0.48j,-0.92-1.55j,-1.65-0.74j,-0.02+1.8j,0.25-1.79j,1.24+1.31j,0.32+1.78j,...
                  1.42+1.12j,0.67-1.68j,-0.91+1.56j,-0.86-1.59j,0.59-1.7j,0.12-1.8j,-1.7+0.62j,1.78-0.3j,-0.83+1.6j,-1.67+0.69j,...
                  -1.24+1.31j,1.4+1.13j,-0.74-1.65j,1.8-0.03j,1.31+1.24j,1.64+0.76j,0.64-1.69j,-0.85+1.59j,-0.56-1.71j,0.87-1.58j,...
                  0.23-1.79j,-1.79-0.25j,1.63+0.78j,-1.47+1.04j,-1.67-0.68j,-1.79+0.26j,0.49+1.74j,0.21-1.79j,1.15+1.39j,-0.28+1.78j,...
                  0.4+1.76j,1.79-0.2j,-1.64-0.75j,1.62-0.79j,1.77+0.37j,1.8-0.05j,-0.46-1.75j,0.21+1.79j,-1.19-1.35j,0.06-1.8j,...
                  -0.19-1.8j,-1.7-0.6j,1.27+1.28j,-1.67+0.67j,-1.35-1.2j,-1.56-0.91j,-1.05+1.47j,1.43-1.1j,-0.39+1.76j,-1.68+0.65j,...
                  -1.56+0.91j,0.44+1.75j,0.69-1.67j,0.47+1.74j,-0.88+1.58j,-0.71+1.66j,1.58+0.88j,-0.68-1.67j,1.64+0.75j,0.11+1.8j,...
                  0.78+1.63j,1.75-0.46j,-1.68-0.65j,1.77-0.34j,1.32+1.23j,1.4+1.13j,1.58-0.88j,-1.77+0.33j,1.22-1.33j,1.73+0.51j,...
                  1.77+0.34i,0.46-1.75j,-1.42+1.11j,0.24-1.79j,1.66-0.72j,1.8+0.03j,0.86-1.59j,-1.59+0.86j,0.75-1.64j,1.79-0.26j,...
                  0,...
                  0.82-1.61j,-1.52+0.98j,1.04-1.48j,1.78+0.31j,1.8-0.18j,0.39-1.76j,-1.43+1.1j,0.66-1.68j,1.78+0.28j,1.77+0.37j,...
                  1.06-1.46j,-1.77+0.37j,1.61-0.82j,1.31+1.24j,1.38+1.16j,1.61-0.82j,-1.67-0.69j,1.76-0.41j,0.95+1.54j,0.37+1.77j,...
                  1.73+0.52j,-0.5-1.74j,1.23+1.32j,-0.7+1.66j,-1.07+1.46j,0.94+1.54j,1-1.5j,0.13+1.8j,-1.57+0.9j,-1.66+0.72j,...
                  -0.08+1.8j,1.58-0.87j,-1.03+1.48j,-1.43-1.11j,-1.46-1.06j,-1.66+0.7j,1.55+0.92j,-1.64-0.75j,-0.01-1.8j,-0.12-1.8j,...
                  -1.26-1.3j,-0.33+1.77j,-0.52-1.73j,1.8-0.11j,1.74+0.47j,1.51-0.99j,-1.5-1.01j,1.8+0.01j,0.52+1.73j,-0.05+1.8j,...
                  1.01+1.5j,0.99-1.51j,0.16+1.8j,-1.72+0.54j,-1.61-0.81j,-1.39+1.15j,1.61+0.81j,-1.77-0.38j,-0.09-1.8j,0.64-1.69j,...
                  -0.73-1.65j,-1.08+1.44j,0.61-1.7j,1.61+0.81j,1.41+1.12j,1.8,-0.62-1.7j,1.24+1.31j,-1.29+1.26j,-1.65+0.73j,...
                  -0.78+1.63j,1.8+0.09j,-1.75+0.44j,-0.15-1.8j,0.98-1.52j,-0.66-1.68j,1.21+1.34j,1.13-1.41j,1.49+1.02j,0.57+1.71j,...
                  1.18+1.37j,0.6-1.7j,0.15+1.8j,-1.74-0.47j,-1.13-1.4j,-1.72-0.56j,0.11+1.8j,-0.5-1.73j,1.8-0.11j,1.63+0.78j,...
                  1.74-0.46j,-0.88-1.57j,0.91+1.56j,-1.69+0.64j,-1.73-0.53j,-1.56+0.92j,0.95+1.54j,-0.85-1.59j,1.72-0.55j,1.73+0.5j]';
                  
%==================================
%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。
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,4)];                                                                                                                              
path12=[zeros(1,2) path2 zeros(1,2)];
path13=[zeros(1,4) path3];
RxSignal0=path11+path12+path13;
RxSignal0=RxSignal0(1:length(path1));

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

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

for SNR=0:2:16
RxSignal=awgn(RxSignal0,10^(SNR/10),'measured',1234,'linear');
%==================
% 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===============================================
%估计导频处的信道频域响应
    H_Pilot1=Yf([29:4:125,133:4:229],1)./Data([29:4:125,133:4:229],1);
    H_Pilot2=Yf([29:128,130:229],2)./Data([29:128,130:229],2);
      
    x1=[1:4:97,105:4:201].';
    y1=[1:201]';
    H01=INTERP1(x1,H_Pilot1,y1,'linear');  % 帧头1估计值内插  
    x2=[1:100,102:201].';
    H02=INTERP1(x2,H_Pilot2,y1,'linear');  % 帧头2估计值内插
    % 两个帧头的平均
    H03=(H01+H02)/2;
    H1=repmat(H01,[1 Numsymb+2]);
    H2=repmat(H02,[1 Numsymb+2]);
    H3=repmat(H03,[1 Numsymb+2]);
    H10=abs(H1);
    H20=abs(H2);
    H30=abs(H3);
    mse1=[mse1,mse(abs(H_real-H01))]
    mse2=[mse2,mse(abs(H_real-H02))]
    mse3=[mse3,mse(abs(H_real-H03))]
   Rx1=Yf;
   Rx2=Yf;
   Rx3=Yf;
   Rxreal=Yf;
   Rx1([29:229],:)=Rx1([29:229],:)./H1.*H10;
   Rx2([29:229],:)=Rx2([29:229],:)./H2.*H20;
   Rx3([29:229],:)=Rx3([29:229],:)./H3.*H30;
   Rxreal([29:229],:)=Rxreal([29:229],:)./H_real1.*abs(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));   %帧头1估计值
DemSignal2=reshape(DemSig2,1,size(DemSig2,1)*size(DemSig2,2));   %帧头2估计值
DemSignal3=reshape(DemSig3,1,size(DemSig3,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);
[data10,subsignal10]=recCDMA(DemSignal1,procgain,seqnum,linktype);
subsignal1=[subsignal1;subsignal10];
[data20,subsignal20]=recCDMA(DemSignal2,procgain,seqnum,linktype);
subsignal2=[subsignal2;subsignal20];
[data30,subsignal30]=recCDMA(DemSignal3,procgain,seqnum,linktype);
subsignal3=[subsignal3;subsignal30];
[datareal0,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:2:16
semilogy(k,ber1,'-rh')
hold on
semilogy(k,ber2,'-ro')
semilogy(k,ber3,'-rx')
semilogy(k,berreal,'-.b')
grid on
axis([0 8 10^(-4) 1])
xlabel('SNR/dB'),ylabel('BER')
legend('帧头1','帧头2','平均','理想')
set (gcf,'color',[1 1 1])
set(gca,'xtick',[0:2:16])

subplot(1,2,2)
k=0:2:16
semilogy(k,mse1,'-rh')
hold on
semilogy(k,mse2,'-ro')
semilogy(k,mse3,'-rx')
grid on
axis([0 16 10^(-4) 1])
xlabel('SNR/dB'),ylabel('MSE')
legend('帧头1','帧头2','平均')
set (gcf,'color',[1 1 1])
set(gca,'xtick',[0:2:16])
hold off
toc