我对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
如果需要更多信息,请告知我们。