这应该是过采样系列的最后一篇文章,经常有同学在使用FPGA、单片机或者DSP进行过采样时没有正确设计代码,导致结果异常,有些结果看似正常,而实际却没有意义。
这篇文章涉及到简单的整型数据和算术运算,希望能有所帮助,仅供参考。
举栗子,理想的8 bit ADC,编码范围是0-255,在参考电压是255mV的情况下,分辨率是1mV。
对一个理想的9.6mV直流电压进行采样,ADC无法分辨小数点后的0.6mV,采样结果会被编码为10,即10mV。
过采样有效是有前提条件的,在这里是对9.6V的直流电压加随机噪声。
过采样
对叠加噪声后的信号进行4次采样,理论上应该得到[9.8, 9.6, 10.4, 9.6]4个离散的样本点,而受到ADC分辨率的限制,实际只能得到[10, 10, 10, 10]4个编码样本,所有样本点都只能分布在。。。8、9、10。。。整数上。
接下来就对这4个样本点详细介绍,直观的感受过采样的原理。
假设信号带宽为B,我们分别分析采样频率F为2B sps/S和8B sps/S两种情况。
当采样频率为2B时,过采样率OSR1=F/(2B)=1;
当采样频率为8B时,过采样率OSR4=F/(2B)=4;
OSR4/OSR1=4,即过采样率提高了4倍(注意:是提高了4倍),其分辨率应该会增加1bit。
继续以上面采样9.6mV信号举栗子。
当以采样频率F=1采样时,采集的结果是[10, 10,10, 10]中的任意一个,对应二进制(0000 1010)。
当以采样频率F=4采样时,采集的结果是[10, 10,10, 10]4个序列。
下面对F=4的4个数据进行下抽处理(降采样),可以减少计算量增加分辨率。
抽取
ADC是8bit的分辨率,但是在过采样计算时,不能定义并初始化一个8bit的整形数据,如果初始化8bit的数据,计算过程会溢出,最终结果的位宽还是8bit,并没有增加分辨率,在这里我们定义一个16bit的数据,预留了足够的buffer。
对采样得到的4个8bit数据求和运算,需要计算最大位宽,求和后的最大位宽为8+2=10bit,相当于左移了2bit,变为10bit。
如果只是简单的求平均,求和后的结果再除以采样个数4的话,则数据其实是右移2bit,又变回原来的8bit位宽,并没有增加分辨率。
在这里我们选择下抽方法是求和后除以2,即右移1bit,则数据从10bit变为9bit,相比于原始的8bit,增加了1bit分辨率(过采样容易理解,更重要的是下抽)。
过采样率为4时,采样的4个数据序列[10, 10,10, 10]求和后是40,对应二进制(00 0010 1000),右移1bit后变为20,对应二进制(0 0001 0100)
255mV参考电压下,原始的8bit ADC,分辨率为1mV,采集的数据是9(0000 1001),即9mV;
过采样率增加4倍后:
255mV参考电压下,9bit ADC,分辨率为0.5mV,采集的数据是20(0 0001 0100),即10.0(9.98)mV;
过采样率增加4倍的前提下,只提高了1bit分辨率,效果不是很明显,继续在9.6mV基础上添加随机噪声,这次过采样率再增加4倍,达到16倍,即采样速率F=16,对16个采样序列进行计算举例。
对采样得到的16个8bit数据求和运算,最大位宽是8+4=12bit。
求和:10*8+9*7+11=154,对应二进制是(0000 1001 1010),再右移2bit,则变为10bit的38(00 0010 0110),(再次强调,不能简单的求和然后求平均)。
9.6mV加噪信号:
1、255mV参考电压下,原始的8bit ADC,分辨率为1mV,采集的数据是10(0000 1001),即10mV
2、过采率为4后:
255mV参考电压下,9bit ADC,分辨率为0.5mV,采集的数据是20(0 0001 0100),即10.0(9.98)mV;
3、过采率为16后:
255mV参考电压下,10bit ADC,分辨率为0.25mV,采集的数据是38(00 0010 0110),即9.47mV;
从列举的例子可以看出,过采样率是可以提高分辨率的,但是提高采样速率来提高分辨率的代价是巨大的(牛顿第三定律:得到点东西时总要舍弃点什么^_^)。