From 754d52cf42d39f202e7cf58042d03aaf404a311b Mon Sep 17 00:00:00 2001 From: Paul B Mahol Date: Thu, 20 Oct 2022 11:55:34 +0200 Subject: avfilter/window_func: add kaiser window --- 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 +@item kaiser @end table Default is @code{hann}. @@ -2960,6 +2961,7 @@ It accepts the following values: @item parzen @item poisson @item bohman +@item kaiser @end table Default is @code{hann}. @@ -6743,6 +6745,7 @@ It accepts the following values: @item parzen @item poisson @item bohman +@item kaiser @end table Default is @code{hann}. @@ -29255,6 +29258,7 @@ It accepts the following values: @item parzen @item poisson @item bohman +@item kaiser @end table Default is @code{hanning}. @@ -29341,6 +29345,7 @@ It accepts the following values: @item parzen @item poisson @item bohman +@item kaiser @end table Default value is @code{hann}. @@ -29505,6 +29510,7 @@ It accepts the following values: @item parzen @item poisson @item bohman +@item kaiser @end table Default value is @code{hann}. @@ -29702,6 +29708,7 @@ It accepts the following values: @item parzen @item poisson @item bohman +@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); } -- cgit v1.2.3