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