Fixed codebook entirely quantised
authorJean-Marc Valin <Jean-Marc.Valin@csiro.au>
Thu, 6 Dec 2007 06:44:09 +0000 (17:44 +1100)
committerJean-Marc Valin <Jean-Marc.Valin@csiro.au>
Thu, 6 Dec 2007 06:44:09 +0000 (17:44 +1100)
libcelt/bands.c
libcelt/vq.c
libcelt/vq.h

index c06efce..a6ddc01 100644 (file)
@@ -160,17 +160,16 @@ void quant_bands(const CELTMode *m, float *X, float *P, ec_enc *enc)
       q = m->nbPulses[i];
       if (q>0) {
          float n = sqrt(B*(eBands[i+1]-eBands[i]));
-         id = alg_quant2(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), q, P+B*eBands[i]);
-         ec_enc_uint(enc,id,ncwrs(B*(eBands[i+1]-eBands[i]), q));
+         alg_quant2(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), q, P+B*eBands[i], enc);
          for (j=B*eBands[i];j<B*eBands[i+1];j++)
             norm[j] = X[j] * n;
          //bits += log2(ncwrs(B*(eBands[i+1]-eBands[i]), q));
       } else {
          float n = sqrt(B*(eBands[i+1]-eBands[i]));
-         copy_quant(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), -q, norm, B, eBands[i]);
+         copy_quant(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), -q, norm, B, eBands[i], enc);
          for (j=B*eBands[i];j<B*eBands[i+1];j++)
             norm[j] = X[j] * n;
-         //bits += 1+log2(eBands[i])+log2(ncwrs(B*(eBands[i+1]-eBands[i]), -q));
+         //bits += 1+log2(eBands[i]-(eBands[i+1]-eBands[i]))+log2(ncwrs(B*(eBands[i+1]-eBands[i]), -q));
       }
    }
    //printf ("%f\n", bits);
index 9b3d66d..18e2df9 100644 (file)
@@ -32,6 +32,7 @@
 #include <math.h>
 #include <stdlib.h>
 #include "cwrs.h"
+#include "vq.h"
 
 /* Algebraic pulse-base quantiser. The signal x is replaced by the sum of the pitch 
    a combination of pulses such that its norm is still equal to 1 */
@@ -95,7 +96,7 @@ void alg_quant(float *x, int N, int K, float *p)
 /* Improved algebraic pulse-base quantiser. The signal x is replaced by the sum of the pitch 
    a combination of pulses such that its norm is still equal to 1. The only difference with 
    the quantiser above is that the search is more complete. */
-int alg_quant2(float *x, int N, int K, float *p)
+void alg_quant2(float *x, int N, int K, float *p, ec_enc *enc)
 {
    int L = 5;
    //float tata[200];
@@ -240,7 +241,7 @@ int alg_quant2(float *x, int N, int K, float *p)
    int comb[K];
    int signs[K];
    pulse2comb(N, K, comb, signs, iy[0]); 
-   return icwrs(N, K, comb, signs);
+   ec_enc_uint(enc,icwrs(N, K, comb, signs),ncwrs(N, K));
 }
 
 /* Just replace the band with noise of unit energy */
@@ -263,7 +264,7 @@ void noise_quant(float *x, int N, int K, float *p)
 static const float pg[5] = {1.f, .82f, .75f, 0.7f, 0.6f};
 
 /* Finds the right offset into Y and copy it */
-void copy_quant(float *x, int N, int K, float *Y, int B, int N0)
+void copy_quant(float *x, int N, int K, float *Y, int B, int N0, ec_enc *enc)
 {
    int i,j;
    int best=0;
@@ -291,6 +292,7 @@ void copy_quant(float *x, int N, int K, float *Y, int B, int N0)
             s = -1;
       }
    }
+   ec_enc_uint(enc,best/B,N0-N/B);
    //printf ("%d %f\n", best, best_score);
    if (K==0)
    {
@@ -319,6 +321,6 @@ void copy_quant(float *x, int N, int K, float *Y, int B, int N0)
       E = .8/sqrt(E);
       for (j=0;j<N;j++)
          P[j] *= E;
-      alg_quant2(x, N, K, P);
+      alg_quant2(x, N, K, P, enc);
    }
 }
index a2257ee..468ca2c 100644 (file)
@@ -32,6 +32,8 @@
 #ifndef VQ_H
 #define VQ_H
 
+#include "entenc.h"
+
 /* Algebraic pulse-base quantiser. The signal x is replaced by the sum of the pitch 
    a combination of pulses such that its norm is still equal to 1 */
 void alg_quant(float *x, int N, int K, float *p);
@@ -39,12 +41,12 @@ void alg_quant(float *x, int N, int K, float *p);
 /* Improved algebraic pulse-base quantiser. The signal x is replaced by the sum of the pitch 
    a combination of pulses such that its norm is still equal to 1. The only difference with 
    the quantiser above is that the search is more complete. */
-int alg_quant2(float *x, int N, int K, float *p);
+void alg_quant2(float *x, int N, int K, float *p, ec_enc *enc);
 
 /* Just replace the band with noise of unit energy */
 void noise_quant(float *x, int N, int K, float *p);
 
 /* Finds the right offset into Y and copy it */
-void copy_quant(float *x, int N, int K, float *Y, int B, int N0);
+void copy_quant(float *x, int N, int K, float *Y, int B, int N0, ec_enc *enc);
 
 #endif /* VQ_H */