OFDM学习过程及仿真

一、OFDM波形理解

​ 正交频分复用(OFDM)技术基于频分复用(FDM)技术发展,因此技术层面十分相似。与FDM基本原理相同,OFDM把高速的数据流通过串并变换,分配到速率相对较低的若T干个频率子信道中进行传输,不同的是,OFDM技术能够更好地利用控制方法,使频谱利用率有所提高。

(一)频分复用(FDM)

​ 为了对比更加简单的理解正交频分复用和传统的频分复用的波形,我们从波形出发对两种技术进行对比。下面是一张有关频分复用的原理图。简单理解,在一个无线信道中发射的数字信号,它可以表示为矩形基带信号与正弦载波相乘的形式,在频域中,矩形基带信号的表示是Sa函数,正弦载波的表示为冲激函数。时域中的相乘可以转化为频域中的卷积,所以从频域的角度看,这个数字信号是一个位于载波频率上的Sa函数。之后,可以通过将另一个信号放在同一个信道中同时选择另一个载波频率,在接收端通过滤波器的选择提取目标信号的大部分主瓣,但是仍然存在一些来自其他信号的干扰,因此可以通过设置频率上的间隔来发送不同的信号,这就是典型的频分复用,即FDM。

图片1

(二)正交频分复用(OFDM)

​ 经过上面的介绍,我们了解到FDM为了减少干扰,频域上的间隔必须较大,这导致通信系统有效性不高。为了更有效的使用频域,即让这些载波可以靠更近间隔更小,这样就可以在不降低可靠性的前提下容纳更多的并行通道。如何做到这一点?现在我们可以用正交频分复用(OFDM)。

​ OFDM中的O代表着正交,所以我们应该先考虑信号是如何正交的,正交的作用是什么。考虑一种最简单的情况,sin(t)sin(t)sin(2t)sin(2t)是正交的,即:

02πsin(t)sin(2t)dt=0\int_{0}^{2\pi}\sin(t)\cdot\sin(2t)dt=0

​ 下面通过图示的方式可以直观的感受到信号正交在通信系统的应用。假设这里我们采用最简单易懂的幅度调制调制方式,两个不同频率的载波分别为sin(t)sin(t)sin(2t)sin(2t),其中sin(t)sin(t)传送信号aasin(2t)sin(2t)传送信号bb,因此在信道中传送的信号为asin(t)+bsin(2t)a·sin(t)+b·sin(2t)。在接收端,分别对接收到的信号坐关于sin(t)sin(t)sin(2t)sin(2t)积分检测(相干解调),就可以得到aabb,这就完成两位数据的并行传播。

信号正交

​ 可见通过我们仔细选取的两个不同频率的正弦载波,它们是可以实现通过同一信道,即使在频域中发生重叠,也同样可以在接收端非常准确的恢复出所发送的信号。下一步,我们通过将sin(t)sin(t)sin(2t)sin(2t)扩展到更多的子载波序列{sin(2πΔft),sin(2πΔf2t),sin(2πΔf3t),,sin(2πΔfkt)}\{\sin(2\pi\cdot\Delta\mathrm{f}\cdot\mathrm{t}) , \sin(2\pi\cdot\Delta\mathrm{f}\cdot2\mathrm{t}) , \sin(2\pi\cdot\Delta\mathrm{f}\cdot3\mathrm{t}),\ldots,\sin(2\pi\cdot\Delta\mathrm{f}\cdot\mathrm{kt})\}(例如k=16,256,1024k=16,256,1024等),它们也是正交的。之后,将可以将cos(t)cos(t)进行引入,同样可以很简单的证明得到02πsin(t)cos(t)dt=0\int_{0}^{2\pi}\sin(t)\cos(t)dt=0,说明sin(t)sin(t)cos(t)cos(t)是正交的,也与sin(kt)sin(kt)的正交族相正交,继续扩展得到cos(kt)cos(kt)也与sin(kt)sin(kt)的正交族相正交。因此,我们的子载波序列就可以通过cos(kt)cos(kt)扩展到{sin(2πΔft),sin(2πΔf2t),sin(2πΔf3t),...,sin(2πΔfkt),cos(2πΔft),cos(2πΔf2t),cos(2πΔf3t),...,cos(2πΔfkt)}\{\sin(2\pi\cdot\Delta f\cdot t),\sin(2\pi\cdot\Delta f\cdot2t),\sin(2\pi\cdot\Delta f\cdot3t),...,\sin(2\pi\cdot\Delta f\cdot kt),\cos(2\pi\cdot\Delta f\cdot t),\cos(2\pi\cdot\Delta f\cdot2t),\cos(2\pi\cdot\Delta f\cdot3t),...,\cos(2\pi\cdot\Delta f\cdot kt)\}。然后利用信号正交性,来看看信道中传输的信号吧。这里,我们假设sin(t),sin(2t),...,sin(kt)sin(t),sin(2t),...,sin(kt)分别幅度调制a1,a2,...,aka_1,a_2,...,a_k信号,cos(t),cos(2t),...,cos(kt)cos(t),cos(2t),...,cos(kt)分别幅度调制b1,b2,...,bkb_1,b_2,...,b_k信号。这2n组互相正交的信号同时发送出去,再进行简单的相加叠加,将会得到如下的发送信号:

f(t)=a1sin(2πΔft)+a2sin(2πΔf2t)+a3sin(2πΔf3t)+aksin(2πΔfkt)+b1cos(2πΔft)+b2cos(2πΔf2t)+b2cos(2πΔf3t)+bkcos(2πΔfkt)=n=1k{ansin(2πΔfnt)+bncos(2πΔfnt)}\begin{aligned}f(t)=&a_{1}\cdot\sin(2\pi\cdot\Delta f\cdot t)+\\&a_{2}\cdot\sin(2\pi\cdot\Delta f\cdot2t)+\\&a_{3}\cdot\sin(2\pi\cdot\Delta f\cdot3t)+\\\\&a_{k}\cdot\sin(2\pi\cdot\Delta f\cdot kt)+\\&b_{1}\cdot\cos(2\pi\cdot\Delta f\cdot t)+\\&b_{2}\cdot\cos(2\pi\cdot\Delta f\cdot 2t)+\\&b_{2}\cdot\cos(2\pi\cdot\Delta f\cdot 3t)+\\&b_{k}\cdot\cos(2\pi\cdot\Delta f\cdot kt)=\sum_{n=1}^{k}\{a_{n}\sin(2\pi\cdot\Delta f\cdot nt)+b_{n}\cdot\cos(2\pi\cdot\Delta f\cdot nt)\}\end{aligned}

上式为了方便进行数学处理,根据欧拉公式其复数表达形式为:f(t)=n=1kFne(j2πΔfkt)f(t)=\sum_{n=1}^{k} {F_n}e^{(j·2\pi·\Delta{f}·kt)}。这样,每个子载波序列都在发送自己的信号,互相交叠,最终在接收端看到的信号就是f(t)f(t)。接收端收到叠加信号f(t)f(t)后,再在每个子载波上分别作相乘后积分的操作,就可以取出每个子载波分别承载的信号了。不难发现,f(t)f(t)的表达式就是傅里叶级数。如果将tt离散化,那么就是离散傅立叶变换,所以OFDM可以使用FFT来实现。下面是针对正交频分复用的时域系统图方便理解。

正交频分复用

​ 我们利用仔细筛选的信号的正交特性在时域上验证了OFDM的可行性。但是,需要主要的是,作为载波的sin(t)sin(t)cos(t)cos(t),它们如果需要正交的话,其发送的时机是有有严格限定的,即其0点的位置需要同步,再加上信道的不确定性,这也就说明OFDM较难在时域上实现。结合频分复用的原理以及缺陷,我们提出OFDM在频域上想要实现的结果其实是如下图所示的。

image-20240623115909732

​ 上述两路信号继续靠近,间隔频率互相正交,因此频谱虽然有重叠,但是在接收端分别恢复两路信号时仍然可以是没有互相干扰。现在,我们看一看频域上OFDM是如何工作的。我们将sin(t)sin(t)sin(2t)sin(2t)以及待发信号(限定在[0,2π][0,2\pi]范围内),观察频谱变化(简单的频谱搬移)。

时域对应频域

​ 现在我们将sin(t)sin(t)sin(2t)sin(2t)所传信号的频谱叠加在一起,利用脉冲成型滤波器(发送滤波器)进行余弦滚降对频谱混叠的待发信号进行修理,这样可以有效的限制带宽外部的信号,在保证本路信号没有码间串扰的情况下,既能最大限度的利用带宽,又能减少子载波间的各路信号的相互干扰。这时我们回想到这样一个问题OFDM正交频谱叠加部分到底有多宽呢?其实,OFDM的子载波间隔最低能达到奈奎斯特带宽,也就是说(在不考虑最旁边的两个子载波情况下),OFDM达到了理想信道的频带利用率

​ 我们可以对两路信号进行扩展,OFDM适用用很多路信号。这样较多的并行通道,并且所有的通道频率完全对其,彼此的频率差恰好是Δf\Delta{f}的整数倍,这样就确保了多路信号互不干扰在接收端都能正确恢复信号。啊,这就是OFDM的神奇之处!啊,这就是正交性在通信系统的可用之处!啊,这就是OFDM的意义所在。

OFDM两路到多路

二、OFDM通信系统中的一些新知识

(一)OFDM符号

​ 第一章节我们从波形的角度(也有公式)简单理解了OFDM的产生以及原理,简单来说,OFDM是一种特殊的正交多载波传输技术,传统的多载波传输技术需要通过保留频率间隔来保证传输的可靠性,OFDM通过保证频域多个子载波之间的正交性来实现传输,不同的正交的子载波不影响其他子载波上信息的传送,提高了频带利用率。

​ 在频域,每个子载波的频谱采用的是sincsinc函数形式的频谱,在时域对应的是方波函数。记住对于周期为TT的方波g(t)g(t),频域sincsinc函数的零

点为k/T,k=0,±1,±2,k/T,k=0,\pm1,\pm2,\cdots,时域上方波函数用来携带信息符号

g(t)={1,0tT0,其他\left.g(t)=\left\{\begin{array}{ll}1,&0\leqslant t\leqslant T\\0,&\text{其他}\end{array}\right.\right.

​ 根据傅立叶变换的频移特性把频域的sinc函数平移到不同的子载波上,

gk(t)=g(t)ej2πfkt=g(t)ej2πkTtG(fkT)g_k(t)=g(t)e^{j2\pi f_kt}=g(t)e^{j2\pi\frac kTt}\leftrightarrow G(f-\frac kT)

​ 在时域把多个携带信息符号dkd_k (基带调制后的符号)的子载波信号 (时间范围为[0,T][0,T])叠加得到一个OFDM符号,一起发送出去。由于
子载波通常在零频附近对称排列,那么包含NN个子载波信息的OFDM符号在时域的表达式可以写成

s(t)=k=N/2N/21dkgk(t)=k=N/2N/21dkexp(j2πktT)g(t)=k=N/2N/21dkexp(j2πktT)s(t)=\sum_{k=-N/2}^{N/2-1}d_kg_k(t)=\sum_{k=-N/2}^{N/2-1}d_k\exp\biggl(\text{j}\frac{2\pi kt}T\biggr)g(t)=\sum_{k=-N/2}^{N/2-1}d_k\exp\biggl(\text{j}\frac{2\pi kt}T\biggr)

​ 在这里我们知道OFDM符号就是一个OFDM周期下在时域上把把多个携带信息符号dkd_k (基带调制后的符号)的子载波信号叠加,是不是就是码。通俗来讲,一个OFDM符号就像是一辆装满货物的大货车,每个子载波就像是货车上的一个箱子,而每个箱子中的货物就是数据符号。

(二)导频

​ 导频不携带信息,导频是双方已知的数据,因为所有子载波会产生一定的相位偏移,在信号中插入导频是提供相位参考,来做接收信号时候的信道估计。其原理为:将训练信号(导频)插入帧中,以便接收器可以根据导频和数据类似地失真的假设来估计信道响应。 因此,设计一种适当的导频模式来满足这种假设。 OFDM系统中的典型导频模式有:块,梳状和分散式。下面是B站一位UP主对导频的讲解。

导频

(三)帧结构

​ 在OFDM系统中,帧是指一种数据组织和传输的方式。一个帧由多个OFDM符号组成,每个OFDM符号包含多个子载波,每个子载波上都可以携带一部分数据。帧结构通常包括数据部分和控制信息部分。数据部分是实际要传输的用户数据,而控制信息部分包含了一些用于管理和控制通信的信息,如同步信息、信道状态信息等。帧结构的设计是为了更有效地管理和控制数据的传输,以提高数据传输的效率和可靠性。通过将数据和控制信息组织成帧的形式,可以更好地调度和管理资源,以满足不同的通信需求。通俗来讲,帧在OFDM系统中就像是一种“容器”,用来装载和传输数据和控制信息。

(四)保护间隔

​ 保护间隔(Guard)也叫做保护频带。其作用为:多径信道会对OFDM符号造成ISI影响,破坏了子载波间的正交性。故需要采取一些方法来消除多径信道带来的符号间干扰(ISI)影响,即插入保护间隔。OFDM系统中设置保护间隔的方法有:①补零(zp),即在保护间隔中填充0;②插入循环前缀(cp)或循环后缀(cs)实现OFDM的循环扩展(为了某种连续性),cp是将OFDM后部的采样复制到前面,长度为TcpT_cp,故每个符号的长度为Tsym=Tsub+TcpT_sym=T_sub+T_cpTsubT_sub为数据部分子载波数。TcpT_cp大于或等于多径时延,符号间的ISI影响将被限制在保护间隔中,因此不会影响下一个OFDM的FFT变换。下面视频是UP主对保护间隔的讲解

(五)帧、符号、导频、保护间隔的关系

​ 这里有一张形象的图示阐述帧、符号、子载波、导频、保护间隔的关系。图中是一帧数据,64× 8 的矩阵,64行表示64个子载波,8列表示8个OFDM符号。

帧等联系

(六)QAM调制

​ 正交幅度调制QAM(Quadrature Amplitude Modulation)是Wi-Fi中一种常用的数字信号调制,是相位调制和幅度调制的组合。QAM在用于Wi-Fi数字信号调制时,与普通幅度调制和相位调制相比能得到更高的速率。因为幅度调制和相位调制仅有2种符号(symbol)来区分0或1。

  • 幅度调制:通过改变载波的振幅来区分0和1(ASK)。

  • 相位调制:通过改变载波的相位来区分0和1。例如我们常见的BPSK,就是使用0°和180°共2个相位表示0和1,即2种符号;QPSK则是使用0°、90°、180°和270°共4个相位,能够表示00、01、10和11共4种符号,传递2 bit的信息。其实QPSK就是一种特殊的QAM,即4-QAM。

​ MPSK调制中随着M的增大,虽然携带信息量增加了,但是图中两个点的欧氏距离越来越近,这表明有效性确实增加了但是可靠性下降了。想要增大距离,一种方式是增大圆的半径但是这意味这发射功率的增大,所以想要通过在不增大发射功率的情况下改变星座结构来改善可靠性。

image-20240604100244803

信号的一个码元可以表示为

sk(t)=Akcos(ω0t+θk)kT<t(k+1)Ts_k\left(t\right)=A_k\cos(\omega_0t+\theta_k)\quad kT<t\leq(k+1)T

式中,k=k=整数;AkA_kθk\theta_k 分别可以取多个离散值。
上式可以展开为

sk(t)=Akcosθkcosω0tAksinθksinω0ts_k(t)=A_k\cos\theta_k\cos\omega_0t-A_k\sin\theta_k\sin\omega_0t

Xk=AkcosθkX_k=A_kcos\theta _k Yk=AksinθkY_k= - A_ksin\theta_k
则信号表示式变为

sk(t)=Xkcosω0t+Yksinω0ts_k\left(t\right)=X_k\cos\omega_0t+Y_k\sin\omega_0t

XkX_kYkY_k 也是可以取多个离散值的变量。从上式看出,sk(t)s_k(t)可以看作是两个正交的振幅键控信号之和。

PSK和QSK对比

​ QAM则有更多的符号,每个符号都有相应的相位和幅度值。以16-QAM为例,通过QAM调制可得到16个不同的波形,分别代表0000,0001…这也意味着一共有16种符号,一个符号可以传递4bit信息。下面是一张示意图。

QAM示意图

​ QAM是将信号加载到2个正交的载波上(通常是正弦和余弦),通过对这两个载波幅度调整并叠加,最终得到相位和幅度都调制过的信号。这两个载波通常被称为I信号,另一个被称为Q信号,所以这种调制方式也被称为IQ调制。由于QAM最终调制后的信号包含了相位和幅度的变换,因此QAM也被认为相位调制和幅度调制的组合。下图QAM调制的实现方式。

QAM实现

​ 在数字信号调制中,星座图通常用于表示QAM调制二维图形。星座图相对于IQ调制而言,将数据调制信息映射到极坐标中,这些信息包含了信号的幅度信息和相位信息。星座图上的每一个点,都表示一个符号。该点I轴和Q轴的分量分别代表着正交的载波上的幅度调整。该点到原点的距离A就是调制后的幅度,夹角φ就是调制后的相位。

星作图

三、OFDM基本链路仿真

​ 下面进行OFDM基本链路仿真,该仿真来自MATLAB官方无线通信入门之旅。

(一)IDFT和DFT

​ 首先回顾一下DFT与IDFT,即离散傅里叶变换

X(k)=n=0N1x(n)ej2πnk/NX(k)=\sum_{n=0}^{N-1}x(n)e^{-j2\pi nk/N}

x(n)=1Nk=0N1X(k)ej2πkn/Nx(n)=\frac1N\sum_{k=0}^{N-1}X(k)e^{j2\pi kn/N}

​ 对OFDM时域符号s(t)s(t)以周期为T/NT/N采样,那么有

sn=s(t)t=nTN=k=N/2N/21dkexp(j2πkTnTN)=k=N/2N/21dkexp(j2πnkN)s_n=s(t)|_{t=n\frac TN}=\sum_{k=-N/2}^{N/2-1}d_k\exp\left(\mathrm{j}\frac{2\pi k}T*\frac{nT}N\right)=\sum_{k=-N/2}^{N/2-1}d_k\exp\left(\mathrm{j}\frac{2\pi nk}N\right)

这里对OFDM符号的采样频率做出如下解释:一个OFDM符号的频谱由NN个子载波组成,在零频附近对称排列有N/2N/2个sinc函数,零点为k/T,k=±1,±2,k/T,k=\pm1,\pm2,\cdots,那么其截止频率大约为N/21/T=N2TN/2*1/T=\frac N{2T}。为了满足采样定理,采样频率最低为N/TN/T,对应的采样周期为T/NT/N。这里的采样周期是符合采样定理的。

​ 可以看到采样后的OFDM符号与IDFT(离散傅里叶逆变换)的表达式非常类似,仔细观察,发现只相差1N\frac1N的系数与kk的求和范围,那么可以考虑利用快速傅里叶变换IFT来实现OFDM的采样后的序列,再经过数模转换得到时域的模拟信号。那么有

sn=k=N/2N/21dkexp(j2πnkN)=k=0N/21dkexp(j2πnkN)+k=N/20dkexp(j2πnkN)=k=0N/21dkexp(j2πnkN)+k=N/2N1dkˉNexp(j2πn(kˉN)N)=1Nk=0N1akexp(j2πnkN)\begin{aligned}s_{n}&=\sum_{k=-N/2}^{N/2-1}d_k\exp\biggl(\mathrm{j}\frac{2\pi nk}N\biggr)\\&=\sum_{k=0}^{N/2-1}d_k\exp\biggl(\mathrm{j}\frac{2\pi nk}N\biggr)\:+\:\sum_{k=-N/2}^0d_k\exp\biggl(\mathrm{j}\frac{2\pi nk}N\biggr)\\&=\sum_{k=0}^{N/2-1}d_k\exp\biggl(\mathrm{j}\frac{2\pi nk}N\biggr)\:+\:\sum_{k=N/2}^{N-1}d_{\bar{k}-N}\exp\biggl(\mathrm{j}\frac{2\pi n(\bar{k}-N)}N\biggr)\\&=\frac1N\sum_{k=0}^{N-1}a_k\exp\biggl(\mathrm{j}\frac{2\pi nk}N\biggr)\end{aligned}

​ 可以看到,把dkd_k重新排列,并且乘上NN系数补偿得到aka_k ,之后再对aka_k做IFFT就可以得到OFDM符号的采样序列sns_n。实际上,IFFT通常是直接用FFT的算法来实现的,只是指数项缺少一个负号以及系数1/N1/N的差别,实际做的时候又会FFT后再乘以1/N1/N。因此就可以不用先乘以NN补偿系数,直接把dkd_k进行重新排列,然后利用FFT的算法实现k=0N1akexp(j2πnkN)\sum_{k=0}^{N-1}a_k\exp\left(\mathrm{j}\frac{2\pi nk}N\right)就可以了,有

ak={dk,0kN21dkN,N2kN1\left.a_k=\left\{\begin{array}{ll}d_k,&0\leqslant k\leqslant\frac N2-1\\d_{k-N},&\frac N2\leqslant k\leqslant N-1\end{array}\right.\right.

​ 在接收端,同样的道理,对接收到的时域信号进行采样,然后做FFT,可以得到接收端解调后的符号(记为bkb_k)。
​ 总结:之所以可以用IFT/FFT来快速实现OFDM,是因为叠加得到的时域上的多个正交子载波的信号s(t)s(t)通过模数转换后的形式与IFFT非常类似,可以通过信息符号重排列后进行IFFT再经过数模转换得到s(t)s(t)

(二)OFDM抗多径频率选择性衰落原理

频率选择性衰落主要是由于多径效应,信号经过不同的路径传播,到达接收端时会经历不同的衰落,引起信道对不同频率分量的影响不同。相干带宽与信道的多径时延扩展成反比,多径时延扩展越大,相干带宽越小。如果信号的周期远大于多径时延扩展,那么多径引起的频率选择性衰落的影响可以忽略不计,可以认为发生频率非选择性衰落。

​ 在OFDM中,高速串行的数据被串并转换到多个正交的子载波上,变成低速的并行多载波信号,信号的周期会增大,因此对抗频率选择性衰落的能力也相应增强。下面是OFDM串并转换的示意图。

串并转换

​ 下面看一下经过滤波器的QAM高速信号的频谱,OFDM将通带划分为多个更小的子频带,这样串行流的每个QAM信号都将转化为子频带之一,从数学上讲这就相当于每个符号都乘以一个负指数ej2π(mkN)e^{j2\pi(\frac{mk}{N})}从而做到频率上的搬移,这样每个符号都在不同的频率上称之为子载波。结合上面的推导,我们可以知道可以通过IFFT快速实现

OFDM实现

(三)OFDM简单链路

​ 由于IDFT可以使用IFFT快速实现,所以最简单的OFDM链路可以通过在发射器中使用IFFT然后经过信道在接收机中使用FFT完成链路仿真。下面是简单OFDM仿真链路的基本原理图。

OFDM链路框图

​ 从原理框图可知,在发射端我们要生成QAM信号并对生成的信号进行IFFT变换,下面是对应的MATLAB代码:

1
2
3
4
5
6
7
numBits = 32768;  %二进制源码数,2的指数
modOrder = 16; % 设定QAM进制,16-QAM

srcBits = randi([0,1],numBits,1); %随机生成二进制源码
qamModOut = qammod(srcBits,modOrder,"InputType","bit","UnitAveragePower",true); %QAM调制
scatterplot(qamModOut) %绘制散点图
title("16-QAM Signal") %散点图标题

如图右图为经过16-QAM调制得到的星座图,由于我们随机了32768bit的二进制数,根据16-QAM调制4个bit组成一个符号,故一共有32768÷4=819232768÷4=8192个符号(注意这里的符号不是指OFDM符号,在这里我们只有一个OFDM符号它是由8192个子载波组成),但是在星座图中我们只能看到16个点,这是因为没有噪声所有的结果重叠在这16点了。

​ 在16-QAM调制中使用了"UnitAveragePower"参数,这是为了确保调制后的QAM符号集的平均功率被规范化到1(即单位功率)。这样确定单位功率相同就可以使信号在功率水平上具有可比性。这一点会在QAM解调中体现。对于右边这样一个星座图,我们知道如果发射功率越大,那它的外圈一定会越大。

​ 在信道里我们之加入加性高斯噪声,对应MATLAB代码如下:

1
2
3
4
5
6
ofdmModOut = ifft(qamModOut);%用ifft实现OFDM调制

if exist("ofdmModOut","var")
SNR = 15; % 设定信噪比
chanOut = awgn(ofdmModOut,SNR,"measured"); %信号经信道后的输出结果
end

​ 在接收端首先将收到的信号进行FFT变换,通过输出的散点图用来和输入端对比,之后,进行QAM解调并计算最后的误码率,对应MATLAB代码如下。

1
2
3
4
5
6
7
8
9
10
ofdmDemodOut = fft(chanOut); %FFT解调
scatterplot(ofdmDemodOut); %绘制散点图
title("ofdmDemodOut Signal"); %散点图标题


if exist("ofdmDemodOut","var")
qamDemodOut = qamdemod(ofdmDemodOut,modOrder,"OutputType","bit","UnitAveragePower",true); %QAM解调
numBitErrors = nnz(srcBits~=qamDemodOut); %按为对比,计算误码率;
BER = numBitErrors/numBits; %计算误码率
end

可以看到在经过加性高斯白噪声后经过FFT解调出的信号效果还是很不错的。对解调后的信号我们计算其误比特率得到的结果是:0.40.4%%,可以看到OFDM在加性高斯白噪声信道下表现是很不错的。下面我们引入多径信道,验证OFDM的抗多径能力,得到的结果如图,可以看到星座图一片杂乱效果非常不好。可见只是通过IFFT实现OFDM进行传输抗其多径效应能力效果不理想,这种条件下,计算得到误比特率为:22.8322.83%(!!!可恶呀,我觉得这个效果还行啊!!!!!😀😀😀)

​ 最后我们尝试引入多径信道,观察OFDM抗多径效应的能力(多径信道带来的通道效应有三个:瑞丽性衰落、频率弥散以及频率选择性衰落),引入多径考虑一个通道效应,对应MATLAB代码如下:

1
2
3
4
5
SNR = 15;  % 设定信噪比
%chanOut = awgn(ofdmModOut,SNR,"measured"); %信号经信道后的输出结果
hasMultipath = true;
hasAWGN = true;
chanOut = channel(ofdmModOut,hasMultipath,hasAWGN,SNR);

(四)频域均衡

​ 在上一节我们通过简单的链路仿真发现使用IFFT实现OFDM其实很简单,但是这样简单的实现实际上对抗多径效应没有太大帮助。

OFDM多径链路框图

​ 这里MATLAB官方给出的解释是这样的:因为信道基本上可以看作是一个滤波器,理想情况下,该滤波器在信号带宽上的频谱是平坦的,之后可以通过接收机中简单的复数增益来补偿信号经过信道后的损失和相位变化,但是多径信道的频谱会随着信号的带宽而变化(频率选择性衰落),其中不同频率的衰落量也不同,这样接收机中就需要使用均衡器来消除信道中产生的所有波峰和波谷。

​ 对于OFDM,其接收机的秘诀就在于它如何执行这种均衡。均衡器很像音频均衡器,它可以增加或减少不同频率的增益。OFDM将高速率信号转化为并行的低速率信号,且每个低速率信号的带宽都很窄,因此它会遇到一个频谱相对平坦的通道(平坦性衰落),这就意味着均衡器可以简单的应用复数增益还可以单独的应用于每一个子载波,从而消除波峰和波谷。而且,由于这种均衡发生在频域,因此实现起来很容易,可以通过估计信道,然后简单的相除就可以得到所传输信号的估计值。但是该方法有一个缺点,即这个简单的均衡方程只有在信道对信号执行循环卷积时才成立,实际情况却是信道我们看作一个滤波器执行的是线性卷积。所以我们接下来的任务就是将线性卷积转化为循环卷积。

​ 这里我们知道如果信号是周期性的,那么针对该信号线性卷积和循环卷积是相同的,所以我们只需要将信号变为周期性的,这样信道就会执行循环卷积。在前面讲解保护间隔时,CP即循环前缀可以实现OFDM的循环扩展。取一个OFDM符号,从末尾处获取一些时域样本将它们添加到开头,这样就可以得到一个周期性的序列(至少对信道来说是足够周期性的,这是因为我们CP的长度至少要与信道的冲击相应一样)。虽然循环前缀会受到多径时间拖尾的影响,但是由于这是和末尾信息是重复的,所以循环前缀是否被损坏并不重要。这样,在接收机执行FFT之前我们需要先去掉循环前缀,之后就可以使用简单的除法来实现均衡信号的输出得到QAM信号。

更实用的OFDM

​ 首先我们进行基本参数的设置,通过设定一个多径信道的模型、设定信噪比,最后进行QAM调制,下面是MATLAB代码:

1
2
3
4
5
6
7
8
9
modOrder = 16; 
bitsPerSymbol = log2(modOrder); %每个状态可以编码4比特,一个码字4bit
mpChan = [0.8; zeros(7,1); -0.5; zeros(7,1); 0.34]; %多径信道模型
SNR = 15; %信噪比
numCarr = 8192; %定义子载波的数量
numBits = numCarr * bitsPerSymbol; %整个信号的总比特数
exist("numBits", "var");
srcBits = randi([0,1], numBits, 1); %随机二进制序列,作为要发送的源比特
qamModOut = qammod(srcBits, modOrder, "InputType", "bit", "UnitAveragePower", true);

​ 多径信道模型是用来描述无线信号在传播过程中会经历多条路径到达接收器的现象。这种现象是由于信号在遇到建筑物、山体、大气等障碍物时发生反射、绕射或散射造成的。每条路径上的信号可能会有不同的延迟、衰减或相位变化,最终到达接收器的信号是这些不同路径上信号的叠加。

​ 在上面的代码中,定义了三条路径,每条路径上的信号都有不同的衰减系数:

  • 第一条路径的衰减系数是0.8,代表信号的强度减少了20%,这通常是直达路径(即最短路径,没有反射的路径)
  • 第二条路径的衰减系数是-0.5,代表信号强度减少了50%,并且信号相位发生了180°的反转(由于负号的原因)
  • 第三条路径的衰减系数是0.34,代表信号强度减少了66%

zeros(7,1)表示在第一条路径和第二条路径之间,以及第二条路径和第三条路径之间,有7个时隙的延迟。在这个模型中,这些时隙对应于信号在这些路径上的传播延迟。由于这些延迟,信号在到达接收器时会有时间上的偏移。

​ 然后,对经过QAM调制后的信号进行OFDM调制,再历经多径和加行高斯白噪声信道,对输出信号进行OFDM解调。

1
2
3
4
5
6
7
cycPrefLen = 32; %循环前缀取32位
ofdmdemod = ofdmmod(qamModOut, numCarr, cycPrefLen); %加循环前缀

mpChanOut = filter(mpChan, 1, ofdmdemod); %多径
chanOut = awgn(mpChanOut, SNR, "measured"); %加性高斯白噪声
ofdmdDemodOut = ofdmdemod(chanOut, numCarr,cycPrefLen); %去循环前缀
scatterplot(ofdmdDemodOut);

​ 浅浅解释一下这个循环前缀的位数:为了防止码间干扰,我们加入循环前缀,这里取循环前缀的位数为32位(即将该OFDM符号的末尾32位信息复制到符号前端)主要是出于这样的考虑:我们的多径信道模型mpChan = [0.8; zeros(7,1); -0.5; zeros(7,1); 0.34];第一个元素是0.8,它代表直达路径分量,通常是最强的信号分量。接着是7个零值,对信号没有影响。之后的元素是-0.5。再接着是另外7个零值。最后的元素是0.34,这代表了第二个显著的多径反射分量。信道模型中的非零分量被分隔开,分别位于数组的第1个、第9个和第17个位置,所以我们取一个至少大于17位的循环前缀就行。

ofdmmod函数和ofdmdemod分别是集成了IFFT+循环前缀FFT+去循环前缀的两个MATLAB自带函数,所以你看不到我做了IFFT的代码。

​ 下面我们就需要做一个频域均衡。在做频域均衡前需要先生成多径信道的频域模型(通过FFT变换,并移位生成频域模型),然后通过相除完成均衡,并绘制均衡后的图。以及计算误码率。

1
2
3
4
5
6
7
8
mpChanFreq = fftshift(fft(mpChan,numCarr)); %将多径模型从时域转换到频域
eqOut = ofdmdDemodOut ./ mpChanFreq; %均衡
scatterplot(eqOut);
title("Frequency Domain Equalizer output");
exist("eqOut", "var");
qamDemodout = qamdemod(eqOut, modOrder, "OutputType", "bit", "UnitAveragePower", true); %QAM解调
numBitErrors = nnz(srcBits~=qamDemodout); %一一对比
DER = numBitErrors / numBits %误比特率

mpChanFreq = fftshift(fft(mpChan,numCarr));之前讲过我们进行频域均衡时,需要使用除法,而且由于均衡这一操作发生在频域所以我们对多径模型进行FFT将其从时域转化到频域,但是由于FFT操作将信号从时域转换到频域,输出的频谱数组是从0Hz(直流分量)开始,然后是正频率分量,直到Nyquist频率,之后是负频率分量直到接近0Hz。fftshift通过将FFT输出的零频分量移动到频谱中心,使得负频率分量位于左侧,正频率分量位于右侧。这样我们就能够使用./逐元素除法,使用频域信道估计mpChanFreq来均衡接收信号,以补偿多径信道引起的失真。

​ OFDM通过将宽带信号分割成多个窄带子载波来抵抗频率选择性衰落。每个子载波可以看作是在一个窄带平坦衰落信道中传输,因此可以单独进行均衡处理。在接收端,通过信道估计可以得到信道对每个子载波的影响,即信道的频域响应mpChanFreq。将接收到的信号在频域上的每个点除以对应的频域信道估计值。如果信道增加了某个子载波的幅度,均衡器会相应地减小它;如果信道减少了幅度,均衡器会增加它。同样,如果信道改变了信号的相位,均衡器会逆向调整以补偿这种变化。表达式如下,其中,Y(k)Y(k)是接收到的第kk个子载波的频域信号,Hest(k)H_{est}(k)是第kk个子载波的频域信道估计Yeq(k)Y_{eq}(k)是均衡后的信号。

Yeq(k)=Y(k)Hest(k)Y_{eq}(k)=\frac{Y(k)}{H_{est}(k)}

左图为只使用IFFT做OFDM后经过多径信道后的解调结果,显示出这样简单的OFDM链路抗多径效应的效果不好。右图为使用加入循环前缀后的OFDM并在接收机使用均衡器得到的解调结果,可以看见效果显著提升。这样的OFDM链路的误比特率经过计算为:3.883.88%。

​ 上面一系列简单链路的仿真对比,其实是不公平的,因为每次都是随机生成的,但是影响不大感觉每次都差不多。在下面的内容中我们会带来更加准确的仿真,并更加直观的感受到OFDM的奇妙之处。

​ 下面是一个更加完善更加统一的OFDM通信系统。下面我们将通过MATLAB实现这一系统,同时在此过程更加直观的感受OFDM的奇妙之处。

更加完善的OFDM通信系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
clc
clear
snr = 0:1:20;%dB 高斯信道的SNR
cdata_number = 128;
fft_n = 128;
%OFDM码元个数 500
%生成数据随机序列
cdata_length = 500;
cdata = rand_bit(cdata_number*cdata_length*2);
figure;
subplot(2,1,1);
time(cdata(1,1:200),"信源序列时域图",'B');
subplot(2,1,2);
frequency_response(cdata(1,1:200),"信源序列频谱图",'B');

image-20240602143405880

1
2
3
4
5
6
7
8
9
10
11
12
13
%导频序列在OFDM系统中通常用于辅助接收机进行信道估计,其实这样不好
%导频长度256
%插入导频间隔为5
%生成随机的的导频序列
pilot_inter = 5;
pilot_length = 256;
pilot_bit = rand_bit(pilot_length);
%--------------------------------------------------------------------------
figure;
subplot(2,1,1);
time(pilot_bit(1,1:200),"导频序列时域图",'B');
subplot(2,1,2);
frequency_response(pilot_bit(1,1:200),"导频序列频谱图",'B');

image-20240602144319625

1
2
3
4
5
6
7
8
9
10
11
%进行qpsk调制 输出复数矩阵
qpsk_bit = modulator_QPSK(cdata); %45°、135°、225°和315°
scatterplot(qpsk_bit);

figure;
subplot(2,1,1);
time(real(qpsk_bit(1:100)),"信源序列QPSK",'B');
hold on;
time(imag(qpsk_bit(1:100)),"信源序列QPSK",'R');
subplot(2,1,2);
frequency_response(qpsk_bit(1:100),"信源序列QPSK频谱图",'B');
信源编码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
%串并转换 128*1000
paradata = reshape(qpsk_bit,cdata_number,cdata_length);
%插入导频
inserted_bit = insert_pilot(paradata,pilot_bit,pilot_inter);
%逆傅里叶变换
ifft_data = ifft(inserted_bit,fft_n,1)*sqrt(fft_n);

figure;
subplot(2,1,1);
time(real(ifft_data(1:100)),"逆傅里叶变换时域图",'B');
hold on;
time(imag(ifft_data(1:100)),"逆傅里叶变换时域图",'R');
subplot(2,1,2);
frequency_response(ifft_data(1:100),"逆傅里叶变换频域图",'B');
image-20240602145749739
1
2
3
4
5
figure;
for i = 1:600
hold on;
frequency_response_deshift(inserted_bit(:,i)',"OFDM频域图",'B');
end

image-20240602145936438

1
2
3
4
5
6
7
8
9
10
11
12
13
%插入循环前缀
symbol_cp_pro = cyclic_prefix(ifft_data);
[row,column] = size(symbol_cp_pro);
%经过高斯信道
awgn_err_plot(cdata,symbol_cp_pro);
%ls多径信道
ERR1 = ls_err_plot(cdata,symbol_cp_pro,pilot_bit);
%并串转换
symbol_cp = reshape(symbol_cp_pro,1,[]);
figure;
time(real(symbol_cp(1:160)),"加入CP时域图",'B');
hold on;
time(imag(symbol_cp(1:160)),"加入CP时域图",'R');

误比特率

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
fs = 15000;
ts = 1/fs;
fd = 0;
tau = [0,50,120,200,230,500,1600,2300,5000]/(10^9);
pdb = [-1.0,-1.0,-1.0,0,0,0,-3.0,-5.0,-7.0];
chan = comm.RayleighChannel('SampleRate',1/ts,'PathDelays',tau,'AveragePathGains',pdb,'MaximumDopplerShift',fd);

reset(chan);

% 使用信道对象处理信号
chan_symbol_s = chan(symbol_cp.');

figure;
subplot(2,1,1);
time(real(chan_symbol_s(1:100)),"经过多径信道时域图",'B');
hold on;
time(imag(chan_symbol_s(1:100)),"经过多径信道时域图",'R');
subplot(2,1,2);
frequency_response(chan_symbol_s(1:100),"经过多径信道频谱图",'B');

%叠加高斯信道
SNR = 20;%单位dB
chan_symbol_s = awgn(chan_symbol_s,SNR);
%--------------------------------------------------------------------------
figure;
subplot(2,1,1);
time(real(chan_symbol_s(1:100)),"经过多径信道叠加高斯信道时域图",'B');
hold on;
time(imag(chan_symbol_s(1:100)),"经过多径信道叠加高斯信道时域图",'R');
subplot(2,1,2);
frequency_response(chan_symbol_s(1:100),"经过多径信道叠加高斯信道频谱图",'B');

信号通过高斯信道叠加高斯信道

1
2
3
4
5
6
7
8
figure;
for i=1:100
plot(chan_symbol_s(i),'b*');
title('QPSK调制经过信道后的信号星座图');
xlabel('I(t)');
ylabel('Q(t)');
hold on;
end

image-20240602152308476

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
%串并转换
chan_symbol_p = reshape(chan_symbol_s,row,length(chan_symbol_s)/row);
%去循环码
re_symbol_cp = re_cyclic_prefix(chan_symbol_p);
%fft
fft_symbol = fft(re_symbol_cp,fft_n,1)./sqrt(fft_n);
figure;
subplot(2,1,1);
time(real(fft_symbol(:,1)'),"傅里叶变换时域图",'B');
hold on;
time(imag(fft_symbol(:,1)'),"傅里叶变换时域图",'R');
subplot(2,1,2);
frequency_response(fft_symbol(:,1)',"傅里叶变换频谱图",'B');

%去除导频
[output,pilot_symbol] = re_insert_pilot(fft_symbol,pilot_inter);
pilot_qpsk = modulator_QPSK(pilot_bit);
pilot_patt=repmat(pilot_qpsk',1,100);
pilot_esti=pilot_symbol./pilot_patt; % Y = H*X + S
[r,c] = size(output);
h = zeros(r,c);
for i = 1:100
h(:,(1+(i-1)*5):i*5) = repmat(pilot_esti(:,i),1,pilot_inter);
end
output = output./h;
figure;
subplot(2,1,1);
time(real(output(1:100)),"接收序列QPSK",'B');
hold on;
time(imag(output(1:100)),"接收序列QPSK",'R');
subplot(2,1,2);
frequency_response(output(1:100),"接收序列QPSK频谱图",'B');
figure;
for i=1:100
plot(output(i),'b*');
title('经过信道均衡后的信号星座图');
xlabel('I(t)');
ylabel('Q(t)');
hold on;
end

接收机

1
2
3
4
5
6
7
8
%并串转换
output = reshape(output,1,[]);
re_modulated =re_modulatorQPSK(output);
figure;
subplot(2,1,1);
time(re_modulated(1,1:200),"接收端序列时域图",'B');
subplot(2,1,2);
frequency_response(re_modulated(1,1:200),"接收端序列频谱图",'B');

image-20240602152943166

四、基于OFDM的图像传输通信系统

​ 下面是一个基于OFDM的图像传输通信系统,通过传输睦头人,改变多径数量以及信噪比观察该传输系统的可靠性。

(一)多径数量5、信噪比20dB

image-20240623115548163

(二)多径数量5、信噪比60dB

image-20240623115709257

(三)多径数量1、信噪比20dB

image-20240623115800810

(四)多径数量1、信噪比60dB

image-20240623115813521