[FFmpeg-cvslog] avfilter/window_func: add kaiser window

Paul B Mahol git at videolan.org
Thu Oct 20 13:10:25 EEST 2022


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Thu Oct 20 11:55:34 2022 +0200| [754d52cf42d39f202e7cf58042d03aaf404a311b] | committer: Paul B Mahol

avfilter/window_func: add kaiser window

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

 doc/filters.texi          |  7 +++++++
 libavfilter/window_func.h | 27 +++++++++++++++++++++++++--
 2 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/doc/filters.texi b/doc/filters.texi
index 6be133baac..2b920bf121 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -1534,6 +1534,7 @@ It accepts the following values:
 @item parzen
 @item poisson
 @item bohman
+ at item kaiser
 @end table
 Default is @code{hann}.
 
@@ -2960,6 +2961,7 @@ It accepts the following values:
 @item parzen
 @item poisson
 @item bohman
+ at item kaiser
 @end table
 Default is @code{hann}.
 
@@ -6743,6 +6745,7 @@ It accepts the following values:
 @item parzen
 @item poisson
 @item bohman
+ at item kaiser
 @end table
 Default is @code{hann}.
 
@@ -29255,6 +29258,7 @@ It accepts the following values:
 @item parzen
 @item poisson
 @item bohman
+ at item kaiser
 @end table
 Default is @code{hanning}.
 
@@ -29341,6 +29345,7 @@ It accepts the following values:
 @item parzen
 @item poisson
 @item bohman
+ at item kaiser
 @end table
 
 Default value is @code{hann}.
@@ -29505,6 +29510,7 @@ It accepts the following values:
 @item parzen
 @item poisson
 @item bohman
+ at item kaiser
 @end table
 
 Default value is @code{hann}.
@@ -29702,6 +29708,7 @@ It accepts the following values:
 @item parzen
 @item poisson
 @item bohman
+ at item kaiser
 @end table
 Default value is @code{hann}.
 
diff --git a/libavfilter/window_func.h b/libavfilter/window_func.h
index bff1fa6041..02b5def9dd 100644
--- a/libavfilter/window_func.h
+++ b/libavfilter/window_func.h
@@ -31,7 +31,7 @@ enum WindowFunc     { WFUNC_RECT, WFUNC_HANNING, WFUNC_HAMMING, WFUNC_BLACKMAN,
                       WFUNC_BHARRIS, WFUNC_BNUTTALL, WFUNC_SINE, WFUNC_NUTTALL,
                       WFUNC_BHANN, WFUNC_LANCZOS, WFUNC_GAUSS, WFUNC_TUKEY,
                       WFUNC_DOLPH, WFUNC_CAUCHY, WFUNC_PARZEN, WFUNC_POISSON,
-                      WFUNC_BOHMAN,
+                      WFUNC_BOHMAN, WFUNC_KAISER,
                       NB_WFUNC };
 
 #define WIN_FUNC_OPTION(win_func_opt_name, win_func_offset, flag, default_window_func)                              \
@@ -56,7 +56,22 @@ enum WindowFunc     { WFUNC_RECT, WFUNC_HANNING, WFUNC_HAMMING, WFUNC_BLACKMAN,
         { "cauchy",   "Cauchy",           0, AV_OPT_TYPE_CONST, {.i64=WFUNC_CAUCHY},   0, 0, flag, "win_func" }, \
         { "parzen",   "Parzen",           0, AV_OPT_TYPE_CONST, {.i64=WFUNC_PARZEN},   0, 0, flag, "win_func" }, \
         { "poisson",  "Poisson",          0, AV_OPT_TYPE_CONST, {.i64=WFUNC_POISSON},  0, 0, flag, "win_func" }, \
-        { "bohman",   "Bohman",           0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BOHMAN},   0, 0, flag, "win_func" }
+        { "bohman",   "Bohman",           0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BOHMAN},   0, 0, flag, "win_func" }, \
+        { "kaiser",   "Kaiser",           0, AV_OPT_TYPE_CONST, {.i64=WFUNC_KAISER},   0, 0, flag, "win_func" }
+
+static inline double get_i0(double x)
+{
+    double y = 1.0, prev = 1.0, i = 1.0;
+
+    while (fabs(prev) > 1e-20) {
+        double summand = prev * x * x / (4 * i * i);
+        y += summand;
+        prev = summand;
+        i++;
+    }
+
+    return y;
+}
 
 static inline void generate_window_func(float *lut, int N, int win_func,
                                         float *overlap)
@@ -216,6 +231,14 @@ static inline void generate_window_func(float *lut, int N, int win_func,
         }
         *overlap = 0.75;
         break;
+    case WFUNC_KAISER:
+        for (n = 0; n < N; n++) {
+            double x = 2.0 / (double)(N - 1);
+
+            lut[n] = get_i0(12. * sqrt(1. - SQR(n * x - 1.))) / get_i0(12.);
+        }
+        *overlap = 0.75;
+        break;
     default:
         av_assert0(0);
     }



More information about the ffmpeg-cvslog mailing list