1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

avfilter/af_biquads: implement 1st order allpass

This commit is contained in:
Paul B Mahol 2020-05-23 17:54:54 +02:00
parent f3068be15b
commit 1206a10d9c
2 changed files with 25 additions and 6 deletions

View File

@ -1568,6 +1568,9 @@ Specify which channels to filter, by default all available are filtered.
@item normalize, n @item normalize, n
Normalize biquad coefficients, by default is disabled. Normalize biquad coefficients, by default is disabled.
Enabling it will normalize magnitude response at DC to 0dB. Enabling it will normalize magnitude response at DC to 0dB.
@item order, o
Set the filter order, can be 1 or 2. Default is 2.
@end table @end table
@subsection Commands @subsection Commands

View File

@ -113,6 +113,7 @@ typedef struct BiquadsContext {
double mix; double mix;
uint64_t channels; uint64_t channels;
int normalize; int normalize;
int order;
double a0, a1, a2; double a0, a1, a2;
double b0, b1, b2; double b0, b1, b2;
@ -264,6 +265,7 @@ static int config_filter(AVFilterLink *outlink, int reset)
AVFilterLink *inlink = ctx->inputs[0]; AVFilterLink *inlink = ctx->inputs[0];
double A = ff_exp10(s->gain / 40); double A = ff_exp10(s->gain / 40);
double w0 = 2 * M_PI * s->frequency / inlink->sample_rate; double w0 = 2 * M_PI * s->frequency / inlink->sample_rate;
double K = tan(w0 / 2.);
double alpha, beta; double alpha, beta;
if (w0 > M_PI) { if (w0 > M_PI) {
@ -389,6 +391,16 @@ static int config_filter(AVFilterLink *outlink, int reset)
} }
break; break;
case allpass: case allpass:
switch (s->order) {
case 1:
s->a0 = 1.;
s->a1 = -(1. - K) / (1. + K);
s->a2 = 0.;
s->b0 = s->a1;
s->b1 = s->a0;
s->b2 = 0.;
break;
case 2:
s->a0 = 1 + alpha; s->a0 = 1 + alpha;
s->a1 = -2 * cos(w0); s->a1 = -2 * cos(w0);
s->a2 = 1 - alpha; s->a2 = 1 - alpha;
@ -396,6 +408,8 @@ static int config_filter(AVFilterLink *outlink, int reset)
s->b1 = -2 * cos(w0); s->b1 = -2 * cos(w0);
s->b2 = 1 + alpha; s->b2 = 1 + alpha;
break; break;
}
break;
default: default:
av_assert0(0); av_assert0(0);
} }
@ -773,6 +787,8 @@ static const AVOption allpass_options[] = {
{"c", "set channels to filter", OFFSET(channels), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64=-1}, INT64_MIN, INT64_MAX, FLAGS}, {"c", "set channels to filter", OFFSET(channels), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64=-1}, INT64_MIN, INT64_MAX, FLAGS},
{"normalize", "normalize coefficients", OFFSET(normalize), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS}, {"normalize", "normalize coefficients", OFFSET(normalize), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
{"n", "normalize coefficients", OFFSET(normalize), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS}, {"n", "normalize coefficients", OFFSET(normalize), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
{"order", "set filter order", OFFSET(order), AV_OPT_TYPE_INT, {.i64=2}, 1, 2, FLAGS},
{"o", "set filter order", OFFSET(order), AV_OPT_TYPE_INT, {.i64=2}, 1, 2, FLAGS},
{NULL} {NULL}
}; };