为什么不能只平均 ADC 样本以从 ADC 获得更高的分辨率?

电器工程 Arduino ADC
2022-01-30 12:43:17

我试图从我的 Arduino ADC 获得超过 10 位的精度,但我无法真正弄清楚它背后的理论。经常引用的 Atmel 应用说明 ( http://www.atmel.com/Images/doc8003.pdf ) 说

重要的是要记住,正常平均不会增加转换的分辨率。抽取或插值是一种平均方法,它与过采样相结合,可提高分辨率

然后他们为“抽取”提出的建议是移动小数点。这相当于将您移动它的每个位置的二进制读数减半,因此您不妨将基数 10 的值除以 2 或 4 或 8 或您拥有的值。我理解抽取错误吗?

4个回答

如果你让某人测量一块 45.2 厘米的木板,精确到最接近的厘米,他们会(或应该)回答 45。如果你要求再次测量,他们会再次回答 45。再重复练习 8 次,所有测量值的平均值应该正好是 45。无论对输入进行多少次采样,最终值都会为 45。所有这些读数的平均值当然是45(即使板长 45.2 厘米)。

如果你让人调整测量仪器,以读取第一次测量前长 0.45 厘米,第二次测量前长 0.35 厘米,第五次前长 0.05 厘米,第六次前短 0.05 厘米,等等,最多前 0.45 厘米第 10 次,然后两次测量读数为 46,另外 8 次读数为 45。所有测量值的平均值为 45.2。

在实践中,设法如此精确地偏向事物是很困难的。如果在每次测量之前随机调整测量设备以读取 0.5 厘米长和 0.5 厘米短之间的某个位置,那么大约 1/5 的测量值将显示为 46,其余为 45,但由于调整是随机的,实际比例可能更高或更低。进行 10 次测量不会增加一个相当完整的显着数字值的精度,但平均约 100 次会。

我不确定我是否完全理解论文中区分平均和右移的基本原理。需要注意的是,通过平均实现的表观精度可能会超过有意义的精度水平,但根据我的经验,何时右移以及右移多少应该由处理器数值范围的限制来驱动。使用在不引起溢出的情况下尽可能放大的数字通常会最大限度地减少舍入误差的影响,前提是不要过度重视少量噪音。

顺便说一句,在最初的用法中,“消灭”一支军队就是杀死其中1/10的士兵。抽取来自 ADC 的数据就是丢弃其中的一部分。短语“小数点”的公共前缀并不意味着关联。

简短的回答是噪音,重要的不一定是噪音,而是噪音的类型另一个问题是像 INL 这样的非线性效应,它会偏离平均值

先说噪音:

如果我们要对高斯分布进行采样,它看起来像这样:

在此处输入图像描述

红线更接近实际热分布(随时间平均),蓝色直方图代表许多 ADC 样本。如果我们要不断地对该分布进行采样,我们将获得更好的统计数据,并且我们将能够以更高的准确度找到平均值或平均值(这通常是之后的情况,是的,我意识到信号会四处移动,有过滤和信噪比取决于频率内容,但让我们只考虑信号暂时不移动的直流情况)。

$$ \mu = \frac{1}{n} \sum_{i=1}^{n}{x_i}$$

问题是闪烁噪声或 1/f 噪声,它改变了高斯均值并导致统计数据崩溃,因为分布不再是高斯分布。

这是一个糟糕的模型,但你可以认为它看起来像这样的 INL 也是一个问题,因为它会引入一些错误,这也会导致均值下降。

$$ \mu = \frac{1}{n} \sum_{i=1}^{n}{x_i}+error$$

这可能令人困惑,让我们看看如下所示的时域

在顶部图像中,您可以看到带有高斯噪声的信号,很容易通过中间“画一条线”并找到平均值。您从这样的信号中获得的样本越多,您对平均值的准确性和知识就越好。

在下图中,您可以看到闪烁噪声的样子,平均在这里没有帮助。

问题是大多数电子产品都有闪烁噪声,电阻器没有(假设不受室温影响),但晶体管和 IC 有。有一种称为斩波放大器的放大器可以克服这些影响。

另一件要知道的事情是有 ADC(线性有一个新的 SAR 内核),工程师们已经努力将 1/f 噪声的影响(以及 ADC 的其他非线性影响,如 INL )消除到远低于 ADC 位的水平价值。您可以使用大量过采样并从 14 位内核中提取 32 位值。

来源:EDN- 1/f 噪声——闪烁的蜡烛 在此处输入图像描述

我看了看笔记,这确实是一个奇怪的说法(或者说它们的实际含义是一种令人困惑的方式)。

也许它们的实际意思是,如果您想获得更高的分辨率,则不能将数字除/移到与单个样本相同的比例,因为(在整数算术中)会丢弃您获得的位。

如果您的 ADC 样本有噪声,那么您当然可以除以在原始比例下获得噪声较小的值。


我从您的问题中想到的另一件事是,要正确进行过采样,您需要使用有效的低通滤波器,而简单的移动平均值不如正确设计的 FIR 作为低通滤波器好(或 IIR)过滤器——但这似乎不受注释文本的支持。

然后他们为“抽取”提出的建议是移动小数点。

不完全是。它的抽取部分认为,在我看来是正确的,多个样本的正常“平均”,但保留了位宽,并没有保留尽可能多的信息。因此,如果您平均 m 个 n 位 ADC 读数,则所得平均值仍然是 n 位 adc 读数。

温和地说,所提出的方法是平均 n 位 ADC 读数,以便得到的平均值具有更高的位宽。例如,将 4 个 10 位 adc 读数相加并将总和除以 2 得出 11 位 adc 读数。

我认为这一直是专业进行过采样的方式。人们普遍认为网络上这种简单的平均方法是错误的方法。

另一点是为了减少噪音,只有在有噪音的情况下,过采样才有效。如果你有一个上帝设计的 10 位 ADC(即每个读数都是绝对真实的读数,没有变化),过采样就不会起作用。

文章末尾关于使用 pwm 添加噪声的特定电路是不正确的:添加噪声的引脚应该有一个隔直电容。不太重要的一点是,它不必是 PWM 引脚。普通的 GPIO 引脚可以工作。