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 0PsamBuff[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;}#elsePsamBuff[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,再除與分母來替代。當然保留的資料位元整數型資料,非浮點數據;如果需要為浮點數據,該方法不能使用。