From e43a0abe0a908603a71b0c35e8c2307a77a7211f Mon Sep 17 00:00:00 2001 From: Jean-Marc Valin Date: Fri, 27 Dec 2013 00:10:54 -0500 Subject: [PATCH] Removes the separate 1/8N rotation in the (I)MDCT and unmerges the MDCT sizes Undoes commits f7547a4e and 72513f3c --- celt/dump_modes/dump_modes.c | 6 +- celt/mdct.c | 128 +++++----- celt/static_modes_fixed.h | 460 +++++++++++++++++++++++++++-------- celt/static_modes_float.h | 460 +++++++++++++++++++++++++++-------- 4 files changed, 794 insertions(+), 260 deletions(-) diff --git a/celt/dump_modes/dump_modes.c b/celt/dump_modes/dump_modes.c index 8c07e196..c2c58090 100644 --- a/celt/dump_modes/dump_modes.c +++ b/celt/dump_modes/dump_modes.c @@ -51,6 +51,7 @@ void dump_modes(FILE *file, CELTMode **modes, int nb_modes) { int i, j, k; + int mdct_twiddles_size; fprintf(file, "/* The contents of this file was automatically generated by dump_modes.c\n"); fprintf(file, " with arguments:"); for (i=0;imdct.n-(mode->mdct.n/2>>mode->mdct.maxshift); fprintf(file, "#ifndef MDCT_TWIDDLES%d\n", mdctSize); fprintf(file, "#define MDCT_TWIDDLES%d\n", mdctSize); fprintf (file, "static const opus_val16 mdct_twiddles%d[%d] = {\n", - mdctSize, mode->mdct.n/4+1); - for (j=0;j<=mode->mdct.n/4;j++) + mdctSize, mdct_twiddles_size); + for (j=0;jmdct.trig[j],(j+6)%5==0?'\n':' '); fprintf (file, "};\n"); diff --git a/celt/mdct.c b/celt/mdct.c index 5e3be84a..500a6289 100644 --- a/celt/mdct.c +++ b/celt/mdct.c @@ -58,13 +58,10 @@ int clt_mdct_init(mdct_lookup *l,int N, int maxshift) { int i; - int N4; kiss_twiddle_scalar *trig; -#if defined(FIXED_POINT) + int shift; int N2=N>>1; -#endif l->n = N; - N4 = N>>2; l->maxshift = maxshift; for (i=0;i<=maxshift;i++) { @@ -77,17 +74,28 @@ int clt_mdct_init(mdct_lookup *l,int N, int maxshift) return 0; #endif } - l->trig = trig = (kiss_twiddle_scalar*)opus_alloc((N4+1)*sizeof(kiss_twiddle_scalar)); + l->trig = trig = (kiss_twiddle_scalar*)opus_alloc((N-(N2>>maxshift))*sizeof(kiss_twiddle_scalar)); if (l->trig==NULL) return 0; - /* We have enough points that sine isn't necessary */ + for (shift=0;shift<=maxshift;shift++) + { + /* We have enough points that sine isn't necessary */ #if defined(FIXED_POINT) - for (i=0;i<=N4;i++) - trig[i] = TRIG_UPSCALE*celt_cos_norm(DIV32(ADD32(SHL32(EXTEND32(i),17),N2),N)); +#if 1 + for (i=0;i>= 1; + N >>= 1; + } return 1; } @@ -107,10 +115,10 @@ void clt_mdct_forward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar { int i; int N, N2, N4; - kiss_twiddle_scalar sine; VARDECL(kiss_fft_scalar, f); VARDECL(kiss_fft_cpx, f2); const kiss_fft_state *st = l->kfft[shift]; + const kiss_twiddle_scalar *trig; #ifdef FIXED_POINT /* FIXME: This should eventually just go in the state. */ opus_val16 scale; @@ -122,18 +130,19 @@ void clt_mdct_forward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar scale = (1073741824+st->nfft/2)/st->nfft>>(15-scale_shift); #endif SAVE_STACK; + N = l->n; - N >>= shift; + trig = l->trig; + for (i=0;i>= 1; + trig += N; + } N2 = N>>1; N4 = N>>2; + ALLOC(f, N2, kiss_fft_scalar); ALLOC(f2, N2, kiss_fft_cpx); - /* sin(x) ~= x here */ -#ifdef FIXED_POINT - sine = TRIG_UPSCALE*(QCONST16(0.7853981f, 15)+N2)/N; -#else - sine = (kiss_twiddle_scalar)2*PI*(.125f)/N; -#endif /* Consider the input to be composed of four blocks: [a, b, c, d] */ /* Window, shuffle, fold */ @@ -178,14 +187,14 @@ void clt_mdct_forward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar /* Pre-rotation */ { kiss_fft_scalar * OPUS_RESTRICT yp = f; - const kiss_twiddle_scalar *t = &l->trig[0]; + const kiss_twiddle_scalar *t = &trig[0]; for(i=0;itrig[0]; + const kiss_twiddle_scalar *t = &trig[0]; /* Temp pointers to make it really clear to the compiler what we're doing */ for(i=0;ii,t[(N4-i)<r,t[i<r,t[(N4-i)<i,t[i<i,t[N4+i]) + S_MUL(fp->r,t[i]); + yi = -S_MUL(fp->r,t[N4+i]) - S_MUL(fp->i,t[i]); + *yp1 = yr; + *yp2 = yi; fp++; yp1 += 2*stride; yp2 -= 2*stride; @@ -240,17 +247,17 @@ void clt_mdct_backward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scala { int i; int N, N2, N4; - kiss_twiddle_scalar sine; + const kiss_twiddle_scalar *trig; + N = l->n; - N >>= shift; + trig = l->trig; + for (i=0;i>= 1; + trig += N; + } N2 = N>>1; N4 = N>>2; - /* sin(x) ~= x here */ -#ifdef FIXED_POINT - sine = TRIG_UPSCALE*(QCONST16(0.7853981f, 15)+N2)/N; -#else - sine = (kiss_twiddle_scalar)2*PI*(.125f)/N; -#endif /* Pre-rotate */ { @@ -258,19 +265,18 @@ void clt_mdct_backward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scala const kiss_fft_scalar * OPUS_RESTRICT xp1 = in; const kiss_fft_scalar * OPUS_RESTRICT xp2 = in+stride*(N2-1); kiss_fft_scalar * OPUS_RESTRICT yp = out+(overlap>>1); - const kiss_twiddle_scalar * OPUS_RESTRICT t = &l->trig[0]; + const kiss_twiddle_scalar * OPUS_RESTRICT t = &trig[0]; const opus_int16 * OPUS_RESTRICT bitrev = l->kfft[shift]->bitrev; for(i=0;i>1); kiss_fft_scalar * OPUS_RESTRICT yp1 = out+(overlap>>1)+N2-2; - const kiss_twiddle_scalar *t = &l->trig[0]; + const kiss_twiddle_scalar *t = &trig[0]; /* Loop to (N4+1)>>1 to handle odd N4. When N4 is odd, the middle pair will be computed twice. */ for(i=0;i<(N4+1)>>1;i++) @@ -294,26 +300,24 @@ void clt_mdct_backward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scala /* We swap real and imag because we're using an FFT instead of an IFFT. */ re = yp0[1]; im = yp0[0]; - t0 = t[i<