FPGA实现OFDM(二)-整体系统框架

时间:2024-05-21 15:12:51

FPGA实现OFDM(二)-整体系统框架

本篇承接(一),首先介绍除了OFDM外,一个完整通信链路中所需的其他环节。然后会给出发射机链路和接收机链路的整体框图,最后结合802.11a介绍相关技术指标。

FPGA实现OFDM(1)-OFDM原理

系统框图调整

FPGA实现OFDM(二)-整体系统框架

在上一篇中,框图部分我们刚介绍了用IFFT/FFT来实现OFDM,通过加循环前缀(CP)来消除ISI和减少ICI。

在这一节中,我们要将整体的OFDM基带实现模型给完整描绘出来,即:

FPGA实现OFDM(二)-整体系统框架

其中,图上省略了在输入的二进制数据之后,FEC编码器之前的加扰的部分,作用是为了避免出现长串的1或0,影响接收机的定时.

前向纠错(英语:forward error correction,缩写FEC)或信道编码(英语:channel coding)是一种在单向通信系统中控制传输错误的技术,通过连同数据发送额外的信息进行错误恢复,以降低比特误码率。

扰码器

在数字通信中,如果出现常‘1’或者常‘0’序列都会影响接收机链路中同步的建立和保持。所以往往可以在发射机链路中加入扰码器(scrambler)来将数字信号变换为具有近似白噪声统计特性的数字序列.这样同时能限制电路中存在不同程度的非线性特性对其他电路通信造成的串扰.

所谓加扰,即在不增加冗余而搅乱信号,改变其统计特性.这项技术的实现方式即耳熟能详的反馈移位寄存器序列(即伪随机序列,m序列).

在硬件实现上,有两种不同的实现方式,分别是输入信号不经过寄存器:

FPGA实现OFDM(二)-整体系统框架

和输入信号经过寄存器:

FPGA实现OFDM(二)-整体系统框架

其中,图中的+号为模2加法,即可以使用异或实现.而在这里,802.11a中采用的是方式1,其中生成多项式为:

S(x)=x7+x4+1S(x)=x^{7}+x^{4}+1

在这种方式下,解扰(descrambler)的过程与加扰电路完全一致.

信道编码

在加扰后,为了加强对信道的抗噪能力,我们需要引入额外的监督码元来对接收信号进行检错纠错即信道编码过程.由于这一部分原理犹如天书,所以仅尽量写得像是个人能读懂的.

在802.11a中主要采用了:卷积编码.在框图中将称之为FEC(forward error correction,前向纠错)编码/译码器

卷积码原理

卷积码的由来,是因为输入的原始消息数据会和编码器(encoder)的冲激响应(impulse response)做卷积运算。即:

yij=k=0hkjxiky_{i}^{j}=\sum_{k=0}^{\infty} h_{k}^{j} x_{i-k}

其中x为输入信号,y为输出信号,而h则为输出信号的冲激响应.

卷积码具有以下特性:

  • 一段k字符的消息(k字符的二进制元字符串)会被编码变换成n字符的符号,k/n即是编码率(code rate,n ≥ k)

  • 监督码元不仅和当前的比特信息段有关,而且还同前面m= (N – 1)个信息段有关,将N称为码组的约束度.

  • 可将卷积码记作(n, k, m),其码率为k/n.

编码过程

一个(n,k,m)卷积编码器由Nk个移位寄存器和n个模2加法器组成。编码输出的n比特不仅取决于正在移入的k比特,还与这之前输入的m个k位有关。所以对一般框图来说:

FPGA实现OFDM(二)-整体系统框架

有三个基本组件,1是移位寄存器,2是模2加法器,3是每输入一组数据,对加法器的并串转换.

自然地,由于其"记忆"的特性,我们可以将此过程看成一个有限状态机,存在着2m2^m个状态,而由于移位寄存器每次移入k位,所以每次状态跳转有2k2^k个分支.

话不多说,我们直接以802.11a中的卷积编码模型为例解释:

802.11a协议中规定卷积编码使用的生成多项式是g0=1338g_0=133_8g1=1718g_1=171_8,码率为1/2.

其中的生成多项式指8进制下的133和8进制下的171,我们可以改写成:

S(x)=x6+x5+x3+x2+1g0S(x)=x6+x3+x2+x1+1g1\begin{array}{l} S(x)=x^{6}+x^{5}+x^{3}+x^{2}+1\quad g_0 \\ S(x)=x^{6}+x^{3}+x^{2}+x^{1}+1\quad g_1 \end{array}

需要注意的是,这里的视角是以输入从左到右看的,所以133和171的二进制应该反过来看.可见,我们只要6个移位寄存器即可实现卷积编码

至此,我们可以得到1/2卷积编码器的原理图:

FPGA实现OFDM(二)-整体系统框架

在此情况下,每输入1比特就是输出A和B两个两个比特,实现1/2码率.

删余

为了提高传输效率,在卷积编码后一边会进行删余(puncture),即周期性删除一些相对不重要的数据比特.进行删余后的卷积编码一般也称作删余卷积码.而在译码前会对删掉的比特位置进行填充.

具体操作如下:

FPGA实现OFDM(二)-整体系统框架

在ofdm系统中,针对不同的数据速率需要不同的编码率,所以我们可以用1/2通过删余得到2/3和3/4等编码率.

FPGA实现OFDM(二)-整体系统框架

所以在很容易可以得到多码率卷积码的硬件结构:

FPGA实现OFDM(二)-整体系统框架

热心的网友的问题:

那这个时候,就会有热心的网友想问:

  1. 为什么不针对2/3,3/4单独开一套卷积编码,非得用1/2去改?在接收端填充不会影响结果的吗?
  2. 你上面写的那个有限状态机是什么东西,有什么用?

那这个时候就要引入解调部分的原理了.

Viterbi算法

其基本原理为:将接收到的序列和所有可能的发送序列作比较,选择其中汉明距离最小的序列当作是现在的发送序列.这是一种利用最大似然估计进行译码的算法.

由于这个算法原理讲清楚很难,看图看懂很简单,硬件实现又很难,所以到后面实现这个模块的时候会进一步细说,这里仅引入几篇图解算法.

如何通俗地讲解 viterbi 算法?-知乎

图解Viterbi维特比算法-知乎

维特比算法-wiki

里面有从最短路径,动态规划,概率估计等角度去解读Viterbi算法的,大家都可以先去看看,而他们有一个共同的好处,就是图多,也方便大家理解.

需要注意的是,这里利用Viterbi算法进行卷积码译码的前提和转换思路是将编码的实现即有限状态的状态机,看成是一个**隐性马尔可夫模型(HMM)**这样子才能实现利用最大似然等概率的方式来反推电路的设计.

看完了上面的几个连接,就可以理解到状态编码将直接影响到整个算法的复杂度,所以在译码过程中先将数据进行增余,再进行译码,即将删余后的2/3或3/4码率通过增余再变成1/2的话,Viterbi算法的实现复杂度将会大大降低.

交织/解交织

在信道编码后的信息具有一定的检纠错能力,但是面对信道的突发错误使得误码区块长度超过信道编码的纠错能力的上限时,信道编码就显得有点"失效"了.这个时候需要引入交织,将信道的突发错误平均到各个字段上,让他变成随机错误,再凭借信道编码,就可以大大提高其纠错能力了.

原理及作用

在上一节的信道编码中,我们知道信道编码可以对一段字符中的某几个字符进行检错和纠错,但如果接收端是这样的:

FPGA实现OFDM(二)-整体系统框架

直接有一个字段就全错了,这个时候信道编码是救不回来的,接下来看看交织是怎么做的(以分组交织为例,简单):FPGA实现OFDM(二)-整体系统框架

通过将信息进行重新整合,若信道出现突发错误,这样在解交织时就会平摊到各个字段上,这样子就可以通过信道编码进行纠错了.

交织有两种基本形式:分组交织和卷积交织.

还有利用两个卷积编码器进行级联,实现一串由伪随机性质的编码,即并行级联卷积码,又称为Turbo码.

其中,分组交织的原理在前面已经讲了,假设输入为N,输出为M,则称交织深度为N*M.可见交织深度必将给系统带来较大延时,故必然会受到约束.

然后就是卷积交织器,这是一个非常适用用于连续比特流通信系统的交织方式,其交织深度仅为分组交织的一般.图解如下:

FPGA实现OFDM(二)-整体系统框架

由于在OFDM中采用的是多载波调制,所以分组交织的延时也没有这么严重,而在802.11中采用的是分组交织,故不过多讨论卷积交织和Turbo码,有兴趣的同学可以看一下参考文献.

解交织

此时可以换一个角度考虑问题:将分组交织看成是一种矩阵的转置

那么显然解交织也只需要对这个矩阵再进行一次转置就可以了,所以跟加扰的解扰一样,这里只要同样做一个转置的交织过程就可以了.

热心网友的问题

那么这个时候就会有热心的网友问:你说的这个加扰器,他不就是将基带信号变成具有伪随机信号性质的东西了吗,这个时候还整交织干嘛嘛?

那显然这个网友是没有好好看交织的原理的,他的目的是为了让信道中出现的突发错误转换成随机错误,让大伙们来"平摊"这个误码,而加扰的话主要目的是为了区别用户(上行加扰)或者区分小区和信道(下行加扰)。

加扰是发送端用小区专用的加扰序列(伪随机码,根据小区ID生成)进行加扰,接收端在进行解扰,只有本小区内的UE才能根据小区的ID进行解扰,从而区分小区,这么做的好处就是可以减少相邻小区的干扰。 - J.mac 知乎

调制与解调

这部分为通信原理究极基础部分,不详述.

需要注意的是,由于在OFDM中为多载波调制,各子载波可以选择不同的调制方式,而协议中对不同信息域的信息也会采用不同的调制方式,所以这个在后面具体实现时会再说.

同时,由于OFDM仅规定了子载波的频率与带宽,所以我们可以进行

  • 相位的调制如:BPSK,QPSK
  • 相位幅度联合调制:16QAM,64QAM

那这个时候就会引入星座图,然后根据星座图画接收域,就可以实现解调了.

而!,在前一节中介绍到OFDM系统具有峰均功率比(Peak-to-Average Power Ratio,OAPR)的问题,所以仅实现幅值上的调制是不是就有点亏啊.所以类似在第一节中的ASK-OFDM就不会太常见.

导频插入与信道均衡

在802.11a或是其他协议中,在通信开始前都有训练序列以进行信道均衡,但是在OFDM中对频偏是很敏感的,因为他会破坏载波间的正交性,所以我们需要浪费一些子载波插入导频,降低随时间增长的对频率估计的偏差.

多普勒频移

除了多径等对频率的影响,还有一个重要的比较重要的影响因素就是多普勒频移.他指的就是发送机位置的移动将对接收机的频率估计进行影响.图解如下:

FPGA实现OFDM(二)-整体系统框架

FPGA实现OFDM(二)-整体系统框架

在维基上由对其他状态的讨论,可见于参考文献.

热心网友的证明

仅针对 接收机不动,发送机移动的情况:

已知:

​ 在一个波内,光源的速度变化乘以波的周期等于波长变化

Δvc=ΔλλΔvλc=Δλ\begin{array}{l} \frac{\Delta v}{c}=\frac{\Delta \lambda}{\lambda} \\ \Delta v \cdot \frac{\lambda}{c}=\Delta \lambda \\ \end{array}

可得:

Δvc=λλ0λ0\frac{\Delta v}{c}=\frac{\lambda-\lambda_{0}}{\lambda_{0}}

这里要感谢@Vinena同学给出的证明和解释.

高铁上要怎么办呢?

刚听完郑同学的讲解啊,我想的就是 高铁要咋办呢?这么高速的情况下,应该频偏会很严重吧.

然后去查了一下,现在主要的方式就是结合MIMO配合Moose,S&C,CP等算法进行进行频率的补偿,这里不细说了,大家有兴趣的话可以看一下参考文献

高铁场景下OFDM_MIMO系统多普勒频偏估计算法研究

网友的疑问

那你这个 导频插入和信道均衡 在哪啊?

实际上这个导频插入大家可以短浅理解为DDS,导频产生就不说了:

基于FPGA的两路信号发生器-****

至于信道均衡的话,在这里具体包括四个方面的内容:

  • 长训练符号提取(LTS Picking)
  • 能量计算(Energy Compute)
  • 信道估算(Channel Estimating)
  • 信道补偿(Channel Compensating)

跟Viterbi算法一样,理论很多,实现很难,还是等到具体实现的时候再慢慢谈吧

IQ调制

在完成数字调制,即星座图映射之后,现在必然存在实数I和复数Q域,在最后发送前,我们需要将这两路信号合并,他的实现思路其实很简单,就是要维持他们的正交性:

FPGA实现OFDM(二)-整体系统框架

然后具体不讲多了,一是累了,二是我看见知乎有大佬写得巨好,真的巨好:

数字调制系列:IQ基本理论

数字调制系列:IQ 调制及解调简述

数字调制系列:IQ调制器特性

数字调制系列:IQ 调制器特性(续)

本人以为这应该是全文写得最好的IQ调制的理论介绍了,故不敢妄加挑战.

802.11a下的标准

这里主要就是 图多.

主要参数设定

FPGA实现OFDM(二)-整体系统框架

在802.11a中,可以根据应用得情景不同选择不同的调制方式实现不同的数据速率和不同的编码效率,其中编码效率的变换在上文的卷积码中已经提到了.

可见一个OFDM符号中有52个子载波,但其中4个为导频信号,即只有48个子载波进行数据传输.而一个OFDM符号位4us,而保护间隔位0.8us.即用于数据传输的时间为3.2us.机子载波间隔为:

13.2μs=312.5kHz\frac{1}{3.2} \mu \mathrm{s}=312.5 \mathrm{kHz}

不同的调制方式对应的数据速率和编码方式对应关系如下:

FPGA实现OFDM(二)-整体系统框架

物理层协议单元(PPDU)帧结构

在802.11a中,相关的帧结构如下:

FPGA实现OFDM(二)-整体系统框架

训练序列

其中,PLCP(Physical Layer Convergence Procedure),可见PLCP Preamble为前导码,具体每位定义如下:

FPGA实现OFDM(二)-整体系统框架

在前导码中分为两种训练序列:

  • 短训练符号(Short Training Symbol,STS)在t1-t10上周期重复.但不是所有子载波都需要这个,只要其中的{-24,-20,-16,-12,-8,-4,4,8,12,16,20,24}
  • 长训练符号(Long Training Symbol,LTS)在T1-T2上周期重复,其中图上G12为两周期保护间隔,T1和T2为完整ofdm信号周期,应为3.2us,即图示有错.

具体符号内容后续实现的时候再讲,这里我们可以得到在发送时的训练序列为:

FPGA实现OFDM(二)-整体系统框架

其中,按4个子载波隔开的是短训练序列,各个子载波都需要的是长训练序列,那4个长条的是导频.

Signal域

接下来就到了Signal域,也就是PLCP Header部分.这一部分需要使用BPSK调制,而且码率为1/2,即此时数据数据为6Mb/s,下面是signal域的结构

FPGA实现OFDM(二)-整体系统框架

其中,前四位为速率位,决定后续数据域的传输方式,对应如下:

FPGA实现OFDM(二)-整体系统框架

第五位为保留位,紧接这的是Length域,主要是MAC所需要发送的物理层服务数据单元(PSDU)的个数.第17位为0-16位的偶校验位.

18-23位全部置0,作用有2:

  • 初始化卷积编码器
  • 终止Viterbi译码器的码网络(让其走回开始状态)

需要注意: SIGNAL字段的内容不加扰。

Data域

接着就到了数据域,其中包括服务域,PSDU,尾比特域和填充比特:

FPGA实现OFDM(二)-整体系统框架

其中,Service的前7个比特设为了0,这里主要是为了初始化接收机的解扰码器.其余的字段主要用于计算data域长度和维持时间,pad段为了填充数据帧为ofdm数据符号数整数倍.

其他细节可参看参考文献,这里主要介绍重要的协议标准,其他细化的会在实现中说明.

与MAC交互过程

最后可以看看物理层与MAC层的交互,以发送过程为例:

FPGA实现OFDM(二)-整体系统框架

结语

我看了一下这字数,算上上一篇,这又是一篇毕业论文的字数要求了…

讲真,这篇博客真的是这么久以来写得我最辛苦的一篇了,很多东西:

  • 看书-> 以为自己懂了 -> 一写 -> 哎有点奇怪 -> 查一下资料
  • 哇,好难 -> 卧槽,知乎/****/某课程ppt 讲得真好
  • 以为自己又懂了 -> 回到第一步

然后这两天要毕业答辩了,就 暂时性不更了.

然后有朋友反映找不到打赏通道,所以这次首发安排上了:

打赏通道

打赏通道

打赏通道

打赏通道

打赏通道

打赏通道

打赏通道

打赏通道

参考文献

《XILINX FPGA的OFDM通信系统基带设计》

关于扰码器(scrambler)的一些想法

卷积码-wiki

卷积码(Convolutional Code)-知乎

通信原理- 樊昌信, 曹丽娜

如何通俗地讲解 viterbi 算法?

图解Viterbi维特比算法

FPGA的OFDM系统交织器设计

中科大周武旸教授的现代通信原理和编码原理

交织和加扰的区别-知乎

Doppler_effect

高铁场景下OFDM_MIMO系统多普勒频偏估计算法研究

基于FPGA的两路信号发生器-****

数字调制系列:IQ基本理论

数字调制系列:IQ 调制及解调简述

数字调制系列:IQ调制器特性

数字调制系列:IQ 调制器特性(续)

WLAN - Frame Structure

无线网标准IEEE802.11

802.11a White Paper