generation. Hard code Bessel I0 approximation iterations to 50. See thread for discussion: [FFmpeg-devel] [PATCH] Move Kaiser-Bessel Derived window to mdct.c Started on the 2008/01/10 Originally committed as revision 11520 to svn://svn.ffmpeg.org/ffmpeg/trunktags/v0.5
@@ -277,7 +277,7 @@ static int ac3_decode_init(AVCodecContext *avctx) | |||||
ac3_tables_init(); | ac3_tables_init(); | ||||
ff_mdct_init(&s->imdct_256, 8, 1); | ff_mdct_init(&s->imdct_256, 8, 1); | ||||
ff_mdct_init(&s->imdct_512, 9, 1); | ff_mdct_init(&s->imdct_512, 9, 1); | ||||
ff_kbd_window_init(s->window); | |||||
ff_kbd_window_init(s->window, 5.0, 256); | |||||
dsputil_init(&s->dsp, avctx); | dsputil_init(&s->dsp, avctx); | ||||
av_init_random(0, &s->dith_state); | av_init_random(0, &s->dith_state); | ||||
@@ -648,8 +648,10 @@ typedef struct MDCTContext { | |||||
/** | /** | ||||
* Generate a Kaiser-Bessel Derived Window. | * Generate a Kaiser-Bessel Derived Window. | ||||
* @param window pointer to half window | * @param window pointer to half window | ||||
* @param alpha determines window shape | |||||
* @param n size of half window | |||||
*/ | */ | ||||
void ff_kbd_window_init(float *window); | |||||
void ff_kbd_window_init(float *window, float alpha, int n); | |||||
int ff_mdct_init(MDCTContext *s, int nbits, int inverse); | int ff_mdct_init(MDCTContext *s, int nbits, int inverse); | ||||
void ff_imdct_calc(MDCTContext *s, FFTSample *output, | void ff_imdct_calc(MDCTContext *s, FFTSample *output, | ||||
@@ -26,24 +26,25 @@ | |||||
*/ | */ | ||||
// Generate a Kaiser-Bessel Derived Window. | // Generate a Kaiser-Bessel Derived Window. | ||||
void ff_kbd_window_init(float *window) | |||||
#define BESSEL_I0_ITER 50 // default: 50 iterations of Bessel I0 approximation | |||||
void ff_kbd_window_init(float *window, float alpha, int n) | |||||
{ | { | ||||
int i, j; | int i, j; | ||||
double sum = 0.0, bessel, tmp; | double sum = 0.0, bessel, tmp; | ||||
double local_window[256]; | |||||
double alpha2 = (5.0 * M_PI / 256.0) * (5.0 * M_PI / 256.0); | |||||
double local_window[n]; | |||||
double alpha2 = (alpha * M_PI / n) * (alpha * M_PI / n); | |||||
for (i = 0; i < 256; i++) { | |||||
tmp = i * (256 - i) * alpha2; | |||||
for (i = 0; i < n; i++) { | |||||
tmp = i * (n - i) * alpha2; | |||||
bessel = 1.0; | bessel = 1.0; | ||||
for (j = 100; j > 0; j--) /* default to 100 iterations */ | |||||
for (j = BESSEL_I0_ITER; j > 0; j--) | |||||
bessel = bessel * tmp / (j * j) + 1; | bessel = bessel * tmp / (j * j) + 1; | ||||
sum += bessel; | sum += bessel; | ||||
local_window[i] = sum; | local_window[i] = sum; | ||||
} | } | ||||
sum++; | sum++; | ||||
for (i = 0; i < 256; i++) | |||||
for (i = 0; i < n; i++) | |||||
window[i] = sqrt(local_window[i] / sum); | window[i] = sqrt(local_window[i] / sum); | ||||
} | } | ||||