简介:数字预失真(DPD)是无线通信系统中提升功率放大器线性度的重要技术,面向射频前端设计、基站开发与通信算法研究人员。资源包涵盖从PA特性测量、记忆多项式建模、预失真系数计算到自适应算法验证的完整流程,既有MATLAB脚本与Simulink仿真模型,也附带实测数据和理论文档。压缩包共13个文件,大小约7.48MB,主要类型包括可运行的.m分析脚本、.slx仿真模型、.mat测量与系数数据、.pdf说明文档及示意图,便于在本地复现DPD设计环境。目前已有305人学习下载。借助其中的模型与文档,读者能够掌握基于实测I/Q数据拟合PA行为模型、通过LMS等自适应算法更新预失真系数,并以EVM/ACLR等指标验证线性化效果,同时理解从静态校正到自适应验证的工程实现路线,适合作为学习与开发参考资料。
1. Adaptive DPD 设计:先搞清「自适应」三个字在解决什么
功放非线性会把邻道泄漏比(ACLR)从 -45 dBc 推到 -25 dBc 附近,EVM 同步劣化,这是每个做射频发射链路的人都见过的场景。DPD(数字预失真)的思路不复杂:在基带侧对信号施加一个逆变换,让「预失真器 + 功放」串接后整体逼近线性。真正让 DPD 从仿真走向量产调试的,是 Adaptive 这个定语——温度漂移、偏置点漂移、器件老化、信号峰均比波动,都会让固定系数预失真在几十分钟内逐步失效。Adaptive DPD 设计,本质是把模型选取、系数辨识、反馈延迟对齐、定点化实现这套闭环做成能长期运行、自动跟随的机制。很多团队拿到的功放 DPD 交付包就是一个 zip,MATLAB 脚本、FPGA IP 导出、寄存器映射表都齐,真正缺的往往是延迟对齐、正则化和更新策略这类参数层的知识。下文按模型 → 辨识 → MATLAB 最小框架 → FPGA 落地 → 现场调试五步展开,做 5G 基站、直放站、宽带功放线性化和射频仪表的人可以直接照这套路径复现。
2. 模型结构与辨识算法:Adaptive DPD 闭环的四个关键决策
2.1 记忆多项式和广义记忆多项式:先定预失真器的能力边界
功放的非线性是「无记忆部分 + 记忆效应」的叠加。无记忆部分看 AM-AM、AM-PM 曲线,记忆效应来自传输线阻抗失配、偏置网络储能和热弛豫,表现为当前输出依赖过去若干时刻的输入。带宽越宽,记忆效应越明显;在 100 MHz 级信号里,记忆效应会直接展宽邻道再生谱,单点查表型预失真通常压 5~8 dB 就到头。
工程上最普及的是记忆多项式(Memory Polynomial),用一个回归式子把非线性阶数和记忆深度统一表达:
y(n) = Σ_{k=1,3,…}^{K} Σ_{m=0}^{M} a_{km} · x(n−m) · |x(n−m)|^(k−1)
只取奇数阶,是因为功放偶数阶交调产物按载波对称性大多落在频带外,对带内性能贡献弱;省掉偶数阶,系数数量能砍掉近一半。K 决定非线性补偿能力,M 决定记忆补偿能力,系数总数是 ((K+1)/2)×(M+1)。参数往哪个方向取,参考典型值:
| 信号带宽 | 典型应用 | K | M | 系数总数 |
|---|---|---|---|---|
| 10~20 MHz | LTE、窄带直放站 | 5 | 2 | 9 |
| 40~100 MHz | 5G NR 单载波 | 7 | 4 | 20 |
| 100~200 MHz | 5G NR 载波聚合 | 9 | 6 | 35 |
| 200 MHz 以上 | 多频段并发 | 11 | 8 | 54 |
系数个数不是越大越好:每加一个记忆深度,辨识矩阵的列数线性增加,奇异值分布迅速恶化,对回采信噪比的要求跟着抬升。信号到 100 MHz 以上时,M 超过 6 的收益递减,瓶颈通常从模型转移到了反馈链路噪声。MP 压不住时,下一步是广义记忆多项式(GMP),它额外引入 x(n−m)|x(n−m−q)|² 这类带偏离记忆的交叉项,对高频记忆效应建模效率更高,代价是系数结构和调参复杂度上升,工程上常用于 200 MHz 以上带宽或 Doherty 功放。
2.2 闭环架构与辨识算法:LS、LMS、RLS 在 DPD 里的分工
Adaptive DPD 的主流工程架构是间接学习(Indirect Learning Architecture)。预失真器初始为直通,信号经功放后捕获反馈;用「功放输出当回归输入、原始信号当期望输出」辨识一个后逆模型,再把后逆系数搬回前馈通路,如此迭代。ILA 的好处是不需要对功放做显式求逆,辨识被规整成线性最小二乘问题。
浮点参照实现按 LMS 写最直观,每来一个样本更新一次系数:
# LMS 系数更新示意:仅作浮点参照,定点实现见第 4 章 import numpy as np K, M = 5, 2 # 非线性阶数 1..5,记忆深度 0..2 P = (K + 1) // 2 * (M + 1) # 系数总数 def reg_vec(x, n): # 反馈样本 x[n-m] 做 |x|^(k-1) 展开,得到回归向量 v = [] for k in range(1, K + 1, 2): for m in range(M + 1): s = x[n - m] if n - m >= 0 else 0 v.append(s * abs(s) ** (k - 1)) return np.array(v) a = np.zeros(P, dtype=complex) # 后逆系数,初始为 0 mu = 1e-3 # 步长:过大会发散,过小收敛慢 for n in range(M, len(x_fb)): # x_in 为发射参考,x_fb 为对齐后的反馈 p = reg_vec(x_fb, n) e = x_in[n] - a @ p # 期望与预测之差 a += mu * e * np.conj(p) # 沿共轭梯度方向更新LMS 的运算量是 O(P)/样本,在 FPGA 里就是一组 MAC 累加;坏处是发射信号自相关强、峰均比高,步长只能取得很小,收敛往往要数万到数十万样本。RLS 收敛快一个量级,但每步 O(P²),且对数值舍入敏感,工程上真正单独用 RLS 的反而少。批量 LS 在捕获一帧后用正规方程一次解出,精度最高,适合当成「校准」动作在开机和温度跳变时执行。三种算法的取舍可以这样记:
| 算法 | 每样本复杂度 | 收敛速度 | 主要风险 | 工程落点 |
|---|---|---|---|---|
| LS 批处理 | O(P²)~O(P³) | 一帧到位 | 矩阵病态,需正则化 | 开机校准、周期自检 |
| LMS | O(P) | 慢 | 步长难调、拖尾长 | 跟踪慢漂移 |
| RLS | O(P²) | 快 | 数值发散 | 快速粗收敛,少单独用 |
常见做法是两段式:开机或温度跳变后用 LS 重新校准,把系统拉到工作点,之后切低步长 LMS 跟踪慢漂。窄带场景捕获帧短,LS 必须加 Tikhonov 正则化,做法在 3.2 节给出。
2.3 反馈通路延迟对齐与功率归一化:自适应失败的第一个排查点
延迟没对齐是 Adaptive DPD 不收敛的第一位原因。反馈通路经过 DDC、数字滤波、捕获缓冲,与发射参考之间既有整数采样延迟,也有亚采样的小数延迟。回归矩阵把功放输出和期望输入错位配对,LS 解出来的是噪声,LMS 直接发散。整数延迟粗估用互相关峰值就够:
% 整数延迟粗估:反馈与发射参考互相关求峰值 [acor, lag] = xcorr(y_fb, x_ref, 64); % 搜索范围 ±64 样本 [~, i] = max(abs(acor)); d_int = lag(i); % 整数样本延迟拿到整数延迟后,剩下的亚采样延迟用多相滤波器或 Farrow 结构补偿。工程上有两个容易漏的地方:一是 TDD 系统里 DUC/DDC 的时钟比值在某次重配置后改变,延迟会跳变,必须在每次捕获前重新对齐;二是功率归一化,反馈链路自带衰减器和下变频增益,若不先把回采信号归一到与发射参考相同的均方根电平,LS 解出来的系数整体偏一个复缩放,预失真效果打折且迭代过程震荡。归一并解算延迟之后再做系数辨识,这一条值得做成所有实现的前置检查项。2.1 和 2.2 选的模型与算法决定性能上限,延迟对齐决定你能否达到这个上限。
3. 用 MATLAB 搭建 Adaptive DPD 最小框架:从功放模型到迭代收敛
3.1 构造高 PAPR 激励与带记忆功放模型
验证 DPD 算法不需要先接真实功放。最小复现链路有三件东西:高 PAPR 基带激励、可复现的带记忆功放模型、后逆辨识脚本。激励用复高斯噪声或者 OFDM 符号,归一化到均方根等于 1,PAPR 大约在 10~12 dB,已经接近 5G NR 的典型值;功放模型用增益、IM3、IM5 加一阶记忆项,足够复现邻道再生和记忆效应。
% adaptive_dpd_min.m —— Adaptive DPD 最小闭环(浮点) rng(42); N = 16384; % 每帧采样点 u = 0.5 * (randn(N,1) + 1j*randn(N,1)); % 复高斯激励 u = u / rms(u); % 归一化到 RMS=1 % 功放模型:线性增益 + IM3 + IM5 + 一阶记忆项 a_pa = [1.2, -0.07, 0.0025, 0.05]; y = a_pa(1)*u + a_pa(2)*u.*abs(u).^2 ... + a_pa(3)*u.*abs(u).^4; yd = [0; u(1:end-1)]; % 延迟 1 拍的记忆分支 y = y + a_pa(4)*yd.*abs(yd).^2; y = y / rms(y) * rms(u); % 反馈功率归一化a_pa的第二、三项代表三阶、五阶交调强度,第四项是一阶记忆系数。整段代码刻意不引入滤波器和上变频,因为 DPD 算法验证关心的是幅度与相位失真关系,不是频段位置。rms 归一化这一行对应 2.3 节说的反馈功率对齐,删掉它,后面的 LS 解会整体偏缩放。
3.2 记忆多项式展开与正则化最小二乘
回归矩阵的构造是整个辨识的核心。build_mp把输入信号展开成 ((K+1)/2)×(M+1) 列,每列对应一个延迟与幂次组合:
function A = build_mp(x, K, M) % 展开为 x(n-m)|x(n-m)|^(k-1) 各列 N = numel(x); A = zeros(N, (K+1)/2 * (M+1)); col = 0; for k = 1:2:K for m = 0:M col = col + 1; xm = [zeros(m,1); x(1:end-m)]; % 延迟 m 拍 A(:,col) = xm .* abs(xm).^(k-1); % 幂次展开 end end end % 带 Tikhonov 正则化的最小二乘解 lambda = 1e-3; a_hat = (B'*B + lambda*eye(size(B,2))) \ (B'*u);B'*B是正规方程的系数矩阵,信号相关性强时条件数能到 1e6 以上,直接B\u也能解,但定点化或帧长缩短后误差会放大。加 λI 的本质是给对角加一个小的下界,抑制系数幅度爆炸。λ 从 1e-6 试到 1e-2,观测 NMSE 和 ACLR 的拐点;λ 太小不起作用,太大会把系数压扁、线性化深度变浅。工程上一般取 trace(B'*B)/size(B,2) 的 1e-4 到 1e-2 倍做初值。
3.3 迭代闭环与 ACPR/NMSE 收敛评估
后逆系数估计一次不够,工程上把「估计系数、搬入预失真器、再过功放」循环 2~4 次,每次迭代都在压低残余失真:
u_d = u; for iter = 1:4 y_pa = pa_forward(u_d, a_pa); % 即 3.1 节功放模型,封装成函数 B = build_mp(y_pa, 5, 2); % 用功放输出建回归矩阵 a_hat = (B'*B + 1e-3*eye(size(B,2))) \ (B'*u_d); u_d = build_mp(u_d, 5, 2) * a_hat; % 后逆系数搬入预失真器 end收敛评估用两个指标:NMSE 看整体拟合误差,公式是 20·log10(||y−x||/||x||);ACLR 看邻道泄漏,在 MATLAB 里对频谱做窗口积分,20 MHz 信号按 20 MHz 频偏积分邻道功率。典型浮点仿真的收敛走势大致如下(数值随功放模型和随机种子浮动,看趋势即可):
| 迭代次数 | NMSE (dB) | ACLR (dBc) | 状态 |
|---|---|---|---|
| 0 | −12.5 | −27 | 未预失真 |
| 1 | −27 | −38 | 一次后逆后显著改善 |
| 2 | −34 | −44 | 逼近线性化上限 |
| 3 | −35 | −45 | 进入平台期 |
提示:仿真里 ACLR 用的是理想频谱积分,现场测的是频谱仪读数,两者通常有 1~3 dB 偏差,验收以仪表为准。
平台期出现后继续加大 K、M 往往无效,这时要回头看延迟对齐、正则化和激励峰均比——三者里任何一个不到位,平台都会提前。仿真帧长 16384 点对 20 MHz 信号够用,对 100 MHz 信号建议加到 65536 点,否则统计意义上邻道积分的置信度不够。
4. FPGA 落地:Xilinx DPD IP Core 的配置、定点化与宽带取舍
4.1 Xilinx DPD IP Core 的三种运行模式与配置要点
在 Zynq UltraScale+ RFSoC 和独立 DPD 参考设计里,Xilinx DPD IP Core 通常提供三种运行状态:bypass、固定系数预失真、自适应更新。bypass 用于链路自检和 DPD 旁路对比;固定系数模式在出厂校准或软件算完系数后加载;自适应模式把回采数据和发射参考送入内置或外置的系数更新引擎。不同 Vivado 版本里 IP 名称和寄存器偏移有差异,但下面的配置项名字是通用的:
| 配置项 | 典型值 | 设计影响 |
|---|---|---|
| 数据通路位宽 | 16 bit I/Q | 决定输出量化噪声地板 |
| DPD 抽头数量 | 与第 2 章 K/M 对应 | 乘法器与 BRAM 消耗 |
| 捕获缓冲深度 | 4096~16384 | 决定单次辨识的统计长度 |
| 更新触发 | AXI-Lite 软触发 / 时隙同步 | 决定什么时候换系数 |
捕获缓冲深度有一个工程经验:至少覆盖 20 个最大记忆深度对应的样本数,同时保证统计上包含足够多的峰值样本。100 MHz 信号、M=6 时,4096 点偏紧,16384 点更稳。软触发意味着主控 CPU 每帧算完系数后写寄存器,固件里要保证写系数和切换预失真发生在时隙边界,避免数据通路正在播放时系数跳变产生毛刺。
提示:不同器件与 Vivado 版本支持的 DPD IP 能力和寄存器地址不同,写驱动前先查对应的 Product Guide 里的寄存器地图。
4.2 定点化:系数位宽、反馈 ADC 分辨率与正则化的配合
DPD 环路的精度瓶颈有两个位置:预失真输出数据通路的位宽,以及反馈 ADC 的有效位数(ENOB)。数据通路位宽不够,残余量化噪声直接抬高邻道地板;反馈 ADC 分辨率不够,交调失真淹没在量化噪声里,自适应环路根本没有信息去纠正。经验上反馈 ENOB 应至少比发射 DAC 高 2~3 bit,否则 DPD 的修正上限被噪声钳住,这个约束在选 RFSoC 内置 ADC 或独立回采板时就要先核对。
系数定点用 Q 格式缩放,常见做法是 Q1.15。系数幅度超过 1 时要先整体归一化,否则溢出会表现为突发 ACLR 恶化;写系数顺序一般按实部全表、虚部全表排布:
# AXI-Lite 写系数示例:a_hat 为浮点后逆系数,P 为系数个数 def q15(v): v = max(min(v, 0.99999), -0.99999) # 饱和到 Q1.15 范围 return int(round(v * 32768)) & 0xFFFF for i in range(P): axi_write(0x2000 + 4*i, q15(a_hat[i].real)) # 实部表 axi_write(0x2000 + 4*(i+P), q15(a_hat[i].imag)) # 虚部表写完后读回校验一遍,很多参考设计里系数 RAM 的地址映射和文档不完全一致。定点与浮点的性能差在 1~2 dB 属于正常范围;大于 3 dB 时优先检查数据通路位宽和峰均比余量,而不是急着加系数位宽。另一种工程实现是把系数估计也放进逻辑,用 QR 分解或 Cholesky 做低延迟更新,适合对更新时延敏感的应用;主控 CPU 软解回写的方案更灵活,适合原型验证阶段。
4.3 宽带与多频段:记忆深度、捕获长度和 CFR 的配合
带宽上到 100 MHz 以后,三个代价必须同时接受:记忆深度 M 加到 5~6,捕获帧长翻倍,小数延迟补偿精确到 0.1 样本量级。反馈通路里 DDC 的抗混叠滤波器群延迟随频率缓慢变化,固定延迟补偿在高频端会残余亚采样误差,工程做法是每帧捕获后重估小数延迟,而不是只在开机时标定一次。
CFR(峰值因子削减)与 DPD 的配合也容易出错。CFR 先把信号 PAPR 压低,DPD 才有余量去放预失真峰值;顺序一定是 CFR 在前、DPD 在后。若 CFR 过度削减引入带内误差,DPD 会把这种误差也当作线性化对象去补偿,两边互相打架。经验做法是 CFR 目标 PAPR 与功放平均回退之间留 1~2 dB 余量,并分别测量 CFR 前后 EVM。
多频段并发时,一个 DPD 核处理多组载波需要在模型里加入带间交叉项,系数数量成倍上升。工程上更可控的做法是每个频段独立 DPD 链路、独立回采,虽然占用资源,但延迟对齐和系数更新互不干扰,排障时也容易定位。单 DPD 核硬撑多频段只在交叉调制对系统指标影响可忽略时才划算。
5. Adaptive DPD 现场落地的五个检查项与调试技巧
现场调试和仿真最大的差别是:所有条件都不理想。以下五个检查项按排查顺序排,前两个不做,后面调参都白费。
5.1 延迟对齐:先整数粗搜再做亚采样细分
现场排查的第一动作永远是把发射参考和反馈捕获对齐。整数延迟用互相关峰值定位,随后用 Farrow 滤波或频域相位斜率估计做亚采样补偿。对齐后立刻复查一帧 NMSE,如果从 −30 dB 量级掉到 −15 dB 以下,基本可以断定对齐还在漂。
5.2 功率归一化:去掉整个反馈链路增益后再辨识
反馈链路里的衰减器、下变频器和 ADC 增益让回采信号幅度和相位都偏了,不做归一化就做 LS,解出的系数整体偏一个复缩放因子。现场做法是先测一条已知幅度参考信号的 RMS,把反馈通路增益折算成固定常数,在辨识前对每一帧统一除。
5.3 正则化强度与系数跳变监测
Tikhonov 正则化从 1e-4 级别起调。系数在一帧更新后跳变超过 20% 时,优先怀疑延迟对齐或归一化问题,而不是模型阶数不够。把每帧系数幅度的均值、最大值打印出来,正常情况下逐帧缓慢变化;突变往往对应回采集合里混入了 RX 时隙或干扰信号。
5.4 TDD 时隙边界重触发与系数冻结
TDD 信号在发射时隙之外没有有效信号,跨时隙累计的捕获会把静默段当成失真去补偿。固件里要在时隙同步信号触发的窗口内捕获,时隙边界处才允许更新系数;更新瞬间短暂冻结预失真输出,避免系数切换毛刺打进相邻时隙。
5.5 用 ACPR 与 EVM 双指标验收,NMSE 只做中间参考
NMSE 下降不代表系统指标达标:它只说明输出与参考在统计上接近,邻道泄漏的残余能量可能被带内拟合掩盖。验收必须同时看 ACPR 和 EVM:ACPR 反映线性化深度,EVM 反映带内质量,两者分别对应频谱模板和调制质量两类测试要求。收敛判别用一条经验式:ACPR 连续三帧变动小于 0.5 dB,EVM 低于目标值 1 dB 以上,才允许把系数固化下来。
本文还有配套的精品资源,点击获取