| @@ -41,8 +41,7 @@ | |||||
| typedef struct BiquadContext { | typedef struct BiquadContext { | ||||
| double a0, a1, a2; | double a0, a1, a2; | ||||
| double b1, b2; | double b1, b2; | ||||
| double i1, i2; | |||||
| double o1, o2; | |||||
| double z1, z2; | |||||
| } BiquadContext; | } BiquadContext; | ||||
| typedef struct CrossoverChannel { | typedef struct CrossoverChannel { | ||||
| @@ -150,8 +149,8 @@ static void set_lp(BiquadContext *b, double fc, double q, double sr) | |||||
| b->a0 = (0.5 + beta - gamma) / 2.0; | b->a0 = (0.5 + beta - gamma) / 2.0; | ||||
| b->a1 = 0.5 + beta - gamma; | b->a1 = 0.5 + beta - gamma; | ||||
| b->a2 = b->a1 / 2.0; | b->a2 = b->a1 / 2.0; | ||||
| b->b1 = -2.0 * gamma; | |||||
| b->b2 = 2.0 * beta; | |||||
| b->b1 = 2.0 * gamma; | |||||
| b->b2 = -2.0 * beta; | |||||
| } | } | ||||
| static void set_hp(BiquadContext *b, double fc, double q, double sr) | static void set_hp(BiquadContext *b, double fc, double q, double sr) | ||||
| @@ -164,8 +163,8 @@ static void set_hp(BiquadContext *b, double fc, double q, double sr) | |||||
| b->a0 = (0.5 + beta + gamma) / 2.0; | b->a0 = (0.5 + beta + gamma) / 2.0; | ||||
| b->a1 = -(0.5 + beta + gamma); | b->a1 = -(0.5 + beta + gamma); | ||||
| b->a2 = b->a0; | b->a2 = b->a0; | ||||
| b->b1 = -2.0 * gamma; | |||||
| b->b2 = 2.0 * beta; | |||||
| b->b1 = 2.0 * gamma; | |||||
| b->b2 = -2.0 * beta; | |||||
| } | } | ||||
| static void calc_q_factors(int order, double *q) | static void calc_q_factors(int order, double *q) | ||||
| @@ -246,26 +245,21 @@ static void biquad_process(BiquadContext *b, | |||||
| const double a2 = b->a2; | const double a2 = b->a2; | ||||
| const double b1 = b->b1; | const double b1 = b->b1; | ||||
| const double b2 = b->b2; | const double b2 = b->b2; | ||||
| double i1 = b->i1; | |||||
| double i2 = b->i2; | |||||
| double o1 = b->o1; | |||||
| double o2 = b->o2; | |||||
| double z1 = b->z1; | |||||
| double z2 = b->z2; | |||||
| for (int n = 0; n < nb_samples; n++) { | for (int n = 0; n < nb_samples; n++) { | ||||
| const double in = src[n]; | const double in = src[n]; | ||||
| double out; | double out; | ||||
| out = in * a0 + i1 * a1 + i2 * a2 - o1 * b1 - o2 * b2; | |||||
| i2 = i1; | |||||
| o2 = o1; | |||||
| i1 = in; | |||||
| o1 = dst[n] = out; | |||||
| out = in * a0 + z1; | |||||
| z1 = a1 * in + z2 + b1 * out; | |||||
| z2 = a2 * in + b2 * out; | |||||
| dst[n] = out; | |||||
| } | } | ||||
| b->i1 = i1; | |||||
| b->i2 = i2; | |||||
| b->o1 = o1; | |||||
| b->o2 = o2; | |||||
| b->z1 = z1; | |||||
| b->z2 = z2; | |||||
| } | } | ||||
| static int filter_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) | static int filter_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) | ||||