ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

从多项式到神经网络:DPD数字预失真算法演进与FPGA工程落地

从多项式到神经网络:DPD数字预失真算法演进与FPGA工程落地 做基站射频前端这块的工程师应该都听过一句话功率放大器PA是无线通信系统里最矛盾的器件——你想要它高效它就给你非线性你想要它线性它就给你烧电。而在RRU的数字中频链路里数字预失真DPD算法就是用来调解这对矛盾的关键手段。从早期纯粹的多项式模型到最近几年神经网络DPD成为热点这个领域已经有几十年演进史了。这篇文章想结合我自己在DPD算法仿真和RRU工程落地上的经验把这条演进路径拆开讲讲DPD到底在解决什么问题多项式模型为什么会一度成为工程主流神经网络又凭什么想“上位”以及最终这些模型是怎么在FPGA和Versal ACAP这类平台上落地成实时链路的。如果你是做通信物理层、射频前端或者FPGA的老师傅或者正在啃5G/6G基站算法相关项目的研究生这篇文章应该能帮你少走不少弯路。1. 线性化技术的前世今生DPD到底在解决什么问题1.1 功率放大器的非线性失真基站里绕不开的坎很多人第一次接触DPD是从功放的AM-AM、AM-PM曲线开始的。PA本质上是一个有记忆的非线性系统输入信号功率增大时增益会被压缩同时相位也会发生偏移。如果你只喂一个单音信号进去问题还不明显顶多输出功率不对、谐波变多但现代通信信号比如5G NR带宽动辄100MHz峰值平均功率比PAPR甚至可以到10dB以上。包络在这种大幅波动下反复拉扯PA的工作点会产生严重的互调失真在频谱上表现为邻道泄漏直接拉高ACPR带内则表现为EVM恶化。要注意的是这里说的“非线性”和“记忆效应”是两回事。非线性是瞬时增益曲线弯曲比如1dB压缩点附近记忆效应则是因为PA内部的热容、偏置电路、匹配网络的储能元件让你的输出不仅取决于当前时刻的输入幅度还取决于前几个采样周期的输入历史。简单理解功放也有“惯性”刚打完一个强信号再出小信号时它还带着“上一脚的脾气”。这个特性对后续的模型选择影响极大也是多项式模型里为什么非要加记忆深度的根本原因。从系统角度看基站或者RRU的设计目标是频谱合规和EVM达标。而工程上几乎没有人会选择让PA深度回退到完全线性区——那功耗就爆炸了Doherty功放的高效率退避区也基本发挥不出来。所以工业界真正的做法是让PA工作在饱和区附近高效率但是失真大然后用DPD在数字域把失真掰回来。DPD化解了一对物理层面的矛盾这也是它几十年来一直是基站射频链路核心算法的原因。1.2 从负反馈到前馈再到DPD线性化手段的演进逻辑在DPD普及之前模拟域线性化技术是主流。负反馈结构简单对低频失真抑制有效但带宽受限射频大带宽下容易自激前馈Feedforward线性化性能不错曾在宏基站里用得较多缺点是把误差放大链路、时延校准、幅度相位匹配这些环节拆成一堆模拟器件成本极高调试一次想死的心都有。只要温度和载波频率稍微变一下前馈链路的匹配就偏了性能直线下滑。真正让数字域DPD成为主流的是数字中频和高速ADC/DAC技术的成熟。DPD的思路非常直接在PA前面串联一个数字预失真器让级联系统的整体传递函数变成一条直线。也就是说预失真器输出的波形在进入PA之前就被“反扭”了一下PA再把它扭回来。这种做法本质上是对PA逆模型的逼近。因为数字逻辑灵活可重构同样的硬件可以通过切换系数适配不同频段、不同PA型号还可以通过反馈通路实时跟踪温漂和器件老化这些是模拟方案完全做不到的。我经常跟团队里的小朋友打比方DPD就像是你提前把嗓子压到一个奇怪的状态去唱歌等音箱的“怪脾气”把声音再扭曲一遍观众听到的正好是准的。难点在于你怎么知道音箱到底会把声音扭成什么样以及怎么实时调整你压嗓子的程度。这两个问题前者对应PA辨识和模型结构后者对应自适应算法和工程实现。2. 多项式模型DPD算法从理论走向工程的第一步2.1 Volterra级数与记忆效应的物理本质如果你去翻非线性系统理论Volterra级数是绕不开的起点。它是线性系统卷积积分概念的延伸把输入信号的三阶、五阶、七阶乃至更高阶的时域卷积累加起来在理论上可以描述一大类带记忆的非线性系统。PA建模和DPD建模从纯数学角度都把它当作最“完备”的建模框架。Volterra级数的矩阵形式可以写成y(n) ∑ h_1(m_1) x(n-m_1) ∑∑ h_2(m_1,m_2) x(n-m_1) x(n-m_2) …直接把PA建模想成“高阶卷积核”的叠加。理论上这个模型是完备的工程上却是灾难每一阶核的维度随记忆深度指数膨胀。一个5阶Volterra模型记忆深度哪怕只有5核数量也会膨胀到几千甚至上万。且不说FPGA资源光是在线辨识这些核系数时矩阵求逆的条件数就能让你疯掉。所以Volterra在实践中更多是理论基准直接拿来工程实现的时代早已过去但它奠定了所有人对“带记忆非线性”的理解。2.2 从Volterra到记忆多项式MP工程妥协的艺术工程上的第一次大妥协是记忆多项式Memory Polynomial, MP的提出。MP把Volterra级数中那些不同时延之间的交叉项全部砍掉每个高阶项只保留“自己的”时延即每个核只依赖x(n-m)这一个时间点。这样一来模型简化成y(n) Σ_{m0}^{M} Σ_{k1,3,5,...,K} a_{k,m} · x(n-m) · |x(n-m)|^{k-1}这里的k是奇次阶数m是记忆深度。PA的失真以奇次交调为主所以通常只取奇数阶。这个模型的参数数量从指数级降到(M1)(K1)/2也就是几十到一百多个系数在FPGA里用LUT或者乘法器就能装得下。早期3G、4G基站里的DPD大量用的就是这种结构。MP模型的工程实现也很成熟。硬件上可以拆成“包络提取 → 多项式查表 → 复数乘法”三级流水线。包络 |x(n-m)| 计算后作为地址查一个实值LUT获得加权值再和输入信号相乘最后把所有记忆支路累加。这种结构在Xilinx FPGA上跑几百兆采样率毫无压力。我自己第一次用MATLAB复现MP训练时还不知道这些细节上了Verilog之后才体会到原先觉得“不够完备”的多项式模型其实是故意把算力需求卡在硬件能接受的边界里。2.3 广义记忆多项式GMP与模型修剪精度与算力之间的平衡木MP模型有一个明显短板它只包含同一时延下的各阶非线性项无法表示“当前输入幅度影响之前时延信号”这种交叉记忆效应而PA的实际行为里这部分是存在的。为了逼近Volterra的精度同时又不完全回到参数爆炸的老路业界又引入了广义记忆多项式GMP。GMP在MP的基础上增加了两组交叉项一组是滞后交叉项用当前时刻的非线性包络对过去时刻的信号做加权一组是超前交叉项反过来处理。模型数学上比MP复杂但依然保持了基函数的结构化形式能够覆盖更多PA失真形态。GMP在实际工程落地时最重要的一步是模型修剪。很多第三方工具或者自研算法在初始建模时会生成一个“超集”GMP包含大量候选基函数。你要用训练数据做一次稀疏化选择把系数能量很低、对线性化贡献小的项删掉。我见过有人一口气把几百个GMP项全保留结果ACPR是达标了但硬件资源爆掉、系数刷新周期拖慢得不偿失。合理修剪后往往只用30到50项就能覆盖大部分失真性能只退步0.5dB以内工程量却少了一半以上。用MATLAB做基矩阵构造时前几行通常长这样% 构建GMP基矩阵示意 % x为输入信号M为记忆深度Ka/Kb为阶数范围 N length(x); basis zeros(N, numTerms); idx 1; for m 0:M for k 1:2:Ka basis(:, idx) x_circshift(x, m) .* abs(x_circshift(x, m)).^(k-1); idx idx 1; end end % 后续用LS或RLS求解系数 a (Phi*Phi)\(Phi*y)这类代码本身不复杂但前提是你把记忆对准了。后面工程实现章节我会再展开时延对齐的问题。总之从Volterra到MP再到GMP这是一条“模型精度”和“工程可实现性”不断博弈的路线也是理解神经网络DPD为什么会出现的大背景。3. 神经网络来了DPD求解思路的范式转换3.1 多项式模型的“天花板”非线性阶数爆炸带来的维度灾难多项式模型虽然统治DPD领域很久但它有一个绕不开的天花板高阶基函数之间相关性极强容易导致回归矩阵病态阶数越高对数值精度越敏感稍微有一点定点量化误差性能就崩。另一个问题是非线性函数类型被基函数本身锁死了。PA的AM-AM/AM-PM曲线如果不是平滑多项式能描述的形态光靠升阶反而会过拟合泛化能力变差。换句话说你用多项式模型本质上是在用一个带记忆的幂级数去拟合PA的逆特性。而功放的失真机制很复杂尤其是GaN HEMT等高功率器件在饱和区附近有较强的非线性软化现象多项式的“无限阶极限”原则上能逼近但实际有限阶实现时精度有限。神经网络在理论上可以按万能逼近定理去拟合任意连续函数而且不需要你手工设计基函数——它自己从数据里学出合适的非线性表示。这个范式的变化让很多人在研究新型DPD时开始把目光投向了MLP、RNN甚至CNN。3.2 神经网络DPD的模型设计从FNN到RNN/LSTM的选择题神经网络做DPD核心任务还是学习PA的逆模型。给定输入期望信号x(n)预失真器输出u(n)要满足PA(u(n))x(n)。用神经网络做这个映射第一步是确定输入特征怎么构造。PA有记忆效应所以简单的“当前时刻IQ进、当前时刻IQ出”是抓不到记忆特征的。常见做法是用延迟线抽头把x(n)、x(n-1)…x(n-M)的I/Q实部虚部拼成一个2(M1)维向量输入给前馈神经网络FNN/MLP。这和直接学习架构里的时延神经网络TDNN思想一致实现成本最低。也可以用极坐标形式输入幅度包络和相位信息因为PA非线性主要跟包络相关这样做可以压缩输入维度模型更容易训练。但极坐标的前向和反向运算有三角函数FPGA里定点化麻烦所以工程上不少实现还是选择IQ双通道输入。RNN和LSTM在理论上是比FNN更自然的记忆建模方案它从结构上自带时序状态理论上可以考虑无限记忆。但DPD链路对时延极其敏感要求每个时钟周期都能输出预失真信号RNN的循环依赖在硬件流水线里很难展开实时性难以保证。所以RNN/LSTM更多存在于论文和离线离线验证中离RRU里的大规模商用落地还有距离。CNN在这里则不是做图像那样的大卷积而是一维卷积在时域窗上做特征提取本质上跟TDNN类似好处是卷积可以高度并行适合FPGA推理加速所以近年的神经网络DPD硬件实现研究中经常提到它。下面是一个极简的FNN-DPD模型训练片段使用PyTorch风格方便理解整体流程import torch.nn as nn class DPDNet(nn.Module): def __init__(self, M3, hidden64): super().__init__() # M代表记忆深度输入为历史M1个IQ采样点的实部虚部 self.fc1 nn.Linear(2 * (M 1), hidden) self.fc2 nn.Linear(hidden, hidden) self.out nn.Linear(hidden, 2) # 输出预失真IQ def forward(self, x): h torch.relu(self.fc1(x)) h torch.relu(self.fc2(h)) return self.out(h) # 训练数据由PA采集得到: u_ref 作为输入特征, x_pa 作为标签(观测到的PA输出)实际训练时还需要对输入输出做归一化比如将信号RMS归一化到0.8左右否则饱和区的大峰值信号会让梯度爆炸。3.3 神经网络DPD的训练与在线适配不只换了个模型这么简单别以为把模型从多项式换成神经网络就万事大吉。神经网络的训练数据需求比多项式大得多而且要覆盖不同功率回退、不同温度下的PA行为否则泛化性很差。基带信号统计特性也会影响训练效果训练集里如果都是低PAPR信号模型推算高PAPR输入时就会明显不准。我见过有实验室拿一段特定数据训练LSTM-DPD离线仿真ACPR改善20dB放到现场测试换一种业务流量模型后就只剩8dB完全没法商用。在线适配也是一个麻烦事。传统多项式模型可以用RLS或者LMS在线迭代更新系数计算量小收敛快。神经网络动辄几万甚至几十万参数在线直接做反向传播虽然理论可行但实时性在RRU这种嵌入式平台上是接受不了的。目前工程上相对现实的方案是“离线训练 在线推理”也就是在研发阶段用大量PA测试数据把网络权重训好部署到硬件上以后只做前向推理如果遇到温漂或者器件老化导致性能下降再用小步长的在线微调比如只更新最后几层全连接层来兜底。2025年华为杯研究生数学建模竞赛的A题提到“通用神经网络处理器下的核内调度”其实就反映了通信物理层开始考虑如何在嵌入式AI处理器上调度神经网络算子的大背景。对DPD领域来说这个方向的意义在于一旦通用NN加速器在RRU侧成熟神经网络DPD才有真正的工程化舞台而不是永远活在论文仿真里。4. RRU里的DPD从MATLAB算法到FPGA硬件实现4.1 在RRU架构中DPD的位置链路预算与实时性约束先理清楚RRU射频拉远单元的数字链路位置。在传统分布式基站架构中BBU负责基带处理通过eCPRI前传接口把IQ数据发给RRURRU收到IQ数据后先做削峰CFR限制峰均比然后进入DPD模块预失真再送到DAC之后才是上变频和PA。PA输出经耦合器取一路反馈信号下变频后由ADC采样送回到DPD的数字逻辑做参数更新。所以DPD在RRU中不是一个独立算法模块而是一套“前向预失真反馈采集逆模型训练更新”的闭环系统。实时性约束要分两条通路来看。预失真前向路径是每采样点都必须算完的它决定DAC的数据能否按时输出这部分简单说就是高吞吐、低时延而参数更新路径可以慢很多通常每几毫秒到几十毫秒更新一次预失真器的系数即可。这种“快前向慢反馈”的拆分是DPD工程实现的通用套路也是它能在FPGA上跑起来的关键。在带宽方面DPD的处理带宽通常需要覆盖PA失真的频谱扩展。5G单载波100MHz信号PA交调扩展后可能要到400~500MHz所以DPD模块工作在几百Msps到1Gsps以上的采样率非常常见。这对FPGA的时钟和DSP资源压力很大也解释了为什么DPD模块通常要用专门的DSP48和BRAM/URAM去优化。4.2 Xilinx DPD IP核与Versal ACAP开发者的左膀右臂对很多团队来说从零写DPD的RTL并不划算Xilinx官方的DPD IP核是更现实的选择。这个IP支持多种预失真模型包括MP和GMP内部集成了时延估计、系数求解、预失真器多个子模块而且提供了AXI接口用于CPU配置和状态监测。你可以把它当作一个“半成品”通过配置寄存器选择模型阶数、记忆深度、导通角等参数再通过数据接口把参考IQ、反馈IQ喂进去输出就是预失真IQ。用得多了就会意识到IP核只是算法骨架真正决定DPD性能的还是你的外围工程能力。比如反馈通路的ADC采样率、反馈数据的方向对齐、DPD输入信号的电平归一化这些没有调好IP核性能再强也白搭。Versal ACAP平台的出现在某种程度上改变了局面AI Engine阵列可以跑大规模的矩阵运算和神经网络推理让原先只能在DSP上顺序执行的GMP系数更新在硬件上高度并行化而传统的Programmable Logic继续扛前向预失真流水线。我接触几个基于Versal的DPD预研项目时明显感觉到神经网络DPD从“仿真验证”到“样机演示”的距离被这种异构架构缩短了不少。提示如果用Xilinx DPD IP建议先在高层次综合或System Generator里做一次数据通路仿真确认IQ位宽、极性、帧格式一致以后再上板。很多第一次调IP的人问题不是算法不好而是接口时序没对齐现象是ACPR毫无改善查半天发现是参考信号和反馈信号反相了。4.3 从浮点仿真到定点硬件系数量化与数值稳定性的细节MATLAB仿真通常用浮点训练和求解都很舒服但进了FPGA就面临定点化问题。定点化做得不好DPD性能很容易从仿真的-25dB ACPR改善掉到-15dB甚至直接发散。几个最容易踩的坑一是输入信号动态范围。IQ信号来自DAC前端峰均比高必须确认定点格式留够裕量。通常要给峰值留头比如6~8dB。幅度归一化是关键要让预失真器的输入不过载否则LUT查表饱和训练再好的系数也白搭。二是系数精度。GMP或神经网络系数经过量化后会有截断噪声尤其小系数项对量化误差极其敏感。解决办法是分块增益归一化让每个子项系数都落在合理的Q格式范围内而不是统一用一个Q格式去硬扛。还可以用双字长或动态缩放硬件资源消耗稍多但稳定性好很多。三是矩阵求逆。在浮点里直接用LS或者伪逆看着没问题定点里直接求逆几乎都会因为条件数过大而翻车。工程上更稳的做法是用RLS迭代更新或者用QR分解做最小二乘当然QR分解资源开销较大需要根据硬件预算权衡。总之浮点仿真过不代表定点能过这块一定要在仿真早期就引入定点建模越晚代价越大。5. 工程实现中的经典问题与实战排查5.1 反馈通路校正不干净的回波信号比非线性的功率放大器更致命这句话是我在做第一个DPD项目时带我的老工程师说的原话是“喂给DPD的反馈信号不干净神仙算法也白搭”。PA输出信号经过耦合器后要经历模拟下变频、滤波、ADC采样才能回到数字域。这条反馈链路上任何的非理想特性——混频器的IQ不平衡、本振泄漏、ADC偏置、镜像干扰——都会被DPD当成PA特性的一部分去学习结果学出来的逆模型是对“PA反馈通路”的联合逆。表现就是DPD输出看起来很好但真实PA输出并没有被线性化。所以规范的DPD工程实现里反馈校正和时延估计是数据处理的第一步。常见做法是在数字域对反馈IQ做直流偏置估计和消除再用正交校正算法去补偿混频器引入的IQ幅度/相位失配。如果反馈通路本身有明显畸变还要先采集一段单音或者宽带信号对反馈链路做均衡补偿。这些校准模块虽然不新鲜但每个现场调试点都逃不开。5.2 数字前端对齐与时延补偿多通道同步的坑DPD需要同时拿到两路信号作为模型训练的参考一路是发射链路发送前的期望信号另一路是PA输出的反馈信号。由于模拟器件、滤波器、PCB走线长度不同反馈信号和参考信号之间存在未知时延。这个时延如果不对齐模型哪怕结构正确也学不出来。我在实验室见过有人拿GMP模型调了两周没有效果最后用互相关搜索发现时延差了三个采样点补偿掉以后ACPR立刻改善10dB以上真是血泪教训。时延估计的常用方法是做互相关峰值搜索或者在频域用相位斜率的方式估计。大带宽信号下时延分辨率要求更高因为一个采样点偏差在高阶非线性项里会被放大。多通道RRU更麻烦每个发射通道的时延可能都不一样而且随温漂变化所以工程上要把时延估计做在参数更新环里周期性地跟踪漂移而不是上电只校准一次。5.3 学习率与步进收敛速度、稳定性与性能的权衡自适应DPD在参数更新时如果没有用直接的LS闭式解而是选择了LMS或者NLMS这类迭代算法学习率的选择就变得很关键。学习率太大系数会在最优值附近振荡甚至发散学习率太小跟踪不上PA特性的快变遇到温度突变或者信号统计突变性能会持续差好几秒。稳妥做法是先用离线数据做一个最优步进搜索再留一个比最优值小一个数量级的保守步进用于现场默认。还有一个容易被忽略的点是触发更新的时机。基站上DPD通常不是连续更新的而是一段时间采集一段数据做一次系数更新更新完再继续观察。这段数据要覆盖足够的峰均比样本否则更新方向被“普通幅度样本”主导峰值区域的预失真效果反而变差。采集窗口内最好能触发多次峰值事件训练数据才有统计代表性。6. 未来演进直接学习架构、实时训练与终端侧DPD6.1 直接学习与间接学习两种训练架构的工程取舍DPD训练架构最常见的两种是间接学习架构ILA和直接学习架构DLA。ILA的做法是先采集PA输出信号y再以y为输入、以发射信号x为期望学习一个逆模型学好之后把这个逆模型直接串在PA前面。优点是计算简单不需要精确的PA正模型收敛也快工业界大量采用。缺点在于训练目标与最终的线性化效果之间存在偏差——逆模型拟合的是“y到x”的映射而不是级联系统的端到端误差。DLA则是先辨识PA的正模型然后利用正模型传播梯度以“预失真器PA”级联输出误差作为损失函数来训练预失真器。DLA优化目标更贴近真实指标线性化潜力更大但对PA模型精度要求高训练计算量也大。神经网络DPD的论文里很多采用DLA因为反向传播本身就需要可微的PA模型。工程上如果后继想把神经网络DPD产品化DLA是绕不开的研究方向就看Versal这类带AI引擎平台的算力能不能顶住端到端训练更新了。6.2 从BBU/RRU到一体化基站DPD算法的下沉与上移5G时代RRU和BBU的边界变得模糊出现了更多一体化基站和小站形态但DPD的位置仍然在离PA最近的地方。分布式架构里DPD的模型训练一般在RRU本地完成因为反馈数据量太大送回BBU做处理不现实但模型参数的更新策略、异常检测、故障预测这类慢变逻辑已经在尝试上移到BBU或者网管侧。这其实是DPD“控制面”与“数据面”的分离跟前传网络的发展趋势一致。神经网络DPD将来如果落地大概率也是这种分工用BBU/上层算力做模型初始训练和周期性演算将更新权重下发RRU侧的AI推理IP只做低时延的前向计算。同时CFR、DPD、DAC这一条链路需要做联合优化而不是各自为战。就像削峰算法削得越狠DPD需要补偿的峰值就越少两者耦合调优会比单独优化每个模块带来更好的整体性能。6.3 对未来DPD工程落地的一点个人思考做了几年DPD我的感受是多项式模型短期内不会被彻底替代。它结构透明、参数少、定点化成熟、在线更新方便这些优点在任何商业产品里都是硬指标。神经网络模型的优势在于逼近复杂非线性能力更强、对新型PA器件适配更灵活但它的代价是训练成本、硬件算力和可解释性下降。两者将来更多的可能是混合形态用神经网络做PA行为级建模然后模型辅助多项式系数计算或者在模型退化时用神经网络补偿多项式残差。物理信息神经网络PINN这类思路也开始被讨论——把PA的物理约束如饱和特性、因果性、记忆上限嵌入到网络损失函数中减少对大量实测数据的依赖。如果这条路走得通神经网络DPD的泛化能力和在线适配能力会有本质提升。工程上我建议正在入行DPD的年轻工程师不要只盯着最新模型先把链路每个环节的机理和“脏”影响搞透再到FPGA上去摸一遍信号通路的时序和资源约束。因为模型只是DPD的一部分整个系统工程的复杂度往往比模型本身高得多。最后再分享一点个人体会。我在RRU调测时印象最深的一次是在实验室里为了ACPR一个指标折腾了三周从GMP系数调优到神经网络预研都试了一圈最后发现是反馈通路的时延补偿差了半个采样点。那一次让我彻底明白DPD工程实现不是算法模型的独角戏而是数字、模拟、射频、软件协同的系统工程。今天很多讨论都聚焦在“多项式还是神经网络”上但真正决定项目成败的往往是你有没有把反馈链路看干净、把时延对齐调准、把定点化做扎实。希望这篇文字能给正在这条路上摸索的朋友一些实在的参考。
返回列表