音频数字低通滤波与带进位除法优化

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,再除与分母来替代。当然保留的数据位整数型数据,非浮点数据;如果需要为浮点数据,该方法不能使用。



原文地址:https://www.cnblogs.com/pangblog/p/3271391.html