我正在编写一个 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、带阻增益的公式?
提前致谢。