【ADC 测试技术】:3. DFT/FFT 频谱分析原理

动态测试基础------DFT/FFT 频谱分析原理

系列:《从原理到实测:ADC 测试技术深度解析》第三篇

难度:进阶

关键词:DFT、FFT、频谱泄漏、整数周期、dBFS、ADC 动态测试


一、静态测试的盲区

经过前两篇的学习,我们已经掌握了用直方图法提取 ADC 的 DNL 和 INL。这些指标描述的是 ADC 在低频、准静态条件下的线性特性。

然而,真实的 ADC 在高频工作时往往表现出与低频截然不同的特性:

  • 采样保持电路(S/H)的带宽限制会导致高频信号失真
  • **时钟抖动(Clock Jitter)**在高频输入时对 SNR 的影响被放大
  • 晶体管的非线性在高频下更为突出,产生更强的谐波失真
  • 内部数字噪声的耦合在高速采样时更难抑制

这些问题在静态测试中完全看不到 。直方图测试通常在 fin≪fs/2f_{in} \ll f_s/2fin≪fs/2 的条件下进行,其结果只代表低频性能,无法预测 ADC 在接近奈奎斯特频率时的行为。

动态频谱测试(Spectral Testing) 正是为此而设计的:通过对 ADC 输出进行离散傅里叶变换(DFT),以频域视角全面揭示 ADC 的动态特性。


二、频谱测试的硬件方案

方案一:ADC + DAC 回放

将 ADC 的数字输出接到一个高性能 DAC,再将 DAC 的模拟输出送入频谱分析仪。

复制代码
信号发生器 → [ADC] → [DAC] → 频谱分析仪
              ↑
           时钟发生器

优点 :直观,容易上手
缺点 :DAC 本身的性能必须显著优于被测 ADC,否则 DAC 的失真会掩盖 ADC 的问题;此外还需注意 DAC 输出的 sinc(x)/x\text{sinc}(x)/xsinc(x)/x 频率整形效应

方案二:数据采集系统 + DFT(推荐)

将 ADC 的数字输出直接送入 PC 或 FPGA,用软件(如 MATLAB)对采集到的数据序列执行 DFT,在计算机中完成频谱分析。

复制代码
信号发生器 → [ADC] → 数据采集系统(PC/FPGA) → DFT 软件分析
              ↑
           时钟发生器

优点 :灵活,精度高,便于自动化;避免了 DAC 回放引入的额外误差
这是现代 ADC 测试的主流方法。

信号链的关键要求

无论采用哪种方案,以下几点都必须注意:

  1. 信号发生器纯度:输入正弦波的谐波失真必须远低于 ADC 被测指标(通常要低 10 dB 以上),否则测到的"ADC 失真"实际上来自信号源
  2. 输入端带通滤波器:滤除信号发生器输出的谐波,确保 ADC 输入信号的频谱纯度
  3. 时钟抖动:时钟发生器的相位噪声会直接恶化 ADC 的高频 SNR,必须使用低抖动时钟源

三、离散傅里叶变换(DFT)基础

3.1 DFT 的定义与频率分辨率

对 NNN 个以 Ts=1/fsT_s = 1/f_sTs=1/fs 为间隔采集的样本 x[0],x[1],...,x[N−1]x[0], x[1], \ldots, x[N-1]x[0],x[1],...,x[N−1] 进行 DFT,得到 NNN 个频率分量:

X[m]=∑k=0N−1x[k]⋅e−j2πmk/N,m=0,1,...,N−1X[m] = \sum_{k=0}^{N-1} x[k] \cdot e^{-j2\pi mk/N}, \quad m = 0, 1, \ldots, N-1X[m]=k=0∑N−1x[k]⋅e−j2πmk/N,m=0,1,...,N−1

频率轴的解读

  • 共 NNN 个频率 bin,均匀覆盖 000 到 fsf_sfs
  • 第 mmm 个 bin 对应的物理频率为 fm=m⋅fs/Nf_m = m \cdot f_s / Nfm=m⋅fs/N
  • 频率分辨率 (相邻 bin 的间距)= fs/Nf_s / Nfs/N

例如,若 fs=1f_s = 1fs=1 MHz,N=1024N = 1024N=1024,则每个 bin 的宽度为 1000000/1024≈976.61000000 / 1024 \approx 976.61000000/1024≈976.6 Hz。

3.2 对称性与有效频率范围

DFT 的频谱关于 fs/2f_s/2fs/2(奈奎斯特频率)对称,因此只有前 N/2N/2N/2 个 bin(对应 000 到 fs/2f_s/2fs/2)包含独立信息。通常只绘制这一半频谱。

3.3 dBFS 归一化

为了方便比较,DFT 幅度通常以 dBFS(相对于满量程,dB Full Scale) 表示:

∣Am∣dBFS=20log⁡10∣X[m]∣aFS⋅N/2|A_m|{\text{dBFS}} = 20 \log{10} \frac{|X[m]|}{a_{FS} \cdot N/2}∣Am∣dBFS=20log10aFS⋅N/2∣X[m]∣

其中 aFSa_{FS}aFS 是满量程正弦波的 RMS 值。

在此归一化下,满量程正弦波的基频 bin = 0 dBFS,所有其他成分(噪声、谐波)均为负值,绝对值越大表示该成分相对于满量程越小。

3.4 MATLAB 示例

matlab 复制代码
fs = 1e6;        % 采样率 1 MHz
fx = 50e3;       % 输入信号频率 50 kHz
Afs = 1;         % 满量程幅度
N = 1024;        % 采样点数

% 生成时间向量和输入信号
t = linspace(0, (N-1)/fs, N);
y = Afs * cos(2*pi*fx*t);

% DFT 并转换为 dBFS
s = 20 * log10(abs(fft(y)) / N / Afs * 2);

% 只取前半段(0 到 fs/2)
s = s(1:N/2);
f = (0:length(s)-1) / N;  % 归一化频率轴(以 fs 为单位)

plot(f, s);
xlabel('Frequency [f/fs]');
ylabel('Magnitude [dBFS]');

对于理想的纯正弦输入(无量化),频谱应在 fx/fsf_x/f_sfx/fs 处出现单一峰值(0 dBFS),其余所有 bin 的幅度理论上为 −∞-\infty−∞ dBFS(实际受计算机浮点精度限制,约为 −300-300−300 dBFS)。


四、频谱泄漏------最常见的陷阱

4.1 什么是频谱泄漏?

如果用上述 MATLAB 代码,但把 fx 改成一个非整数比的频率(例如 fx = 53.3e3),会发现频谱图的峰值不再是单一的尖峰,而是弥散到周围许多 bin,噪底看起来高出许多。

这就是**频谱泄漏(Spectral Leakage)**现象。

4.2 泄漏的根本原因

DFT 隐含地假设:输入序列是周期性重复的 ------即把 NNN 个样本作为一个"块",然后认为真实信号是这个块无限重复拼接而成的。

当信号频率与 fs/Nf_s/Nfs/N 不成整数比时,在块的边界处会出现相位/幅度的突变 (信号末尾与下一块开头不连续)。这种人为引入的不连续性等效于在频域中对理想单音谱线进行了卷积,导致能量从单一 bin 扩散到相邻的许多 bin 中。

直观理解:DFT 只能精确表示频率恰好落在某个 bin 中心的信号。若信号频率"落在两个 bin 之间",则 DFT 需要用多个 bin 的线性组合来近似,表现为能量在多个 bin 间弥散。

4.3 后果

频谱泄漏的危害是双重的:

  1. 信号能量弥散:基频的功率散布到多个 bin,导致信号幅度估计偏低
  2. 噪底抬高:泄漏的能量淹没附近的噪声和谐波,使 SNR、SFDR 等指标无法准确测量

五、解决泄漏:整数周期法

5.1 原理

消除频谱泄漏最干净的方法是保证 NNN 个样本恰好包含信号的整数个完整周期

若信号在 NNN 个样本中包含 MMM 个完整周期,则:
fx=M⋅fsNf_x = M \cdot \frac{f_s}{N}fx=M⋅Nfs

此时信号频率恰好落在第 MMM 个 DFT bin 的中心,所有能量集中在单一 bin 中,无泄漏。

5.2 整数周期的约束条件

为保证测试结果的有效性,整数周期数 MMM 的选择必须满足两个条件:

条件一:MMM 必须是整数(消除泄漏)

这是最基本的要求,确保信号在观测窗口内首尾相接。

条件二:N/MN/MN/M(每周期样本数)必须是非整数,即 MMM 最好是质数

若 N/MN/MN/M 是整数,则量化噪声序列也会以周期 N/MN/MN/M 重复,成为周期性的非随机噪声,在频谱上形成若干离散的谱线,而非均匀的噪声基底。这会使 SNR 的计算结果出现偏差。

选择 MMM 为质数(如 67、97、127 等),保证 N/MN/MN/M 不是整数,量化噪声就会均匀分布在所有 bin 中,统计特性更接近真实情况。

条件三:NNN 最好是 2 的幂次

N=2kN = 2^kN=2k 时,可以用**FFT(快速傅里叶变换)**代替 DFT 进行计算。FFT 的计算复杂度为 O(Nlog⁡N)O(N\log N)O(NlogN),而直接 DFT 为 O(N2)O(N^2)O(N2),对大 NNN 而言速度差异极为显著。

5.3 MATLAB 实现

matlab 复制代码
fs = 1e6;
N = 2^10;        % 1024 点,2的幂次
cycles = 67;     % 质数周期数,确保 N/cycles 不是整数
fx = fs * cycles / N;   % 计算满足整数周期条件的信号频率

Afs = 1;
t = (0:N-1) / fs;
y = Afs * cos(2*pi*fx*t);

% 使用 FFT(N 为 2 的幂次时等价于 DFT,但速度更快)
s = 20 * log10(abs(fft(y)) / N / Afs * 2);
s = s(1:N/2);
f = (0:N/2-1) / N;

plot(f, s);

此时频谱图中,基频处出现一个非常尖锐的单一峰值(0 dBFS),其余所有 bin 的噪声均匀地分布在约 −300-300−300 dBFS(数值精度极限)。

5.4 整数周期法的限制

整数周期法虽然效果好,但有一个实际限制:

信号频率 fxf_xfx 必须被严格控制 ,必须恰好等于 M⋅fs/NM \cdot f_s / NM⋅fs/N。

在实际测量中,这意味着测试系统必须能够将信号发生器的频率锁定到采样时钟 (通常通过 PLL 实现)。若测试系统没有这种能力,则需要转向另一种方案------加窗(Windowing),这将在下一篇中详细介绍。


六、DFT 噪声基底的正确解读

6.1 一个常见的困惑

用 DFT 测量 ADC 的 SNR 时,新手常常感到困惑:DFT 频谱图上的噪声基底,和实际 ADC 的总量化噪声功率不是同一回事!

以 10 位 ADC 为例,理论 SQNR = 6.02 × 10 + 1.76 ≈ 62 dB。但在 DFT 频谱图(N=2048N = 2048N=2048)中,每个噪声 bin 的幅度大约在 −92-92−92 dBFS 附近,远低于 −62-62−62 dBFS。

6.2 原因:DFT 的频率细分效应

DFT 本质上是一个滤波器组 ,每个 bin 只接收宽度为 fs/Nf_s/Nfs/N 的窄带信号。

若总量化噪声功率均匀分布在 000 到 fs/2f_s/2fs/2 的频率范围内,则每个 bin 接收到的噪声功率仅为总噪声的 1/(N/2)1/(N/2)1/(N/2)。

DFT 噪声基底低于实际噪底的幅度为:

Δ=−10log⁡10(N/2)[dB]\Delta = -10\log_{10}(N/2) \quad [\text{dB}]Δ=−10log10(N/2)[dB]

对于 N=2048N = 2048N=2048:

Δ=−10log⁡10(1024)≈−30 dB\Delta = -10\log_{10}(1024) \approx -30 \text{ dB}Δ=−10log10(1024)≈−30 dB

所以 DFT 频谱图上的噪声基底约为 −62−30=−92-62 - 30 = -92−62−30=−92 dBFS,与实际计算完全吻合。

6.3 实践意义

这个关系有两层重要含义:

  1. 读图时 :不能直接把 DFT 噪声基底当作 ADC 的实际噪声水平,需要加上 10log⁡10(N/2)10\log_{10}(N/2)10log10(N/2) dB 才得到真实噪底
  2. 设计测试时 :增大 NNN 可以降低每个 bin 的噪声功率,让原本被噪声淹没的谐波分量浮现出来,有助于测量 SFDR 等失真指标

七、小结

要点 内容
静态测试的局限 无法反映高频性能,需要动态频谱测试
推荐硬件方案 数字输出直接送 PC,软件 DFT 分析
dBFS 归一化 满量程正弦波基频 = 0 dBFS,其余为负值
频谱泄漏原因 信号频率不落在 bin 中心时,DFT 块边界出现不连续
整数周期法 fx=M⋅fs/Nf_x = M \cdot f_s / Nfx=M⋅fs/N,MMM 取质数,NNN 取 2 的幂次
噪声基底修正 DFT 实测噪底 = 实际噪底 −10log⁡10(N/2)- 10\log_{10}(N/2)−10log10(N/2)

下一篇 :《加窗技术与频谱测试实战》

当测试系统无法锁定信号频率时,加窗是替代整数周期法的重要手段。我们将详细介绍 Nuttall、Hann 等常用窗函数的特性,分析加窗的代价与收益,并给出两种方法的适用场景对比。

相关推荐
Meraki.Zhang1 天前
【芯片测试】:6. 向量、Sequencer 指令与高速串行 IO
芯片测试
Meraki.Zhang2 天前
【芯片测试】:3. DUT Board Description 与 Measurement Specification 详解
芯片测试
Meraki.Zhang2 天前
【芯片测试】:SmarTest 开发环境入门
芯片测试
Meraki.Zhang3 天前
【芯片测试】:Driver、Comparator、PMU 与 Active Load
芯片测试
Meraki.Zhang3 天前
【芯片测试】:什么是 VCDSTIL?
芯片测试
Meraki.Zhang3 天前
【芯片测试】:基于时钟的时序提取
芯片测试
黑猫学长呀7 天前
存储宝典第6篇:测试机台的PE板和PPB板有什么区别?
测试工具·fpga开发·ssd·芯片测试·ate·存储芯片·测试机台
Meraki.Zhang8 天前
【芯片测试】:SmarTest 8 Software Overview
芯片测试
Meraki.Zhang8 天前
【芯片测试】:SmarTest 8 Hardware Overview
芯片测试