我现在正在尝试在VST3中实现二阶Butterworth LPF。
我尝试了以下方法。
这两种方法都满足了实现要求,我可以看到指定的频带被切断,但是会产生一些噪声,例如记录灰尘噪声。在要切断的频带越低,该噪声越明显,在约18 kHz以上的较高频带中几乎看不到。
这是主要的处理代码:
int32 sampleFrames = data.numSamples;
if (sampleFrames > 0)
{
float* input_L = data.inputs[0].channelBuffers32[0];
float* input_R = data.inputs[0].channelBuffers32[1];
float* output_L = data.outputs[0].channelBuffers32[0];
float* output_R = data.outputs[0].channelBuffers32[1];
float in_L = 0, in_R = 0;
float y0_L = 0.f, y1_L = 0.f, y2_L = 0.f;
float y0_R = 0.f, y1_R = 0.f, y2_R = 0.f;
float sr = this->processSetup.sampleRate;
float freq = fFreq1; //cut-off frequency paramater
float pi = 3.1415926535f;
float fSlow0 = tan(pi * freq / sr);
float fSlow1 = 1 / fSlow0;
float fSlow2 = 1.0f / (((fSlow1 + 1.41421354f) / fSlow0) + 1.0f);
float fSlow3 = ((fSlow1 - 1.41421354f) / fSlow0) + 1.0f;
float fSlow4 = 2.0f * (1.0f - (1.0f / (fSlow0 * fSlow0)));
for (int32 sample = 0; sample < sampleFrames; sample++)
{
in_L = input_L[sample];
in_R = input_R[sample];
y0_L = (in_L)-(fSlow2 * ((fSlow3 * y2_L) + (fSlow4 * y1_L)));
output_L[sample] = fSlow2 * (y2_L + (y0_L + (2.0f * y1_L)));
y0_R = ((in_R)-(fSlow2 * ((fSlow3 * y2_R) + (fSlow4 * y1_R))));
output_R[sample] = fSlow2 * (y2_R + (y0_R + (2.0f * y1_R)));
y2_L = y1_L;
y1_L = y0_L;
y2_R = y1_R;
y1_R = y0_R;
}
}
此代码是我在努力时设计的实现(我的实现方法2)。浮士德可以导出我们直接设计为vst插件的效果,但是该插件不会引起任何噪音。 浮躁的设计是:https://faustservicecloud.grame.fr/99BF5F7076036D0441A67B4B9F54418143C3AB18/diagram/process.svg(链接可能会很快断开。)
此外,以上代码被实现为for语句;我也尝试过像mda-examples这样的while语句来实现它。但是,结果是相同的。
即使我们不知道具体的解决方案,这种噪声的主要原因是什么?