DSP滤波器问题

时间:2014-07-22 18:35:06

标签: c++ filter signal-processing

我对DSP& amp;还在学习。我正试图建立一个多坡度&多模式过滤器,但我有一些问题。这是我当前过滤器的代码。

double Filter::process(double inputValue) {
    if (inputValue == 0.0) return inputValue;
    buf0 += cutoff * (inputValue - buf0 + feedbackAmount * (buf0 - buf1));
    buf1 += cutoff * (buf0 - buf1);
    buf2 += cutoff * (buf1 - buf2);
    buf3 += cutoff * (buf2 - buf3);
    switch (mode) {
    case FILTER_MODE_LOWPASS:
        if (slope) { return buf3; }
        return buf1;
    case FILTER_MODE_HIGHPASS:
        if (slope) { return inputValue - buf3; }
        return inputValue - buf1;
    case FILTER_MODE_BANDPASS:
        if (slope) { return buf0 - buf3; }
        return buf0 - buf1;
    default:
        return 0.0;
    }
}

如您所见,它有四个一阶低通滤波器。 "斜率" feature是基于您选择的参数的值0或1(有效,我已经调试它并确保没有错误)。问题在于高通和带通滤波器。低通工作正常并返回正确的值(buf3),这导致-24dB滤波器。

然而,另外两个似乎是倒退。当斜率设置为24db(斜率== 1)时,高通和&带通,即使它返回适当的值(例如inputvalue - buf3)我仍然得到似乎是12dB的斜率(通过分析仪检查频率确定&你可以通过产生的声音来判断)。我似乎无法弄清楚错误的位置。

我遇到的另一个问题是非常令人讨厌的混叠,即当我将低通滤波器设置为低截止时,仍有一些高频通过&你可以听到声音摆动或什么的。反馈为零,一个干净的锯正在通过另一个插件传递。这只是一个经过剪辑失真的简单过滤器插件。其余的代码 -

//for loop
    *input = mFilter.process(*input);
    if(*input >= 0) {
        *output = std::min(*input, mThreshold);
    } else {
        *output = std::max(*input, -mThreshold);
    }
    *output *= mOutputLevel / mThreshold;
//end loop

如果需要更多信息,请告知我们。

0 个答案:

没有答案