aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2022-03-12 23:37:02 +0100
committerPaul B Mahol <onemda@gmail.com>2022-03-13 01:49:02 +0100
commit546afd0d497b8d8a7140f3c4fd202034658414e5 (patch)
tree7f598e7c47c8ca1beac3fb932827b7a31e9bc4f9
parentb2c6c7c4c5017e49f11c05a3571c655de8741dc7 (diff)
downloadffmpeg-546afd0d497b8d8a7140f3c4fd202034658414e5.tar.gz
avfilter/af_afftdn: allow user to change ratio factor
While here change default to lower value as previous value were causing too much smearing on time axis of spectrogram.
-rw-r--r--doc/filters.texi6
-rw-r--r--libavfilter/af_afftdn.c11
2 files changed, 13 insertions, 4 deletions
diff --git a/doc/filters.texi b/doc/filters.texi
index 914baaf134..7a7937ca6c 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -1341,6 +1341,12 @@ Pass only noise.
Default value is @var{output}.
@end table
+
+@item adaptivity, ad
+Set the adaptivity factor, used how fast to adapt gains adjustments per
+each frequency bin. Value @var{0} enables instant adaptation, while higher values
+react much slower.
+Allowed range is from @var{0} to @var{1}. Default value is @var{0.5}.
@end table
@subsection Commands
diff --git a/libavfilter/af_afftdn.c b/libavfilter/af_afftdn.c
index b638d52ca5..acef2057ed 100644
--- a/libavfilter/af_afftdn.c
+++ b/libavfilter/af_afftdn.c
@@ -30,8 +30,6 @@
#include "filters.h"
#define C (M_LN10 * 0.1)
-#define RATIO 0.98
-#define RRATIO (1.0 - RATIO)
#define NB_PROFILE_BANDS (15)
enum OutModes {
@@ -103,6 +101,7 @@ typedef struct AudioFFTDeNoiseContext {
int track_noise;
int track_residual;
int output_mode;
+ float ratio;
float last_residual_floor;
float last_noise_floor;
@@ -182,6 +181,8 @@ static const AVOption afftdn_options[] = {
{ "o", "output", 0, AV_OPT_TYPE_CONST, {.i64 = OUT_MODE}, 0, 0, AFR, "mode" },
{ "noise", "noise", 0, AV_OPT_TYPE_CONST, {.i64 = NOISE_MODE}, 0, 0, AFR, "mode" },
{ "n", "noise", 0, AV_OPT_TYPE_CONST, {.i64 = NOISE_MODE}, 0, 0, AFR, "mode" },
+ { "adaptivity", "set adaptivity factor",OFFSET(ratio), AV_OPT_TYPE_FLOAT, {.dbl = 0.5}, 0, 1, AFR },
+ { "ad", "set adaptivity factor",OFFSET(ratio), AV_OPT_TYPE_FLOAT, {.dbl = 0.5}, 0, 1, AFR },
{ NULL }
};
@@ -315,6 +316,8 @@ static void process_frame(AudioFFTDeNoiseContext *s, DeNoiseChannel *dnch,
AVComplexFloat *fft_data,
double *prior, double *prior_band_excit, int track_noise)
{
+ const double ratio = s->ratio;
+ const double rratio = 1. - ratio;
double d1, d2, d3, gain;
int n = 0, i1;
@@ -325,7 +328,7 @@ static void process_frame(AudioFFTDeNoiseContext *s, DeNoiseChannel *dnch,
dnch->noisy_data[i] = d1;
d2 = d1 / dnch->abs_var[i];
- d3 = RATIO * prior[i] + RRATIO * fmax(d2 - 1.0, 0.0);
+ d3 = ratio * prior[i] + rratio * fmax(d2 - 1.0, 0.0);
gain = d3 / (1.0 + d3);
gain *= (gain + M_PI_4 / fmax(d2, 1.0E-6));
prior[i] = d2 * gain;
@@ -802,7 +805,7 @@ static int config_input(AVFilterLink *inlink)
}
for (int i = 0; i <= s->fft_length2; i++)
- prior[i] = RRATIO;
+ prior[i] = 1.0 - s->ratio;
for (int i = 0; i < s->buffer_length; i++)
dnch->out_samples[i] = 0;