www.pudn.com > OFDM_emluator.rar > OFDM.m


function[TotEbNo,Errors]=OFDM(Mt,Mr); 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
% 
%function[TotEbNo,Errors]=OFDM(Mt,Mr); 
% 
%输入: 
%    Mt    ----发射天线数 
%    Mr    ----接收天线数 
%输出: 
%TotEbNo   ----信噪比 
%Errors    ----平均误比特率 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
load ENC2.mat 
load ENC4.mat 
load ENC16.mat 
load ENC64.mat 
load ENC256.mat 
 
A=[1 1/exp(1) 1/exp(2)];     %功率时延谱 
N=64;                        %OFDM子载波数 
GI=16;Q                      %保护间隔 
sig2=1e-3;                   %噪声 
M=8;                         %最大的星座比特数 
Mgap=10.^(1:(1.7/10):2.7);    %间隔 
Btot=100*Mt;                 %每个ofdm符号总的比特数 
TransimitIter=50;             %每个信道传输符号迭代次数 
ChannelIter=50;           %随机信道迭代 
CapIter=length(Mgap); 
 
TotEbNo=[]; 
Errors=[]; 
EbNo=[]; 
for lGap=1:GapIter 
    gap=Mgap(lGap); 
    totalErrors=0; 
         for lChan=1:ChannelIter 
             %创建信道 
             [H h_f]=create_channel(Mr,Mt,A,N+GI); 
             %在频域中分解每个子信道 
             [USV]=svd_decompose_channel(Mt,Mr,h_f,N); 
             %比特分配 
             [bits_alloc,energy_alloc]=BitLoad(S,Btot,Mt*N,gap,gig2,M); 
             %能量分配 
             for lTrans=1:TransmitIter 
                 %传输的比特 
                 x=(randn(1,Blot)>0); 
                 %调制 
                 x_mod=modu(x,bits_alloc,energy_alloc,s2,s4,s16,s64,s256); 
                 %调制信号预编码 
                 x_pre=precode(Mt,x_mod,V,N); 
                 %ifft,含循环前缀 
                 ofdm_symbol=[ofdm_symbol;ifft_cp_tx_blk(x_pre(i:Mt:Mt*(N-1)+i),N,GI)]; 
             end 
             ofdm_symbol2=reshape(ofdm_symbol,Mt*(N+GI),1); 
             %信道 
             y=transpose(channel(sig2,Mt,Mr,ofdm_symbol2,H,N+GI)); 
             %ifft 
             rec_symbol=[]; 
             for i=1:Mt 
                 rec_symbol=[rec_symbol;fft_cp_rx_blk(y(i:Mt:Mt*(N+GI-1)+i),N,GI)]; 
             end 
             rec_symbol2=reshape(rec_symbol,1,Mt*N); 
             %接收信号成形 
             shoped_vals=shape(rec_symbol2,Mr,U,N); 
             %解调 
             y_demod=demodulate(shaped_vals,bits_alloc,energy_alloc,S,s2,s4,s16,s64,s256,c2,c4,c16,c64,c256); 
             %比较 
             totalErrors=totalError+sum(xor(y_demod,x)); 
         end 
         EbNo=[EbNo sum(energy_alloc)/Btot/sig2]; 
end 
Errors=[Errors totalErrors/Btot/channelIter/TransmiIter]; 
TotEbNo=[TotEbNo mean(EbNo)]; 
EbNo=[]; 
End