news 2026/5/1 6:28:48

ADC的有效位数(ENOB)、信噪比(SNR)和无杂散动态范围(SFDR)——详细分析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ADC的有效位数(ENOB)、信噪比(SNR)和无杂散动态范围(SFDR)——详细分析

这一部分(图25.20及其相关文本)是继续讨论ADC(模数转换器)实际性能的章节,主要焦点是有效位数(ENOB)、**信噪比(SNR)与输入频率的关系,以及无杂散动态范围(SFDR)**的概念。这些是评估ADC在真实应用中性能的关键指标,尤其在高频信号下。既然你的信号基础不太好,我会从最基础的概念开始,一步步解释,包括每个术语的含义、为什么会出现这些现象、相关公式,以及图25.20的分析。最后,我会用一些视觉图例来辅助理解。

1. 基础回顾:ADC的理想 vs 实际性能
  • 理想ADC:一个n位ADC的理论SNR约为6.02n + 1.76 dB(这是量化噪声限定的)。例如,12位ADC的理想SNR ≈ 74 dB。
  • 实际ADC:由于各种噪声和失真(如热噪声、抖动、非线性失真),实际SNR会低于理想值。高频信号时,这些问题更严重,导致ADC的“有效性能”下降。
  • 这部分文本强调:ADC的输入频率必须远低于其3dB截止频率(带宽上限),否则SNR会急剧下降。图25.20就是展示抖动如何限制SNR的典型例子。
2. 有效位数(ENOB)——ADC的“真实位数”
  • 什么是ENOB?ENOB(Effective Number of Bits)是衡量ADC实际分辨率的指标。它回答:“这个ADC在实际条件下,相当于一个理想的几位ADC?” 例如,一个标称12位ADC,如果实际ENOB=10位,意味着它的噪声和失真让它只相当于理想10位ADC的性能。
  • 为什么需要ENOB?因为实际ADC有多种噪声源(如抖动、热噪声、非线性),这些会“吃掉”部分分辨率。文本中提到:由于ADC内部的噪声源(如抖动),实际SNR低于理想,导致ENOB < 标称位数。
    • 低频信号:ENOB接近标称位数(量化噪声主导)。
    • 高频信号:抖动等噪声主导,ENOB下降明显。
  • ENOB的计算公式(文本中隐含,标准公式):
    • 这里SNR是实际测量的dB值。
    • 为什么是这个公式?因为理想n位ADC的SNR = 6.02n + 1.76 dB,反推n(即ENOB)就是这个。
    • 示例:如果实际SNR=68 dB,则ENOB ≈ (68 - 1.76)/6.02 ≈ 11位(标称12位ADC损失了1位)。 文本中说“ENOB (=SNR/6dB)”,这是近似(忽略1.76 dB,因为它小),实际精确公式如上。
  • 文本中的关键点: ENOB是小信号时的指标(信号幅度小,噪声主导)。对于大信号,非线性失真更重要,这时用SFDR评估。
3. 无杂散动态范围(SFDR)——衡量ADC的线性度
  • 什么是SFDR?SFDR(Spurious-Free Dynamic Range)是ADC的动态性能指标,定义为:输入信号功率 与 最大杂散(spurious)信号功率 的比值(dB)
    • 杂散信号:ADC输出中不应出现的频率成分(如谐波失真、互调失真),不是噪声,而是失真产物。
    • 示例:输入一个纯正弦波(单频f),理想输出只有f,但实际输出有2f、3f等谐波,这些就是杂散。 SFDR越高,说明ADC线性度越好,能处理更大动态范围的信号而不产生明显失真。
  • SFDR vs SNR
    • SNR关注总噪声(随机噪声,如抖动、热噪声)。
    • SFDR关注特定杂散(确定性失真)。
    • 文本中强调:典型ADC的SFDR > SNR(因为杂散通常比总噪声小)。例如,SNR=70 dB,SFDR可能=80 dB。
    • 但在高频下,抖动会让SNR下降更快,而SFDR可能受非线性影响。
    • 为什么重要?在通信、雷达等应用中,杂散会干扰其他信号通道,所以SFDR是关键规格。
  • 测量SFDR: 通常输入满幅度单频信号,观察FFT谱,找最大杂散峰值。
  • 文本中的关键点
    • ADC的数据手册中会给出SFDR vs 输入频率的图。
    • SFDR比SNR高,不等于说可以用SFDR代替SNR设计。
    • 如果前面提到过,通过滤波或校准可以改善SFDR。
    • 在设计中,要查看厂家数据手册;实际测试时,用比较采样技术测量抖动规模。
4. 图25.20的详细分析:抖动对SNR/ENOB的影响
  • 图的描述
    • X轴:输入频率(MHz),从1到100 MHz。
    • Y轴左侧:SNR (dB),从0到120 dB。
    • Y轴右侧:ENOB(位),从4到14位(因为ENOB ≈ SNR/6 dB)。
    • 多条曲线:对应不同RMS抖动水平(t_j),如0.5ps、1ps、2ps、10ps、50ps、250ps、1000ps。
    • 趋势:所有曲线都随频率增加而下降(斜率≈-20 dB/十倍频)。
  • 为什么这样?(回顾抖动公式) 从上一节,抖动限定的SNR:
    • f(频率)增加,SNR线性下降(对数轴上呈直线)。
    • t_j(抖动)越大,曲线越低(SNR越差)。
    • 示例:对于t_j=1ps,f=10 MHz时SNR≈100 dB(ENOB≈16位);f=100 MHz时SNR≈80 dB(ENOB≈13位)。
    • 实际中,低抖动(如<1ps)对高频ADC(如GHz采样)至关重要。
  • 文本与图的联系
    • 图展示不同抖动下的SNR下降曲线,证明高频时抖动是主导因素。
    • 结合ENOB:右轴直接显示ENOB损失(例如,抖动大时,高频ENOB可能降到6-8位)。
    • 3dB截止:输入频率应<< ADC带宽,否则SNR进一步下降。

下面是一些类似图25.20的参考图像,展示抖动对SNR的影响(这些是网络搜索到的示例图,帮助可视化):

5. 实际应用与总结
  • 设计提示(从文本):
    • 选择ADC时,看数据手册的SNR、ENOB、SFDR vs 频率图。
    • 减小抖动:用低抖动时钟、优化PCB、电源滤波。
    • 对于大信号:关注SFDR(失真);小信号:关注SNR/ENOB(噪声)。
    • 如果ENOB不足,用过采样或多ADC并行提升(但增加复杂度)。
  • 为什么这段重要?它解释了为什么高速ADC(如用于5G、雷达)的规格那么贵:抖动和失真限制了高频性能。理解这些,能帮你避免设计陷阱。

代码实现

import numpy as np import matplotlib.pyplot as plt # 参数设置(与书中的图25.20一致) frequencies = np.logspace(0, 2, 500) # 1 MHz 到 100 MHz(对数轴) frequencies = frequencies * 1e6 # 转换为 Hz # 不同的 RMS 抖动值(单位:秒),对应书中的曲线 jitter_values_ps = [0.5, 1, 2, 10, 50, 250, 1000] # ps jitter_values_s = np.array(jitter_values_ps) * 1e-12 # 转换为秒 # 计算抖动限制下的 SNR(dB) # SNR = -20 * log10(2 * π * f * t_j) snr_db = [] for tj in jitter_values_s: snr = -20 * np.log10(2 * np.pi * frequencies * tj) snr_db.append(snr) snr_db = np.array(snr_db) # 计算对应的 ENOB(有效位数) # ENOB = (SNR - 1.76) / 6.02 (精确公式) # 书上用近似 ENOB ≈ SNR / 6 enob_precise = (snr_db - 1.76) / 6.02 enob_approx = snr_db / 6.02 # 书上常用近似值(略高一点) # 绘图 plt.figure(figsize=(10, 7)) # 主坐标轴:SNR (dB) for i, tj_ps in enumerate(jitter_values_ps): plt.plot(frequencies / 1e6, snr_db[i], label=f't_j = {tj_ps} ps', linewidth=2) plt.xlabel('输入信号频率 (MHz)', fontsize=12) plt.ylabel('SNR (dB)', fontsize=12) plt.xscale('log') plt.grid(True, which="both", ls="--", linewidth=0.5) plt.title('不同时钟抖动下的 ADC 信噪比 SNR 与输入频率的关系', fontsize=14) plt.legend() plt.xlim(1, 100) plt.ylim(0, 120) # 副坐标轴:ENOB(位数) ax2 = plt.twinx() # 这里用近似值画 ENOB(与书上右轴一致) for i, tj_ps in enumerate(jitter_values_ps): ax2.plot(frequencies / 1e6, snr_db[i] / 6.02, linewidth=2) # 不显示第二次,避免图例重复 ax2.set_ylabel('ENOB (bits)', fontsize=12) ax2.set_ylim(0, 120 / 6.02) ax2.set_yticks(np.arange(4, 15, 2)) plt.tight_layout() plt.show()

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

Java毕设项目:基于springboot付费自习室管理系统基于SpringBoot付费选座自习室(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/5/1 6:10:56

SCAPS-1D终极指南:如何快速掌握太阳能电池仿真技术

SCAPS-1D终极指南&#xff1a;如何快速掌握太阳能电池仿真技术 【免费下载链接】SCAPS-1D太阳能电池仿真软件 SCAPS-1D是一款专业的太阳能电池一维仿真工具&#xff0c;广泛应用于光伏领域的研究与开发。通过本软件&#xff0c;用户能够详细模拟和分析太阳能电池的结构、材料性…

作者头像 李华
网站建设 2026/5/1 6:09:12

Jenkins 还可以支持钉钉消息通知?一个插件带你搞定!

Jenkins 作为最流行的开源持续集成平台&#xff0c;其强大的拓展功能一直备受测试人员及开发人员的青睐。大家都知道我们可以在 Jenkins 中安装 Email 插件支持构建之后通过邮件将结果及时通知到相关人员。 但其实 Jenkins 还可以支持钉钉消息通知&#xff0c;其主要通过 Ding…

作者头像 李华
网站建设 2026/5/1 6:09:22

WCDB编译排障指南:从环境配置到问题定位的完整方案

WCDB编译排障指南&#xff1a;从环境配置到问题定位的完整方案 【免费下载链接】wcdb Tencent/wcdb: 是一个基于 SQLite 的数据库引擎&#xff0c;它提供了高性能、高可用性、安全性的移动数据库解决方案。适合用于移动设备和嵌入式设备的数据库开发&#xff0c;特别是对于需要…

作者头像 李华
网站建设 2026/5/1 6:12:33

代码随想录算法第三十七天| KamaCoder52携带研究材料、LeetCode518零钱兑换Ⅱ、LeetCode377组合总和Ⅳ、KamaCoder57爬楼梯

KamaCoder 52 携带研究材料 题目链接&#xff1a;52.携带研究材料 文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;携带研究材料 思路与感想&#xff1a;这道题目是一道纯完全背包题&#xff0c;携带研究材料在之前纯01背包题目的时候已经做过了&#xff0c;区别就在于物…

作者头像 李华
网站建设 2026/4/23 23:46:19

软件测试人员的基本功包括哪些?

什么是基本功&#xff1f; 百度到的结果是&#xff1a;从事某种工作所必需的基本的知识和技能。 推理1&#xff1a;“基本”二字&#xff0c;意味着基本功必定是来源测试工作的基本流程。 推理2&#xff1a;“必须”二字&#xff0c;就意味者无论你是高级的测试开发&#xff…

作者头像 李华