为什么我的Butterworth滤波器在VST3中产生噪声?

时间:2020-11-05 07:03:40

标签: c++ audio signal-processing vst

我现在正在尝试在VST3中实现二阶Butterworth LPF。

我尝试了以下方法。

  1. 我自己计算系数(例如b0,b1,a1)并以常规方式实现。
  2. 设计了相同的过滤器,然后在本地实现。

这两种方法都满足了实现要求,我可以看到指定的频带被切断,但是会产生一些噪声,例如记录灰尘噪声。在要切断的频带越低,该噪声越明显,在约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语句来实现它。但是,结果是相同的。

即使我们不知道具体的解决方案,这种噪声的主要原因是什么?

0 个答案:

没有答案
相关问题