ARTICLE DETAIL

资讯详情

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

FPGA多径信道下Gardner定时恢复环性能实测与失效分析

FPGA多径信道下Gardner定时恢复环性能实测与失效分析 先说结论我在自建的 FPGA 验证平台上把 Gardner 定时恢复环喂进不同的多径信道里实测下来发现当第二径延时走到半个符号周期附近时哪怕第二径幅度只有主径的 0.3 倍定时误差信号也会明显畸变环路从“干净入锁”变成“振荡几万符号后才勉强稳住”。这篇笔记是【2.17】系列项目的第二阶段重点记录不同多径大小对 Gardner 环性能的影响分析过程包括信道怎么构建、误差信号怎么统计、哪些参数不能瞎调以及我踩过的几个典型失效坑。搞串行收发、调制解调、数字中频的同学可以直接拿这套方法复测自己的工程。1. 为什么多径是 Gardner 环的“隐形敌人”先从 S 曲线说起1.1 Gardner 定时环正常工作时到底在测什么Gardner 环本质上是利用码元波形在最佳采样点和相邻符号中点之间形成的对称性来产生误差信号。假设接收端已经做过匹配滤波采样速率是符号速率的 2 倍那么定时误差检测器输出的典型形式是e(k) y(k - 1/2) * [ y(k) - y(k - 1) ]其中 y(k) 是当前符号的采样值y(k-1) 是上一个符号的采样值y(k-1/2) 是两者中间位置的采样值。很多人第一次看这个式子会觉得莫名其妙为什么要拿中间点去乘两个符号点的差实际上它的物理含义非常直接如果定时相位完全正确中间点应当落在相邻符号的平均过渡点上眼图张开度最大符号点之间差值最大而中间点刚好是零交叉位置附近乘积在一个理想无噪声信道里精确等于零当定时相位偏移时中间点在眼图中不再是零交叉乘出来的误差信号就有了正负方向环路积分器据此修正插值器相位。这个检测器和 Mueller-Muller 型检测器最大的不同在于它不依赖数据的判决结果是真正的非数据辅助型定时恢复。我在项目里选择它而不是盲目套用 PLL 或者早迟门就是因为 Gardner 对载波相位偏差相对不敏感可以放在解调器前面直接跑后面再做载波同步整体结构干净。1.2 多径进来以后S 曲线不再是单径那根干净的线所谓 S 曲线就是定时误差检测器输出 e 作为定时相位误差 τ 的函数的静态曲线。单径直视信道下S 曲线是一条在 τ0 处过零、斜率为正的单调曲线环路锁定点就在零点。但多径信道下接收信号变成多条路径的叠加r(t) h0 * x(t - tau0) h1 * x(t - tau0 - D) n(t)第二径相当于是把原信号复制一份延时 D 后按幅度 h1 叠加回来。这个叠加改变了等效信道的脉冲响应形状也改变了整个符号波形的对称性。Gardner 误差信号里那个“中间点乘以符号点差值”的对称性前提被打破了产生两个直接后果第一S 曲线在零点附近的斜率变小意味着同样的相位误差产生的控制电压变小环路增益等效下降收敛速度自然变慢第二S 曲线整体可能出现一个非零偏差也就是零点不在 τ0 处而是在某个偏移量上。环路最终锁定的位置会偏离理想定时点即使环路闭合也无法消除这个静态定时偏差只能靠后续均衡器去兜底。我在实测里把这些现象拆成了几个可量化的指标后面测试平台部分会详细说明统计方法。这里先记住一句话多径对 Gardner 环的破坏不是“噪声变大”那么简单而是直接改写检测器的高斯曲线形态。如果只按单径条件整定环路带宽拿到多径场景下往往不是慢而是可能永远锁不到目标点。2. 测试平台怎么搭从多径信道注入到误差信号统计2.1 信道模拟部分用 FPGA 内部 FIR 抽头延迟线仿真多径这个测试我不想依赖射频仪器多径信道完全在 FPGA 内部生成好处是可重复、可精确控制幅度和延迟坏处是容易把“理想多径”和“真实多径”混为一谈。我的做法是在发送端先按符号速率 2 Msps 产生基带码元经过根升余弦成形滤波后再送进一个抽头延迟线结构的 FIR 滤波器模拟两径信道主径增益固定为 1.0延时 0第二径增益 h1 取 0.1、0.3、0.5、0.8 四档第二径延时 D 取 0.125T、0.25T、0.5T、0.75T 四档叠加高斯白噪声SNR 控制在 18 dB 附近。FIR 的抽头数量取决于最大延时时长。符号周期 T 为 0.5 μsADC 采样率取 8 Msps也就是每符号 4 个采样点0.75T 的延迟对应 3 个采样时钟周期。理论上 FIR 只需要 4 个有效抽头但我还是把 FIR 总长度留到 8 抽头尾部补零防止边界效应干扰统计结果。每个抽头系数在测试开始时通过寄存器接口写入我用的方案是 UART 控制寄存器下发既简单又能脱离 JTAG 单独灌数据。如果要在自己的工程里复现关键点是发送端脉冲成形的滚降系数要固定。我用的根升余弦滚降系数 β0.25这个直接影响 ISI 的分布形状也影响 Gardner 环对多径的敏感程度。实测中如果把 β 改成 0.1同样的 0.5T 延时多径会让锁定变得更困难因为频谱收敛更慢脉冲旁瓣更长第二径和主径的重叠区域更大。2.2 环路部分参数整定系数不是拍脑袋定的Gardner 环的数字实现核心是一个二阶环路滤波器加一个数控振荡器 NCO 或者直接控制插值器小数间隔。我工程里的结构是Gardner 定时误差检测器输出 24 bit 有符号数环路滤波器比例支路系数 α 和积分支路系数 βFarrow 结构三次插值器用环路输出的分数间隔小数部分实时计算采样点NCO 溢出控制决定插值器是在每个符号周期还是每个采样周期更新。环路系数我按经典二阶环公式初算环路自然角频率 omega_n 2 * pi * B_L / 1.1 环路阻尼 zeta 0.707 归一化增益 K0 1 alpha 2 * zeta * omega_n * Ts beta omega_n^2 * Ts^2这里 B_L 是等效单边噪声带宽Ts 是环路更新周期。注意 Gardner 环路的更新率和符号率一致不是采样率。我第一轮直接把 B_L 取成符号率的 1e-3结果锁定时间超过预期后来改成 8e-3 才在 2 万符号内收敛。这里要提醒一句环路带宽调大虽然能加快捕获但也会让多径造成的定时抖动直接串进输出所以后面测多径时我做了三组带宽对照分别是 2e-3、5e-3、1e-2后面会给出对应数据。2.3 评价指标不只看能否锁定还要看锁定路径判断 Gardner 环性能不能只盯着最终能不能锁定。我在测试中同时抓三类数据锁定时间从环路启动到误差信号 e 连续 5000 个符号内未超过门限的时间单位符号数稳态抖动锁定后误差信号 e 的方差换算成定时相位抖动单位是 UI符号周期百分比锁定点偏差锁定后插值器小数间隔的平均值相对 0.5 的偏移量反映静态定时偏差。这三类数据都从 FPGA 内部逻辑分析仪抓原始时序然后通过串口回传上位机统计。这个做法看着笨但比仿真可靠的地方在于真实复位时序、真实数据位宽和真实的数值饱和都会体现在结果里。我在第一版测试脚本里犯过一个低级错误把插值器小数间隔直接当成定点数打印出来没有做符号延展结果抖动数据里混入大量溢出尖峰整个统计全部作废。后面改为打印前先做 32 位有符号到单精度浮点转换一行代码解决数据立刻干净了。3. 实测数据对比不同多径幅度和延时下的 Gardner 环表现3.1 单径基线先确认环路本身没有暗病任何性能测试第一步都要跑基线。我在单径、SNR 18 dB、B_L 5e-3 条件下测得锁定时间约 5200 个符号稳态定时抖动约 0.03 UI锁定点偏差小于 0.005 UI。这个基线说明环路本身的对称性和数值精度没有问题。如果基线抖动就超过 0.1 UI后面谈多径对比就毫无意义了大概率是插值器阶数不够或者环路滤波器积分器饱和。我第一版 Farrow 插值器用的二阶结构基线抖动是 0.09 UI换成三阶后骤降到 0.03 UI可见插值器精度对 Gardner 环底的贡献比想象中大。3.2 固定延时 0.25T改变第二径幅度先看第二径延时固定在 0.25T 时的结果。这个延时正好落在符号主瓣的上升沿附近与主径的波形交叠集中在符号边界附近是工程上比较常见的一种多径形态。第二径幅度锁定时间(符号)稳态抖动(UI)锁定点偏差(UI)现象0单径52000.030.005快速收敛0.161000.040.008变化不大0.3100000.070.015明显变慢0.5150000.120.03出现局部振荡0.8锁定失败——误差信号收敛到错误相位第二径幅度 0.3 时环路虽然能锁但锁定时间已经翻倍。这说明哪怕多径能量不高只要延时落在符号主瓣内Gardner 误差信号里一部分有效信息就被路径叠加抵消掉了。0.8 时环路锁错位置插值器停在 0.22 附近而不是 0.5输出眼图依然能打开一部分星座图却明显旋转不对称如果后续还有载波恢复这个时候会把相位误差干扰传递过去导致整体解调器崩溃。3.3 固定第二径幅度 0.3改变延时再把第二径幅度固定为 0.3看延时变化的影响第二径延时锁定时间(符号)稳态抖动(UI)锁定点偏差(UI)S 曲线斜率0.125T85000.050.01基础上限较小0.25T100000.070.015明显压缩0.5T230000.130.04零点偏移严重0.75T180000.10.025部分恢复0.5T 延时是最恶劣的场景。两个路径的信号在半个符号周期处恰好错开主径采样点刚好处于第二径的符号过渡位置附近采样点处同时出现两个符号电平的混合。这个时候 Gardner 误差信号里“符号点差值”的贡献被大幅削弱零点位置漂移接近 0.04 UI。单纯从眼图看你可能觉得信号还能解调但实际上定时恢复已经把采样时刻偏掉了误码率会随噪声进一步恶化。0.75T 延时反而比 0.5T 好一些因为延时超过半个符号周期以后第二径对主径相邻符号的干扰在部分统计意义上又重新变得“类似噪声”不会精确对准 Gardner 检测器的敏感位置。这个现象让我印象很深也提醒我判断多径影响不能只看幅度延时位置才是决定环路崩溃与否的关键参数。3.4 环路带宽与多径抖动的折中我对比了三组环路带宽在 0.25T、0.3 幅度多径下的表现B_L锁定时间(符号)稳态抖动(UI)2e-3280000.15e-3100000.071e-270000.11数据很清楚环路带宽调宽锁定时间显著缩短但稳态抖动先降后升。1e-2 带宽下环路跟踪噪声能力变差多径引起的相位波动没有被充分平均抖动重新恶化。5e-3 是一个比较合理的折中。这说明多径环境里的环路带宽选择不能单看 SNR应当把多径导致的额外相位噪声功率也折算进等效输入噪声中。4. 测试中发现的几类典型失效模式4.1 误差信号出现“假锁定点”环路被吸到错误相位这是我在 0.8 幅度、0.25T 延时条件下遇到的情况。环路最终停在某个相位上误差信号平均值为零看起来像是锁定了但实际锁定点并不是眼图张开度最大的位置而是在错误相位上出现的人为过零。从 S 曲线角度很好解释多径叠加后曲线除了在 τ0 附近有零点还在 τ0.25T 附近产生了一个新的过零区域而且这个区域的局部斜率更大环路被错误捕获。这种假锁定点比纯粹失锁更难排查因为环路已经收敛抖动统计也看起来正常。我建议在测试平台里加一个“眼图张开度评估”模块不依赖环路自身状态而是用独立采样点计算符号点方差与中间点方差的比值。当这个比值低于设定阈值时即使 Gardner 环报告锁定也应该判定为假锁定。这个思想其实直接对应很多接收机里的 lock detector 设计。4.2 多径造成的静态定时偏差和后续载波恢复形成恶性循环在 0.5T 延时、0.5 幅度条件下定时恢复输出存在约 0.03 UI 的静态偏差。表面看 0.03 UI 不算大但如果后面接的是平方环或 Costas 环这类对符号采样点敏感的载波恢复定时偏差会被转换成额外载波相位剩余误差环路可能为了补偿这个伪相位而把频偏积分支路拉偏最终表现为频偏估计值出现虚假偏移。我在工程里把定时恢复、载波恢复两组环路同时接通后对比发现纯定时环抖动量只有 0.07 UI但级联完整解调链路后误码率比单独测定时环恶化近一倍。排错方向很关键不是盲目调大载波环带宽而是回头检查定时环的静态偏移。这类跨环路关联问题往往只有做整机闭环实测才能暴露。4.3 定点位宽不足导致积分器饱和误认为是多径失效测试途中有一个用例结果特别诡异第二径幅度只有 0.1环路反而比 0.3 时锁得更慢。排查到最后才发现问题出在环路滤波器积分器的定点位宽上。误差信号在 0.1 幅度时虽然小但直流分量在积分器里堆积我又把积分器位宽设得太窄导致周期性溢出归零环路每隔几千符号就把相位重置一次。这个坑必须单独拿出来提醒定点实现里“小信号”不等于“安全信号”积分器的动态范围要按误差信号直流积累最大值算不能按瞬态信号幅度算。我最后把积分器从 32 bit 扩到 40 bit相同用例的锁定时间从 36000 符号回到 6500 符号数据才恢复正常。5. 工程上应对多径干扰的具体增强方案5.1 在定时环之前放一个匹配滤波器能挡掉至少一半的伪误差分量很多人做 FPGA 串行恢复时省略匹配滤波觉得靠高过采样直接上 Gardner 也能跑。实测中这个差异在多径环境下特别明显。我在测试链路里加了根升余弦匹配滤波器之后再进 Gardner 检测器0.25T 延时、0.3 幅度的用例锁定时间从 10000 符号缩短到 8200 符号抖动也从 0.07 UI 降到 0.05 UI。匹配滤波把非目标路径的一部分高频分量压掉等于在时域上给 S 曲线“整形”恢复出更接近单径的对称性。需要注意匹配滤波器的抽头系数必须与发送端成形滤波器的滚降系数一致。我在工程里犯过一个低级错误发送端 β0.25接收端误设成 0.5这会让匹配滤波本身引入额外符号间干扰效果比不加匹配滤波还差。验证方法很简单在单径条件下对比滤波前后的眼图和抖动如果抖动反而变大基本就是系数不匹配。5.2 强多径条件下切换更大阻尼系数牺牲一点收敛速度换稳定域环路阻尼系数 zeta 不是必须在 0.707 一条路走到黑。多径 S 曲线被压缩后相位裕度下降0.707 阻尼在强多径下容易在锁定点附近产生持续振荡。我把阻尼调整到 1.2 以后0.5T 延时、0.3 幅度用例虽然锁定时间从 23000 增加到 30000 符号但稳态抖动从 0.13 UI 降到 0.09 UI而且锁定的重复性明显变好多次复位测试的最终相位都落在同一区域。工程里如果实时性要求高可以在 FPGA 里做双参数切换用多径强度指示器判断当前信道状态弱多径时用 zeta0.707、B_L5e-3强多径时切换为 zeta1.2、B_L3e-3。这个切换不需要无缝只要切换前后插值器小数间隔差距不大环路相位不会跳变。我的实现里切换逻辑很简单就是在误差信号方差超阈值时写一组新系数到环路滤波器寄存器抖动控制在可接受范围。5.3 配合盲均衡或者自适应均衡是双径场景下的最终解法Gardner 环到底是定时恢复模块它没有能力消除多径造成的整个信道记忆。实测中如果第二径幅度超过 0.5单纯优化环路参数很难把误码率压回可用水平这时候必须在环后加均衡器。我建议的完整处理链是输入信号先过匹配滤波器Gardner 环完成初始定时粗同步盲均衡如 CMA 或 DD-LMS 的自适应均衡器收敛并消除多径残余将均衡后的信号作为 Gardner 误差检测的反馈信号重新精调插值器相位。这种“外环均衡内环定时”的结构和传统单独定时环的差异在于均衡器会把 S 曲线重新修正得更接近单径形态Gardner 环的误差信号更加干净。不过代价是 FPGA 资源明显增加均衡器的抽头更新时钟、乘法器数量都要重新规划。我在小规模测试里用 16 抽头盲均衡器在 0.25T、0.5 幅度条件下把最终稳态抖动从 0.12 UI 改善到 0.04 UI代价是逻辑资源增加了约 1200 个 LUT 和 8 个 DSP 块。如果资源紧张至少做一个 8 抽头的前馈均衡器也能显著改善静态偏差。5.4 测试序列设计的实操建议永远别只跑一条固定数据流多径对 Gardner 环的影响和数据图案有一定相关性。固定一条伪随机序列测出来的结果可能是特定数据的特例换一条序列结论就变了。我在测试中是交替使用 PRBS13 和自定义的正弦符号序列自定义序列特意包含连续的 11-1-1 重复图案用来强化“符号点差值”波形。实测发现PRBS13 在 0.5T 多径下的锁定时间约 23000 符号而重复图案序列下只有 18000 符号差异来自统计数据中位于符号过渡附近的码元分布不同。因此在测试报告中必须同时记录数据序列类型、多径延时、多径幅度和 SNR 四个变量缺一个都无法复现。我周围不少同事只写“多径 0.3”这种简略记录后面想分析问题根本对不上号。6. 最后留点个人体会这一轮【2.17】做完以后我对 Gardner 环在多径信道里的表现有一个很直观的认识它本质上是在“感知”整个信道脉冲响应的对称性多径一进来对称性被破坏所有基于对称性设计的环路参数都会失真。与其花大量时间调环路增益不如先把信道脉冲响应摸清楚再决定是牺牲收敛速度换稳定性还是干脆上均衡器。如果是刚开始做 FPGA 定时恢复的同学我建议你按这个顺序验证先复现单径基线再把多径幅度从 0.1 开始以 0.1 步进递增记录每个步进的锁定时间和抖动。这个操作看起来枯燥但它能帮你建立对 S 曲线变化的直觉。等做到 0.8 幅度那个用例、看到假锁定点出现的时候你对 Gardner 的“脾气”基本就摸透了。后续想做更深的进阶可以考虑在环路里加入自适应插值系数或者做多径强度实时估计这两条路我都跑过一半数据量足够支撑下一轮测试等整理完再继续分享。
返回列表