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);
  }
}
Beispiel #2
0
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);
  }
}