带通FIR滤波器
我需要制作一个简单的带通音频滤镜。 现在我已经使用了这个简单的C ++类:http://www.cardinalpeak.com/blog/ac-class-to-implement-low-pass-high-pass-and-band-pass-filters
它运作良好,并切断所需的乐队。 但是,当我尝试用小步骤改变上限或下限时,在某些极限值上,我会听到错误的结果 - 衰减或频移(不对应于电流极限)声音。
用于计算脉冲响应的函数:
void Filter::designBPF()
{
int n;
float mm;
for(n = 0; n < m_num_taps; n++){
mm = n - (m_num_taps - 1.0) / 2.0;
if( mm == 0.0 ) m_taps[n] = (m_phi - m_lambda) / M_PI;
else m_taps[n] = ( sin( mm * m_phi ) -
sin( mm * m_lambda ) ) / (mm * M_PI);
}
return;
}
哪里
m_lambda = M_PI * Fl / (Fs/2);
m_phi = M_PI * Fu / (Fs/2);
Fs - 采样率(44.100)Fl - 下限Fu - 上限
和简单的过滤功能:
float Filter::do_sample(float data_sample)
{
int i;
float result;
if( m_error_flag != 0 ) return(0);
for(i = m_num_taps - 1; i >= 1; i--){
m_sr[i] = m_sr[i-1];
}
m_sr[0] = data_sample;
result = 0;
for(i = 0; i < m_num_taps; i++) result += m_sr[i] * m_taps[i];
return result;
}
我是否需要使用任何窗口功能(Blackman等)? 如果是的话,我该怎么做? 我试图将我的冲动反应与Blackman窗口相乘:
m_taps[n] *= 0.42 - 0.5 * cos(2.0 * M_PI * n / double(N - 1)) +
0.08 * cos(4.0 * M_PI * n / double(N - 1));
但结果是错误的。 我需要正常化水龙头吗?
我发现了FIR滤波器的一个很好的免费实现:http://www.iowahills.com/A7ExampleCodePage.html
...这个开窗FIR滤波器C代码有两个部分,第一个是计算矩形窗口(低通,高通,带通或陷波)的脉冲响应。 然后将一个窗口(Kaiser,Hanning等)应用于脉冲响应。 有几个窗口可供选择...
y [i] =波形[i]×(0.42659071-0.49656062cos(w)+ 0.07684867cos(2w))
其中w =(2)i / n,n是波形中元素的数量
试试这个我得到了以下代码:http://zone.ni.com/reference/en-XX/help/370592P-01/digitizers/blackman_window/
我希望这有帮助。
链接地址: http://www.djcxy.com/p/62147.html上一篇: bandpass FIR filter