1. 为什么要单独理解 Offset Mismatch?
最近在做两个5 GS/s ADC 时间交织成 10 GS/s的项目时,如果把两路 ADC 数据送进 FPGA,按照 ADC0、ADC1、ADC0、ADC1 的顺序重新排列,再做 FFT,经常会遇到一种很有特点的频谱现象:
Nyquist 频率附近多出了一根不该有的杂散。
例如,交织后的等效采样率是:
fs = 10 GS/s
那么它对应的 Nyquist 频率就是:
fs / 2 = 5 GHz
也就是说,对于这个 10 GS/s 的采样系统,如果只看第一 Nyquist 区,频率范围是:
0 ~ 5 GHz
如果 FFT 在5 GHz 附近出现一根明显的离散谱线,就需要考虑一个很典型的问题:
Offset Mismatch,也就是偏置失配。
它是时间交织 ADC 三大通道失配里最好理解的一种。
把 Offset 这个问题想明白以后,后面的 Gain Mismatch 和 Timing Skew 会容易很多。
2. Offset Mismatch 到底是什么?
先说人话:
同样的模拟输入,两路 ADC 的“零点”不一样。
假设 ADC 输入端接的是 0 V。
理想情况下:
ADC0:0 ADC1:0但是实际系统可能是:
ADC0:+3 LSB ADC1:-3 LSB这里的 LSB,可以简单理解成 ADC 输出数据变化的最小单位。
虽然两颗 ADC 输入的都是 0 V,但 ADC0 的数字输出整体偏高,ADC1 的数字输出整体偏低。
这就是Offset Mismatch。
当然,Offset 不一定非得是一正一负。
例如:
ADC0:+5 LSB ADC1:+1 LSB两路同样存在 Offset Mismatch。
因为我们真正关心的不是它们有没有 Offset,而是:
ADC0 的 Offset 和 ADC1 的 Offset 是否一样。
只要两路不同,就存在 Offset Mismatch。
3. 为什么几个码的 Offset,最后会变成一根频谱杂散?
这是本文最重要的地方。
我们继续使用实际项目中的参数:
ADC0:5 GS/s
ADC1:5 GS/s
单颗 ADC 采样周期:200 ps
两路理想时间差:100 ps
交织后等效采样率:10 GS/s
单颗 5 GS/s ADC 的采样周期是:
Ts = 1 / 5 GHz = 200 ps
也就是说,单颗 ADC 每隔 200 ps 采一次。
ADC0 可以这样采样:
时间 ─────────────────────────────> ADC0:● ● ● ● 0 200 400 600 psADC1 相对 ADC0 错开 100 ps:
ADC1: ● ● ● ● 100 300 500 700 ps这样,两路合并以后:
合并:● ● ● ● ● ● ● ● 0 100 200 300 400 500 600 700 ps最终每隔 100 ps 就有一个采样点,因此等效采样率变成:
10 GS/s
FPGA 里通常会按照类似下面的顺序重新排列数据:
ADC0 → sample[0] ADC1 → sample[1] ADC0 → sample[2] ADC1 → sample[3] ADC0 → sample[4] ADC1 → sample[5] ……现在假设:
ADC0 Offset = +3 LSB ADC1 Offset = -3 LSB即使模拟输入完全为 0,FPGA 最终看到的数据也会变成:
采样点: 0 1 2 3 4 5 6 7 数据: +3 -3 +3 -3 +3 -3 +3 -3注意这里最关键的一点:
这个误差不是随机出现的。
它会严格按照:
+3,-3,+3,-3,+3,-3……不断重复。
也就是说,Offset Mismatch 在交织以后,变成了一个周期性的误差序列。
而只要是周期性的东西,FFT 就很容易把它找出来。
4. 这个“正负交替”的误差为什么正好出现在 5 GHz?
对于整个 10 GS/s 的交织系统,每个采样点之间相隔:
100 ps
Offset 误差变化规律是:
+ - + - + - + -每两个采样点重复一次。
因此它完整重复一次所需要的时间是:
100 ps × 2 = 200 ps
周期是 200 ps,对应频率就是:
1 / 200 ps = 5 GHz
而整个系统采样率是:
fs = 10 GS/s
所以:
5 GHz = fs / 2
这就是为什么在一个理想的两通道时间交织 ADC 中:
Offset Mismatch 最典型的杂散位置就在总采样率的一半,也就是 fs / 2。
对于我们的项目:
总采样率:10 GS/s Offset Mismatch 典型杂散位置:5 GHz刚好位于 Nyquist 频率。
5. 为什么有时候会看到 DC,有时候会看到 5 GHz?
这里还有一个很容易被忽略的问题。
假设两路 ADC 是:
ADC0 Offset = +5 LSB ADC1 Offset = +1 LSB这两个 Offset 可以拆成两部分。
第一部分,是两路共同拥有的平均 Offset:
平均 Offset = (5 + 1) / 2 = 3 LSB第二部分,是两路之间的差异:
差分 Offset = (5 - 1) / 2 = 2 LSB于是实际交织后的 Offset 可以理解成:
3 + 2 3 - 2 3 + 2 3 - 2 ……也就是:
5,1,5,1,5,1……这里实际上包含两个东西:
一个固定的 +3 LSB + 一个 +2、-2、+2、-2…… 的交替误差固定不变的 +3 LSB 是什么?
它是直流。
所以 FFT 里面会出现在:
0 Hz,也就是 DC。
而:
+2,-2,+2,-2……每两个采样点重复一次,因此出现在:
5 GHz,也就是 fs / 2。
可以简单总结成:
两路共同的 Offset ↓ DC 两路之间的 Offset 差异 ↓ fs / 2 杂散这点非常重要。
并不是“只要 ADC 有 Offset,就一定会产生 5 GHz 杂散”。
真正产生交织杂散的是:
两路 ADC 的 Offset 不一样。
6. 一个极端例子更容易理解
假设:
ADC0 Offset = +5 LSB ADC1 Offset = +5 LSB两路完全一样。
那么交织之后:
+5,+5,+5,+5,+5,+5……这是一个固定的直流量。
所以频谱主要出现在:
0 Hz
不会因为通道失配产生明显的 5 GHz 交织杂散。
再来看另外一种情况:
ADC0 Offset = +5 LSB ADC1 Offset = -5 LSB交织之后:
+5,-5,+5,-5,+5,-5……这个序列没有直流平均值,但存在非常明显的正负交替。
所以它的主要频率成分就在:
5 GHz
这两个例子放在一起看,就比较容易理解 Offset 和 Offset Mismatch 的区别。
7. 用 Python 直接看一下频谱
这个现象很适合用一个非常简单的 FFT 仿真验证。
下面不加入任何正弦输入,只模拟 ADC0 和 ADC1 的 Offset 不一致:
import numpy as np import matplotlib.pyplot as plt fs = 10e9 N = 1024 offset0 = 3 offset1 = -3 x = np.zeros(N) x[0::2] = offset0 x[1::2] = offset1 X = np.fft.rfft(x) f = np.fft.rfftfreq(N, 1 / fs) plt.plot(f / 1e9, np.abs(X)) plt.xlabel("Frequency (GHz)") plt.ylabel("Magnitude") plt.grid() plt.show()这里:
x[0::2]表示偶数位置的数据,也就是 ADC0 的采样点。
而:
x[1::2]表示奇数位置的数据,也就是 ADC1 的采样点。
运行以后,会看到在:
5 GHz
附近出现一根非常明显的谱线。
因为:
总采样率 = 10 GS/s 10 / 2 = 5 GHz如果把代码改成:
offset0 = 5 offset1 = 5两路 Offset 完全相同。
这时主要能量会跑到:
0 Hz,也就是 DC。
所以这个实验可以非常直观地说明:
共同 Offset ↓ DC Offset Mismatch ↓ fs / 2这里的 FFT 只是帮助理解 Offset Mismatch 的频谱现象。
它不是严格的 ADC SNR、SNDR、SFDR、THD 或 ENOB 性能测试方法。
真正测试 ADC 性能时,还要考虑相干采样、窗函数、FFT 点数、谐波处理方式和噪声积分范围等问题。
8. Offset Mismatch 到底从哪里来?
知道为什么会产生 5 GHz 杂散以后,再看 Offset 的来源就比较容易了。
Offset Mismatch 可能来自:
ADC 内部模拟电路本身的失配;
ADC 内部放大器或比较器的偏置差异;
两路 ADC 的模拟输入共模不完全一致;
两路前级放大器存在直流偏差;
模拟前端器件不一致;
PCB 两路模拟链路存在差异;
温度变化;
电源或者参考电压存在轻微差异。
所以,即使:
ADC0 和 ADC1 是完全相同的型号也不能直接认为:
ADC0 Offset = ADC1 Offset即使两个 ADC 通道集成在同一颗芯片里面,也依然会存在一定程度的通道失配。
工程上真正关心的是:
失配到底有多大,以及它是否已经影响系统频谱性能。
9. 放到 FPGA 项目里应该怎么理解?
整个系统可以简单理解成:
ADC0:5 GS/s ──┐ │ ├──→ FPGA 数据重排 ──→ 10 GS/s 等效采样序列 │ │ ADC1:5 GS/s ──┘ ↓ FFT如果 ADC0 和 ADC1 的 Offset 不一样,那么交织以后:
ADC0误差 ADC1误差 ADC0误差 ADC1误差 + - + -就形成了一个固定规律的周期误差。
而 FFT 最擅长做的事情之一,就是:
把这种隐藏在时域里的周期性成分找出来。
所以在高速 ADC 调试中经常会遇到一种情况:
时域波形看起来没有特别明显的问题。
但是一做 FFT:
5 GHz 附近突然冒出来一根很高的 spur这时候,FFT 实际上是在告诉你:
系统内部可能存在一个每两个采样点重复一次的误差。
对于两路交织 ADC 来说,Offset Mismatch 正好符合这个特征。
10. FPGA 里 Offset 能不能校准?
可以。
而且相对于 Gain Mismatch 和 Timing Skew 来说,Offset 通常算比较容易处理的一类误差。
最直观的方法就是:
分别估计 ADC0 和 ADC1 的平均 Offset。
例如:
ADC0 平均值 → 估计 ADC0 Offset ADC1 平均值 → 估计 ADC1 Offset然后分别减掉:
ADC0校准数据 = ADC0原始数据 - ADC0 Offset ADC1校准数据 = ADC1原始数据 - ADC1 Offset最后再进行交织:
ADC0 ──→ Offset估计 ──→ 减法 ──┐ │ ├──→ 数据交织 │ ADC1 ──→ Offset估计 ──→ 减法 ──┘从 FPGA 实现角度来说,这种结构本身并不复杂。
真正需要注意的是:
怎么得到准确的 Offset 估计值。
比如输入信号本身就带有 DC 分量。
这时如果直接计算平均值,很可能把:
真实信号的 DC和:
ADC 自己的 Offset混在一起。
所以实际工程中,Offset 估计方法要结合输入信号类型和系统工作方式来设计。
11. 新人容易搞错的地方
误区一:ADC 有 Offset,就一定会在 5 GHz 产生杂散
不准确。
比如:
ADC0 Offset = +5 LSB ADC1 Offset = +5 LSB两路虽然都有 Offset,但它们是一样的。
这时候主要产生:
DC 分量
而不是明显的交织杂散。
真正导致 fs / 2 杂散的是:
两路 Offset 不一致。
误区二:Offset Mismatch 的杂散会随着输入信号频率变化
对于理想的两通道 Offset Mismatch 模型来说,典型 spur 位置主要由交织结构决定。
总采样率是:
10 GS/s
那么典型 Offset mismatch spur 就在:
5 GHz
它不像后面要讲的 Gain Mismatch 那样,会和输入信号频率发生明显关系。
误区三:FFT 在 5 GHz 看到 spur,就一定是 Offset Mismatch
也不能这么绝对。
真实系统中还可能存在:
时钟相关杂散;
电源干扰;
数字串扰;
FPGA 时钟泄漏;
其他周期性噪声;
ADC 内部杂散。
所以:
频谱位置可以帮助定位问题,但不能只凭一根谱线直接下结论。
最好再结合:
ADC0、ADC1 单独测试;
时域平均值;
Offset 校准前后频谱变化;
一起判断。
12. 总结
这一篇最重要的是记住下面 5 点:
Offset Mismatch 的本质,是不同 ADC 通道的直流零点不一样。
两个 ADC 进行时间交织以后,Offset 差异会形成类似:
高、低、高、低、高、低……这样的周期误差。
对于两个 5 GS/s ADC 交织形成的 10 GS/s 系统,这种误差每 200 ps 重复一次,所以对应的典型频率是:
5 GHz,也就是总采样率的一半。
两路 ADC 共同拥有的 Offset 主要出现在:
DC,也就是 0 Hz。
真正产生 5 GHz 交织 spur 的,是两路 Offset 的差值。
Offset 可以在 FPGA 数字域进行估计和补偿,但实际工程中需要注意,不要把输入信号本身的 DC 分量误认为 ADC Offset。
所以,对于我们这个项目:
ADC0 = 5 GS/s ADC1 = 5 GS/s 交织后等效采样率 = 10 GS/s Nyquist 频率 = 5 GHz如果两路存在明显的 Offset Mismatch,那么最典型的特征杂散位置就是:
5 GHz。
下一篇继续聊:
《ADC 交织中的 Gain Mismatch:杂散频率为什么出现在这个位置?》
Gain Mismatch 和 Offset Mismatch 最大的区别之一,就是:
Gain Mismatch 产生的杂散位置,会和输入信号频率发生关系。
关键词
FPGA、ADC、时间交织ADC、Offset Mismatch、TIADC、FFT、频谱分析、高速采集