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:
parent
f3068be15b
commit
1206a10d9c
@ -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 {
|
|||||||
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}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user