ref: 2169f64c5283098171e0cab26cc0588e964cbb71
parent: e1d41b6ebb07de84840dc1548ee8992abd0dd502
author: Jean-Marc Valin <jeanmarcv@google.com>
date: Thu Feb 27 05:13:36 EST 2025
Increase accuracy of QEXT twiddle factors/window
--- a/celt/kiss_fft.c
+++ b/celt/kiss_fft.c
@@ -417,8 +417,8 @@
for (i=0;i<nfft;++i) {
opus_val32 phase = -i;
#ifdef ENABLE_QEXT
- twiddles[i].r = floor(.5+2147483647*cos((2*M_PI/nfft)*phase));
- twiddles[i].i = floor(.5+2147483647*sin((2*M_PI/nfft)*phase));
+ twiddles[i].r = (int)MIN32(2147483647, floor(.5+2147483648*cos((2*M_PI/nfft)*phase)));
+ twiddles[i].i = (int)MIN32(2147483647, floor(.5+2147483648*sin((2*M_PI/nfft)*phase)));
#else
kf_cexp2(twiddles+i, DIV32(SHL32(phase,17),nfft));
#endif
--- a/celt/modes.c
+++ b/celt/modes.c
@@ -380,7 +380,7 @@
#else
# ifdef ENABLE_QEXT
for (i=0;i<mode->overlap;i++)
- window[i] = 2147483647*sin(.5*M_PI* sin(.5*M_PI*(i+.5)/mode->overlap) * sin(.5*M_PI*(i+.5)/mode->overlap));
+ window[i] = MIN32(2147483647, 2147483648*sin(.5*M_PI* sin(.5*M_PI*(i+.5)/mode->overlap) * sin(.5*M_PI*(i+.5)/mode->overlap)));
# else
for (i=0;i<mode->overlap;i++)
window[i] = MIN32(32767,floor(.5+32768.*sin(.5*M_PI* sin(.5*M_PI*(i+.5)/mode->overlap) * sin(.5*M_PI*(i+.5)/mode->overlap))));
--
⑨