用MATLAB实现OFDM仿真分析

para=128;

fftlen=128;

noc=128;   

nd=6;      

ml=2;   

sr=2500;

br=sr.*ml;

gilen=18;  

ebn0=3;  

 

%************************** 主循环部分 **************************

 

nloop=100;

noe = 0;  

nod = 0;  

eop=0;    

nop=0;    

 

for iii=1:nloop

 

%****************** 发射部分 ******************************************************

 

%****************** 产生数据 **********************

 

seldata=rand(1,para*nd*ml)>0.5;        

 

%****************** 串并转换 ***********************

 

paradata=reshape(seldata,para,nd*ml); 

 

%****************** QPSK调制 ***********************

 

[ich,qch]=qpskmod(paradata,para,nd,ml);

kmod=1/sqrt(2);                      

ich1=ich.*kmod;

qch1=qch.*kmod;                      

 

%****************** IFFT(离散傅里叶反变换) *********

 

x=ich1+qch1.*i;

y=ifft(x);                       

ich2=real(y);                           

qch2=imag(y);                          

 

%****************** 插入保护间隔 *******************

 

[ich3,qch3]= giins(ich2,qch2,fftlen,gilen,nd);

fftlen2=fftlen+gilen;

 

%****************** 衰减计算 ************************

 

spow=sum(ich3.^2+qch3.^2)/nd./para;    

attn=0.5*spow*sr/br*10.^(-ebn0/10);

attn=sqrt(attn);

 

%****************** 高斯白信道 *****************************************************

 

[ich4,qch4]=comb(ich3,qch3,attn);

 

%****************** 接收部分  ******************************************************

 

%****************** 去除保护间隔 ********************

 

[ich5,qch5]= girem(ich4,qch4,fftlen2,gilen,nd);

 

%****************** FFT(离散傅里叶变换)  ************

 

rx=ich5+qch5.*i;

ry=fft(rx); 

ich6=real(ry);      

qch6=imag(ry);   

 

%***************** QPSK解调 **************************

 

ich7=ich6./kmod;

qch7=qch6./kmod;

[demodata]=qpskdemod(ich7,qch7,para,nd,ml);  

 

%**************  并串变换  ***************************

 

demodata1=reshape(demodata,1,para*nd*ml);

 

%*************** 比特误码率 (BER) *********************

 

% instantaneous number of error and data

 

noe2=sum(abs(demodata1-seldata));     

nod2=length(seldata);                  

 

% cumulative the number of error and data in noe and nod

 

noe=noe+noe2;

nod=nod+nod2;

 

% calculating PER

 

if noe2~=0 

   eop=eop+1;

else

   eop=eop;

end  

   eop;

   nop=nop+1;

  

fprintf('%d\t%e\t%d\n',iii,noe2/nod2,eop);  

end

 

%****************** 结果输出 ***************************

 

per=eop/nop;

ber=noe/nod;

 

fprintf('%f\t%e\t%e\t%d\t\n',ebn0,ber,per,nloop);

fid = fopen('BERofdm.dat','a');

fclose(fid);

%****************** end of file ******************************************************

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页