He preparado un ecualizador de audio multibanda usando filtros biquad. Estoy obteniendo los coeficientes usando los métodos del libro de cocina RBJ .
Ahora quiero trazar la curva que muestra la respuesta de magnitud. Estoy usando una ecuación de esta fuente
Aquí está mi función para obtener los coeficientes y obtener la respuesta de magnitud en los puntos de interés.
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;
}
}
Mis filtros suenan correctos, pero mi trama parece muy incorrecta. Por ejemplo, cuando he calculado los coeficientes para un filtro de pico con un ancho de octavas, centrado en , con ; mi respuesta de magnitud usando esos coeficientes en es aproximadamente .
Debo estar haciendo algo mal, pero no puedo entenderlo.
FreqPoints
matriz o laPI
constante, por ejemplo.Respuestas:
Alguien en el foro KRV señaló que necesito normalizar mis coeficientes para que a0 = 1.
Resuelto mi problema
fuente