www.gusucode.com > MC-CDMA系统的仿真matlab源码程序 > mc-cdma/rayleigh(移动信道)/preamble.m

    % 清除内存,计时开始  5径瑞利信道 %jakes
clear 
tic;
%设置参数
totalframe=1; %帧长
totalwords=totalframe*100*12;%每帧60个数据符号,每个符号里12个用户数据
%numsymb=totalframe*64;%每帧共64个符号,4个导频符号,60个数据符号
numusers=1;
wordsize=2;
linktype=0;   %上行链路
NumCarr=256;
procgain=16;  %扩频码的长度
guardtime=64;
guardtype=2;
frameguard=NumCarr+guardtime;  % Guard Time between successive frames (one symbol period)

Fc = 900e+06;        % carrier frequency (Hz) --> ISM band
wc = 2*pi*Fc;        % carrier frequency (rad/sec)
V = 3000/3600;       % mobile speed (= 3 Km/hr) in m/sec
N0 = 24;              % The number of paths

lambda = 3e+08/Fc;   % wavelength at Fc
Fm = V/lambda       % Doppler shift
Fs = 8*Fm;           % sampling frequency
M = 10000;            % number of samples

paths = 16;
Ts = 1/Fs;           % sampling period
t = [0:Ts:(M-1)*Ts]; % time array

fading = jakes(Fm,Fs,M,N0,paths);


% 产生要发送的双极性二进制随机数
seed=1234;
rand('seed',seed);	                    	% Set to new seed
seqnumlist = randperm(procgain);
Datatx = zeros(numusers,totalwords);
RxSignal0=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);
% 插入帧头
w1=floor(rand(256,4)*4); %第一个用户的4个帧头
for i=1:(size(w1,1)*size(w1,2))
   w1(i)=mapping(1+w1(i));
end;
pm=zeros(256,4); %4个用户,每列一个用户的导频
for m=1:NumCarr
      pm(m,:)=w1(m,:)*exp(-j*2*pi*(k-1)*guardtime*(m-1)/NumCarr);
end;
pm(:,2)=pm(:,2)*sqrt(2);
pm(:,4)=pm(:,4)*2;

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

%ofdm调制
%=============
% 每载波要传输多少数据
%=============
%生成数据和导频图案
numsymb=numsymb+4*totalframe;
Pattern=ones(NumCarr,numsymb);  % the position of data is set as 1.
Pattern(129,:)=0;                 % DC=0
Pattern([1:28,230:256],:)=0;      % guard band=0
Pattern(:,[1:4])=0;
Data_Pattern=find(Pattern==1);   %the pattern of data
Data=zeros(size(Pattern));
Data(Data_Pattern)=basesignal_0;   %插入用户数据

Data(:,1)=pm(:,1);
Data(:,2)=pm(:,2);
Data(:,3)=pm(:,3);
Data(:,4)=pm(:,4);
%==================================
%Find the time waveform using IFFT
%==================================
BaseSignal = ifft(Data);       %ifft是对列进行ifft变换。
%=================================
%Add a Guard Period
%=================================
BaseSignal=[BaseSignal((end-guardtime+1):end,:); BaseSignal];
%BaseSignal = reshape(BaseSignal0,1,size(BaseSignal0,1)*size(BaseSignal0,2));   %先取第一列,再取第二列,……
%===============
% CHANNEL MODEL, channel have delay
%===============
fc=3.5e9;  
V=5;         %V km/h
fdmax=V*fc/3e8/3.6   %fmax=V*fc/C

fade=Rayleigh(fdmax);
path1=ones(frameguard,1)*fade(1,[1+1000:numsymb+1000]).*BaseSignal;
path2=ones(frameguard,1)*fade(2,[1+1000:numsymb+1000]).*BaseSignal;
path3=ones(frameguard,1)*fade(3,[1+1000:numsymb+1000]).*BaseSignal;
path4=ones(frameguard,1)*fade(4,[1+1000:numsymb+1000]).*BaseSignal;
path5=ones(frameguard,1)*fade(5,[1+1000:numsymb+1000]).*BaseSignal;
path6=ones(frameguard,1)*fade(6,[1+1000:numsymb+1000]).*BaseSignal;
path01=reshape(path1,1,size(path1,1)*size(path1,2));
path02=reshape(path2,1,size(path2,1)*size(path2,2));
path03=reshape(path3,1,size(path3,1)*size(path3,2));
path04=reshape(path4,1,size(path4,1)*size(path4,2));
path05=reshape(path5,1,size(path5,1)*size(path5,2));
path06=reshape(path6,1,size(path6,1)*size(path6,2));
%the delay is [0 0.31 0.71 1.09 1.73] us,[0 2 3 5 7];  % time delay spread(in sample) of each path
path11=[path01 zeros(1,10)];    % the largest delay is 10 sample                                                                                                                          
path12=[zeros(1,1) path02 zeros(1,9)];
path13=[zeros(1,3) path03 zeros(1,7) ];
path14=[zeros(1,4) path04 zeros(1,6)];
path15=[zeros(1,7) path05 zeros(1,3)];
path16=[zeros(1,10) path06];
RxSignal00=path11+path12+path13+path14+path15+path16;
RxSignal1=RxSignal00(1:length(path01));
RxSignal0=RxSignal1+RxSignal0;
end;
H_real=zeros(NumCarr,numsymb);      % the real channel impulse response
for k=1:NumCarr
    H_real(k,:)=H_real(k,:)+fade(1,[1+1000:numsymb+1000])*exp(-j*2*pi*(k-1)*0/NumCarr)+fade(2,[1+1000:numsymb+1000])*exp(-j*2*pi*(k-1)*1/NumCarr)+...
                            fade(3,[1+1000:numsymb+1000])*exp(-j*2*pi*(k-1)*3/NumCarr)+fade(4,[1+1000:numsymb+1000])*exp(-j*2*pi*(k-1)*4/NumCarr)+...
                            fade(5,[1+1000:numsymb+1000])*exp(-j*2*pi*(k-1)*7/NumCarr)+fade(6,[1+1000:numsymb+1000])*exp(-j*2*pi*(k-1)*10/NumCarr);
end

ber1=[];
ber2=[];
ber3=[];
berreal=[];
mse1=[];
mse2=[];
mse3=[];
for SNR=0:5:30
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);
%=======================================Estimation===============================================
PL=repmat(pm(:,2),1,numsymb);
Htotal=Yf./PL;
htotal=ifft(Htotal);
hl=htotal;
HL=fft(hl);
    mse1=[mse1,mse(abs(H_real-HL))]
    
   Rx1=Yf;
   Rxreal=Yf;
   Rx1=Rx1./HL;
   Rxreal=Rxreal./H_real;
    
   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));%理想估计值
%解扩
subsignal1=[];
subsignalreal=[];
for k=1:numusers
    seqnum = seqnumlist(k);
[data10,subsignal10]=recCDMA(DemSignal1,procgain,seqnum,linktype);
subsignal1=[subsignal1;subsignal10];
[datareal0,subsignalreal0]=recCDMA(DemSignalreal,procgain,seqnum,linktype);
subsignalreal=[subsignalreal;subsignalreal0];
end
%去掉映射
Datarx1=invmapping(subsignal1,mapping,wordsize);
Datarxreal=invmapping(subsignalreal,mapping,wordsize);
%计算误码率
ber10=err(Datatx,Datarx1,totalwords,numusers);
berreal0=err(Datatx,Datarxreal,totalwords,numusers)
ber1=[ber1,ber10]
berreal=[berreal,berreal0]
end;

figure
subplot(2,2,1)
k=0:5:30
semilogy(k,ber1,'-rh')
hold on
semilogy(k,berreal,'-.b')
grid on
axis([0 30 10^(-3) 1])
xlabel('SNR/dB'),ylabel('BER')
legend('用户1','理想')
set (gcf,'color',[1 1 1])
set(gca,'xtick',[0:5:30])

subplot(2,2,2)
k=0:5:30
semilogy(k,mse1,'-rh')
grid on
axis([0 30 10^(-3) 1])
xlabel('SNR/dB'),ylabel('MSE')
set (gcf,'color',[1 1 1])
set(gca,'xtick',[0:5:30])
toc