int fft_init_fix(FFTContext_fix *s, int nbits, int inverse) { int i, j, m, n; double alpha, c1, s1, s2; s->nbits = nbits; n = 1 << nbits; s->exptab = malloc((n / 2) * sizeof(FFTComplex_fix)); if (!s->exptab) goto fail; s->revtab = malloc(n * sizeof(unsigned short)); if (!s->revtab) goto fail; s->inverse = inverse; s2 = inverse ? 1.0 : -1.0; if(inverse) s->fft_calc = fft_calc_fix_inverse; else s->fft_calc = fft_calc_fix; s->imdct_calc = imdct_calc_fix; for(i=0;i<(n/2);i++) { alpha = 2 * M_PI * (double)i / (double)n; c1 = cos(alpha); s1 = sin(alpha) * s2; s->exptab[i].re = FFT_SAMPLE(c1); s->exptab[i].im = FFT_SAMPLE(s1); } /* compute bit reverse table */ for(i=0;i<n;i++) { m=0; for(j=0;j<nbits;j++) { m |= ((i >> j) & 1) << (nbits-j-1); } s->revtab[i]=m; } return 0; fail: free(&s->revtab); free(&s->exptab); return -1; }
/** * init MDCT or IMDCT computation. */ int mdct_init_fix(MDCTContext_fix *s, int nbits, int inverse) { int n, n4, i; double alpha; memset(s, 0, sizeof(*s)); n = 1 << nbits;//1<<6 = 64 s->nbits = nbits;//6 s->n = n;//64 n4 = n >> 2;//16 s->tcos = malloc(n4 * sizeof(FFTSample_fix)); if (!s->tcos) goto fail; s->tsin = malloc(n4 * sizeof(FFTSample_fix)); if (!s->tsin) goto fail; for(i=0; i<n4; i++) { //n4 = 16 alpha = 2 * M_PI * (i + 1.0 / 8.0) / n; s->tcos[i] = -FFT_SAMPLE(cos(alpha)); s->tsin[i] = -FFT_SAMPLE(sin(alpha)); } if(inverse) { s->mdct_calc = imdct_calc_fix; s->imdct_half = imdct_half_fix_c; } else { s->mdct_calc = mdct_calc_fix; //need mdct function } if (fft_init_fix(&s->fft, s->nbits - 2, inverse) < 0) goto fail; return 0; fail: free(s->tcos); free(s->tsin); return -1; }