[FFmpeg-cvslog] avfilter/af_afftdn: allow user to change ratio factor

Paul B Mahol git at videolan.org
Sun Mar 13 02:49:01 EET 2022


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Sat Mar 12 23:37:02 2022 +0100| [546afd0d497b8d8a7140f3c4fd202034658414e5] | committer: Paul B Mahol

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.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=546afd0d497b8d8a7140f3c4fd202034658414e5
---

 doc/filters.texi        |  6 ++++++
 libavfilter/af_afftdn.c | 11 +++++++----
 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
+
+ at 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;
 



More information about the ffmpeg-cvslog mailing list