【深度学习OFDM调制解调】Deep-Waveform:一种基于深度复值卷积网络的学习OFDM接收机【附代码】

摘要

离散傅立叶逆变换(DFT/IDFT)通常被认为是正交频分复用(OFDM)系统的基本原理。本文提出了一种深度复值卷积网络(DCCN),用于在不依赖任何显式DFT/IDFT的情况下从时域OFDM信号中恢复比特。DCCN可以利用OFDM波形的循环前缀(CP),通过用学习的线性变换代替DFT来增加SNR,并且具有将CP利用、信道估计和符号间干扰(ISI)抑制相结合的优点,其复杂度为O(N2)。数值试验表明,在具有不同时延扩展和移动性的瑞利衰落信道中,DCCN接收机的性能优于传统的基于理想和近似线性最小均方误差(LMMSE)估计的信道估计器和传统的CP增强技术.所提出的方法受益于复值神经网络的表达特性,然而,目前缺乏流行的深度学习平台的支持。作为响应,为无线PHY的卷积网络的设计和分析提供了复值卷积层的精确和近似实现的指南。此外,一套新的训练技术的开发,以提高训练模型在衰落信道中的收敛性和泛化能力。这项工作展示了深度神经网络处理OFDM波形的能力,结果表明OFDM接收机中的FFT处理器可以被硬件AI加速器取代。

一.介绍

最近已经针对各种任务[1]- [3]探索了用于无线通信的物理层(PHY)的深度学习,包括信号分类[4],[5],参数估计[5]-[9],信道估计[8]-[20],信道编码[16],[21],[22],检测[11],[16],[23]-[26],调制星座设计[7]和导频设计[27],[28]。深度神经网络(DNN)不仅可以增强无线PHY的某些功能和组件,还可以开发成一种端到端的新型通信架构,被视为自动编码器(AE)[6]-[8],[17],[21],[22]。代替寻求结构化数据的紧凑嵌入,诸如在图像和文本中(图1的顶部),通信AE(图1的底部)生成非结构化数据的冗余表示。在被噪声信道污染之后可以从中恢复原始信息的比特。通信AE通过对作为训练数据的一组随机比特的自监督学习,通过数据的结构来学习信道的行为。在PHY之上,深度学习也用于资源分配和网络管理,例如流量预测[29],干扰对齐[30],功率控制[31],频谱共享[32]和调度[33]。

深度学习的数据驱动方法为无线PHY提供了几个优势:i)实现信号处理链中组合级联模块的协同效应[6],[7],ii)减少底层模型与现实之间的失配,iii)通过利用DNN的非线性构建低复杂度解决方案[11],[16],[25],[26],以及iv)发现不规则和/或自适应设计,例如,对于导频设计[27],[28]和调制星座[6],[7]。

与图像或文本解释相比,无线通信的一个主要区别是依赖于复杂域C中的无线信号的表示。然而,目前,无线PHY的深度学习缺乏对复值神经网络(CVNN)的支持[34],[35],这是机器学习学科中的一个新兴领域,来自流行的平台,如TensorFlow [36]和Keras [37]。相反,现有的研究分别处理复值张量的真实的部和虚部,例如近似D:两个平行的实值张量[7],[11],[16],或近似C:实值张量的两个通道[28]。然而,复数域C与R2空间的乘法运算不同,如果不考虑乘法运算,可能会阻止DNN在相位和幅度方面充分利用信号样本的真实的实部和虚部之间的关系,从而导致复杂度增加、性能降低和可解释性有限。

图1.通用自动编码器(顶部)与通信自动编码器。

例如,正交频分复用(OFDM)系统需要(逆)离散傅立叶变换(DFT/IDFT)和/或线性有限脉冲响应(FIR)滤波器,在复数域C中定义的。在没有复值表示的情况下,现有的基于深度学习的OFDM接收器[8],[10],[11],[13]-[16],[23]和AE [8]限于在处理OFDM波形时依赖DFT/IDFT。关于技术解决方案,卷积神经网络(CNN)[4],[5],[16],[23],[24],[28]在无线PHY中的使用频率低于多层感知器(MLP)[6]-[12],[21],[22],[25],尽管它们的效率更高。由于CNN依赖于底层过程的假设,因此更难为复杂领域的操作设计

在本文中,我们提出了一种深度复值卷积网络(DCCN)的设计,从同步的时域OFDM信号中恢复比特。开发的端到端OFDM接收机不依赖DFT/IDFT,而是学习一种新的方法来接收具有改善信噪比(SNR)的OFDM波形,这表明了OFDM波形深度学习的潜力。DCCN接收机优于传统的接收机在瑞利衰落信道中具有较低的复杂性,通过利用最近的发展范围内的CVNN。此外,基于领域知识和OFDM帧结构,选择了DCCN的许多结构和维度超参数,为其他波形结构提供了可移植的设计模板。

本文的主要贡献包括:

1)提出了一种学习线性变换,利用其循环前缀(CP)代替DFT/IDFT处理OFDM信号,提高了OFDM信号的信噪比。结果表明,一种新的硬件加速器可以潜在地取代OFDM接收机中的FFT处理器,我们证明了CVNN在学习通信波形中的潜力。

2)我们还设计了一个数据驱动的可解释DCCN信道均衡器,通过结合CP利用[38]-[42],符号间干扰(ISI)缓解和信道估计,在O(N2)的低复杂度下实现了比传统接收机上级的性能和良好的可推广性。

3)我们提出了一套训练方法来提高衰落信道中基于DNN的接收机的收敛性和泛化能力,包括一种转移学习方案,该方案分两个阶段训练基本的OFDM解调和信道均衡。该模型在不同的SNR值设置为白色噪声和衰落信道,并使用混合瑞利衰落模型来平滑训练的损失景观进行训练和评估。

4)据我们所知,DCCN是第一个基于深度神经网络的无线接收器,它对整个同相和正交(IQ)域采用显式复值表示。在开源软件中提供了复值密集层和卷积层的库[43],并向社区提供了使用实值神经网络处理复值张量的指南。

本文的其余部分组织如下:第二节讨论了相关的工作。在第III节中提供了OFDM系统和信道估计方法的概述。在第四节中,DCCN接收机的设计和训练方法。最后,在第六节中讨论了结论和未来的方向。

二.相关工作

A.用于无线通信的深度神经网络

MLP不对底层过程进行假设,并且用于信道估计[9]-[12],[19],检测[25],[26]和通信AE [6]-[8],[21],[22]。在这些研究中,MLP通常有3到5层,并且在信号路径中遵循两种配置。第一种配置是直通:在接收器(发射器)处,MLP接收数据和导频(输入比特)并输出传输符号或软比特的估计[7],[8],[11],[25],[26](发送IQ样本[6]-[8],[22])。AE [6]- [8]、[22]中可能包括用于同步的其他组件。第二种配置是估计器:MLP通过利用接收到的导频或信号仅估计信道[9]、[10]、[12]、[19]或其他参数[7]、[9],并且类似于传统系统单独恢复信号。在本文中,开发的DCCN采用了4层MLP与卷积层之间的信道估计的估计器配置。

CNN用于信号分类[4]和恢复[5],信道估计[16]-[18],[20],[28],[44],[45]和检测[16],[24]。虽然CNN可能不会优于MLP [21],但它更有效和可扩展。例如,[16]中的OFDM接收器基于在残差架构中级联的深度可分离卷积来匹配具有线性复杂度的线性最小均方误差(LMMSE)估计器。CNN也被配置为信号路径中的直通[16],[24]和估计器[44]。其他类型的DNN,如广义回归神经网络(GRNN)[12]和长短期记忆(LSTM)[14],[17]也用于信道估计,基于模型的DNN展开迭代算法[23]用于检测。

CVNN在[34],[35]中进行了讨论,但它们尚未在流行的平台中得到支持[36],[37]。[35第1页]指出,CVNN“由于缺乏构件而被边缘化”。在无线PHY中,大多数CNN都是实值的[4],[16],[18],[20],[24],[28],[45],除了在[5]中使用单层复值卷积来实现幅度相位表示,这在许多应用中需要额外的相位(解)包裹。基于第IV-A节中的分析,CVNN的表达性质可以由MLP以及CNN保留[16],[28]具有适当的输入格式和维度,例如,接收字段和滤波器的数量。然而,缺乏对这些设置的讨论使得很难在系统参数(包括天线数量和DFT大小)方面扩大CNN的成功设计[16],[28],或者将这些经验用于未来的工作。在这项工作中,提供了实现复值卷积层的指导方针,并在整个IQ域中使用CVNN。

B.OFDM系统及其增强的信道估计

OFDM是现代无线网络中最流行的系统。在[46]、[47]中,介绍了OFDM物理层和各种信道估计方法。在发射机侧,几种增强的波形被引入OFDM系列,诸如滤波器组多载波(FBMC),用于5G和下一代通信系统的UFMC,GFDM [48]。这些修改的OFDM波形通常具有关于各种干扰的更好的特性。提出了星座增强方法[49]和基于深度学习(DL)的编码系统[13]来降低OFDM波形的峰均功率比(PAPR)。用于FBMC的基于MLP的信道估计器在高移动性信道中显示出良好的性能[50]。

图2.OFDM系统的物理层:(a)传统OFDM PHY的图[46],(B)示例性OFDM相干时隙和时域波形[41]。

大多数改进发生在接收器端。如图2(B)所示,作为OFDM波形的部分副本,引入循环前缀(CP)用于接收机处的同步和ISI减轻。CP已被用于通过改善SNR、频率选择性和干扰减轻来增强盲[39]-[42]和导频辅助[38]信道估计[41]。在[38]中,前一OFDM符号的解码数据用于恢复下一符号的CP。然而,[38]中的方法只能增强LS信道估计。我们的模型通过同时处理多个OFDM符号来完成这一任务,具有更好的整体性能和略微提高的效率,而无需显式算法,这是对分析方法的补充,例如最大似然[39],[41]和因子图[40],[42]在利用CP中。

DNN还用于增强OFDM接收机。在[11]中,5层MLP用于信道估计和符号检测。我们的工作证实了[11]中的结论,即MLP可以在高SNR下匹配MMSE,并且比MMSE更好地处理与CP、限幅噪声和信道失配相关的逆境。与[11]不同的是,我们的信道估计器是线性激活的,而不是使用ReLU,因此可以解释为LMMSE的低秩近似。[11]中的MLP处理没有CP的OFDM波形,而我们的模型使用CP来同时提高SNR和减轻ISI。此外,在[11]中,每16位需要训练一个独立的MLP,而我们只使用一个模型来处理整个相干时隙,从而获得更好的可扩展性。许多研究使用CNN进行OFDM系统中的信道估计[18],[20],[44],[45],而不能优于理想的LMMSE。然而,对于大规模MIMO,可以优于近似LMMSE的低复杂度信道估计器[18]仍然具有吸引力。[16]中的OFDM接收机实现了线性复杂度O(N),但它仅匹配训练信道模型上的理想LMMSE,并且性能不佳看不见的频道模型。这些研究相比,我们的DCCN优于理想的LMMSE的复杂度只有O(N2),即使与看不见的信道模型。在[19]中,用于非OFDM系统的基于MLP的信道估计器在双选择性信道中优于近似LMMSE,并且对移动性表现出更好的鲁棒性,其中这些发现在我们的工作中得到了证实,尽管结果并不直接可比。在[14]中,长短期记忆(LSTM)被用于通过预测未来数据来估计信道,并且据报道在高速场景中优于LMMSE。相比之下,我们的方法通过同时处理多个OFDM符号来减轻ISI。深度学习已被证明能够改善MIMO检测[23]-[25]和信道编码[17],而本文仅考虑单天线。此外,上述工作[8],[10],[11],[13]-[16],[23]都依赖于显式DFT/IDFT,其在我们的方法中被学习的线性变换所取代,以提高SNR。我们的工作首先展示了DNN处理OFDM波形的能力,我们基于OFDM帧结构和利用领域知识设置NN层超参数的方法为其他波形结构提供了可转移的设计模板。

三.OFDM通信系统

我们首先介绍了相关的概念和符号在较低的物理层的传统OFDM系统,其次是信道估计方法在传统的接收机。

A.物理层

OFDM系统的PHY的框图在图2(a)中示出。在发射机处,首先将信道编码应用于输入比特b ∈ {±1}以用于错误检测和/或校正。然后,通过映射到IQ平面上的星座图,将编码比特转换为复值同相和正交(IQ)数据。通过将训练信号(导频)和保护频带插入到IQ数据中来创建频域OFDM符号X,然后经由N点IDFT和随后的并行到串行(P/S)转换将X变换为时域OFDM符号x。接下来,CP(在其末端的一部分x)被前置到x以创建时域全OFDM符号xcp,如图2(b)所示。然后,基带信号xcp被上变频为射频(RF),并通过RF前端在空中传输。无线电信号在无线信道上传播,并由接收机前端拾取和下变频为基带IQ样本。在接收机处,接收到的时域OFDM符号ycp由载波同步器恢复。然后,从ycp中移除CP,并且经由DFT将其余的IQ样本y变换为频域OFDM符号Y。基于Y,信道均衡器输出所估计的发送频域IQ数据X,然后将其解调为软比特(对数似然)Xib,并由信道解码器转换为二进制输出比特Xib。最后,将B层传递到下一层。请注意,本文的重点是较低的物理层,信道编码不在讨论范围之内。我们将图2(a)中的频域和时域称为IQ域,其中信号由复值样本表示。

图3.不同无线信道对QPSK调制的影响,SNR= 6 dB,IQ平面(x:同相,y:正交)。

OFDM系统通常具有帧结构,其中相干时隙(或简称为“时隙”)由多个OFDM符号组成,如图2(b)所示。与OFDM相干时隙相关的符号如下:OFDM符号包含N个子载波,其中N是DFT/IDFT的大小。在N个子载波中,总共G个无效保护子载波被放置在中心(DC保护频带)和边缘(边缘保护频带)。OFDM符号中的子载波被称为资源元素(RE)。相干时隙包含F个连续的OFDM符号,其中P个RE和D个RE分别被分配给导频和数据。时域全OFDM符号的长度是S = N+Ncp,其中Ncp是CP的长度。在m进制调制下,IQ样本携带m个比特,并且星座的大小为2 m。

B.无线信道

无线信道模型的一个广为接受的简化描述了衰落和噪声过程[46]:

其中x、y、no ∈ CSF×1分别是时域发送和接收信号以及白色噪声,h ∈ CL×1是信道冲激响应,X、Y、H、No ∈ CN×F是x、y、h和no的频域变换,例如,X = DFTN(x),并且xN和xN分别是卷积和逐元素乘积的运算符。不失一般性,(1)也可以指OFDM符号,即,x ∈ CN×1,xcp ∈ CS×1和X ∈ CN×1。

多径衰落可以建模为线性有限脉冲响应(FIR)滤波器[51]:

其中zk是复值随机变量,向量τ和τ表示衰落过程的功率延迟分布(PDP),Ts是离散信号的采样周期。选择滤波器长度L,使得|HL|当l < 0或l ≥ L时,对于瑞利衰落,zk的真实的和虚部是独立同分布的。高斯随机变量,因此|ZK| 2服从瑞利分布。K是多径衰落信道中的路径数。在平坦衰落信道K = 1中,OFDM符号的所有子载波上的信道系数相同。在多径衰落信道中,K > 1,信道系数随子载波而变化,使得信道表现出频率选择性。不同衰落过程对频域IQ样本的影响如图3所示。注意,只考虑噪声和衰落,而信道编码的信道损伤留给未来的工作。

信道脉冲响应h是时变的,并且其相干时间Tc与最大多普勒频率Fd成反比,即,Tc <1/Fd.OFDM系统通常根据其应用、测量的相干时间Tc、相干带宽Bc和总带宽来配置,使得慢衰落适用于相干时隙。

图4.典型的OFDM导频模式:梳状、块和散射。

C.信道估计和均衡

考虑在接收机处具有导频辅助信道估计的通信系统。如图4所示,不同的导频模式,如块、梳状和分散导频,被设计用于对信道失真进行采样。导频信号是恒定信号或低自相关序列(例如,Zadoff-Chu序列)。OFDM系统中的基本导频辅助信道均衡器基于最小二乘(LS)估计器[46],[47]:

其中,X^是估计的信号,H^LS是包含LS信道估计的信号,XP和YP分别是发送和接收的导频,并且F(·)是插值算子,例如,线性,样条,低通滤波器和DFT [46],[47]。LS估计器对信道统计是不可知的,而其他估计器,例如LMMSE,最大似然和基于参数信道建模(PCMB)的估计器,基于LS估计和/或先验信道知识[46],[47]。

理想的LMMSE估计器表示为[47],[52]:

其中,RHH = E{H*,i,HH*,i}是信道实现H的频域协方差矩阵,α是线性域SNR,β是基于特定调制方案定义的常数。(4)中的理想LMMSE估计器需要先验信道知识RHH和α,这在实践中是不可用的。此外,(4)中的矩阵求逆导致O(N3)的计算复杂度。LMMSE的低秩近似(LRA)[53]通过规定的α和RHH的奇异值分解(SVD)近似理想的LMMSE矩阵RHH(RHH + β αI)−1,它可以容忍PDP失配并以不可约的错误地板为代价实现较低的O(N2)复杂度。近似LMMSE(ALMMSE)的改进包括使用不同的PDP [54],SNR估计[52],[55],秩估计和利用LMMSE矩阵的循环属性[52]。快速ALMMSE可以通过预先计算的LMMSE矩阵将复杂度进一步降低到O(N),代价是在特定SNR范围内性能下降[56]。

图5.DCCN OFDM接收机流程图:DCCN均衡器将时域接收信号ycp转换为估计的发射信号xcp,随后DCCN基本接收机将其转换为估计的软比特xcp和硬比特xcp。蓝色表示复值域,灰色表示实值域。密集层的维度和数据类型被示为例如,CS×N,其输出张量的形状为,例如,[B,F,N],Conv层的维度被标记在块旁边,例如,N×N×1表示N个一维滤波器,每个滤波器的长度为N。虚线块表示数据张量。

四.基于DCCN的OFDM接收机

基于DCCN的OFDM接收器由函数b~ = DS(ycp;Θ)表示,其在用于OFDM帧和DCCN流图的配置的超参数S的集合上定义(图5),其中,b是发送比特的对数似然,ycp是包括CP的相干时隙的同步时域接收的OFDM符号,并且Θ是DCCN的可训练参数的集合。基于DCCN的OFDM接收机包括信道均衡器,随后是基本接收机。DCCN的隐藏层以传统OFDM接收器中的信号处理模块命名,但它们的功能可能不同。前向网络概括了传统接收机中的信号处理,并通过添加计算冗余来确保Θ的搜索空间至少包含ALMMSE接收机,这可以在训练期间通过引入正则化损失来最小化。在流程图中包含了结构冗余以供研究,并在第V-E节中提出了一个简化的流程图以供部署。

A.复值图层的指导原则​​​​​​​

图6.(a)保持其表达能力的1D复值Conv(C-Conv)层(1 × 1 × 1)的三种实现,(B)基于2D实值Conv层(16×(1,8)×1)的1D C-Conv层(8×8×1)的实现

省略偏置和激活,复值神经元可以表示为[34]:

其中xIN、xOUT ∈ C和权重a、B ∈ R分别是复权重的真实的实部和虚部。(5)可以近似为R2×2的密集层,具有近似D的输入和训练的权重w a-b b a。将(5)推广到更高的维度,我们有以下原则:

注1.CZi×Zo的稠密层总是可以近似为具有充分表达能力的R2 Zi × 2 Zo的稠密层。

注2.大小为fn × fs × fc的复值卷积(C-Conv)层(代表形状、fs和深度offc的fn滤波器)可以近似为大小为2fn×(fs,2)×fc的实值Conv层(对于近似D输入)或2fn×fs×2fc(对于近似C输入),而无需遵循(5),并且可以通过大小为2fn×fs×fc的实值Conv层(对于近似D输入)来精确实现(5)。

通过遵循(5),CVNN层的精确实现减少了不必要的自由度,并且仅需要近似所需的可训练实值权重的一半。更具体地,在图6(a)中给出了尺寸为1 × 1 × 1的1D C-Conv层的三个示例性实现以说明注释2。所有三种实现都满足了具有相同计算复杂度的表达要求(每个复杂样本四次乘法和两次加法)。前两个近似中的每一个都需要四个权重,而第三个精确实现仅需要两个权重。精确的实现具有更好的空间复杂度和训练效率,同时减少了优化器的搜索空间。对于从业者来说,如果近似的C-Conv层不能满足所需的输入格式或最小大小,则它的表达能力将低于精确的C-Conv层,例如,过滤器的形状和数量。对于复值激活原理,我们请读者参考[34],[35]。

图7.DCCN培训系统框图。

在图6(B)中,我们的DFT类C-Conv层的实现通过大小为16 ×(1,8)× 1的2D实值Conv层实现的大小为8×8×1的1D C-Conv层的示例来说明。在这项工作中,复张量的真实的和虚部是在最后一个维度。

B.基本DCCN接收器

基本DCCN接收器是没有信道均衡器的OFDM接收器,如图5的右半部分所示。基本接收器的前向网络从用于丢弃CP的可选切片开始,然后是大小为N × S × 1(或如果丢弃CP则为N × N × 1)的C-Conv层,其设计用于将时域OFDM符号转换为频域X,并利用CP获得SNR增益。接着,设计了一个复杂的密集层CFN×D,用于从一个相干槽中提取所有的数据RE × XD。前向网络的其余部分本质上是一个将IQ样本转换为软比特的分类器,其中输入IQ样本被视为两个真实的数的向量,C ∈ R2。提取的IQ向量及其非线性(Leaky ReLU)激活A0连接到形状为[B,D,4]的张量,并馈送到R4× 2 m的小密集层,然后是另一个Leaky ReLU激活A1,其输出张量被重塑为[B,D,m,2],然后由softmax函数沿着其最后一个维度激活,以产生软位-±1的似然向量。B是一批输入信号中的时隙数。由于信道编码超出了我们的范围,因此输出比特通过对软比特的硬判决来获得。在第V-E节中,测试了前向网络的变化。

C.DCCN通道扩展器

DCCN均衡器的输入端为ycp,输出端为xcp,它被前置到基本DCCN接收机,如图5的左半部分所示。DCCN均衡器的前向网络包含四个子模块:第一子模块包括CS×N(或CN×N,如果CP被丢弃)的密集层,随后是N × N × 1的C-Conv层,它将ycp转换到频域Y。第二子模块估计具有四个密集层的信道频率响应H ∞,随后是2D复数滤波器。第三子模块利用逐元素复数除法X = Y/H执行均衡。最后,通过N×N× 1的IDFT类1D C-Conv层将X xcp转换为xcp,并通过添加具有CN×S致密层的CP来恢复xcp。

图8.分两个阶段训练基本接收机和均衡器。

在信道估计子模块中,CFN×P的第一密集层被设计用于定位导频和估计导频上的信道系数H P LS。然后,通过将H * P LS内插到整个相干时隙和下三个密集层中的信道估计以及大小为(F,N)的2D滤波器来获得H * P LS,其类似于LRA-LMMSE [53]:

其中Dp是对角矩阵,元素δk = λk λk+β/α(k ∈ [1,p]),δk = 0(k ∈ [p + 1,N]),U是包含RHH奇异向量的酉矩阵.代替显式设置λ,p,α和U [52],[54],[55],(6)中的LMMSE矩阵是要从数据中学习的多个密集层的可训练参数。注意,这些密集层的维度具有用于ISI减轻的相干时隙。在第V-C节中,我们的DCCN接收器还表现出具有规定SNR的像ALMMSE的错误平层[52],[53],[55]。其他数量的CFN×FN致密层在第V-E节中进行试验。

将每个相干时隙的OFDM符号的数量F考虑为协议中的常数,DCCN接收机的渐近计算复杂度为O(N2)(或对于具有CP的DCCN为O(NS)),因为DCCN由没有任何环路的级联层组成。1D复卷积层和全连接层的最大复杂度为O(N2)(或对于CP为O(NS))。如果F被认为是一个变量,复杂度为O(N2F2)。

D.2-阶段训练

DCCN接收器的训练设置在图7中示出。在线随机发生器创建随机二进制流b,其由OFDM发射机转换成时域OFDM符号作为发射信号xcp。接收信号ycp是通过将衰落和噪声添加到x的信道模型创建的。ycp和B分别是训练数据和标签。DCCN模型的输出是软比特位,以及通过对软比特位进行硬判决而生成的输出比特位,损失函数L(B,k B,k B,Θ)是交叉熵(CE)损失和正则化损失Lreg(Θ)的加权和:

其中ε 远小于1是一个小常数。交叉熵损失LCE(B,B)是训练标签B和软比特B的平均交叉熵。在训练期间,DCCN接收器的0被随机初始化并由Adam优化器更新,Adam优化器基于(7)中的损失函数运行反向传播。

由于图3(c)中所示的严重失真,直接在多径衰落信道中训练DCCN接收机是困难的并且可能是不切实际的。因此,开发了如图8所示的转移学习方案,以在两个阶段中训练基本接收器和均衡器。在阶段1中,仅在AWGN信道中训练基本接收机。在阶段2中,DCCN均衡器的流图首先在专用于图形编辑的TensorFlow会话中被前置到预训练的基本接收器。然后,均衡DCCN接收机在另一个会话中被加载和训练,其中基本接收机的可训练参数被冻结并且信道衰落被包括以生成训练数据。损失函数在阶段1和阶段2中是相同的。当前向网络的后半部分被冻结时,图形编辑技术可以实现反向传播。注意,两阶段训练方法可以通过针对不同的衰落设置在阶段2中重用相同的预先训练的基本接收器来提高数据效率。类似地,来自阶段2的训练模型可以针对不同的真实通道进行微调。

为了提高训练效率,采用了几种技术。训练数据以小批量的方式馈送到模型,这利用了图形处理单元(GPU)中并行处理的高吞吐量,并最大限度地减少了内存复制的延迟。在基于NumPy的OFDM发射机和衰落模块的编程中,数据处理矢量化,避免了大循环。随着训练的进行,学习率呈指数衰减,以便进行微调。随机训练标签和相应的训练数据是在线生成的,而不是重复地输入预先生成的训练数据集。因此,我们使用迭代而不是epoch(对整个数据集进行完整的训练)来描述训练中的最外层循环。如果关键性能度量(即,BER)在固定次数的迭代之后没有改善。

E.训练中的通道设置

对于设置基于DL的PHY的训练SNR,不存在明确的指导。我们在两个阶段中使用不同的SNR配置。在第一阶段,信噪比不影响最佳的基本接收机,但训练的有效性。通道中的噪声会产生比特错误,从而驱动梯度下降,并充当正则化器以防止过度拟合。较高的信噪比需要较大的小批量来产生相同数量的比特错误,这可能降低数据效率并延长训练的收敛时间。另一方面,低SNR可能在相对大的BER中隐藏小的解调偏差,即,输出位中的1始终多于− 1。为此,我们建议训练阶段1的训练SNR值为Eb/No = 5 dB [21],具体而言,选择SNR ηi = 5 m dB用于m进制调制。

在训练阶段2中,最佳DCCN均衡器取决于诸如SNR和PDP的信道统计。为了提高训练模型的泛化能力,采用SNR和衰落模型的混合。每个OFDM相干时隙的SNR是基于偏好高SNR值而不排除中等和低SNR值的概率函数从工作SNR机制中随机选择的。例如,ηi ∈ {0,3,...,30},其中P(ηi ≥ 17)= 90%。基本原理是DCCN均衡器类似于快速ALMMSE算法[52],其在设计用于高SNR(即,20 dB)而不是低SNR(即,5dB)。同时,由于LMMSE对PDP失配具有鲁棒性,因此DCCN均衡器对于不同PDP的最优点将接近。瑞利衰落模型的混合不仅提高了推广性,但也收敛时间。具有较短延迟扩展的衰落模型可以平滑整体损耗景观,以帮助优化器克服与具有更丰富多径的衰落模型相关联的局部最小值。在第V-D节和第V-E节中,比较了在两个阶段中使用不同通道设置训练的模型。

表I.OFDM系统性能评估

五.评价结果

A.方法

在数值评估中,DCCN接收器与具有不同信道估计器的传统接收器进行比较[43]。首先给出了在AWGN信道中采用m进制正交幅度调制(QAM)调制(m ≤ 4)的DCCN基本接收机的结果,然后给出了在瑞利衰落信道中采用不同PDP、ISI泄漏和移动性设置的均衡DCCN接收机的结果。我们使用符号DCCN和DCCN-CP来分别指代没有CP利用和利用CP利用的DCCN接收器。

所评估的OFDM系统模拟简化的LTE下行链路帧结构[57],如表I中所详述,其中DFT大小为64,边缘和直流(DC)处的保护子载波(SC)的总数为16,采样率为0.96 MHz,并且子载波的带宽为15 KHz。相干时隙包含7个OFDM符号,其中分配给导频和数据的RE的数量分别为P = 16和D = 320。使用与如图4的最右边所示的LTE协议一致的分散导频图案,并且导频信号具有恒定值1/2(1 + i)。使用阶数为2、4、8、16的QAM和格雷码进行星座映射,其中最大星座的振幅是1。在发射机之后的OFDM波形的峰均功率比(PAPR)被限制为9dB。

基本接收器和具有m进制调制的均衡器的训练配置列于表II中。一个随机梯度下降为基础的亚当优化器的小批量大小为72相干槽。在每次迭代中,生成新的随机比特流(训练标签),并通过传统OFDM发射机和信道模型将其转换为训练数据。由于训练标签是随机的,因此提前停止机制的损失函数基于训练数据而不是单独的测试数据集。训练要么通过达到最大迭代次数而终止,要么触发早期停止,这在实践中通常发生。学习率最初设置为0.001,每500个小批量(步骤)或2.5次外部迭代衰减2%。根据第IV-D节中的描述设置SNR。每个外部训练迭代包含200个小批次,并且测试数据对于从-10到30 dB的每个SNR点具有20,000个相干时隙。用于训练阶段2的瑞利衰落被设置为连续时隙中的平坦衰落、EPA、伊娃和ETU的交替模型。

训练DCCN模型持续250-1300次迭代,如图12和13所示。9.训练过程从快速拟合开始,然后是一个漫长的微调阶段:交叉熵首先在前10-50次迭代中急剧下降,然后缓慢但稳定地下降,直到达到最低点。源代码可以在[43]中找到。

B.加性白色高斯噪声通道

我们的基本接收机和传统OFDM接收机[43]在SNR为-10到20 dB的AWGN信道中采用BPSK、QPSK、8 QAM和16 QAM调制的BER如图10所示,其中考虑长CPDCCN-CP。没有CP的帮助,我们不期望DCCN优于传统解调,因为后者在AWGN信道中是最佳的。对于BPSK、8 QAM和16 QAM,当BER低于10−5时,DCCN的性能接近传统接收机,差距可忽略不计(≤ 0.16 dB)。然而,对于QPSK,DCCN在BER水平为10 - 2时开始表现不佳,并且在BER为10 - 6时,差距增加到0.7 dB。另一方面,DCCN-CP始终优于DCCN,差距从BPSK的0.7 dB减小到16 QAM的0.5 dB。对于QPSK,DCCN-CP在BER为10−6时开始表现不佳。注意,当BER非常小时,例如,≤ 10−5时,由于模拟中有限的数据大小而导致的相对误差增加。CP在所有子载波上携带信息并且经历独立的随机噪声,因此理论上可以将数据信号的功率提高NcpD/(FN 2),这对应于对于0.25N的CP长度,AWGN信道中的SNR增加0.75dB。对于BPSK,DCCN-CP使DCCN的SNR改善非常接近0.75 dB。结果表明,利用C-Conv层将OFDM符号从时域变换到频域,具有利用CP携带的冗余信息的优点,而这是显式DFT无法实现的。

六.结论和今后的工作

本文提出了一种端到端的OFDM接收机--深度复值卷积网络(DCCN),从同步的时域OFDM信号中恢复未编码的比特。DCCN采用复数域乘法规则,而不是将IQ采样的真实的和虚部作为分离的流,能够取代OFDM系统中的DFT/IDFT,并利用OFDM波形中循环前缀的冗余来提高信噪比。利用复值神经网络的表达能力和协同优势,DCCN能够将CP开发、LMMSE低秩近似和符号间干扰抑制等任务结合起来,从而在双选择性瑞利衰落信道中优于传统的LMMSE接收机和传统的CP增强信道估计,计算复杂度为O(N2)。这项工作也为类似的工作提供了可转移的经验。为复值卷积网络的近似实现提供了实用指导,特别是关于OFDM系统参数设置卷积层的维度。为基于深度学习的无线收发器开发了一套新的训练方法,包括转移学习方案,可以防止训练中消失梯度问题的端到端损失函数,以及使用混合SNR和衰落模型来平滑损失景观。它展示了深度神经网络处理复杂通信波形的能力,并建议OFDM接收机中的FFT处理器可以由硬件AI加速器取代。

关于复值神经网络的可能的未来方向包括:1)探索非线性信号处理以获得更好的性能和/或复杂度,2)通过使用卷积层进行信道估计来提高可扩展性,3)扩展到空间域,例如大规模MIMO,以及4)通过基于复值神经网络的通信自动编码器探索波形设计和信道编码。

MATLAB代码

% Benchmark code for OFDM communication system in AWGN channel
---------------------------------------
​
%% Step 1: Configurations
clc;
%clear all;
close all;
save_tx_data = 1;
if save_tx_data
    mkdir('mat');
end
% 1.1 OFDM parameters
N = 64;                                                 % FFT size, Number of total subcarriers
Ncp = 16;                                               % Length of Cyclic prefix
Ts = 1e-7;                                              % Sampling period of channel
Fd = 0;                                                 % Max Doppler frequency shift
Np = 8;                                                 % No of pilot symbols
Ng = 4;                                                 % No of side guard subcarriers
Ndc = 2;                                                % No of DC guard subcarriers
Ndata = N - Np - 2.*Ng - Ndc;                           % No of Data subcarriers per symbol
Frame_size = 8;                                         % OFDM symbols per frame
Nframes = 2000;                                         % Size of tested OFDM frames: set as 10^4 for smooth curve
M_set = [2, 4, 8, 16];                                  % Modulation orders
SNRs = -10:1:29;                                        % Test SNR points
% 1.2 Vehicles for results
berofdm_all = zeros(5,length(SNRs));
berofdm_all(1,:) = SNRs;
serofdm_all = zeros(5,length(SNRs));
serofdm_all(1,:) = SNRs;
% 1.3 Calculate pilot locations
DC_sc = [N/2, N/2+1];
Effec_sc = [Ng+1:N-Ng];
Effec_sc = setdiff(Effec_sc, DC_sc);
% Pilot_sc = [5,12,19,26,34,41,48,55];
pilot_loc = [1:ceil(length(Effec_sc)/Np):length(Effec_sc)];
Pilot_sc = Effec_sc(pilot_loc);
guard_sc = [1:Ng,N-Ng+1:N];
​
Np = length(pilot_loc); % Recalculate Number of pilot
pilot_sc_frame = [];
guard_sc_frame = [];
DC_sc_frame = [];
for i_sym = 0:Frame_size-1
    pilot_sc_sym = Effec_sc(sort(mod((pilot_loc + i_sym*3)-1,length(Effec_sc))+1)); % scattered
%     pilot_sc_sym = Pilot_sc; % comb pilot
    pilot_sc_frame = [pilot_sc_frame, pilot_sc_sym+i_sym*N];
    guard_sc_frame = [guard_sc_frame, guard_sc+i_sym*N];
    DC_sc_frame = [DC_sc_frame, DC_sc+i_sym*N];
end
data_sc_frame = setdiff([1:Frame_size*N],guard_sc_frame);
data_sc_frame = setdiff(data_sc_frame, pilot_sc_frame);
data_sc_frame = setdiff(data_sc_frame, DC_sc_frame);
​
%% Step 2: Test Loops
mod_names = {'BPSK','QPSK','8QAM','16QAM'};
channel = 'AWGN';
mat_name = sprintf('BER_OFDM_%s_Gray.mat',channel);
csv_name = sprintf('BER_OFDM_%s_Gray.csv',channel);
snr = SNRs;
% EsNo= EbNo + 10*log10((N-2.*Np)/N)+ 10*log10(N/(N+Ncp));      % symbol to noise ratio
% snr= EsNo - 10*log10(N/(N+Ncp)); 
for m_ary = 1:4
    M = M_set(m_ary);                                                  % No of symbols for PSK modulation
    const = qammod([0:M-1],M,'gray'); % Get constellation
    berofdm = zeros(1,length(snr));
    serofdm = zeros(1,length(snr));    
    for i = 1:length(snr)
        % Step 2.1 Transmitter
        % 2.1.1 Random bits generation
        D = round((M-1)*rand(Ndata*Frame_size,Nframes));
        D_test = reshape(D, Ndata, Frame_size*Nframes);
        D_gray = D_test; % gray2bin(D_test,'qam',M);
        txbits = de2bi(D_gray(:)); % transmitted bits
        % 2.1.2 Modulation 
        if M == 8
            Dmod = qammod(D,M,'gray');
        else
            Dmod = qammod(D,M,'gray');
        end
        % 2.1.3 Framing
        Data = zeros(N*Frame_size,Nframes);   % Guard sc Insertion
        Data(data_sc_frame,:) = Dmod;   % Data sc Insertion
        txamp = max(abs(Dmod(:)));
        pilot_signal = txamp.*sqrt(1/2).*(1+1i); % Norm pilot power to peak constellation power
        Data(pilot_sc_frame,:)= pilot_signal; % Pilot sc Insertion
        Data = reshape(Data, N, Frame_size*Nframes);
        % 2.1.4 To Time-domain OFDM symbol
        IFFT_Data = (N/sqrt(N-2*Np))*ifft(Data,N);
        TxCy = [IFFT_Data((N-Ncp+1):N,:); IFFT_Data];       % Add Cyclic prefix
        [r, c] = size(TxCy);
        Tx_Data = TxCy;
        % 2.1.5 Clip PAPR to 8 (9dB)
        Tx_Amp = abs(Tx_Data);
        Tx_Power = Tx_Amp.^2;
        Power_PAPR8 = 8.*mean(Tx_Power,1);
        Clip_loc = Tx_Power > Power_PAPR8;
        Clip_Data = Tx_Data./Tx_Amp;
        Clip_Data = sqrt(Power_PAPR8).*Clip_Data;
        Tx_Data(Clip_loc) = Clip_Data(Clip_loc);
        % Step 2.2 Wireless Channel
        Tx_Pow_Freq = mean2(abs(Tx_Data).^2);
        Tx_Data = reshape(Tx_Data, r*Frame_size,[]);
        totalFrames = c/Frame_size;
        % 2.2.2 Add AWGN noise
        y = awgn(Tx_Data,snr(i),'measured');                            
        y = reshape(y,r,[]);
        % Step 2.3: OFDM Receiver
        % 2.3.1 Remove cyclic prefix 
        Rx = y(Ncp+1:r,:);               
        % 2.3.2 Transform to Frequency-Domain
        Rx_Freq = (sqrt(N-2*Np)/N)*fft(Rx,N,1);
        % 2.3.3 Reshape to Frame size
        FFT_Data = reshape(Rx_Freq,N*Frame_size,[]);
        % 2.3.4 Extract Data Cells
        FFT_Data = reshape(FFT_Data(data_sc_frame,:), [], Nframes*Frame_size);
        % 2.3.5 Demodulation 
        if m_ary==3
            Rx_Data = qamdemod(FFT_Data,M,'gray');    
        else
            Rx_Data = qamdemod(FFT_Data,M,'gray');     
        end
        Rx_gray = Rx_Data; % gray2bin(Rx_Data,'qam',M);
        rxbits = de2bi(Rx_gray(:));
        % Step 2.4 Collect BER and SER
        [bitErrors,ber] = biterr(txbits,rxbits);
        [symErrors,ser] = symerr(Rx_Data(:),D(:));
        serofdm(i) = ser;
        berofdm(i) = ber;
        % Export data for Test in python
        if save_tx_data
            filename = sprintf('./mat/ofdm_awgn_%s_%ddB.mat',mod_names{m_ary},snr(i));
            save(filename,'y','txbits','rxbits');
        end
    end
    berofdm_all(m_ary+1,:) = berofdm;
    serofdm_all(m_ary+1,:) = serofdm;
end
​
%% Step 3: Result Presentation: Plot BER
save(mat_name, 'berofdm_all','serofdm_all');
csvwrite(csv_name, berofdm_all);
figure;
semilogy(SNRs,berofdm_all(2:5,:),'--x','LineWidth',2);
grid on;
title('OFDM BER vs SNR in AWGN channel');
xlabel('SNR (dB)');
ylabel('BER');
legend(mod_names);
 

Pyhton代码
 

#! /usr/bin/python
from numpy import genfromtxt
import tensorflow as tf
import numpy as np
import os
import time
import scipy.io as sio
​
flags = tf.app.flags
flags.DEFINE_string('data_dir', '../m/mat/', 'directory .mat data is saved')
flags.DEFINE_string('save_dir', './model/', 'directory where model graph and weights are saved')
flags.DEFINE_integer('nbits', 1, 'bits per symbol')
flags.DEFINE_integer('msg_length', 102400, 'Message Length of Dataset')
flags.DEFINE_integer('batch_size', 512, '')
flags.DEFINE_integer('max_epoch_num', 1000, '')
flags.DEFINE_integer('seed', 1, 'random seed')
flags.DEFINE_integer('nfft', 64, 'Dropout rate TX conv block')
flags.DEFINE_integer('nsymbol', 8, 'number of OFDM symbols per frame')
flags.DEFINE_integer('npilot', 8, 'number of pilot cells per OFDM symbol')
flags.DEFINE_integer('nguard', 8, 'number of guard bands per OFDM symbol (without DC)')
flags.DEFINE_integer('nfilter', 80, 'number of filters')
flags.DEFINE_float('SNR', 3.0, 'Signal to Noise Ratio')
flags.DEFINE_integer('early_stop',100,'number of epoches for early stop')
flags.DEFINE_string('channel', 'AWGN', 'AWGN or Rayleigh Channel')
flags.DEFINE_boolean('cp',False,'If include cyclic prefix')
flags.DEFINE_boolean('load_model',False,'Set True if run a test')
flags.DEFINE_string('token', 'OFDM','Name of model to be saved')
FLAGS = flags.FLAGS
​
​
class testflag:
    def __init__(self):
        self.token='OFDM'
        self.split=1.0
        self.load_model=True
        self.cp = False
        self.early_stop = 100
        self.SNR = 3.0
        self.nfilter=80
        self.nguard = 8
        self.npilot=8
        self.nsymbol=8
        self.nfft=64
        self.seed=1
        self.max_epoch_num=1000
        self.batch_size=512
        self.msg_length=102400
        self.nbits=1
        self.save_dir='./model/'
​
​
class ofdm_tx:
    def __init__(self, sflag):
        self.K=sflag.nfft
        self.CP = sflag.nfft//4
        self.DC = 2
        self.G = sflag.nguard
        self.P = sflag.npilot
        self.nSymbol = sflag.nsymbol
        self.nfft=64
        self.nbits=sflag.nbits
​
​
def load_model_np(path, session):
    graph = session.graph
    saver = tf.train.import_meta_graph(path + '.meta', clear_devices=True)
​
    saver.restore(session, path)
    print("Load Model: %s" % (path))
​
    y = graph.get_tensor_by_name('bits_in:0')
    x = graph.get_tensor_by_name('tx_ofdm:0')
    iq_receiver = graph.get_tensor_by_name('input:0')
    outputs = graph.get_tensor_by_name('output:0')
    total_loss = graph.get_tensor_by_name('cost:0')
    ber = graph.get_tensor_by_name('log_ber:0')
    berlin = graph.get_tensor_by_name('linear_ber:0')
    conf_matrix = graph.get_tensor_by_name('conf_matrix:0')
    power_tx = graph.get_tensor_by_name('tx_power:0')
    noise_pwr = graph.get_tensor_by_name('noise_power:0')
    iq_rx = graph.get_tensor_by_name('iq_rx:0')
    iq_tx = graph.get_tensor_by_name('iq_tx:0')
    ce_mean = graph.get_tensor_by_name('ce_mean:0')
    SNR = graph.get_tensor_by_name('SNR:0')
    return y, x, iq_receiver, outputs, total_loss, ber, berlin, conf_matrix, power_tx, noise_pwr, iq_rx, iq_tx, ce_mean, SNR
​
​
def test_model(path_prefix_min, ofdmobj, session):
    y, x, iq_receiver, outputs, total_loss, ber, berlin, conf_matrix, power_tx, noise_pwr, iq_rx, iq_tx, ce_mean, SNR = load_model_np(path_prefix_min,session)
    print("Final Test SNR: -10-30 dB")
    mod_names = ['BPSK','QPSK','8QAM','16QAM']
    nfft = ofdmobj.K
    nbits = ofdmobj.nbits
    npilot = ofdmobj.P # last carrier as pilot
    nguard = ofdmobj.G
    nsymbol = ofdmobj.nSymbol
    DC = ofdmobj.DC
    frame_size = nfft - nguard - npilot - DC
    msg_length = 16000
    n_fr = msg_length//nsymbol
    n_sc = nfft + ofdmobj.CP
    for snr_t in range(-10, 30):
        mat_name = '%sofdm_awgn_%s_%ddB.mat'%(FLAGS.data_dir,mod_names[nbits-1], snr_t)
        matfile = sio.loadmat(mat_name)
        iq_matlab = matfile['y']
        txbits_matlab = matfile['txbits']
        test_xs = np.transpose(iq_matlab, axes=[1,0])
        test_xs = np.reshape(test_xs,[msg_length//nsymbol,nsymbol,-1])
        xs_real = np.reshape(np.real(test_xs), [n_fr, nsymbol, n_sc, 1])
        xs_imag = np.reshape(np.imag(test_xs), [n_fr, nsymbol, n_sc, 1])
        test_xs = np.concatenate([xs_real, xs_imag], axis=-1)
        test_ys = np.reshape(txbits_matlab,[msg_length,frame_size,nbits])
        snr_test = 100 * np.ones((msg_length//nsymbol, 1)) # noise is already included in test_xs from matlab
        confmax, berl, pwr_tx, pwr_noise, test_loss, tx_sample, rx_sample = session.run([conf_matrix, berlin, power_tx, noise_pwr, ce_mean, iq_tx, iq_rx], {x: test_xs, y: test_ys, SNR:snr_test})
​
        print("SNR: %.2f, BER: %.8f, Loss: %f"%(snr_t, berl, test_loss))
        print("Test Confusion Matrix: ")
        print(str(confmax))
    session.close()
​
​
def main(argv):
    # Get current working directory
    cwd = os.getcwd()
    token = "OFDM_Dense3"
    # From Previous Test, max_epoch_num = 120~200 is ok
    batchsize = 512
    n_filter = FLAGS.nfilter # 128
​
    # save_dir = "./ofdm_saved/"
    # save_dir = "./ofdm_np_dc/"
    save_dir = FLAGS.save_dir
    data_dir = FLAGS.data_dir
    ebno = 3.0
    for nbits in range(1,5):
        snr = float(ebno*nbits)
        max_epoch_num = 1200 * nbits
        cond = "%dmod"%(nbits)
        for cp in ['False', 'True']:
            tflag = testflag()
            chan = 'AWGN'
            # chan = 'EPA'
            tflag.batch_size=batchsize
            tflag.cp=cp
            tflag.channe=chan
            tflag.save_dir=save_dir
            tflag.early_stop=100
            tflag.nfilter=n_filter
            tflag.max_epoch_num=max_epoch_num
            tflag.SNR=snr
            tflag.nbits=nbits
​
            token1 = "%s_%s_snr%d_cp%s" % (token, cond, int(snr), cp)
            tflag.token = token1
​
            path_prefix_min = '%s%s'%(FLAGS.save_dir,token1)
            ofdmobj = ofdm_tx(tflag)
            session = tf.Session()
            session.run(tf.global_variables_initializer())
            test_model(path_prefix_min,ofdmobj,session)
            session.close()
            tf.reset_default_graph()
            time.sleep(2)
​
​
​
if __name__ == "__main__":
    tf.app.run()
​


​​​​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值