示例#1
0
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;


}
示例#2
0
/**
 * 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;
}