FIR 滤波器增益

信息处理 过滤器 过滤器设计
2022-01-05 05:17:49

我正在编写一个 C 函数来使用简单的窗口方法生成带通 FIR 滤波器系数(更多详细信息请参见FIR filters by windowing

重要的代码片段如下(f1 和 f2 是低和高带通频率,fs 是采样频率,均以 hz 为单位,M 是抽头数,M 系数以 h[0..M-1] 为单位)

double* band_pass (double f1, double f2, double fs, int M) {
    double* h = (double*)calloc(M,sizeof(double));
    double w1 = 2.0*PI*f1/fs;
    double w2 = 2.0*PI*f2/fs;
    int MHALF = (M-1)/2;
    for (int n=0; n<MH; n++) {
        h[n] = (sin((n-MHALF)*w2) - sin((n-MHALF )*w1) ) / ((n-MHALF )*PI);
            h[n] = h[n] * (0.54-0.46*cos(2*PI*n/(M-1)));
        }
        h[M-n-1] = h[n];
    }
    h[MHALF ] = (w2 - w1) / PI;
    return h;
}

系数(以及滤波器)似乎工作正常,但带通增益并不总是单一的。我想我必须缩放所有系数以获得单一增益(在带通中)。

所以问题是:我如何缩放系数?

谷歌搜索了一下,我发现了这个计算 BP 滤波器增益的公式:

gain += 2*h[n]*cos((n-MHALF)*(w1+w2)/2.);

然后我必须为这个增益划分所有的系数。如果它是正确的,公式从何而来,哪些是其他类型的窗冷杉滤波器 LP、HP、带阻增益的公式?

提前致谢。

1个回答

如果你想获得你的长度-N滤波器在特定频率下为单位,然后您可以直接计算它:

G=k=0N1h[k]ejωk

G给出滤波器在频率处的增益ω[0,2π). 如果您想对滤波器进行归一化,使其在该频率下的增益为1,然后将所有滤波器系数除以G. 您可能想要选择ω躺在你的通带中间。

对于希望在 DC 上获得单位增益的低通滤波器,您经常会看到这种情况。在这种情况下,公式简化为:

G=k=0N1h[k]

IEG只是滤波器系数的总和。