双狄拉克模型:RJ与DJ的数学拆解

做抖动分离这些年,我碰到的第一个硬骨头就是双狄拉克模型。说实话,刚入行时我总觉得这玩意儿太理论,直到有一次在高速串行链路测试中,眼图闭合得莫名其妙,拿频谱仪扫了半天看不出来问题。最后用双狄拉克模型把随机抖动和确定性抖动剥离开,才发现是电源噪声引起的DJ占了大头。从那以后,我再也不敢跳过这个模型了。

为什么需要双狄拉克模型?

抖动测量里,我们拿到的总抖动(TJ)是随机抖动(RJ)和确定性抖动(DJ)的混合体。RJ服从高斯分布,DJ则往往由多个离散的确定性事件叠加而成——比如数据相关抖动(DDJ)、周期抖动(PJ)、占空比失真(DCD)。双狄拉克模型的核心思想很简单:把DJ近似看作两个狄拉克δ函数的组合,再与高斯卷积,就能得到总抖动的概率密度函数(PDF)。你想想看,这比直接处理一堆乱七八糟的抖动分量要干净得多。

数学表达

双狄拉克模型的PDF可以写成:

f(t) = (1-α)·G(t - μ + δ/2) + α·G(t - μ - δ/2)

其中:

  • G(·) 是高斯函数,标准差σ对应RJ的RMS值
  • δ 是两个狄拉克脉冲之间的间距,代表DJ的峰峰值
  • α 是峰值幅度比例,通常取0.5(对称情况)
  • μ 是均值偏移

说白了,这个模型把DJ简化为两个“撞击点”,RJ像雾一样弥散在周围。我在测试一款25Gbps SerDes时发现,当DCD占主导时,δ恰好等于1个UI的一半,非常直观。

RJ与DJ的分离逻辑

核心公式:总抖动的尾部在双对数坐标下呈现直线,斜率与σ(RJ)相关,截距与δ(DJ)相关。利用这一特性,我们可以从直方图尾部拟合出RJ和DJ。

具体推导不展开了,我说下工程上的做法。假设我们测到了大量边沿位置数据,画出直方图。在直方图的左右尾部(概率密度小于10⁻³的区域),高斯分布的贡献占主导,因为DJ的δ效应在尾部会被高斯“吞没”。拟合尾部斜率就能得到σ,再反推DJ分量。

参数拟合方法

我常用的方法有三种,各有利弊:

方法 原理 优点 缺点
直方图尾部线性拟合 对概率密度取对数,尾部近似为直线 计算快,直观 尾部数据稀疏,噪声敏感
非线性最小二乘(NLS) 直接拟合双狄拉克模型PDF 精度高,利用全数据 初始值难选,易陷入局部最优
累积分布函数(CDF)拟合法 使用Q函数逆变换,分离高斯尾部 抗噪性强,适合大数据量 需要累加运算,稍慢

我个人习惯先用直方图尾部拟合做个快速筛查,正态概率纸上一画,马上能看出有无明显的DJ偏差。遇到混沌信号再用NLS法细抠。记住一个坑:尾部线性拟合前一定要确认数据量足够——我曾经拿1000个点去拟合尾部,结果RJ误差超过30%。后来改成至少50000个点,稳定多了。

Python拟合示例

import numpy as np
from scipy.optimize import curve_fit

def dual_dirac_pdf(t, sigma, delta, mu):
    # 双狄拉克模型PDF(对称)  
    return 0.5 * np.exp(-((t - mu + delta/2) / sigma)**2 / 2) / (sigma * np.sqrt(2*np.pi)) \
         + 0.5 * np.exp(-((t - mu - delta/2) / sigma)**2 / 2) / (sigma * np.sqrt(2*np.pi))

# 假设数据:times是边沿位置数组
hist, bins = np.histogram(times, bins=200, density=True)
bin_centers = (bins[:-1] + bins[1:]) / 2

# 只对概率密度大于1e-4的数据点做拟合,避开尾部噪声
mask = hist > 1e-4
popt, pcov = curve_fit(dual_dirac_pdf, bin_centers[mask], hist[mask],
                        p0=[2e-12, 10e-12, 0])  # 初始值按经验给
sigma_fit, delta_fit, mu_fit = popt
print(f"RJ(rms) = {sigma_fit*1e12:.2f} ps, DJ(p-p) = {delta_fit*1e12:.2f} ps")

曲线拟合的初始值很关键。我一般先粗略估算RJ:取直方图尾部1%和99%分位点,除以4.65(对应高斯99%置信区间),得到近似的σ初值。DJ初值则取直方图双峰峰间距的一半。这样算法很少跑飞。

小心!双狄拉克模型假设DJ只有两个状态。如果实际抖动中含有三个以上的确定性分量(比如多模态DDJ),模型会低估DJ。碰到这种情况,我改用多狄拉克模型或直接测量每个子成分。别盲目套用。

模型验证与可视化

为了看清RJ和DJ如何组合成最终抖动,我画了下面这张结构图:

双狄拉克模型结构示意 双狄拉克模型:RJ与DJ合成总抖动PDF DJ:两个δ脉冲 幅度α和(1-α) 间距δ(DJ峰峰值) RJ:高斯分布 标准差σ 均值μ(可偏移) ⊗ 总抖动PDF 双峰高斯卷积结果 左侧尾部和右侧尾部用于 分离RJ与DJ参数 实际测量中对直方图尾部做线性拟合,即可同时得到σ(RJ)和δ(DJ)

上图从左到右展示了“两个狄拉克脉冲”与“高斯分布”通过卷积生成总PDF的过程。你注意看,最终PDF会有两个凸起——双峰间距就是DJ的δ,而每个峰的宽度由σ决定。这正是双狄拉克模型命名的由来。

工程实践避坑

  • 数据长度不够?双狄拉克尾部拟合至少需要10⁵个边沿样本,否则尾部统计飘得没法看。我曾在某28Gbps项目上因为采样点不够,RJ拟合值来回跳了5倍。
  • 噪声不是高斯?有些情况下(比如有串扰耦合)RJ呈现非高斯分布。这时双狄拉克模型会误判。我一般先做正态性检验(如Anderson-Darling),通不过的话换用其他模型。
  • DJ不对称?虽然模型写α=0.5,但实际DCD或PJ可能导致两个脉冲幅度不等。拟合时可以放开α参数,我试过效果更准。

小结:双狄拉克模型是抖动分离的实用化工具,它把复杂的抖动分解成RJ(σ)和DJ(δ)两个简洁参数。理解和掌握它的数学推导、拟合过程,是后续串行链路测试、眼图模板测试的基础。