00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <libavutil/avassert.h>
00021 #include <libavutil/mathematics.h>
00022 #include "libavutil/attributes.h"
00023 #include "kbdwin.h"
00024
00025 #define BESSEL_I0_ITER 50 // default: 50 iterations of Bessel I0 approximation
00026
00027 av_cold void ff_kbd_window_init(float *window, float alpha, int n)
00028 {
00029 int i, j;
00030 double sum = 0.0, bessel, tmp;
00031 double local_window[FF_KBD_WINDOW_MAX];
00032 double alpha2 = (alpha * M_PI / n) * (alpha * M_PI / n);
00033
00034 av_assert0(n <= FF_KBD_WINDOW_MAX);
00035
00036 for (i = 0; i < n; i++) {
00037 tmp = i * (n - i) * alpha2;
00038 bessel = 1.0;
00039 for (j = BESSEL_I0_ITER; j > 0; j--)
00040 bessel = bessel * tmp / (j * j) + 1;
00041 sum += bessel;
00042 local_window[i] = sum;
00043 }
00044
00045 sum++;
00046 for (i = 0; i < n; i++)
00047 window[i] = sqrt(local_window[i] / sum);
00048 }