[FFmpeg-devel] [PATCH 1/4] avfilter/af_biquads: implement 1st order allpass
Paul B Mahol
onemda at gmail.com
Sun May 24 20:03:05 EEST 2020
Signed-off-by: Paul B Mahol <onemda at gmail.com>
---
doc/filters.texi | 3 +++
libavfilter/af_biquads.c | 28 ++++++++++++++++++++++------
2 files changed, 25 insertions(+), 6 deletions(-)
diff --git a/doc/filters.texi b/doc/filters.texi
index 85a511b205..5af4797b7e 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -1568,6 +1568,9 @@ Specify which channels to filter, by default all available are filtered.
@item normalize, n
Normalize biquad coefficients, by default is disabled.
Enabling it will normalize magnitude response at DC to 0dB.
+
+ at item order, o
+Set the filter order, can be 1 or 2. Default is 2.
@end table
@subsection Commands
diff --git a/libavfilter/af_biquads.c b/libavfilter/af_biquads.c
index a2f7e3f061..81cdb0c10e 100644
--- a/libavfilter/af_biquads.c
+++ b/libavfilter/af_biquads.c
@@ -113,6 +113,7 @@ typedef struct BiquadsContext {
double mix;
uint64_t channels;
int normalize;
+ int order;
double a0, a1, a2;
double b0, b1, b2;
@@ -264,6 +265,7 @@ static int config_filter(AVFilterLink *outlink, int reset)
AVFilterLink *inlink = ctx->inputs[0];
double A = ff_exp10(s->gain / 40);
double w0 = 2 * M_PI * s->frequency / inlink->sample_rate;
+ double K = tan(w0 / 2.);
double alpha, beta;
if (w0 > M_PI) {
@@ -389,12 +391,24 @@ static int config_filter(AVFilterLink *outlink, int reset)
}
break;
case allpass:
- 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;
+ 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->a1 = -2 * cos(w0);
+ s->a2 = 1 - alpha;
+ s->b0 = 1 - alpha;
+ s->b1 = -2 * cos(w0);
+ s->b2 = 1 + alpha;
+ break;
+ }
break;
default:
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},
{"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},
+ {"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}
};
--
2.17.1
More information about the ffmpeg-devel
mailing list