C語言源碼的陷波器設計及調試總結

一 前記
音頻信號處理中,限波器是一個常用的算法。這個算法難度不是很高,可用起來卻坑很多。
二 源碼解析
1 濾波器的核心函數,這裏注意兩點,一個是帶寬不能太寬了,太寬了殺傷力太大了,容易出問題。另外一個就是濾波器的階數非常重要,假如想濾波寬度儘量窄一些,那就階數儘量高一些。
/************************************************************************
*  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;
}
三 效果展示
一個1k的正玄波處理前如下所示:
 
 
過了這個濾波器之後如下所示:
 
這樣看可以得出這個限波器還是非常有價值的。
四 總結備忘
1 限波期會影響音質,所以用的時候的原則就是儘量少用或者不用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章