ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

ADC评估避坑指南:FFT后SNR、SNDR、THD、ENOB、SFDR五大指标计算机制详解

ADC评估避坑指南:FFT后SNR、SNDR、THD、ENOB、SFDR五大指标计算机制详解 简介这份MATLAB计算程序面向信号处理、ADC/DAC测试与电路设计方向的学习者和工程师用于评估数字信号质量与系统性能。程序围绕SNR、SNDR、THD、ENOB、SFDR五项核心指标展开通过读取数据文件、预处理、FFT频谱分析分离信号、噪声与失真分量并计算各参数功率比帮助读者理解指标背后的理论含义与实现方式。资源包共2个文件包含1个m脚本与1个txt数据文件压缩包约4KB脚本负责计算流程数据文件提供待分析样本便于直接运行验证。目前已有4557人学习下载适合需要快速搭建指标计算框架、对照理论公式排查结果偏差的读者参考也可作为信号链性能评估与优化的小型工具脚本使用。1. 五个指标算错一个整条信号链的评估就翻车了做数据采集或者 ADC 评估的人几乎都遇到过这种场景辛辛苦苦采了一段正弦波丢进 FFT想看看 SNR 到底多少结果频谱上底噪忽高忽低算出来的 ENOB 一会儿 10.2 位一会儿 11.8 位完全没法写进报告。问题往往不在硬件而在计算程序本身——窗函数选错、相干采样没做、直流和高次谐波没剔除、归一化基准搞混任何一个环节出问题SNR、SNDR、THD、ENOB、SFDR 这五个指标就会集体失真。这套 MATLAB 计算程序要解决的正是把「从一段时域采样到五个频域指标」的整条链路固化下来让每一次评估都可复现、可对比。搞懂它背后的机制比会调用几个函数重要得多因为指标之间的耦合关系才是判断一个转换器真实性能的关键。2. 从时域采样到频域指标FFT 之后到底发生了什么2.1 为什么必须做相干采样泄漏是怎么毁掉 SNR 的FFT 的本质是把有限长序列当成一个周期信号的完整周期来展开。如果采样点数和信号频率不满足整数周期关系首尾就接不上频谱上会出现能量泄漏——主瓣能量向两侧扩散原本干净的底噪被抬高SNR 直接虚低。这就是为什么相干采样是第一步让信号频率、采样率、采样点数三者满足fin M/N * fsM 取与 N 互质的整数。常见的实现思路是先确定采样率 fs 和点数 N一般取 2 的幂比如 8192、16384、65536再反推一个满足相干条件的输入频率。程序里通常会有这样一段N 2^13; % FFT 点数取 2 的幂便于基 2 运算 fs 100e6; % 采样率 100 MSPS M 31; % 与 N 互质的整数决定相干频率 fin M/N * fs; % 相干采样频率保证整数周期这里 M 必须与 N 互质否则信号会在多个周期内重复等效于降低了有效采样点数。选 31 这种质数是最省事的做法。如果实在做不到相干采样就必须加窗但加窗会引入主瓣展宽和旁瓣衰减后续算 SNR 时要把窗函数的等效噪声带宽ENBW补偿回去否则又是一笔糊涂账。2.2 加窗与 ENBW 补偿非相干采样下的后悔药工程现场很多时候没法精确控制输入频率尤其是评估板上已经焊死的信号源。这时候只能加窗。窗函数的作用是让截断处的突变变平滑压制旁瓣。但代价是主瓣变宽频谱上每个 bin 代表的噪声带宽不再是 1而是 ENBW。以 Hann 窗为例ENBW 约为 1.5 个 bin。也就是说你把所有噪声 bin 的功率加起来之后要除以 ENBW 才是真实的噪声功率。这一步漏掉SNR 会偏高约 1.76 dB。程序里一般这样处理win hanning(N); % 生成 Hann 窗 xw x .* win; % 加窗 X fft(xw)/sum(win); % 归一化补偿窗增益 P abs(X).^2; % 功率谱 enbw sum(win.^2)/sum(win)^2 * N; % 等效噪声带宽bin注意fft之后除以sum(win)而不是 N这是为了补偿窗函数带来的幅度衰减。归一化基准搞错是所有指标集体偏移的常见原因。加窗是权宜之计相干采样才是正解这一点在写评估报告时心里要有数。2.3 直流、谐波、噪声的分离逻辑拿到功率谱之后五个指标的计算本质上是对不同 bin 集合做功率求和。直流分量bin 0 附近要剔除因为它不代表交流性能信号主瓣fin 对应的 bin 及其相邻泄漏 bin要单独拎出来作为信号功率谐波位置2fin、3fin…的 bin 要归到谐波功率剩下的才是噪声。这里有个容易踩的坑信号主瓣到底占几个 bin。相干采样下理想情况只占 1 个 bin但实际会有轻微泄漏通常取主瓣中心左右各 1 个 bin 共 3 个 bin 作为信号功率。谐波 bin 的选取同理要按谐波频率对应的 bin 索引去定位而不是简单按倍数关系取整。程序里一般会写一个辅助函数来定位某个频率对应的 binfunction k freq2bin(f, fs, N) k round(f/fs*N) 1; % MATLAB 索引从 1 开始 end这个1是 MATLAB 数组下标从 1 开始的经典坑漏掉它整个频谱会偏移一个 bin谐波定位全错。血泪经验每次换语言移植这段逻辑第一件事就是检查索引基准。3. 五个指标的计算机制谁是谁的分子分母3.1 SNR 与 SNDR一字之差差在谐波算不算噪声SNR 的定义是信号功率与噪声功率之比这里的噪声不包括谐波。SNDR也叫 SINAD则是信号功率与「噪声 谐波」总功率之比。两者差多少直接反映谐波失真有多严重。计算逻辑上先把信号功率 Ps 求出来再把除直流和信号外的所有 bin 功率求和得到总噪声谐波功率 Pn_total把谐波 bin 功率求和得到 Ph。那么SNR 10*log10(Ps / (Pn_total - Ph))SNDR 10*log10(Ps / Pn_total)Ps sum(P(sig_bins)); % 信号功率 Ph sum(P(harm_bins)); % 谐波功率 Pn_total sum(P) - Ps - P(dc_bins); % 噪声谐波 SNR 10*log10(Ps / (Pn_total - Ph)); SNDR 10*log10(Ps / Pn_total);很多人第一次算会发现 SNR 比 SNDR 高出一大截误以为程序有 bug其实这正是谐波贡献的差距。如果两者几乎相等说明系统谐波失真很低是好事。反过来如果 SNR 和 SNDR 都很低那问题在底噪不在谐波。3.2 THD谐波功率到底要取到第几次THD 是总谐波功率与信号功率之比通常用百分比或 dB 表示。关键问题是取到第几次谐波。理论上越高越好但实际受限于 Nyquist 带宽——高于 fs/2 的谐波会折叠回来混进噪声里取多了反而把噪声当谐波。常见的做法是取前 5 到 10 次谐波且只取那些落在 Nyquist 以内的。程序里一般会设一个nHarm参数nHarm 5; % 取前 5 次谐波 harm_bins []; for h 2:nHarm fh h * fin; if fh fs/2 % 只取 Nyquist 以内 harm_bins [harm_bins, freq2bin(fh, fs, N)]; end end THD 10*log10(sum(P(harm_bins)) / Ps);注意谐波 bin 定位后通常也要像信号主瓣一样取左右相邻 bin防止泄漏导致谐波功率被低估。取几次谐波没有绝对标准但同一份报告里必须一致否则横向对比没有意义。3.3 ENOB 与 SFDR一个看整体一个看最坏点ENOB有效位数是把 SNDR 换算成等效的理想 ADC 位数公式是ENOB (SNDR - 1.76) / 6.02。这个 1.76 和 6.02 来自理想量化噪声模型满量程正弦输入下量化信噪比约为 6.02N 1.76 dB。所以 ENOB 本质上是 SNDR 的另一种表达单位从 dB 换成了 bit。SFDR无杂散动态范围则是信号功率与最大杂散不一定是谐波也可能是时钟馈通、交调产物功率之比。它看的是频谱上最坏的那个点而不是整体噪声。ENOB (SNDR - 1.76) / 6.02; P_spur max(P(setdiff(1:N/2, [dc_bins, sig_bins]))); % 最大杂散 SFDR 10*log10(Ps / P_spur);ENOB 和 SFDR 经常一起看ENOB 高但 SFDR 低说明底噪干净但有个别杂散ENOB 低但 SFDR 高说明整体噪声大但没有突出杂散。这两个指标的组合比单看任何一个都更能定位问题。4. 避坑与排查五个指标算不对时先查这几处4.1 现象SNR 算出来是负数或个位数原因通常是归一化基准错了。比如fft之后没有除以点数或窗增益导致信号功率和噪声功率的绝对数值都失真比值自然离谱。另一种可能是信号 bin 定位偏了把噪声当成了信号。解决先画出功率谱肉眼确认信号主瓣位置是否正确。再检查fft后的归一化系数相干采样下除以 N加窗时除以sum(win)。把 Ps 和 Pn 的绝对值打印出来和理论值对一下。4.2 现象ENOB 超过 ADC 标称位数原因一般是噪声 bin 求和时把直流或信号泄漏 bin 也排除了导致噪声功率偏小SNDR 虚高。也可能是谐波没算进 SNDR误用了 SNR 去算 ENOB。解决确认 SNDR 用的是「噪声 谐波」总功率而不是 SNR。检查直流剔除范围是否过宽把信号主瓣附近的 bin 也误删了。ENOB 超过标称位数在物理上不可能一定是计算口径问题。4.3 现象THD 每次算出来都不一样原因是非相干采样导致泄漏随机谐波 bin 定位不稳定。或者谐波次数取得太多把折叠回来的高频噪声也算进去了。解决优先保证相干采样。做不到就加窗并做 ENBW 补偿。谐波次数固定下来且只取 Nyquist 以内的。每次评估用同样的 N、fs、nHarm保证可复现。4.4 现象SFDR 比 SNR 还低原因通常是最大杂散定位时把信号主瓣的泄漏 bin 也算进去了导致「杂散」功率虚高。也可能是直流附近的低频杂散没排除。解决杂散搜索范围要排除直流 bin、信号主瓣 bin 及其相邻泄漏 bin。如果确实存在靠近信号的杂散那 SFDR 低是真实的需要从时钟或电源上找原因。4.5 现象换一段数据五个指标集体偏移原因多半是采样率或点数变了但程序里的相干频率、谐波次数没跟着调整。或者窗函数换了但 ENBW 没重算。解决把 N、fs、fin、nHarm、窗类型作为一组参数统一管理换数据时整组更新。程序里加一个自检确认fin/fs*N接近整数否则给出警告。5. 设计取舍为什么这套程序不追求「全自动」写这类计算程序最容易掉进的坑是追求「一键出结果」——自动找信号、自动定谐波、自动判杂散。但实际评估中信号频率、谐波次数、杂散范围这些参数往往需要根据被测对象和测试条件人为判断。全自动的代价是黑匣子化一旦结果异常你根本不知道它把哪些 bin 算进了噪声。这套程序的取舍是把参数暴露出来把中间量功率谱、信号 bin、谐波 bin、噪声 bin都保留让使用者能自己核对。代价是上手要多填几个参数收益是每一个数字都能追溯到具体的 bin。我一般会这么理解评估程序的价值不在于算得快而在于算得可解释。取舍点全自动方案本程序方案信号定位峰值搜索按相干频率计算 bin谐波次数自适应手动指定 nHarm杂散范围全谱搜索排除直流与信号主瓣可复现性依赖算法稳定性依赖参数一致性排查难度高黑匣子低中间量可见如果你要验证自己的实现对不对一个实用的方法是用理想正弦波加已知噪声生成一段数据理论 SNR 可以手算然后看程序输出是否吻合。再人为加入二次谐波看 THD 是否按预期变化。这种「已知答案反推」的验证比拿真实数据反复调参靠谱得多。从那以后我每次拿到一段新的采样数据都强制先画功率谱、确认相干条件、核对信号 bin 位置再去看那五个指标。希望帮到你。本文还有配套的精品资源点击获取
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表