shithub: opus

Download patch

ref: 6cde5dd24c005e87fbae2fcfecf6f28a08ba59d3
parent: 8ed865813eb3aaea73e88fc3e6fc9b5dcedce711
author: Jean-Marc Valin <[email protected]>
date: Thu Dec 4 16:21:41 EST 2008

alg_quant() now handles the sign of X[] separately from the quantisation
process

--- a/libcelt/vq.c
+++ b/libcelt/vq.c
@@ -91,7 +91,7 @@
 }
 
 
-void alg_quant(celt_norm_t *X, celt_mask_t *W, int N, int K, const celt_norm_t *P, ec_enc *enc)
+void alg_quant(celt_norm_t *X, celt_mask_t *W, int N, int K, celt_norm_t *P, ec_enc *enc)
 {
    VARDECL(celt_norm_t, y);
    VARDECL(int, iy);
@@ -122,8 +122,11 @@
       X[j] -= P[j];
       if (X[j]>0)
          signx[j]=1;
-      else
+      else {
          signx[j]=-1;
+         X[j]=-X[j];
+         P[j]=-P[j];
+      }
       iy[j] = 0;
       y[j] = 0;
       sum = MAC16_16(sum, P[j],P[j]);
@@ -164,7 +167,7 @@
       do {
          celt_word16_t Rxy, Ryy;
          /* Select sign based on X[j] alone */
-         s = MULT16_16(signx[j],magnitude);
+         s = magnitude;
          /* Temporary sums of the new pulse(s) */
          Rxy = EXTRACT16(SHR32(MAC16_16(xy, s,X[j]),rshift));
          /* We're multiplying y[j] by two so we don't have to do it here */
@@ -185,7 +188,7 @@
       } while (++j<N);
       
       j = best_id;
-      is = MULT16_16(signx[j],pulsesAtOnce);
+      is = pulsesAtOnce;
       s = SHL16(is, yshift);
 
       /* Updating the sums of the new pulse(s) */
@@ -216,7 +219,7 @@
          celt_word16_t Rxy, Ryy, Ryp;
          celt_word16_t num;
          /* Select sign based on X[j] alone */
-         s = MULT16_16(signx[j],magnitude);
+         s = magnitude;
          /* Temporary sums of the new pulse(s) */
          Rxy = ROUND16(MAC16_16(xy, s,X[j]), 14);
          /* We're multiplying y[j] by two so we don't have to do it here */
@@ -242,8 +245,15 @@
             best_id = j;
          }
       } while (++j<N);
-      iy[best_id] += signx[best_id];
+      iy[best_id] += 1;
    }
+   j=0;
+   do {
+      P[j] = MULT16_16(signx[j],P[j]);
+      X[j] = MULT16_16(signx[j],X[j]);
+      if (signx[j] < 0)
+         iy[j] = -iy[j];
+   } while (++j<N);
    encode_pulses(iy, N, K, enc);
    
    /* Recompute the gain in one pass to reduce the encoder-decoder mismatch
--- a/libcelt/vq.h
+++ b/libcelt/vq.h
@@ -50,7 +50,7 @@
  * @param p Pitch vector (it is assumed that p+x is a unit vector)
  * @param enc Entropy encoder state
 */
-void alg_quant(celt_norm_t *X, celt_mask_t *W, int N, int K, const celt_norm_t *P, ec_enc *enc);
+void alg_quant(celt_norm_t *X, celt_mask_t *W, int N, int K, celt_norm_t *P, ec_enc *enc);
 
 /** Algebraic pulse decoder
  * @param x Decoded normalised spectrum (returned)