|
|
|
@ -39,8 +39,8 @@ |
|
|
|
|
#define MAX_BANDS MAX_SPLITS + 1 |
|
|
|
|
|
|
|
|
|
typedef struct BiquadContext { |
|
|
|
|
double a0, a1, a2; |
|
|
|
|
double b1, b2; |
|
|
|
|
double b0, b1, b2; |
|
|
|
|
double a1, a2; |
|
|
|
|
double z1, z2; |
|
|
|
|
} BiquadContext; |
|
|
|
|
|
|
|
|
@ -146,30 +146,42 @@ static av_cold int init(AVFilterContext *ctx) |
|
|
|
|
|
|
|
|
|
static void set_lp(BiquadContext *b, double fc, double q, double sr) |
|
|
|
|
{ |
|
|
|
|
double thetac = 2.0 * M_PI * fc / sr; |
|
|
|
|
double d = 1.0 / q; |
|
|
|
|
double beta = 0.5 * (1.0 - (d / 2.0) * sin(thetac)) / (1.0 + (d / 2.0) * sin(thetac)); |
|
|
|
|
double gamma = (0.5 + beta) * cos(thetac); |
|
|
|
|
|
|
|
|
|
b->a0 = (0.5 + beta - gamma) / 2.0; |
|
|
|
|
b->a1 = 0.5 + beta - gamma; |
|
|
|
|
b->a2 = b->a1 / 2.0; |
|
|
|
|
b->b1 = 2.0 * gamma; |
|
|
|
|
b->b2 = -2.0 * beta; |
|
|
|
|
double omega = M_PI * fc / sr; |
|
|
|
|
double cosine = cos(omega); |
|
|
|
|
double alpha = sin(omega) / (2. * q); |
|
|
|
|
|
|
|
|
|
double b0 = (1. - cosine) / 2.; |
|
|
|
|
double b1 = 1. - cosine; |
|
|
|
|
double b2 = (1. - cosine) / 2.; |
|
|
|
|
double a0 = 1. + alpha; |
|
|
|
|
double a1 = -2. * cosine; |
|
|
|
|
double a2 = 1. - alpha; |
|
|
|
|
|
|
|
|
|
b->b0 = b0 / a0; |
|
|
|
|
b->b1 = b1 / a0; |
|
|
|
|
b->b2 = b2 / a0; |
|
|
|
|
b->a1 = -a1 / a0; |
|
|
|
|
b->a2 = -a2 / a0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void set_hp(BiquadContext *b, double fc, double q, double sr) |
|
|
|
|
{ |
|
|
|
|
double thetac = 2.0 * M_PI * fc / sr; |
|
|
|
|
double d = 1.0 / q; |
|
|
|
|
double beta = 0.5 * (1.0 - (d / 2.0) * sin(thetac)) / (1.0 + (d / 2.0) * sin(thetac)); |
|
|
|
|
double gamma = (0.5 + beta) * cos(thetac); |
|
|
|
|
|
|
|
|
|
b->a0 = (0.5 + beta + gamma) / 2.0; |
|
|
|
|
b->a1 = -(0.5 + beta + gamma); |
|
|
|
|
b->a2 = b->a0; |
|
|
|
|
b->b1 = 2.0 * gamma; |
|
|
|
|
b->b2 = -2.0 * beta; |
|
|
|
|
double omega = M_PI * fc / sr; |
|
|
|
|
double cosine = cos(omega); |
|
|
|
|
double alpha = sin(omega) / (2. * q); |
|
|
|
|
|
|
|
|
|
double b0 = (1. + cosine) / 2.; |
|
|
|
|
double b1 = -1. - cosine; |
|
|
|
|
double b2 = (1. + cosine) / 2.; |
|
|
|
|
double a0 = 1. + alpha; |
|
|
|
|
double a1 = -2. * cosine; |
|
|
|
|
double a2 = 1. - alpha; |
|
|
|
|
|
|
|
|
|
b->b0 = b0 / a0; |
|
|
|
|
b->b1 = b1 / a0; |
|
|
|
|
b->b2 = b2 / a0; |
|
|
|
|
b->a1 = -a1 / a0; |
|
|
|
|
b->a2 = -a2 / a0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void calc_q_factors(int order, double *q) |
|
|
|
@ -250,11 +262,11 @@ static void biquad_process(BiquadContext *b, |
|
|
|
|
double *dst, const double *src, |
|
|
|
|
int nb_samples) |
|
|
|
|
{ |
|
|
|
|
const double a0 = b->a0; |
|
|
|
|
const double a1 = b->a1; |
|
|
|
|
const double a2 = b->a2; |
|
|
|
|
const double b0 = b->b0; |
|
|
|
|
const double b1 = b->b1; |
|
|
|
|
const double b2 = b->b2; |
|
|
|
|
const double a1 = b->a1; |
|
|
|
|
const double a2 = b->a2; |
|
|
|
|
double z1 = b->z1; |
|
|
|
|
double z2 = b->z2; |
|
|
|
|
|
|
|
|
@ -262,9 +274,9 @@ static void biquad_process(BiquadContext *b, |
|
|
|
|
const double in = src[n]; |
|
|
|
|
double out; |
|
|
|
|
|
|
|
|
|
out = in * a0 + z1; |
|
|
|
|
z1 = a1 * in + z2 + b1 * out; |
|
|
|
|
z2 = a2 * in + b2 * out; |
|
|
|
|
out = in * b0 + z1; |
|
|
|
|
z1 = b1 * in + z2 + a1 * out; |
|
|
|
|
z2 = b2 * in + a2 * out; |
|
|
|
|
dst[n] = out; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|