⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ofdm2.asv

📁 自己编写的简单易懂的OFDM通信系统仿真程序
💻 ASV
字号:
%ofdm.m
%QPSK仿真实现OFDM传输系统
%---------定义参数--------
para=128;     %并行传输的信道数(点数)
fftlen=128;    %FFT长度
noc=128;      %子载波数
nd=6;         %每次循环含有的OFDM 符号数
ml=2;         %调制电平:QPSK(二电平)
sr=4800;      %符号速率
br=sr.*ml;    %每载波的比特率
gilen=32;     %保护间隔(点数)
%------------主循环部分---------
nloop2=100;   %仿真循环次数
noe=0;        %误码率
nod=0;        %传输的数据数量
eop=0;        %误组数
nop=0;        %传输的分组数
snr=0;        %信噪比

nloop1=input('nloop1='); 

for jjj=1:nloop1
    
    snr=snr+1;
    
  for iii=1:nloop2
    %--------------发送部分--------
    %--------------产生数据--------
    seldata=rand(1,para*ml)>0.5;%(均匀分布的随机矩阵函数;para*ml每次产生的数据个数)
   %seldata得到的实际上是右边那个逻辑表达式的结果,rand产生的值如果大于0.5,则seldata为1,如果小于0.5,则seldata为0
   %---------------------串并变换-------------
   paradata=reshape(seldata,para,ml);
   %变换方式:前128bit变为第一列,随后的128bit为第二列,依此类推
   %----------------------QPSK调制-------------
   x=qpskmod(paradata,para,ml);  % 实现QPSK调制,并规一化  
   
   %-------------IFFT--------------
   y=ifft(x,fftlen) ;
   
   %-----------并串转换--------
   paradata1=reshape(y,1,para);
   ich2=real(paradata1);
   qch2=imag(paradata1);
  
   %------------插入保护间隔----------
   [ich3,qch3]=giins(ich2,qch2,para,gilen);
   para1=para+gilen;
   paradata2=ich3+qch3.*i;
  
   %--------------加入加性高斯白噪声--------------
   
   paradata3=awgn(paradata2,snr,'measured');
   %--------------接收部分-------------
   %-----------------移除保护间隔---------------
   ich4=real(paradata3);
   qch4=imag(paradata3);
   [ich5temp,qch5temp]=girem(ich4,qch4,para1,gilen);
  
   
   %-----------------串并转换--------
   ich5=reshape(ich5temp,para,1);
   qch5=reshape(qch5temp,para,1);
   %----------------FFT----------------
   rx=ich5+qch5.*i;
   ry=fft(rx,fftlen);
   ich6=real(ry);
   qch6=imag(ry);
  
   %---------------QPSK解调-----------
   [demodata]=qpskdemod(ich6,qch6,para);
   %------------------并串转换-------------
   demodata1=reshape(demodata,1,para*ml);
   %-------------------误比特率(BER)-------------
   %即使的误码和数据
   noe2=sum(abs(demodata1-seldata));
   %将接受解调后的信号与原始信号相比较,累计不一样的
   nod2=length(seldata);   %发送信号总长度
   %累计误码数和总的数据
   noe=noe+noe2;
   %因为是进行了nloop次的循环,所以把每次循环的数据和误码数积累起来
   nod=nod+nod2;
   %计算误组率(PER)(每次循环作为一个分组)
   end
 ber=noe/nod %总的误码率
 noe=0;
 nod=0;
xsnr(jjj)=snr;
yber(jjj)=ber;
end 
figure(1)
semilogy(xsnr,yber,':*');
title('QPSK信噪比与误码率的关系');
xlabel('SNR / db');
ylabel('ber');
gtext('QPSK');
hold on;

                        %BPSK仿真实现OFDM传输系统
                        
snr=0;

for jjj=1:nloop1
    
    snr=snr+1;
    
  for iii=1:nloop2
    %--------------发送部分--------
    %--------------产生数据--------
    seldata=rand(1,para)>0.5;%(均匀分布的随机矩阵函数;para*ml每次产生的数据个数)
   %seldata得到的实际上是右边那个逻辑表达式的结果,rand产生的值如果大于0.5,则seldata为1,如果小于0.5,则seldata为0
   %---------------------串并变换-------------
   paradata=reshape(seldata,para,1);
   %变换方式:前128bit变为第一列,随后的128bit为第二列,依此类推
   %----------------------BPSK调制-------------
   x=bpskmod(paradata,para);  % 实现BPSK调制,并规一化  
   %-------------IFFT--------------
   y=ifft(x,fftlen) ;
   %-----------并串转换--------
   paradata1=reshape(y,1,para);
   ich2=real(paradata1);
   qch2=imag(paradata1);
  
   %------------插入保护间隔----------
   [ich3,qch3]=giins(ich2,qch2,para,gilen);
   para1=para+gilen;
   paradata2=ich3+qch3.*i;
   
  
   %--------------加入加性高斯白噪声--------------
   
   paradata3=awgn(paradata2,snr,'measured');
   %--------------接收部分-------------
   %-----------------移除保护间隔---------------
   ich4=real(paradata3);
   qch4=imag(paradata3);
   [ich5temp,qch5temp]=girem(ich4,qch4,para1,gilen);
  
%-----------------串并转换--------
   ich5=reshape(ich5temp,para,1);
   qch5=reshape(qch5temp,para,1);
   %----------------FFT----------------
   rx=ich5+qch5.*i;
   ry=fft(rx,fftlen);
   ich6=real(ry);
   qch6=imag(ry);
  
   %---------------BPSK解调-----------
   [demodata]=bpskdemod(ich6,para);
   %------------------并串转换-------------
   demodata1=reshape(demodata,1,para);
   %-------------------误比特率(BER)-------------
   %即使的误码和数据
   noe2=sum(abs(demodata1-seldata));
   %将接受解调后的信号与原始信号相比较,累计不一样的
   nod2=length(seldata);   %发送信号总长度
   %累计误码数和总的数据
   noe=noe+noe2;
   %因为是进行了nloop次的循环,所以把每次循环的数据和误码数积累起来
   nod=nod+nod2;
   %计算误组率(PER)(每次循环作为一个分组)
   end
 ber=noe/nod %总的误码率
 noe=0;
 nod=0;
xsnr(jjj)=snr;
yber(jjj)=ber;
end 
semilogy(xsnr,yber,':*');
title('BPSK信噪比与误码率的关系');
gtext('BPSK');
hold on;


%------------使用16QAM调制
snr=0;      %信噪比

for jjj=1:nloop1
    snr=snr+1; 
for iii=1:nloop2
%--------------发送部分--------
   %--------------产生数据--------
    BitsTx = floor(rand(1,para*4)*2);
    %---------------------串并变换-------------
    SymQAMtmp=zeros(para,4);
    aa=1;
    for ii=1:para
        SymQAMtmp(aa,1)=BitsTx(4*aa-3);
        SymQAMtmp(aa,2)=BitsTx(4*aa-2);
        SymQAMtmp(aa,3)=BitsTx(4*aa-1);
        SymQAMtmp(aa,4)=BitsTx(4*aa);
        aa=aa+1;
    end
    
    %----------------------16QAM调制-------------
    SymQAMtmptmp = bi2de(SymQAMtmp,2,'right-msb');
    x=qammod(SymQAMtmptmp,16);
    
   %-------------IFFT--------------
   y=ifft(x,fftlen) ;
   %-----------并串转换--------
   paradata1=reshape(y,1,para);
   ich2=real(paradata1);
   qch2=imag(paradata1);
  
   %------------插入保护间隔----------
   [ich3,qch3]=giins(ich2,qch2,para,gilen);
   para1=para+gilen;
   paradata2=ich3+qch3.*i;
   
   %--------------加入加性高斯白噪声--------------
   
   paradata3=awgn(paradata2,snr,'measured');

   %--------------接收部分-------------
   %-----------------移除保护间隔---------------
    ich4=real(paradata3);
   qch4=imag(paradata3);
   [ich5temp,qch5temp]=girem(ich4,qch4,para1,gilen);
   %------------串并转换—————————
   ich5=reshape(ich5temp,para,1);
   qch5=reshape(qch5temp,para,1);
   %----------------FFT----------------
   rx=ich5+qch5.*i;
   ry=fft(rx,para);
   %---------------16QAM解调----------
   [demodata]=qamdemod(ry,16);
   %------------------并串转换------------
   
   demodata1=de2bi(demodata).';
 demodata2=reshape(demodata1,1,para*4);
           
   
   %-------------------误比特率(BER)-------------
   %即使的误码和数据
   noe2=sum(abs(demodata2-BitsTx));
   %将接受解调后的信号与原始信号相比较,累计不一样的
   nod2=length(BitsTx);   %发送信号总长度
   %累计误码数和总的数据
   noe=noe+noe2;
   %因为是进行了nloop次的循环,所以把每次循环的数据和误码数积累起来
   nod=nod+nod2;
end
ber=noe/nod    %总的误码率
noe=0;
nod=0;
xsnr(jjj)=snr;
yber(jjj)=ber;
end
semilogy(xsnr,yber,':*');
title('信噪比与误码率的关系');
gtext('16-QAM');
hold off;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -