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

    % 清除内存,计时开始  SUI3 信道
clear 
tic;
%设置参数
totalwords=1920*6;
numusers=4;
wordsize=2;   %QPSK
linktype=0;   %上行链路
seqnum=3;     %1~64之间取值
ifftsize=256;
procgain=16;  %扩频码的长度
windowtype=0;
guardtime=32;
guardtype=2;
delay=2;
frameguard=ifftsize+guardtime;  % Guard Time between successive frames (one symbol period)
% 产生要发送的双极性二进制随机数
rand('seed',1234);	
datatx = floor(rand(1,totalwords)*2);%0和1
		datatx = datatx-1;%-1和0
		index = find(datatx>=0);
		datatx(index) = datatx(index)+1;%为0的变为+1
ber=[];
MSE=[];
%扩频
for i=2:1:4
    procgain=2^i;
basesignal=trancdma(datatx,procgain,seqnum,linktype);%用户数据与扩频码相乘  %1920*6*2*16
index = find(basesignal<0);
basesignal(index) = basesignal(index)+1; %符号转换,将双极性信号变为单极性信号
%将二进制转换为2×wordsize进制,以备映射
B=bin2high(basesignal,wordsize);%ofdm调制 %B为1行,size(basesignal,2)/wordsize列 %1920*6*2*16列
NumCarr =192;	    %取得载波数
%=============
% 每载波要传输多少数据
%=============
numsymb = ceil(length(B)/NumCarr);%120*16

%如果传输的数据不是载波的整数倍,则在后面补零
if length(B)/NumCarr ~= numsymb,
	DataPad = zeros(1,numsymb*NumCarr);
	DataPad(1:length(B)) = B;
	B = DataPad;
end
clear DataPad;

% Mapping to the signal constellation follow
mapping=get80216map(2^wordsize);
for i=1:length(B),
    ModSignal(i)=mapping(1+B(i));
end;
Xf=reshape(ModSignal,NumCarr,numsymb);
%PilotIndex=[45 69 93 117 141 165 189 213];     % pilot interval=24
PilotIndex=[45:24:213];
DCIndex=129;
Wk=[1 0 1 0 0 0 1 1]';              % DownLink pilotini
pilotini=1-2*Wk;                    % BPSK modulation for pilot
DataIndex=[29:229];                 % the other carriers except guard carriers

Xf=[zeros(28,numsymb);Xf(1:16,:);zeros(1,numsymb);Xf(17:39,:);zeros(1,numsymb);Xf(40:62,:);zeros(1,numsymb);...
    Xf(63:85,:);zeros(1,numsymb);Xf(86:96,:);zeros(1,numsymb);Xf(97:107,:);zeros(1,numsymb);Xf(108:130,:);zeros(1,numsymb);...
    Xf(131:153,:);zeros(1,numsymb);Xf(154:176,:);zeros(1,numsymb);Xf(177:192,:);zeros(27,numsymb)];

Xf(PilotIndex,:)=pilotini(:,ones(1,numsymb));   % pilot insertion
Cpp=diag(Xf(PilotIndex));           % diagonal matrix composed of pilot

%==================================
%Find the time waveform using IFFT
%==================================
BaseSignal = ifft(Xf);       %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]);

for SNR=0:2:24
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);
Hp=inv(Cpp)*Yf(PilotIndex,:);     % find the channel response at the pilot frequency
for n=0:255
   k=0:255;
   F(n+1,:)=1/sqrt(256)*exp(-j*2*pi*n*k/256);     % N by N unitary FFT matrix, note:F'=inv(F)
end
Fuh=F(DataIndex,1:3);
DemSig=[];
for k=1:numsymb
 H_ls(:,k)=interp1(PilotIndex',Hp(:,k),[DataIndex]','linear','extrap'); 
 DemSig(:,k)=Yf(DataIndex,k)./H_ls(:,k);      % extract effective data
end
esterr=H_ls-H_real1;        % LS estimation error
mse_ls=mse(abs(esterr));     % Mean Square Error of LS estimation
MSE=[MSE,mse_ls]
fprintf('SNR=%idB, MSE of LS estimation=%i\n',SNR,mse_ls);

DemSig([DCIndex,PilotIndex]-28,:)=[];    % DC and pilots removal
DemSig=reshape(DemSig,1,size(DemSig,1)*size(DemSig,2));  % complex signal to be de demapped
%去映射
Datarx=zeros(1,NumCarr*numsymb); 
M=2^wordsize;
for i=1:NumCarr*numsymb
     for j=1:M,
         metrics(j)=(real(DemSig(i))-real(mapping(j)))^2+(imag(DemSig(i))-imag(mapping(j)))^2;
     end;
     [min_metrics decis]=min(metrics);  % [a b]=min(metrics) a:minimum value,b: responding position
      Datarx(i)=decis-1;
end;
%解扩
%将2×wordsize进制二进制转换为二进制,以备映射
d=Datarx;
C=dec2bin(d);%十进制转为二进制
C=C';
Datarx=reshape(C,1,2*size(C,2));
index = find(Datarx<=0);
Datarx(index) = Datarx(index)-1;%符号转换,将单性信号变为双极性信号
[datarx, subsignal] = reccdma(Datarx,procgain,seqnum,linktype);
errs=totalwords;
for i=1:totalwords,
    if datatx(i)==datarx(i),
        errs=errs-1;
    end;
end;
ber=[ber,errs/totalwords]
end;%for SNR=0:2:24
end;%for i=2:1:4
figure
subplot(2,2,1)
k=0:2:24
semilogy(k,ber(1,1:13),'-r*')
hold on
semilogy(k,ber(1,14:26),'-bo')
semilogy(k,ber(1,27:39),'-rs')
grid on
axis([0 24 10^(-4) 0.5])
xlabel('SNR/dB'),ylabel('BER')
legend('procgain=4','procgain=8','procgain=16')
set (gcf,'color',[1 1 1])
set(gca,'xtick',[0:2:24])

subplot(2,2,2)
k=0:2:24
semilogy(k,MSE(1,1:13),'-r*')
hold on
semilogy(k,MSE(1,14:26),'-bo')
semilogy(k,MSE(1,27:39),'-rs')
grid on
axis([0 24 10^(-4) 1])
xlabel('SNR/dB'),ylabel('MSE')
legend('procgain=4','procgain=8','procgain=16')
set (gcf,'color',[1 1 1])
set(gca,'xtick',[0:2:24])

toc