news 2026/9/11 6:23:13

ADC 交织中的 Offset Mismatch:它为什么会在频谱上产生杂散?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ADC 交织中的 Offset Mismatch:它为什么会在频谱上产生杂散?

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 ps

ADC1 相对 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 点:

  1. Offset Mismatch 的本质,是不同 ADC 通道的直流零点不一样。

  2. 两个 ADC 进行时间交织以后,Offset 差异会形成类似:

高、低、高、低、高、低……

这样的周期误差。

  1. 对于两个 5 GS/s ADC 交织形成的 10 GS/s 系统,这种误差每 200 ps 重复一次,所以对应的典型频率是:

5 GHz,也就是总采样率的一半。

  1. 两路 ADC 共同拥有的 Offset 主要出现在:

DC,也就是 0 Hz。

真正产生 5 GHz 交织 spur 的,是两路 Offset 的差值。

  1. 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、频谱分析、高速采集

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 8:41:28

江西高三集训班什么时候报名

江西高三集训班什么时候报名?南昌金博教育全封闭冲刺班招生启动 南昌金博教育是江西省南昌市一所专注于高三全日制冲刺的封闭管理集训学校,面向江西全省招收高三应届生及复读生,采用“食宿一体、封闭管理”的教学模式,为有集中冲刺…

作者头像 李华
网站建设 2026/9/11 6:22:26

Agentic Programming是Flop吗?工程视角下的落地实践与反思

最近在国内外技术社区里,总能看到一个争议很大的问题:Agentic Programming 到底是不是一个“Flop(失败/泡沫)”?有人觉得 Agentic AI 是下一代开发范式,是打破传统“输入—处理—输出”固化逻辑的新方向&am…

作者头像 李华
网站建设 2026/9/3 6:55:57

从生成模型采样加速到计算与统计保证:c-Rectified Flow 理论解析

从计算保证到统计保证:c-Rectified Flow 的理论核心与实验验证指南 如果你接触过生成模型,这几年大概率会频繁听到 Rectified Flow 或者 Flow Matching。它们的共同目标是解决扩散模型采样的老大难问题:生成质量虽高,但推理阶段动…

作者头像 李华
网站建设 2026/9/1 22:06:45

从NumPy到Pandas再到量化项目:一条完整的数据分析学习路径

学数据分析时,Pandas 是绕不开的库,也是最容易让人半途而废的库。第一个原因很实际:不少教程把 NumPy、Pandas、Matplotlib 拆成独立章节,每个章节又单独讲 API,读者学完 NumPy 的 ndarray 后,并不知道它和…

作者头像 李华
网站建设 2026/9/4 1:02:09

Vue 3 + Vite:2026年主流前端技术栈完全指南

前言截至2026年,Vue 3市场占有率已超71%,搭配Vite构建工具的组合成为国内前端开发绝对主流方案,尤其适合与FastAPI等Python后端搭配使用。Vue 3自动生成的OpenAPI文档可直接导出TypeScript类型定义,与FastAPI的Pydantic模型形成完…

作者头像 李华
网站建设 2026/9/4 8:52:22

生日悖论与哈希碰撞:从概率原理到工程防碰撞实践

生日悖论听起来像一道概率脑筋急转弯,但它真正决定的是实际工程问题:随机 ID 什么时候会重复、验证码什么时候会撞车、自定义哈希什么时候会出现碰撞。别只盯着“单个值出现的概率很小”,更危险的是“两个值落在同一个集合里还恰好相同”。这…

作者头像 李华