mirror of
https://github.com/xiph/opus.git
synced 2025-05-31 15:47:43 +00:00
Slightly improving the accuracy of the fixed-point MDCT downscale
Also simplifying the code
This commit is contained in:
parent
e0c00e27d8
commit
cc344fb8ff
1 changed files with 9 additions and 13 deletions
22
celt/mdct.c
22
celt/mdct.c
|
@ -119,15 +119,20 @@ void clt_mdct_forward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar
|
||||||
VARDECL(kiss_fft_cpx, f2);
|
VARDECL(kiss_fft_cpx, f2);
|
||||||
const kiss_fft_state *st = l->kfft[shift];
|
const kiss_fft_state *st = l->kfft[shift];
|
||||||
const kiss_twiddle_scalar *trig;
|
const kiss_twiddle_scalar *trig;
|
||||||
|
opus_val16 scale;
|
||||||
#ifdef FIXED_POINT
|
#ifdef FIXED_POINT
|
||||||
/* FIXME: This should eventually just go in the state. */
|
/* FIXME: This should eventually just go in the state. */
|
||||||
opus_val16 scale;
|
|
||||||
int scale_shift;
|
int scale_shift;
|
||||||
scale_shift = celt_ilog2(st->nfft);
|
scale_shift = celt_ilog2(st->nfft);
|
||||||
if (st->nfft == 1<<scale_shift)
|
if (st->nfft == 1<<scale_shift)
|
||||||
scale = Q15ONE;
|
scale = Q15ONE;
|
||||||
else
|
else
|
||||||
scale = (1073741824+st->nfft/2)/st->nfft>>(15-scale_shift);
|
scale = (1073741824+st->nfft/2)/st->nfft>>(15-scale_shift);
|
||||||
|
/* Allows us to scale with MULT16_32_Q16(), which is faster than
|
||||||
|
MULT16_32_Q15() on ARM. */
|
||||||
|
scale_shift--;
|
||||||
|
#else
|
||||||
|
scale = st->scale;
|
||||||
#endif
|
#endif
|
||||||
SAVE_STACK;
|
SAVE_STACK;
|
||||||
|
|
||||||
|
@ -195,28 +200,19 @@ void clt_mdct_forward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar
|
||||||
kiss_fft_scalar re, im, yr, yi;
|
kiss_fft_scalar re, im, yr, yi;
|
||||||
t0 = t[i];
|
t0 = t[i];
|
||||||
t1 = t[N4+i];
|
t1 = t[N4+i];
|
||||||
#ifdef FIXED_POINT
|
|
||||||
t0 = MULT16_16_P15(t0, scale);
|
|
||||||
t1 = MULT16_16_P15(t1, scale);
|
|
||||||
#else
|
|
||||||
t0 *= st->scale;
|
|
||||||
t1 *= st->scale;
|
|
||||||
#endif
|
|
||||||
re = *yp++;
|
re = *yp++;
|
||||||
im = *yp++;
|
im = *yp++;
|
||||||
yr = -S_MUL(re,t0) + S_MUL(im,t1);
|
yr = -S_MUL(re,t0) + S_MUL(im,t1);
|
||||||
yi = -S_MUL(im,t0) - S_MUL(re,t1);
|
yi = -S_MUL(im,t0) - S_MUL(re,t1);
|
||||||
yc.r = yr;
|
yc.r = yr;
|
||||||
yc.i = yi;
|
yc.i = yi;
|
||||||
#ifdef FIXED_POINT
|
yc.r = PSHR32(MULT16_32_Q16(scale, yc.r), scale_shift);
|
||||||
yc.r = SHR32(yc.r, scale_shift);
|
yc.i = PSHR32(MULT16_32_Q16(scale, yc.i), scale_shift);
|
||||||
yc.i = SHR32(yc.i, scale_shift);
|
|
||||||
#endif
|
|
||||||
f2[st->bitrev[i]] = yc;
|
f2[st->bitrev[i]] = yc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* N/4 complex FFT, down-scales by 4/N */
|
/* N/4 complex FFT, does not downscale anymore */
|
||||||
opus_fft_impl(st, f2);
|
opus_fft_impl(st, f2);
|
||||||
|
|
||||||
/* Post-rotate */
|
/* Post-rotate */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue