【问题标题】:bandpass FIR filter带通 FIR 滤波器
【发布时间】:2015-03-05 05:05:19
【问题描述】:

我需要制作一个简单的带通音频滤波器。 现在我使用了这个简单的 C++ 类:http://www.cardinalpeak.com/blog/a-c-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 - 下限 福——上限

以及简单的过滤功能:

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 等)吗?如果是,我该怎么做? 我试图将我的脉冲响应乘以布莱克曼窗口:

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));

但结果是错误的。 我需要标准化水龙头吗?

【问题讨论】:

标签: c++ audio filter signal-processing


【解决方案1】:

我找到了一个很好的免费 FIR 滤波器实现: http://www.iowahills.com/A7ExampleCodePage.html

...这个 Windowed FIR Filter C 代码有两部分,第一部分是 计算矩形窗口的脉冲响应(低 通、高通、带通或陷波)。然后是一扇窗户(凯撒,汉宁, 等)应用于脉冲响应。有几个窗口可以 选择...

【讨论】:

    【解决方案2】:

    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/

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2018-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多