音频数字低通滤波与带进位除法优化
16Khz采样频率,12Bit采样精度,经过ADPCM压缩解压缩算法后,听到一些低噪,通过硬件排除(一声道直接将mic经过运放后到耳放输出,判断进入AD的声音OK),认为问题来之AD采样内部噪声。
优化思路:
1、ADC经过16KHz的Timer进行DMA到SampBuf[32];
2、在DMA中断,将SampBuf每相邻两个数据进行一次均值滤波,那么32个数据可以求31次,所以
===> 增加一个16bit的变量PreSamp,用于存储SampBuf[32-1],将最后的数据保存,用于衔接后一次DMA中断的第一组均值的第一个数据,即PreSamp,SampBuf[0];
新增变量为静态变量,初值设为0即可。这样数据才会连续,不会出现每32个数据丢一个数据的bug;
3、将数据编解码;
4、启动DAC DMA的Timer中断,进行数据传输;
5、OK
附:均值滤波算法(计算结果存储为整数型适用)
static uint16_t EndSampVal = 0; #if 0 PsamBuff[0] = (int16_t)(((EndSampVal + SampBuff[0])/2.0)+0.5)-2040; EndSampVal = SampBuff[BUFFSIZE-1]; for(i=1;i<BUFFSIZE;i++) { PsamBuff[i]=(int16_t)(((SampBuff[i-0]+SampBuff[i])/2.0)+0.5)-2040; } #else PsamBuff[0] = (int16_t)((EndSampVal + SampBuff[0] + 1)>>1)-2040; EndSampVal = SampBuff[BUFFSIZE-1]; for(i=1;i<BUFFSIZE;i++) { PsamBuff[i]=(int16_t)((SampBuff[i-0]+SampBuff[i]+ 1)>>1)-2040; } #endif
上面两种的计算结果是一致的,对于两个数据的四舍五入的算法优化,后面部分为优化部分,避免浮点运算的巨大计算量,提高计算效率。 即两个数的带进位除法可以通过分子加1,再除与分母来替代。当然保留的数据位整数型数据,非浮点数据;如果需要为浮点数据,该方法不能使用。