Commit 1206a10d authored by Paul B Mahol's avatar Paul B Mahol

avfilter/af_biquads: implement 1st order allpass

parent f3068be1
...@@ -1568,6 +1568,9 @@ Specify which channels to filter, by default all available are filtered. ...@@ -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
......
...@@ -113,6 +113,7 @@ typedef struct BiquadsContext { ...@@ -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) ...@@ -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,12 +391,24 @@ static int config_filter(AVFilterLink *outlink, int reset) ...@@ -389,12 +391,24 @@ static int config_filter(AVFilterLink *outlink, int reset)
} }
break; break;
case allpass: case allpass:
s->a0 = 1 + alpha; switch (s->order) {
s->a1 = -2 * cos(w0); case 1:
s->a2 = 1 - alpha; s->a0 = 1.;
s->b0 = 1 - alpha; s->a1 = -(1. - K) / (1. + K);
s->b1 = -2 * cos(w0); s->a2 = 0.;
s->b2 = 1 + alpha; s->b0 = s->a1;
s->b1 = s->a0;
s->b2 = 0.;
break;
case 2:
s->a0 = 1 + alpha;
s->a1 = -2 * cos(w0);
s->a2 = 1 - alpha;
s->b0 = 1 - alpha;
s->b1 = -2 * cos(w0);
s->b2 = 1 + alpha;
break;
}
break; break;
default: default:
av_assert0(0); av_assert0(0);
...@@ -773,6 +787,8 @@ static const AVOption allpass_options[] = { ...@@ -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}
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment