Σ-Δ ADC的高精度数模转化,是如何实现的?

2023-11-05

        以前接触过Σ-Δ ADC24位采样芯片,一直对其原理没有搞清楚,最近看到有对其原理讲解的文章,因此收集下来作为参考。

我们在了解Delta-Sigma (Σ-Δ) ADC原理之前,先明确几个概念:

1. 量化噪声

下图中,蓝色斜线是连续的模拟信号,阶梯状波形是经过ADC转换后的离散信号。如果我们把这个两个相减,会得到右边那个像锯齿波一样的量化误差。

图1:量化误差(图片来源:TI)

 量化噪声(Quantization Noise),这里Q值代表量化,如果采样越快,两个Q之间的距离越小,Q的幅值越低,也就是量化噪声的幅值越低。虽然Q值幅值变低,但是它包围的面积不变。因此,改变采样速度,可以改变量化噪声的幅值,但不能改变量化噪声的总能量。

图2:数字化后的Sine波形(图片来源:TI)

 从时域里看,对于一个模拟的Sine波形,经过ADC转换数字化后,我们会得到锯齿状的Sine波形。我们加快采样速度,可以把锯齿变得很细,但是依旧存在,并且量化噪声的总能量不变。

2. 信噪比

如果我们把上面的Sine波形放到频域里看。我们希望信号频率的幅值尽量大,而噪声幅值尽量小。

 图3:Sine波幅频相应曲线(图片来源:TI)

上图的噪声主要来源于量化噪声,通过信噪比计算,我们会得到一个固定的公式:

信噪比SNR(dB) = 6.02N + 1.76(噪声仅考虑量化噪声)

  • SNR:指的是量化噪声信噪比(Signal noise ratio)

  • N:指的是ADC采样位数。如果我们把N提高,信噪比提高,即信号更大,噪声更小。采样质量变好,因此,提高ADC采样位数,可以提高采样质量。

一般来说,提高采样位数,往往意味着ADC的成本可能也会更高。有没有不提高位数,同样优化信噪比的方法呢?答案是“有的”,那就是过采样。

3. 过采样提高信噪比

我们把图3进一步简化。下图红色箭头表示主信号的幅值,灰色代表噪声幅值,平均分布在DC到fs/2之间。(fs为采样频率)

 图4:过采样提高信噪比

如上图,如果我们将采样率提高K倍,噪声能量不变,并且平均分布在更宽范围,从而噪声的幅值降低。原始信号没变,但是噪声幅值减少,也就是信噪比提高了。提高采样率之后的信噪比公式:SNR=6.02N+1.76dB+10log(OSR)

其中,过采样速率OSR = Fs/(2 ᵡ BW), BW为带宽。(注意:此公式仅适用于只存在量化噪声的理想ADC)因此,提高采样率有助于提高信噪比。

Delta Sigma调制的原理 

Delta Sigma调制,即把模拟信号调制成方波形式的PCM(Pulse Code Modulation)信号。PCM波是一个频率固定占空比变化的波,通过比较信号和高频调制波产生。然后经过数字滤波,再通过解调,得到一个数字化的最终结果。

图7:Delta-Sigma (Σ-Δ) ADC原理

其中数字解调滤波器可以和调制器一起集成在Delta Sigma ADC里面。也可以把Delta Sigma调制器部分做成一个独立的调制芯片,然后把数字解调滤波器集成在MCU里,比如TI C2000解调的过程其实是根据一定比率对信号进行抽取,抽取率DR=Fs/Fd。

  • Fs为调制频率

  • Fd为解调后的频率

下面重点讲一下Delta Sigma调制器的工作原理与数字滤波器:

Delta Sigma调制器的工作原理

通过Delta Sigma调制器调制,我们把模拟信号调制成方波形式的PCM信号。

图8:Delta-Sigma调制器输出(时域)

我们想象一下啊,下图模拟信号(红色虚线)和PCM信号(黑色方波状的波形),表达的是同一个信号。

图9:“模拟信号” VS “PCM信号”

Delta Sigma调制器传递函数

图10:Delta Sigma调制器拓扑图

通过上面的环路,进行Delta-Sigma数字化调制。环路的传递函数, 输出等于输入与输出之间的差值乘以前向的积分环节加上量化噪声。我们可以得到传递函数:

 求解这个传递函数,我们得到输出Dout

 经过Delta-Sigma调制环节之后, 信号被优化,我们在频域范围内更好理解。当频率较低时,信号保留,量化噪声被削减,当频率比较高时,量化噪声保留,信号削减。

 图11:Delta-Sigma调制器输出(频域)

因此,通过Delta-Sigma调制环节之后,有效信号频带的信噪比进一步被优化。

数字滤波器

通过Delta-Sigma调制器之后,我们还需要进一步数字滤波。下图是经过Delta Sigma调制器之后的幅频特性,如果我们设计一个如下图红线所示的数字滤波器(比如一个低通滤波器)把红线右边的高频噪声滤除,那么剩下就是有效的信号信息。

图12:数字滤波器

而数字滤波器的带宽,幅频特性,我们可以参数或者阶数去调节。两种常用两种滤波器,可以实现我们要的幅频特性:

 下面我们通过一个实例进行说明:TI ADS1672芯片使用了55阶的FIR (Finite Impulse Response,即有限脉冲响应),实现了宽带通带滤波器的功能,同时意味着,需要延迟55个时钟周期来完成滤波。

 图13:ADS1672内置宽带带通滤波器

一般来说,阶数越高,幅频特性越好,量化噪声衰减越厉害。但是,阶数越高,带来的延迟也越大。所以,在更好的幅频特性还是要更快的响应,有时我们不得不取舍。

本文小结

Delta-Sigma(Σ-Δ) ADC可以达到很高的精度,需要过采样、数字滤波消除量化噪声,从而实现高分辨率。而这样做的代价是牺牲了采样速度,延迟变大,功耗也不小。基于这样的特性,Delta-Sigma (Σ-Δ) ADC在连续信号采集,高精度测量等领域有着广泛的应用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Σ-Δ ADC的高精度数模转化,是如何实现的? 的相关文章

  • WebRTC:匹配最近的同行

    给定一个公共 IP 地址 对等点 A 和许多其他公共 IP 地址 IPv4 和 IPv6 地址的混合 列表 将对等点 A 的 IP 地址匹配的最简单方法是什么 n最近的对等点 而无需让对等点手动相互 ping 通以进行延迟基准测试 我认为使
  • 强制 linux 排序使用字典顺序

    我生成了一个带有伪随机数的文本文件 如下所示 853340442 1130519212 2070936922 707168664 2076185735 2135012102 166464098 1928545126 5768715 1060
  • 使用 gdb 中的函数调用堆栈进行导航

    在 Visual Studio 中 如果单击调用堆栈中的某个条目 则会打开编辑器并显示该函数的源代码 gdb 中可能有类似的东西吗 我在 gdb 中使用 tui 文本用户界面 是否可以让 tui 显示回溯中给定条目的源代码 如果没有 那么如
  • sed 使用:预期上下文地址

    我用sedmacOS 上的命令包含以下文本 cat pets txt This is my cat my cat s name is betty This is your dog your dog s name is frank This
  • 是否可以将 MIPS 寄存器名称与 GAS(GNU 汇编器)一起使用?

    如果我使用寄存器名称 我会得到 Error illegal operands add t0 zero zero 如果我使用寄存器号 8代替 t0 and 0代替 zero 有用 我使用的是 binutils 2 17 GNU 汇编器不直接支
  • GNU GCC 编译器更新

    我正在使用 gnu gcc 编译器的代码块 但是当我尝试编译开始的范围基础时 它给出了许多错误 所以我认为编译器不支持C 0x 所以我想知道如何知道我正在使用的编译器版本以及如何将其正确更新到 C 0x 支持版本 我使用的是Windows
  • grep 是如何工作的?

    我想了解如何grep works 当我说grep hello does grep获取 2 个参数 1 要搜索的字符串 即 hello 和 2 路径 或者shell是否转换 变成某事grep可以理解 哪里可以得到源代码grep 我遇到了这个G
  • BSD md5 与 GNU md5sum 输出格式?

    任何人都知道为什么 BSD md5 程序会产生这种格式的哈希输出 MD5 checksum md5 9eb7a54d24dbf6a2eb9f7ce7a1853cd0 而 GNU md5sum 会产生像这样更合理的格式 9eb7a54d24d
  • 如何通过peerJS 点对点连接接收数据?

    我正在尝试使用peerJS 连接两个对等点 我几乎只是在遵循他们的 入门 但我仍然在挣扎 下面是我到目前为止得到的代码
  • WCF 是否支持点对点实现?

    我正在尝试在 LAN 内实现点对点消息传递和文件共享实用程序 那么 WCF 支持 p2p 吗 有人尝试过通过 WCF 进行文件共享吗 是的 它确实 请参见如何在对等网络中设计状态共享 http msdn microsoft com en u
  • 在Linux下,C++源代码如何成为可执行文件或静态/动态库。以及程序运行时如何加载到内存中

    我知道源代码可以编译并链接到共享 静态库或 ELF 可执行文件 当程序运行时 它会加载到内存中并根据ELF格式创建一个进程映像 但我不确定程序如何加载共享库 链接器如何在外部库中查找符号以及 a 存档如何工作 如果程序在 64 位操作系统上
  • 链接器输入文件未使用的 c++ g++ make 文件

    我无法弄清楚是什么导致了我在制作项目时不断遇到的错误 i686 apple darwin11 llvm g 4 2 lncurses linker input file unused because linking not done 我的
  • 比较 timespec 值

    比较两个 timespec 值以查看哪个先发生的最佳方法是什么 下面这句话有什么问题吗 bool BThenA timespec a timespec b Returns true if b happened first b will be
  • GNU gdb 如何显示源文件名和符号行

    当使用 GNU gdb 调试 c 进程时 list 命令将打印行但不告诉我文件名 设置断点可以显示我想要的所有行和文件信息 但我不想设置断点并且必须禁用或删除它 gdb b oyss funtion Breakpoint 13 at 0x8
  • 是否可以通过互联网在两个移动设备 (iPhone) 之间连接套接字?

    是否可以通过互联网在两个移动设备 iPhone 之间连接套接字 我正在尝试发现每个设备的IP并直接连接 我知道可以使用 Bonjour 来完成 但这只适用于本地网络 我需要通过互联网在两个设备之间建立高速连接 Thanks 如果你有两个 I
  • 同步通过 LAN 电缆连接的两台 Windows 7 计算机之间的时间

    我有许多笔记本电脑 它们运行我们的应用程序 同时通过以太网电缆成对连接 但未连接到任何外部网络或互联网 时间 我需要连接对来同步其系统时间 但由于每台计算机都需要能够与任何其他计算机同步 因此我无法将一台计算机定义为时间服务器 而另一台计算
  • 如何在 mac 中使用“getopt”命令让 bash 处理长参数?

    我想让我的 bash 脚本处理长参数 我发现getopt 但 OS X 不支持它 谁能告诉我为什么getoptBSD 实现了 GNU 没有实现 我尝试构建getopt在 GNU C lib 中 但由于我对 Linux 的技能不佳而失败了 有
  • 为什么 fgets 函数被弃用?

    From GNU C 编程教程 http crasseux com books ctutorial fgets html The fgets file get string 功能与gets类似 功能 这个函数是已弃用 这意味着它已经过时了
  • Windows 上 gnu make 的 libintl3 和 libiconv2 在哪里,需要在 MinGW 上用 ruby​​ 编译 vim

    我正在尝试为 Windows 运行 gnu make 但它无法运行 因为libint3 dll没找到 果然 http gnuwin32 sourceforge net packages make htm http gnuwin32 sour
  • 使用 tar 压缩带有密码的文件 tar.gz [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 I use tar czf test tar gz test 压缩test文件夹到test tar gz 现在 我想压缩为test tar

随机推荐

  • Android数据库升级解决方案

    方案一 第三方库ActiveAndroid数据库 在对应继承model的实体类中添加的字段 并且对应的数据库版本升级 1 在assert资源文件添加一个migrations文件夹 里面创建文件 版本号 sql 文件中添加数据库脚本 即 AL
  • 最容易理解的JavaScript解决约瑟夫环问题的方式之一

    这种方式虽然效率不是最高的 但绝对是最容易理解的思路之一 function ysf flag stayNum allNum let arr let start 1 for let i 1 i lt allNum i arr push i 当
  • 做爱做的事,做有快感的事

    还是不发首页了 最近没规划 需要缓一缓 因为发首页还是要符合几点要求的 所以就先停停 不过文章还是得写 本来十一点多就写好了 没想到洗个澡就过了十二点 今天就更像聊天了 上一篇说到拖延症 最后留下了一个尾巴 就是怎么找到不会发生拖延症的事去
  • 【Git】(四)子模块

    1 增加子模块 进入准备添加子模块所在的目录 例如library git submodule add b 1 0 0 0 git gitee com sunriver2000 SubModule git 参数 b用于指定子模块分支 2 更新
  • 刷脸支付每个人的脸都具有唯一性无法复制

    移动支付时代 手机成为承载资金的介质 人人手机里有支付宝或者微信支付 但如果手机一旦丢失 不法分子破解了用户密码 那么资金安全也面临威胁 而刷脸支付的第一大优势就在于保证用户资金安全 因为在整个支付过程中 用户完全不用打开手机和自己的资金账
  • [游戏开发][Shader]GLSLSandBox转Unity-CG语言

    官网 GLSL Sandbox Galleryhttps glslsandbox com 屏幕坐标计算 fragCoord与 ScreenParams mat2矩阵转换 vec2向量 在GLSL里mat2 a b c d 函数返回vec2
  • yolov3之数据集预处理

    目录 txt标签文件的说明 将jpg与txt文件分开 txt生成xml标签文件 xml标签详解 xml标签生成txt txt标签文件的说明 获取到的数据集是这样的 需要转换为VOC格式 其实就是将txt转换为xml文件 打开txt文件可以看
  • 在线代码编辑器:Monaco Editor

    monaco editor是微软开源的一款web版代码编辑器 它支持智能提示 代码高亮 代码格式化 Monaco Editor是为VS Code提供支持的代码编辑器 运行在浏览器环境中 编辑器提供代码提示 智能建议等功能 供开发人员远程更方
  • 2013年9月10日星期二(DEMO8_6矩阵)

    首先设置了2个矩阵 1 把所有的点存储为1 2矩阵 typedef struct MATRIX1X2 TYP float M 2 MATRIX1X2 MATRIX1X2 PTR M X Y 2把所有变换矩阵采用3 2矩阵 typedef s
  • 带你玩转kubernetes-k8s(第21篇:k8s-深入掌握Pod-初始化容器、Pod滚动升级)

    上节内容的错误 还请大家不要太在意 后面我们会解决的 理解Job的作用 概念就可以了 下面我们进入正题 Init Container 初始化容器 在很多应用场景中 应用在启动之前都需要进行如下初始化操作 等待其他关联组件正确运行 例如数据库
  • Gitbash 无法显示中文

    GitBash gt 右键 gt options gt 左侧text 设置locale zh cn 设置Character set GBK save gt apply GitBash输入 systeminfo看能否正常显示
  • 几种C/C++语言安全检测工具介绍

    转自新浪微博http www vckbase com index php wv 1635 针对C C 语言安全漏洞的分析检测也出现了大量的工具 按照不同的机理主要分为以下几类 如表所示 分析类型 机理 分析工具 备注 静态分析 预处理 Fo
  • ## Hive分区、桶、与倾斜

    Hive的分区 1 在Hive Select 查询中一般会扫描整个表内容 会消耗很多时间做没必要的工作 有时候查询 只需要扫描表中关心的一部分数据 因此建表时引入partition概念 2 分区表指的是在创建表时指定的partition的分
  • 数据库查询最近N天数据

    查询最近7天数据 1 查询最近7天订单金额 用到了虚表和UNION ALL的知识 其中 price是要查询的数据 orders是表名 IFNULL b price 0 是指b price如果值为空 则将空值设置为0 SELECT a cli
  • Java版手写数字(0~9)BP神经网络识别

    MNIST的样本集太无趣 连图片都看不到 也无法用人手进行输入 所以 基于BP神经网络的理论知识 参见数据挖掘黑书212页起 讲得甚好 纯手写了一版带训练和测试的小玩具 Java语言 效果如下 代码已上传github https githu
  • 多项式回归(非线性回归)的python代码实现

    1 概述 在解决回归问题中 很多数据集中输入空间与输出空间并非完全呈线性关系 使用线性回归无法解决此类问题 为了解决存在非线性关系的数据集的回归问题 需要进行多项式回归 但sklearn并未提供多项式回归模型的类 多项式回归使用的还是线性回
  • 字节的对齐方式

    VC对结构的存储的特殊处理确实提高CPU存储变量的速度 但是有时候也带来了一些麻烦 我们也屏蔽掉变量默认的对齐方式 自己可以设定变量的对齐方式 重要规则 1 复杂类型中各个成员按照它们被声明的顺序在内存中顺序存储 第一个成员的地址和整个类型
  • 【k8s】k8s部署网络插件Calico、创建网络策略

    一 简介 01 calico简介 calico官网 flannel实现的是网络通信 calico的特性是在pod之间的隔离 通过BGP路由 但大规模端点的拓扑计算和收敛往往需要一定的时间和计算资源 纯三层的转发 中间没有任何的NAT和ove
  • String、StringBuffer与StringBuilder之间区别

    String StringBuffer StringBuilder String的值是不可变的 这就导致每次对String的操作都会生成新的String对象 不仅效率低下 而且浪费大量优先的内存空间 StringBuffer是可变类 和线程
  • Σ-Δ ADC的高精度数模转化,是如何实现的?

    以前接触过 ADC24位采样芯片 一直对其原理没有搞清楚 最近看到有对其原理讲解的文章 因此收集下来作为参考 我们在了解Delta Sigma ADC原理之前 先明确几个概念 1 量化噪声 下图中 蓝色斜线是连续的模拟信号 阶梯状波形是经过