第3章 抖动分离原理

3.1 为什么要做抖动分离?

好,咱们先聊个最直接的问题:你测出来的总抖动(TJ),到底是谁的锅?

我在项目里见过不少年轻工程师,拿眼图一看——哦,眼睛闭了,就去调VCO带宽、改电源滤波。折腾一整天,抖动没降多少,反而把信号眼图弄得更歪了。为什么?因为抖动不是一个人干的。

高速链路上,抖动来源五花八门:

  • 随机抖动(RJ):热噪声、散弹噪声,天生改不了,只能靠系统容忍度来扛。
  • 确定性抖动(DJ):又分成数据相关抖动(DDJ)、周期抖动(PJ)、占空比失真(DCD)等等。每个根因对应的修正动作完全不同。

你想想看,如果只知道总抖动大小,就跟医生只知道“病人发烧”一样——退烧药吃下去不一定对症。抖动分离,说白了就是把“总发烧”拆成“病毒感染”和“细菌感染”,才能真正下药。

⚠ 注意:不分离就优化,本质上是在瞎猜。我做过一个12Gbps的SERDES项目,眼图闭合但RJ只占不到5%,剩下全是电源噪声引起的周期性抖动。结果团队花了三周改PLL,最后发现换一组退耦电容就搞定了。嗯,这就是不分离的代价。

3.2 传统眼图方法,到底局限在哪?

眼图是好东西,但它只能告诉你“眼睛是睁是闭”,很难告诉你“为什么闭”。

咱们细数几个硬伤:

  1. 只能看统计结果,看不到时间演化——眼图等效于把所有比特叠在一起,时间信息全丢了。一个低频周期抖动和一段突发噪声在眼图里都是“变粗”。
  2. 无法区分RJ和DJ——眼图闭合高度是二者叠加的结果。RJ是高斯尾巴,DJ会在眼图中间产生离散的“鬼影”。但鬼影一多就糊成一团,你根本数不清有几个峰值。
  3. 对低频抖动不敏感——频率远低于信号速率的抖动,在眼图里表现为整体摇晃,眼图轮廓边界还在,但内部BER完全恶化。这种“隐形杀手”,眼图很难暴露。
  4. 需要大量采样,但RBW(分辨率带宽)受限制——示波器采样深度有限,传统眼图测不到极低概率的尾巴事件。

我记得有一次给客户分析一块失效的板子,客户用眼图测了半天,所有指标都“过得去”,但系统就是误码。后来我们用抖动分离一查——是个30kHz的电源扰动,在眼图上几乎看不出来。所以我说,眼图只是“望闻问切”的第一步,真到查根因,还得靠分离。

分析方法 能做的事情 存在的问题
传统眼图 ∞快速评估总体眼开度 ∞无法分离抖动分量
浴盆曲线 ∞估计BER边界 ∞只能看到TJ分布
抖动频谱 ∞显示周期抖动频率 ∞测不到RJ的高斯尾巴
抖动分离算法 ∞得到RJ/DJ各自参数 ∞需要足够样本量

3.3 基于统计的分离思路,怎么做到的?

核心思路其实不复杂——利用两类抖动的概率密度函数(PDF)差异来做分离。

  • 随机抖动(RJ):服从高斯分布,PDF是一条平滑的钟形曲线,尾巴延至无穷远。
  • 确定性抖动(DJ):服从有界分布(比如双高斯的DCD、正弦的PJ),PDF有明显的上下界和离散峰值。

总抖动的PDF = RJ的PDF 与 DJ的PDF 的卷积。嗯,这就是分离的理论基础。

实际操作一般是这么几个步骤:

  1. 大量采样边缘位置——用高精度时间间隔测量,采集几十万甚至上百万个边沿时刻。
  2. 做直方图——统计每个时间偏移的出现频次,得到抖动PDF的近似。
  3. 做尾部分析——在PDF的两侧尾巴,由于DJ有界,尾巴形状只来自RJ的高斯分布。拟合这条尾巴就能得到RJ的均方根(σRJ)。
  4. 剥离高斯——从总PDF中减去RJ成分,剩下的就是DJ的PDF。继续分析DJ的分布形状,就能识别出是DCD、PJ还是DDJ。
💡 核心公式:TJ(t) = RJ(t) + DJ(t)。其中RJ(t) ~ N(0, σRJ²),DJ(t)是确定的有限分布。分离算法本质就是解卷积。

我在开发一个28Gbps的NRZ接收机时,用过这种尾部拟合方法。当时面临的难题是:采样点必须足够多(10⁶以上),否则尾巴的统计不够稳定。我尝试用双核FPGA实时累积边沿直方图,跑了大约3秒就拿到足够的数据。然后Python后端用高斯尾部拟合,几毫秒就把RJ和DJ拆开了。

你可能会问:“尾部拟合精度怎么保证?”

说实话,这里有个坑——高斯尾巴非常窄,如果信噪比不够,或者DJ的有界范围太大,尾巴会被DJ的峰值淹没。碰到这种情况,我会先做一个高通滤波,把低于一定幅度的抖动分量暂时滤掉,再拟合尾巴。当然,滤波器引入了新的相位误差,需要校准。我踩过这个坑,后来在算法里加了直流基线校准,才稳定下来。

下面这张图概括了基于统计的抖动分离全流程:

基于统计的抖动分离流程 采集边沿时刻 生成抖动直方图 尾部高斯拟合 → 得到σRJ 总PDF − 高斯(RJ) → 剩余DJ PDF 分析DJ PDF形状 → 分离DCD/PJ/DDJ → 得到各分量大小 输出:RJ(σ), DJ(p-p) 各分量类型及幅度 💡 注意:采样数≥10⁶ 尾部拟合需BER等级≤10⁻¹² 先做基线校准消除直流偏置

这张图是我在实际测试板上跑流程时画的简化版。每一步背后都有不少细节:比如边沿采集时的触发点选择、直方图bin宽度的确定、尾部拟合时选哪个置信区间……每一个都是坑。我曾经因为bin宽度设得太细,导致直方图稀疏得像梳子,尾部拟合全跑偏了。后来经验是:bin宽取ITU-T建议的0.05UI,或者根据采样时钟精度动态调整。

3.4 分离之后,你得到了什么?

做完分离,你实际上拿到了一套“抖动体检报告”:

  • RJ的σ值——告诉你链路噪声底线。
  • DJ的峰峰值——告诉你哪些是能改进的。
  • DCD的占空比偏移——指向驱动端或者接收端阀值。
  • PJ的频率和幅度——帮你定位电源纹波或耦合干扰。

举个例子,我手头一个项目总抖动TJ≈0.35UI,分离后发现RJ占0.04UI(很小),DJ占0.31UI,DJ里面PJ占了0.25UI,频率42kHz。第二天我就拿着频谱仪直接对着电源平面扫——果然,一个DC-DC模块的开关频率是42kHz,测量纹波达到了30mV。换了一个低纹波模块之后,PJ降到0.05UI,眼图完全打开了。

你看,没有分离,这35%的眼图闭合损失根本找不到真凶。

🔧 实战技巧:如果你没有专用抖动分离软件,可以用高速示波器的“抖动分析”功能。大多数主流示波器内置了尾部拟合法。但是注意:它们默认的DJ有界模型是矩形分布,对正弦PJ误差较大。我自己的做法是拿到原始TIEd(时间间隔误差)数据后,用Python自己跑一遍分离流程,结果更可信。