过采样的意义:

  1. 过采样可以更真实的重建原始信号
  2. 采样系统中,利用过采样可以提升采样分辨率
  3. 欠采样信号会失真

要理解过采样的意义,首先建议理解什么是采样定理,什么是欠采样等概念.

什么是过采样?

在信号处理中,过采样是指以明显高于奈奎斯特速率的采样频率对信号进行采样。 从理论上讲,如果以奈奎斯特速率或更高的速率进行采样,则可以完美地重建带宽受限的信号。

奈奎斯特频率定义为信号带宽的两倍。 过采样能够提高分辨率和信噪比SNR,并且通过放宽抗混叠滤波器的性能要求,有助于避免混叠和相位失真。

在很多项目应用中,需要测量信号的动态范围广,且需要参数变化小。例如:ADC需要测量很大的温度范围(比如工业中甚至要求从-200℃~500℃),但仍要求系统对小于1度的变化做出响应。

常见的单片机片上ADC位数为12位,如要实现高于12位分辨率要怎么做呢?我们由奈奎斯特-香农采样定理可知:
fn=2fmf_n = 2 \cdot f_m

其中:
fmf_m为输入待采样信号最高频率;
fnf_n奈奎斯特频率;

如果实际采样频率高于奈奎斯特频率fnf_n,即为过采样
低于奈奎斯特采样频率进行采样就称为欠采样
如下为过采样和欠采样示意图:

奈奎斯特频率/过采样/欠采样

Softool.cn Notes:
x轴: 时间
y轴:幅度

或许你会问,常规的应用都是过采样,怎么也没见分辨率提高了呀?如果仅仅过采样,要实现更高分辨率显然是不够的,那么要怎么利用过采样实现更高的分辨率呢?要知道所采用的ADC硬件分辨率是固定的,难道还会变不成?

过采样提高分辨率

如果对一模拟信号,采用过采样,然后再进行一定的软件后处理,理论上是可以得到更高分辨率的

过采样提高分辨率方案

为增加有效位数(ENOB :effective number of bits),对信号进行过采样,所需的过采样率(又称:过采样频率)可以由下面公式确定(省略理论推导,过于枯燥):
fos=4W×fsf_{os} = 4^W \times f_s

其中:
fosf_{os} 为过采样频率,单位: Hz;
fsf_s 为产品所需实际采样频率,单位: Hz;
WW 为额外所需增加的分辨率位数;

假设:系统使用12位ADC每 100ms 输出一次采样值也就是 10 Hz。 为了将测量的分辨率提高到16位(Softool.cn Notes: 从12位增加到16位,也就是需要额外增加4位,即W=4),此时我们即可按上述公式计算过采样频率:
fos=4W×fs=44×10=2560Hzf_{os} = 4^W \times f_s = 4^4 \times 10 = 2560Hz

Softool.cn Notes:
问题: 100ms 是多少 Hz 呢?
先将 100ms 转换为标准的单位 0.1s ,访问 频率Hz和时间s的换算器 选择” s 转 Hz “ ,输入数值为 0.1 ,即可知为 10Hz ,计算的原理为:f = 1/0.1s = 10Hz

那么此时,通过过采样提高分辨率的原理为:首先我们以fos=2560Hzf_{os}=2560Hz对信号进行过采样,然后在所需的采样周期内收集足够的样本以对它们进行平均,最后将16位输出数据用于16位测量。

具体怎么做呢?

  • 首先将256个连续采样累加;
  • 然后将总数除以16(或将总数右移4位)。 该过程通常称为抽取,也即将速率采样。
  • 再类似进行下一次16位样本处理

注意:用于累积过采样数据并执行除法的内存及数据类型必须具有足够的字节,以防止溢出和截断错误。比如这里累积和可以采样32位无符号整型。

由上面公式可得出一个重要结论:每提高W位分辨率,需要提高采样率4W4^W

过采样提高ADC的信噪比:

ADC测量的SNR理论极限基于量化噪声,这是基于在没有过采样和平滑滤波情况下模数转换过程中固有的量化误差所致。 而量化误差取决于ADC分辨率的位数,其中N为ADC的位数,VrefV_{ref}为参考电压:
Δ=Vref2N\Delta = \frac{V_{ref}}{2^N}

SNR理论情况下极限值的计算方式是数据转换的有效位数,如下所示:
SNR(dB)=(6.02×ENOB)+1.76SNR(dB) = (6.02 \times ENOB) + 1.76

这个公式没必要去记,用到的时候参考计算一下即可。从公式中可看出,要提升一个模数转换器的理论SNR的一种可行方案可以通过提升采样位数,但是需要注意的是这里的信噪比是度量模数转换器本身的,就一个真实系统的信噪比还与整个信号链相关!

从上式中不难算出,12位ADC的理论SNR极限值为74dB,而通过过采样提升4位分辨率后,其SNR理论极限提高至96 dB!

软件实现原理:

这里以伪代码的方式给出编程思路:

void init_adc(void)
{
    /*配置ADC的采样率为过采样率连续中断模式*/
}

void start_adc(void)
{
   /*控制ADC启动采样*/
}

/*不同的开发平台中断函数写法略有差异,比如51需要指定向量   */
/*OVERSAMPLE_FACTOR=4^RSHIFT_BITS 下面两个宏一起修改 */
#define RSHIFT_BITS        (4)
#define OVERSAMPLE_FACTOR  (256)
static unsigned short adc_result=0U;

void adc_isr(void)
{
    static unsigned short adc_index = OVERSAMPLE_FACTOR;
    static unsigned int accumulator = 0U;

    /*ADC_REG ADC转换结果寄存器,不同平台名称不同*/ 
    accumulator += ADC_REG; 
    adc_index--;
    if( adc_index==0 )
    {
        /* 加和按因子抽取 */
        adc_result  = accumulator>>RSHIFT_BITS;
        accumulator = 0;
        adc_index   = OVERSAMPLE_FACTOR;
    }
}

该方案有一个缺陷,就是每次ADC中断都需要CPU参与,在过采样率很高的情况下,上述方案消耗很多CPU资源,那么如果单片机内存资源足够的情况下可以考虑采用DMA模式,采集很多数据并将数据暂存下来,然后再做累加平均抽取。这是空间换时间的策略的体现。这个编代码也很容易,只需要申请一片内存区,内存区的大小可以定为256的倍数,这是因为在提升4位分辨率情况下,一个16位的输出样本需要256个12位样本。

总结一下:

在成本受限的情况下,可以通过单片机片内ADC过采样以及累积抽取的技术来提升采样分辨率,这种技术的特点:

  • 可以使用过采样和平均来提高测量分辨率,而无需增加昂贵的片外ADC;
  • 过采样和加和抽取将以提高CPU利用率和降低吞吐量为代价来提高SNR和测量分辨率;
  • 过采样和加和抽取可以改善白噪声的信噪比;

来源: 微信公众号 嵌入式客栈
作者: 逸珺
https://mp.weixin.qq.com/s/-EFyDcVq3jcP12Qt2g8Pzw