绘制双二阶滤波器的幅度响应

信息处理 过滤器 声音的 频率响应 双二阶
2022-01-10 03:26:56

我已经使用双二阶滤波器组合了一个多频段音频均衡器。我正在使用RBJ 食谱中的方法获取系数。

现在我想绘制显示幅度响应的曲线。我正在使用来自此来源的方程式

这是我获取系数并获取感兴趣点的幅度响应的函数。

void GetCoefficients (double samplerate = 44100.0) {

    //from the rbj biquad coefficient cookbook by Robert Bristow-Johnson
    long double SR = (long double)samplerate;
    long double A = powl(10.0L, dBGain/40.0L);
    long double W0 = 2.0L * PI * Center / SR;
    long double alpha = sinl(W0)*sinhl( LN2/2.0L * WidthInOctaves * W0/sinl(W0));

    if (Type == "peaking") {
        b0 = 1.0L + alpha * A;
        b1 = -2.0L * cosl(W0);
        b2 = 1.0L - alpha * A;
        a0 = 1.0L + alpha / A;
        a1 = -2.0L * cosl(W0);
        a2 = 1.0L - alpha / A;
    }
    
    long double w;
    long double numerator;
    long double denominator;
    long double magnitude;

    for (int i = 0; i < 59; ++ i) {
        w = 2.0L*PI*FreqPoints[i] / SR;  
        numerator = b0*b0 + b1*b1 + b2*b2 + 2.0L*(b0*b1 + b1*b2)*cosl(w) + 2.0L*b0*b2*cosl(2.0L*w);
        denominator = 1.0L + a1*a1 + a2*a2 + 2.0L*(a1 + a1*a2)*cosl(w) + 2.0L*a2*cosl(2.0L*w);
        magnitude = sqrtl(numerator / denominator);
        FrequencyResponse[i] = magnitude;   
    }
}

我的过滤器听起来是正确的,但我的情节接缝是错误的。例如,当我计算了宽度为个八度音阶的峰值滤波器的系数时,以为中心,增益处使用这些系数的幅度响应约为24398 Hz3 dB349 Hz12

我一定做错了什么,但我无法完全弄清楚。

1个回答

KRV 论坛上的某个人指出,我需要对系数进行归一化,使 a0 = 1。

b0 /= a0;
b1 /= a0;
b2 /= a0;
a1 /= a0;
a2 /= a0;
a0 = 1;

解决了我的问题。