view mp3lib/equalizer.c @ 32527:babddccb9312

use x264_picture_init. this currently has no effect, but it always should have been done this way, and it will be required for some future x264 version.
author lorenm
date Wed, 10 Nov 2010 08:32:54 +0000
parents 0ad2da052b2e
children
line wrap: on
line source

#include "mpg123.h"

void init_spline(float *x, float *y, int n, float *y2)
{
    int i, k;
    float p, qn, sig, un, *u;
    u = malloc(n * sizeof (float));

    y2[0] = u[0] = 0.0;

    for (i = 1; i < n - 1; i++)
    {
        sig = ((float) x[i] - x[i - 1]) / ((float) x[i + 1] - x[i - 1]);
        p = sig * y2[i - 1] + 2.0;
        y2[i] = (sig - 1.0) / p;
        u[i] = (((float) y[i + 1] - y[i]) / (x[i + 1] - x[i])) -
               (((float) y[i] - y[i - 1]) / (x[i] - x[i - 1]));
        u[i] = (6.0 * u[i] / (x[i + 1] - x[i - 1]) - sig * u[i - 1]) / p;
    }
    qn = un = 0.0;

    y2[n - 1] = (un - qn * u[n - 2]) / (qn * y2[n - 2] + 1.0);
    for (k = n - 2; k >= 0; k--)
        y2[k] = y2[k] * y2[k + 1] + u[k];
    free(u);
}

float eval_spline(float xa[], float ya[], float y2a[], int n, float x)
{
    int klo, khi, k;
    float h, b, a;

    klo = 0;
    khi = n - 1;
    while (khi - klo > 1)
    {
        k = (khi + klo) >> 1;
        if (xa[k] > x)
            khi = k;
        else
            klo = k;
    }
    h = xa[khi] - xa[klo];
    a = (xa[khi] - x) / h;
    b = (x - xa[klo]) / h;
    return (a * ya[klo] + b * ya[khi] + ((a * a * a - a) * y2a[klo] + (b * b * b - b) * y2a[khi])
            * (h * h) / 6.0);
}

void mpg123_set_eq(int on, float preamp, float *b)
{
    float x[] =
    {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, yf[10], val, band[10];
    int bands[] =
    {0, 4, 8, 16, 26, 78, 157, 313, 366, 418};
    int i, j;

    mpg123_info->eq_active = on;
    if (mpg123_info->eq_active)
    {
        for (i = 0; i < 10; i++)
        {
            band[i] = b[i] + preamp;
        }

        init_spline(x, band, 10, yf);
        for (i = 0; i < 9; i++)
        {
            for (j = bands[i]; j < bands[i + 1]; j++)
            {
                val = eval_spline(x, band, yf, 10, i + ((float) (j - bands[i]) * (1.0 / (bands[i + 1] - bands[i]))));
                mpg123_info->eq_mul[j] = pow(2, val / 10.0);
            }
        }
        for (i = bands[9]; i < 576; i++)
            mpg123_info->eq_mul[i] = mpg123_info->eq_mul[bands[9] - 1];
    }
}