summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2022-04-23 16:06:50 +0200
committerPaul B Mahol <onemda@gmail.com>2022-04-23 16:25:45 +0200
commita64e250680fbc7296eff714b81b54b1c0e2d185f (patch)
tree57427984bcc491fa028c504febca2b2c1a0e4a51
parent16463520d9de05481320303dd49ea5158c715c9f (diff)
avfilter/af_afftdn: add gain_smooth option
-rw-r--r--doc/filters.texi6
-rw-r--r--libavfilter/af_afftdn.c11
2 files changed, 17 insertions, 0 deletions
diff --git a/doc/filters.texi b/doc/filters.texi
index a428191f6a..039b25bae1 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -1390,6 +1390,12 @@ Stop sample noise capture and measure new noise band profile.
Default value is @code{none}.
@end table
+
+@item gain_smooth, gs
+Set gain smooth factor, used to lowpass gains applied to each frequency bin.
+Useful to reduce random music noise artefacts.
+Higher values reduce smoothing of gains.
+Default value is @code{1.0}.
@end table
@subsection Commands
diff --git a/libavfilter/af_afftdn.c b/libavfilter/af_afftdn.c
index 253526e532..2fb3cb19ac 100644
--- a/libavfilter/af_afftdn.c
+++ b/libavfilter/af_afftdn.c
@@ -114,6 +114,7 @@ typedef struct AudioFFTDeNoiseContext {
int output_mode;
int noise_floor_link;
float ratio;
+ float gain_smooth;
float band_multiplier;
float floor_offset;
@@ -207,6 +208,8 @@ static const AVOption afftdn_options[] = {
{ "begin", "start", 0, AV_OPT_TYPE_CONST, {.i64 = SAMPLE_START}, 0, 0, AFR, "sample" },
{ "stop", "stop", 0, AV_OPT_TYPE_CONST, {.i64 = SAMPLE_STOP}, 0, 0, AFR, "sample" },
{ "end", "stop", 0, AV_OPT_TYPE_CONST, {.i64 = SAMPLE_STOP}, 0, 0, AFR, "sample" },
+ { "gain_smooth", "set gain smooth factor",OFFSET(gain_smooth), AV_OPT_TYPE_FLOAT, {.dbl = 1.00}, 0.0001, 1, AFR },
+ { "gs", "set gain smooth factor",OFFSET(gain_smooth), AV_OPT_TYPE_FLOAT, {.dbl = 1.00}, 0.0001, 1, AFR },
{ NULL }
};
@@ -421,6 +424,14 @@ static void process_frame(AVFilterContext *ctx,
}
}
+ {
+ const double f = s->gain_smooth;
+ const double F = 1. - f;
+
+ for (int i = 1; i < s->bin_count; i++)
+ gain[i] = gain[i-1] * F + f * gain[i];
+ }
+
for (int i = 0; i < s->bin_count; i++) {
const double new_gain = gain[i];