shithub: opus

Download patch

ref: c7b01bad5018ba110320fd1b674a1d05410c1483
parent: dc8a6eee433ef2cf8866d7bfe051c331d6607a81
author: Jean-Marc Valin <[email protected]>
date: Fri Mar 19 19:17:28 EDT 2010

fixed-point: slightly increasing the decoder accuracy again

--- a/libcelt/quant_bands.c
+++ b/libcelt/quant_bands.c
@@ -110,7 +110,7 @@
          celt_word16 q;
          celt_word16 x;
          celt_word16 f;
-         celt_word16 mean =  (i-start < E_MEANS_SIZE) ? MULT16_16_P15(Q15ONE-coef,eMeans[i-start]) : 0;
+         celt_word16 mean =  (i-start < E_MEANS_SIZE) ? SUB16(eMeans[i-start], MULT16_16_P15(coef,eMeans[i-start])) : 0;
          x = eBands[i+c*m->nbEBands];
 #ifdef FIXED_POINT
          f = x-mean -MULT16_16_P15(coef,oldEBands[i+c*m->nbEBands])-prev[c];
@@ -135,7 +135,7 @@
          q = SHL16(qi,DB_SHIFT);
          
          oldEBands[i+c*m->nbEBands] = MULT16_16_P15(coef,oldEBands[i+c*m->nbEBands])+(mean+prev[c]+q);
-         prev[c] = mean+prev[c]+MULT16_16_P15(Q15ONE-beta,q);
+         prev[c] = mean+prev[c]+q-MULT16_16_P15(beta,q);
       } while (++c < C);
    }
    return bits_used;
@@ -235,11 +235,11 @@
    /* Decode at a fixed coarse resolution */
    for (i=start;i<m->nbEBands;i++)
    {
-      c=0; 
+      c=0;
       do {
          int qi;
          celt_word16 q;
-         celt_word16 mean =  (i-start < E_MEANS_SIZE) ? MULT16_16_P15(Q15ONE-coef,eMeans[i-start]) : 0;
+         celt_word16 mean =  (i-start < E_MEANS_SIZE) ? SUB16(eMeans[i-start], MULT16_16_P15(coef,eMeans[i-start])) : 0;
          /* If we didn't have enough bits to encode all the energy, just assume something safe.
             We allow slightly busting the budget here */
          if (ec_dec_tell(dec, 0) > budget)
@@ -249,7 +249,7 @@
          q = SHL16(qi,DB_SHIFT);
 
          oldEBands[i+c*m->nbEBands] = MULT16_16_P15(coef,oldEBands[i+c*m->nbEBands])+(mean+prev[c]+q);
-         prev[c] = mean+prev[c]+MULT16_16_P15(Q15ONE-beta,q);
+         prev[c] = mean+prev[c]+q-MULT16_16_P15(beta,q);
       } while (++c < C);
    }
 }
--- a/libcelt/vq.c
+++ b/libcelt/vq.c
@@ -75,8 +75,8 @@
          celt_norm x1, x2;
          x1 = Xptr[0];
          x2 = Xptr[stride];
-         Xptr[stride] = MULT16_16_Q15(c,x2) + MULT16_16_Q15(s,x1);
-         *Xptr++      = MULT16_16_Q15(c,x1) - MULT16_16_Q15(s,x2);
+         Xptr[stride] = EXTRACT16(SHR32(MULT16_16(c,x2) + MULT16_16(s,x1),15));
+         *Xptr++      = EXTRACT16(SHR32(MULT16_16(c,x1) - MULT16_16(s,x2),15));
       }
       Xptr = &X[len-2*stride-1];
       for (i=len-2*stride-1;i>=0;i--)
@@ -84,8 +84,8 @@
          celt_norm x1, x2;
          x1 = Xptr[0];
          x2 = Xptr[stride];
-         Xptr[stride] = MULT16_16_Q15(c,x2) + MULT16_16_Q15(s,x1);
-         *Xptr--      = MULT16_16_Q15(c,x1) - MULT16_16_Q15(s,x2);
+         Xptr[stride] = EXTRACT16(SHR32(MULT16_16(c,x2) + MULT16_16(s,x1),15));
+         *Xptr--      = EXTRACT16(SHR32(MULT16_16(c,x1) - MULT16_16(s,x2),15));
       }
    }
    /*if (len==30)