OFDM通信系统分析与仿真

    最近一段时间学习了OFDM通信方式,也算有了一定的理解,因此写这篇博客梳理一下知识点。

    其实我认为OFDM不是一种调制技术,而是一种通信方式。因为在OFDM中用到了PSK、QAM这样的调制技术,而且它的优点源于码元传输速率的降低。


一、OFDM基本原理

    下面通过一张图来引出OFDM的原理。

    在《通信原理》中我们学到,(1)码元速率决定了发送信号所需的传输带宽,即码元速率越大、码元周期越小、码元占用的带宽越宽^{[1]},这个带宽通过单载波上变频平移到可以在无线信道中传播的频段。(2)如果采用多进制调制,将几个码元合并成一个码元,增大了单个码元的周期,减小了码元占用的带宽,如果再采用多载波上变频,将多个多进制码元的带宽平移到可以在无线信道中传播的频段,我们直观的想法肯定是这些带宽互相相邻,而且需要保护间隔。(3)如果将多个多进制码元互连相邻的带宽的间隔缩小,让它们重叠,使多个子载波的相邻频率间隔为1/T_{B},这样的多个子载波满足相互正交,这样的叠加信号类似于泰勒展开式,叠加结果类似于泰勒展开式的原函数,这就是后来使用IFFT/FFT实现调制与解调的前提。正是由于满足这种运算,才使得相邻子载波的带宽虽然重叠但是可以通过运算将它们区分出来。

二、OFDM主要特点

    优点:

    1.无线信道最主要的缺点就是存在多径效应,而多径效应使信道的传输函数表现为具有频率选择性衰落的特性^{[2]},(1)首先,由于单个多进制码元的周期增大,信息传输速率下降,多径效应的时间时延对其影响就不明显。(2)其次,即使存在多径效应,无线信道表现出频率选择性衰落的特性,可以在衰落频率点的子载波上插入导频而不用数据调制,就可以减少多径效应对传输数据的影响。(3)最后,可以在每一帧数据前加入循环前缀,且循环前缀的长度大于多径最大时延,就可以明显改善多径效应(下面会具体解释)。

    2.由于码元传输速率降低,则每个子载波的调制带宽减小,则子信道的带宽减小。若子信道的带宽足够小,就可以认为信道特性接近理想信道特性,码间串扰就可以得到有效的克服。

    3.各路子载波采用PSK、QAM调制,这样各路频谱的位置和形状不会改变,只有幅度和相位变化,任然保持正交性。

    4.由于各路频谱具有重叠,因此频带利用率提高。

    缺点:

    1.各路子载波要求严格正交,因此对信道产生的频率偏移和相位噪声比较敏感。

    2.信号峰值功率和平均功率的比值比较大,这样会降低射频功率放大器的效率。

三、OFDM系统分析

    下面这张图是OFDM通信系统的整个过程。

    1.卷积编码是为了提高数据的纠错能力,保证数据传输的准确性。

    2.交织是将相邻的信息比特分别映射到不相邻的子载波上,由于频率选择性衰落零点附近会出现一连串比特错误,这样可以降低误比特率,而且前向纠错编码在错误均匀分布的情况下工作更有效。

    3.根据香农定理,信道容量正比于信号带宽和信噪比,当信道容量一定时,通过扩频可以增大信号带宽,这样可以降低对信噪比的要求。

    4.插入的导频可以用来进行信道估计和获取同步信息。

    5.串并变换是将多个多进制码元构成矩阵的一列,作为一帧数据,经过IFFT变换后成为多载波调制数据。由于一列为一帧,因此还需要经过并串变换变成已调数据流。

    6.每一帧数据加循环前缀可以改善多径效应。

    由于IFFT变换具有周期性,数据加入循环前缀任包含数据的所有信息。

    通过对比数据加空白前缀和循环前缀的接收结果与原始数据,发现数据加循环前缀可以改善多径效应。

    7.每一帧数据进行加窗操作,使已调数据在带宽之外的功率谱密度下降得更快。

四、OFDM系统仿真

    经过上面的理论分析,下面在MATLAB中将OFDM通信系统的整个过程进行仿真。

    该仿真过程对比了单径信道和2径信道的数据传输误比特率,但不包括卷积编码和扩频,且仿真过程参考文献[3](需要电子书可以留言跟我联系),在文献[4]中给出了OFDM通信系统包含卷积编码和扩频的系统仿真,有兴趣的同学可以参考。

%参数设置
Nsp=52;                          %子载波数
Nfft=64;                         %FFT长度
Ncp=16;                          %循环前缀长度
Ns=Nfft+Ncp;                     %一帧OFDM数据长度
noc=53;                          %包含直流载波的子载波数
Nd=6;                            %一个数据包所包含的帧数
M1=4;                            %QPSK调制
M2=16;                           %16QAM调制
sr=250000;                       %码元速率
EbNo=0:2:30;                     %归一化信噪比
Nfrm=10000;                      %数据包数目
ts=1/sr/Ns;                      %码元抽样时间间隔
t=0:ts:(Ns*(Nd+1)*Nfrm-1)*ts;    %抽样时刻
fd=100;                          %最大多普勒频移
h=rayleigh(fd,t);                %生成单径Rayleigh衰落信道
h1=sqrt(2/3)*h;                  %生成2径衰落信道
h2=sqrt(1/3)*rayleigh(fd,t);
h2=[zeros(1,4) h2(1:end-4)];

%长训练符号频域数据
Preamble=[1 1 -1 -1 1 1 -1 1 -1 1 1 1 1 1 1 -1 -1 1 1 -1 1 -1 1 1 1 1 ...
        1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1 1 1 1 1];
Preamble1=zeros(1,Nfft);
Preamble1(2:27)=Preamble(27:end);
Preamble1(39:end)=Preamble(1:26);
preamble1=ifft(Preamble1);
preamble1 = [preamble1(Nfft - Ncp + 1:end) preamble1];
%仿真循环
for ii=1:length(EbNo)
%发射机部分
msg1=randsrc(Nsp,Nd*Nfrm,[0:M1-1]);    %QPSK信息数据
msg2=randsrc(Nsp,Nd*Nfrm,[0:M2-1]);    %16QAM信息数据
data1=pskmod(msg1,M1,pi/4);            %QPSK调制
data2=qammod(msg2,M2)/sqrt(10);        %16QAM调制

    data3=zeros(Nfft,Nd*Nfrm);         %数据重排
    data4=zeros(Nfft,Nd*Nfrm);

    data3(2:27,:)=data1(27:end,:);
    data3(39:end,:)=data1(1:26,:);

    data4(2:27,:)=data2(27:end,:);
    data4(39:end,:)=data2(1:26,:);

    clear data1 data2;

    data3=ifft(data3);                 %IFFT变换
    data4=ifft(data4);

    data3=[data3(Nfft-Ncp+1:end,:);data3];    %加入循环前缀
    data4=[data4(Nfft-Ncp+1:end,:);data4];

    spow1=norm(data3,'fro').^2/(Nsp*Nd*Nfrm); %计算符号能量
    spow2=norm(data4,'fro').^2/(Nsp*Nd*Nfrm);

    data5=zeros(Ns,(Nd+1)*Nfrm);              %加入训练符号
    data6=data5;
    for index=1:Nfrm
        data5(:,(index-1)*(Nd+1)+1)=preamble1.';
        data5(:,(index-1)*(Nd+1)+2:index*(Nd+1))=data3(:,(index-1)*Nd+1:index*Nd);

        data6(:,(index-1)*(Nd+1)+1)=preamble1.';
        data6(:,(index-1)*(Nd+1)+2:index*(Nd+1))=data4(:,(index-1)*Nd+1:index*Nd);
    end

    clear data3 data4

    data5=reshape(data5,1,Ns*(Nd+1)*Nfrm);    %串并变换
    data6=reshape(data6,1,Ns*(Nd+1)*Nfrm);

    data51=zeros(1,length(data5));
    data61=zeros(1,length(data6));
    data51(5:end)=data5(1:end-4);
    data61(5:end)=data6(1:end-4);

    sigma1=sqrt(1/2*spow1/log2(M1)*10.^(-EbNo(ii)/10));    %根据EbNo计算噪声标准差
    sigma2=sqrt(1/2*spow2/log2(M2)*10.^(-EbNo(ii)/10));

    for indx=1:Nfrm
        dd1=data5((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1));
        dd2=data6((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1));
        dd3=data51((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1));
        dd4=data61((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1));

        hh=h((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1));         %当前数据包的单径信道参数
        hh1=h1((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1));       %当前数据包的2径信道参数
        hh2=h2((indx-1)*Ns*(Nd+1)+1:indx*Ns*(Nd+1));

        %信号通过单径衰落信道,并加入高斯白噪声
        r1=hh.*dd1+sigma1*(randn(1,length(dd1))+j*rand(1,length(dd1)));
        r2=hh.*dd2+sigma1*(randn(1,length(dd2))+j*rand(1,length(dd2)));

        %信号通过2径衰落信道,并加入高斯白噪声

        r11=hh1.*dd1+hh2.*dd3+sigma1*(randn(1,length(dd1))+j*rand(1,length(dd1)));
        r21=hh1.*dd2+hh2.*dd4+sigma1*(randn(1,length(dd2))+j*rand(1,length(dd2)));

        r1=reshape(r1,Ns,Nd+1);    %并串变换
        r2=reshape(r2,Ns,Nd+1);

        r11=reshape(r11,Ns,Nd+1);
        r21=reshape(r21,Ns,Nd+1);

        r1=r1(Ncp+1:end,:);        %移除循环前缀
        r2=r2(Ncp+1:end,:);

        r11=r11(Ncp+1:end,:);
        r21=r21(Ncp+1:end,:);

        %根据训练符号进行的信道估计
        R1=fft(r1);                %FFT变换
        R2=fft(r2);

        R11=fft(r11);
        R21=fft(r21);

        R1=[R1(39:end,:);R1(2:27,:)];    %数据重排
        R2=[R2(39:end,:);R2(2:27,:)];
        R11=[R11(39:end,:);R11(2:27,:)];
        R21=[R21(39:end,:);R21(2:27,:)];

        HH1=(Preamble.')./R1(:,1);       %信道估计
        HH2=(Preamble.')./R2(:,1);

        HH11=(Preamble.')./R11(:,1);
        HH21=(Preamble.')./R21(:,1);

        HH1=HH1*ones(1,Nd);
        HH2=HH2*ones(1,Nd);
        HH11=HH11*ones(1,Nd);
        HH21=HH21*ones(1,Nd);

        x1=R1(:,2:end).*HH1;             %信道补偿
        x2=R2(:,2:end).*HH2;
        x3=R11(:,2:end).*HH11;
        x4=R21(:,2:end).*HH21;

        x1=pskdemod(x1,M1,pi/4);         %数据解调
        x2=qamdemod(x2.*sqrt(10),M2);
        x3=pskdemod(x3,M1,pi/4);
        x4=qamdemod(x4.*sqrt(10),M2);

        %统计一帧中的错误比特数
        [neb1(indx),temp]=biterr(x1,msg1(:,(indx-1)*Nd+1:indx*Nd),log2(M1));
        [neb2(indx),temp]=biterr(x2,msg2(:,(indx-1)*Nd+1:indx*Nd),log2(M2));
        [neb3(indx),temp]=biterr(x3,msg1(:,(indx-1)*Nd+1:indx*Nd),log2(M1));
        [neb4(indx),temp]=biterr(x4,msg2(:,(indx-1)*Nd+1:indx*Nd),log2(M2));
    end
    ber1(ii)=sum(neb1)/(Nsp*log2(M1)*Nd*Nfrm);    %理想信道的误比特率
    ber2(ii)=sum(neb2)/(Nsp*log2(M2)*Nd*Nfrm);

    ber3(ii)=sum(neb3)/(Nsp*log2(M1)*Nd*Nfrm);    %2径信道的误比特率
    ber4(ii)=sum(neb4)/(Nsp*log2(M2)*Nd*Nfrm);

end
semilogy(EbNo,ber1,'-ro',EbNo,ber3,'-rv',EbNo,ber2,'-r*',EbNo,ber4,'-rd')
grid on
title('OFDM系统误比特率性能')
legend('QPSK单径信道','QPSK2径信道','16-QAM单径信道','16-QAM2径信道')
xlabel('信噪比(EbNo)')
ylabel('误比特率')

    仿真结果如下:

    从仿真结果中可以看出,同一种调制方式下,数据通过单径信道和2径信道的误比特率比较接近,证明了OFDM通信系统可以改善多径效应。

 

参考文献

[1][2]    樊昌信,曹丽娜.通信原理 第七版[M].国防工业出版社,2012.

[3]    刘学勇.详解MATLAB/SIMULINK 通信系统建模与仿真[M].电子工业出版社,2011.

[4]    子木.OFDM完整仿真过程及解释(MATLAB) [DB/OL].Online available at :https://zhuanlan.zhihu.com/p/57967971,or,https://blog.csdn.net/qq_41687938/article/details/89404046,2019-9-12.

 

评论 41
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值