/************************************************************************ * IIR陷波器(直接II型/典範型) * 參數列表: * short ch:濾波通道,0-17 * int xn:濾波輸入 * float fnotch:陷波頻率,Hz * float bw: 帶寬,Hz(eg:50Hz±1Hz,BW=2Hz ) * float fs: 採樣率,Hz * short init: 是否初始化陷波器(1:初始化,0:不初始化) * 輸出: * 濾波輸出(若ch超出範圍,或者fs,bw,fnotch不合理,返回-1) * 說明: 陷波器個數由ch決定,每個陷波器相互獨立,因此需要單獨初始化; ************************************************************************/ int AzIIRNotchFilter(short ch,int xn, float fnotch,float bw, float fs, short init) { float y0; float Fn; float BW; if (ch<0 || ch>=AZ_CH_NUM)return -1; if (bw<=0 || fs<=0 || fnotch<=0 || fs<=fnotch*2 || fnotch-bw/2<=0)return -1; Fn = fnotch/(fs/2); BW = bw/(fs/2); if (init) { AzInitNotchByChannel(ch,Fn,BW); } // fNotchBuf[ch][0]=(float)xn*fCoefA[ch][0]-fCoefA[ch][1]*fNotchBuf[ch][1]-fCoefA[ch][2]*fNotchBuf[ch][2]; fNotchBuf[ch][0]=(float)xn-fCoefA[ch][1]*fNotchBuf[ch][1]-fCoefA[ch][2]*fNotchBuf[ch][2]; y0=fCoefB[ch][0]*fNotchBuf[ch][0]+fCoefB[ch][1]*fNotchBuf[ch][1]+fCoefB[ch][2]*fNotchBuf[ch][2]; fNotchBuf[ch][2]=fNotchBuf[ch][1]; fNotchBuf[ch][1]=fNotchBuf[ch][0]; return (int)y0; }
C語言源碼的陷波器設計及調試總結
一 前記
音頻信號處理中,限波器是一個常用的算法。這個算法難度不是很高,可用起來卻坑很多。
二 源碼解析
1 濾波器的核心函數,這裏注意兩點,一個是帶寬不能太寬了,太寬了殺傷力太大了,容易出問題。另外一個就是濾波器的階數非常重要,假如想濾波寬度儘量窄一些,那就階數儘量高一些。
三 效果展示
一個1k的正玄波處理前如下所示:
過了這個濾波器之後如下所示:
這樣看可以得出這個限波器還是非常有價值的。
四 總結備忘
1 限波期會影響音質,所以用的時候的原則就是儘量少用或者不用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.