[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