From f7547a4e8e59dc97dda510f2f925124aefe2c986 Mon Sep 17 00:00:00 2001 From: Jean-Marc Valin Date: Wed, 28 Apr 2010 22:10:57 -0400 Subject: [PATCH] Shrinking the MDCT's table by separately rotating by the 1/(8N) factor --- libcelt/mdct.c | 73 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 49 insertions(+), 24 deletions(-) diff --git a/libcelt/mdct.c b/libcelt/mdct.c index 0cb15efa..4bdab58b 100644 --- a/libcelt/mdct.c +++ b/libcelt/mdct.c @@ -61,29 +61,30 @@ void clt_mdct_init(mdct_lookup *l,int N) { int i; - int N2; + int N2, N4; l->n = N; N2 = N>>1; + N4 = N>>2; l->kfft = cpx32_fft_alloc(N>>2); #ifndef ENABLE_TI_DSPLIB55 if (l->kfft==NULL) return; #endif - l->trig = (kiss_twiddle_scalar*)celt_alloc(N2*sizeof(kiss_twiddle_scalar)); + l->trig = (kiss_twiddle_scalar*)celt_alloc((N4+1)*sizeof(kiss_twiddle_scalar)); if (l->trig==NULL) return; /* We have enough points that sine isn't necessary */ #if defined(FIXED_POINT) #if defined(DOUBLE_PRECISION) & !defined(MIXED_PRECISION) - for (i=0;itrig[i] = SAMP_MAX*cos(2*M_PI*(i+1./8.)/N); + for (i=0;i<=N4;i++) + l->trig[i] = SAMP_MAX*cos(2*M_PI*i/N); #else - for (i=0;itrig[i] = TRIG_UPSCALE*celt_cos_norm(DIV32(ADD32(SHL32(EXTEND32(i),17),16386),N)); + for (i=0;i<=N4;i++) + l->trig[i] = TRIG_UPSCALE*celt_cos_norm(DIV32(ADD32(SHL32(EXTEND32(i),17),N2),N)); #endif #else - for (i=0;itrig[i] = cos(2*M_PI*(i+.125f)/N); + for (i=0;i<=N4;i++) + l->trig[i] = cos(2*M_PI*i/N); #endif } @@ -102,9 +103,16 @@ void clt_mdct_forward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar N = l->n; N2 = N>>1; N4 = N>>2; + kiss_twiddle_scalar sine; ALLOC(f, N2, kiss_fft_scalar); - - /* Consider the input to be compused of four blocks: [a, b, c, d] */ + /* sin(x) ~= x here */ +#ifdef FIXED_POINT + sine = TRIG_UPSCALE*(QCONST16(0.7853981f, 15)+N2)/N; +#else + sine = 2*M_PI*(.125f)/N; +#endif + + /* Consider the input to be composed of four blocks: [a, b, c, d] */ /* Window, shuffle, fold */ { /* Temp pointers to make it really clear to the compiler what we're doing */ @@ -150,12 +158,14 @@ void clt_mdct_forward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar kiss_fft_scalar *t = &l->trig[0]; for(i=0;in; N2 = N>>1; N4 = N>>2; + kiss_twiddle_scalar sine; ALLOC(f, N2, kiss_fft_scalar); ALLOC(f2, N2, kiss_fft_scalar); + /* sin(x) ~= x here */ +#ifdef FIXED_POINT + sine = TRIG_UPSCALE*(QCONST16(0.7853981f, 15)+N2)/N; +#else + sine = 2*M_PI*(.125f)/N; +#endif /* Pre-rotate */ { @@ -206,11 +226,14 @@ void clt_mdct_backward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scala kiss_fft_scalar *t = &l->trig[0]; for(i=0;i