static void setup_peak_filter (GstIirEqualizer * equ, GstIirEqualizerBand * band) { g_return_if_fail (GST_AUDIO_FILTER (equ)->format.rate); { gdouble gain, omega, bw; gdouble alpha, alpha1, alpha2, b0; gain = arg_to_scale (band->gain); omega = calculate_omega (band->freq, GST_AUDIO_FILTER (equ)->format.rate); bw = calculate_bw (band, GST_AUDIO_FILTER (equ)->format.rate); if (bw == 0.0) goto out; alpha = tan (bw / 2.0); alpha1 = alpha * gain; alpha2 = alpha / gain; b0 = (1.0 + alpha2); band->a0 = (1.0 + alpha1) / b0; band->a1 = (-2.0 * cos (omega)) / b0; band->a2 = (1.0 - alpha1) / b0; band->b1 = (2.0 * cos (omega)) / b0; band->b2 = -(1.0 - alpha2) / b0; out: GST_INFO ("gain = %5.1f, width= %7.2f, freq = %7.2f, a0 = %7.5g, a1 = %7.5g, a2=%7.5g b1 = %7.5g, b2 = %7.5g", band->gain, band->width, band->freq, band->a0, band->a1, band->a2, band->b1, band->b2); } }
static void setup_high_shelf_filter (GstIirEqualizer * equ, GstIirEqualizerBand * band) { gint rate = GST_AUDIO_FILTER_RATE (equ); g_return_if_fail (rate); { gdouble gain, omega, bw; gdouble alpha, delta, b0; gdouble egp, egm; gain = arg_to_scale (band->gain); omega = calculate_omega (band->freq, rate); bw = calculate_bw (band, rate); if (bw == 0.0) goto out; egm = gain - 1.0; egp = gain + 1.0; alpha = tan (bw / 2.0); delta = 2.0 * sqrt (gain) * alpha; b0 = egp - egm * cos (omega) + delta; band->a0 = ((egp + egm * cos (omega) + delta) * gain) / b0; band->a1 = ((egm + egp * cos (omega)) * -2.0 * gain) / b0; band->a2 = ((egp + egm * cos (omega) - delta) * gain) / b0; band->b1 = ((egm - egp * cos (omega)) * -2.0) / b0; band->b2 = -((egp - egm * cos (omega) - delta)) / b0; out: GST_INFO ("gain = %5.1f, width= %7.2f, freq = %7.2f, a0 = %7.5g, a1 = %7.5g, a2=%7.5g b1 = %7.5g, b2 = %7.5g", band->gain, band->width, band->freq, band->a0, band->a1, band->a2, band->b1, band->b2); } }
/* Filter taken from * * The Equivalence of Various Methods of Computing * Biquad Coefficients for Audio Parametric Equalizers * * by Robert Bristow-Johnson * * http://www.aes.org/e-lib/browse.cfm?elib=6326 * http://www.musicdsp.org/files/EQ-Coefficients.pdf * * The bandwidth method that we use here is the preferred * one from this article transformed from octaves to frequency * in Hz. */ static void setup_filter (GstIirEqualizer * equ, GstIirEqualizerBand * band) { g_return_if_fail (GST_AUDIO_FILTER (equ)->format.rate); /* FIXME: we need better filters * - we need shelf-filter for 1st and last band */ { gdouble gain, omega, bw; gdouble edge_gain, gamma; gdouble alpha, beta; gain = arg_to_scale (band->gain); if (band->freq / GST_AUDIO_FILTER (equ)->format.rate > 0.5) omega = M_PI; else if (band->freq < 0.0) omega = 0.0; else omega = 2.0 * M_PI * (band->freq / GST_AUDIO_FILTER (equ)->format.rate); if (band->width / GST_AUDIO_FILTER (equ)->format.rate >= 0.5) { /* If bandwidth == 0.5 the calculation below fails as tan(M_PI/2) * is undefined. So set the bandwidth to a slightly smaller value. */ bw = M_PI - 0.00000001; } else if (band->width <= 0.0) { /* If bandwidth == 0 this band won't change anything so set * the coefficients accordingly. The coefficient calculation * below would create coefficients that for some reason amplify * the band. */ band->a0 = 1.0; band->a1 = 0.0; band->a2 = 0.0; band->b1 = 0.0; band->b2 = 0.0; gain = 1.0; goto out; } else { bw = 2.0 * M_PI * (band->width / GST_AUDIO_FILTER (equ)->format.rate); } edge_gain = sqrt (gain); gamma = tan (bw / 2.0); alpha = gamma * edge_gain; beta = gamma / edge_gain; band->a0 = (1.0 + alpha) / (1.0 + beta); band->a1 = (-2.0 * cos (omega)) / (1.0 + beta); band->a2 = (1.0 - alpha) / (1.0 + beta); band->b1 = (2.0 * cos (omega)) / (1.0 + beta); band->b2 = -(1.0 - beta) / (1.0 + beta); out: GST_INFO ("gain = %5.1f, width= %7.2f, freq = %7.2f, a0 = %7.5g, a1 = %7.5g, a2=%7.5g b1 = %7.5g, b2 = %7.5g", band->gain, band->width, band->freq, band->a0, band->a1, band->a2, band->b1, band->b2); } }