ref: 0164bdb37a5115db7221fb0a065ba78812995e6a
parent: cdba712c8c3fd702c6aab1b06cc3f87e51ce6666
author: Jean-Marc Valin <jeanmarcv@google.com>
date: Sat Jun 29 21:49:35 EDT 2024
More accurate fixed-point normalise_bands()
--- a/celt/bands.c
+++ b/celt/bands.c
@@ -150,13 +150,19 @@
i=0; do {
opus_val16 g;
int j,shift;
- opus_val16 E;
- shift = celt_zlog2(bandE[i+c*m->nbEBands])-13;
- E = VSHR32(bandE[i+c*m->nbEBands], shift);
- g = EXTRACT16(celt_rcp(SHL32(E,3)));
- j=M*eBands[i]; do {
- X[j+c*N] = MULT16_16_Q15(VSHR32(freq[j+c*N],shift-1),g);
- } while (++j<M*eBands[i+1]);
+ opus_val32 E;
+ shift = celt_zlog2(bandE[i+c*m->nbEBands])-14;
+ E = VSHR32(bandE[i+c*m->nbEBands], shift-2);
+ g = EXTRACT16(celt_rcp(E));
+ if (shift > 0) {
+ j=M*eBands[i]; do {
+ X[j+c*N] = PSHR32(MULT16_32_Q15(g, freq[j+c*N]),shift);
+ } while (++j<M*eBands[i+1]);
+ } else {
+ j=M*eBands[i]; do {
+ X[j+c*N] = SHL32(MULT16_32_Q15(g, freq[j+c*N]),-shift);
+ } while (++j<M*eBands[i+1]);
+ }
} while (++i<end);
} while (++c<C);
}
--
⑨