shithub: opus

Download patch

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);
 }
--