Error measurement for stereo as well
authorJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Thu, 29 Jul 2010 16:32:54 +0000 (18:32 +0200)
committerJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Thu, 29 Jul 2010 16:32:54 +0000 (18:32 +0200)
libcelt/bands.c
libcelt/bands.h
libcelt/celt.c

index 0243ceb..bbc5701 100644 (file)
@@ -450,7 +450,7 @@ void dump_norm_mse(void)
    printf ("\n");
 }
 
-void measure_norm_mse(const CELTMode *m, float *X, float *X0, float *bandE, float *bandE0, int M)
+void measure_norm_mse(const CELTMode *m, float *X, float *X0, float *bandE, float *bandE0, int M, int N, int C)
 {
    static int init = 0;
    int i;
@@ -462,12 +462,17 @@ void measure_norm_mse(const CELTMode *m, float *X, float *X0, float *bandE, floa
    for (i=0;i<m->nbEBands;i++)
    {
       int j;
-      float g = bandE[i]/(1e-15+bandE0[i]);
-      if (bandE0[i]<1)
+      int c;
+      float g;
+      if (bandE0[i]<1 || (C==2 && bandE0[i+m->nbEBands]<1))
          continue;
-      for (j=M*m->eBands[i];j<M*m->eBands[i+1];j++)
-         MSE[i] += (g*X[j]-X0[j])*(g*X[j]-X0[j]);
-      MSECount[i]++;
+      for (c=0;c<C;c++)
+      {
+         g = bandE[i+c*m->nbEBands]/(1e-15+bandE0[i+c*m->nbEBands]);
+         for (j=M*m->eBands[i];j<M*m->eBands[i+1];j++)
+            MSE[i] += (g*X[j+c*N]-X0[j+c*N])*(g*X[j+c*N]-X0[j+c*N]);
+      }
+      MSECount[i]+=C;
    }
    nbMSEBands = m->nbEBands;
 }
index 8d9317d..e2b762f 100644 (file)
@@ -79,6 +79,10 @@ void apply_pitch(const CELTMode *m, celt_sig *X, const celt_sig *P, int gain_id,
 
 int folding_decision(const CELTMode *m, celt_norm *X, celt_word16 *average, int *last_decision, int end, int _C, int M);
 
+#ifdef MEASURE_NORM_MSE
+void measure_norm_mse(const CELTMode *m, float *X, float *X0, float *bandE, float *bandE0, int M, int N, int C);
+#endif
+
 /** Quantisation/encoding of the residual spectrum
  * @param m Mode data 
  * @param X Residual (normalised)
index 5d11be4..ad400d8 100644 (file)
@@ -1047,11 +1047,12 @@ int celt_encode_with_ec_float(CELTEncoder * restrict st, const celt_sig * pcm, c
    quant_fine_energy(st->mode, st->start, st->end, bandE, st->oldBandE, error, fine_quant, enc, C);
 
 #ifdef MEASURE_NORM_MSE
-   float X0[1000];
-   float bandE0[30];
-   for (i=0;i<N;i++)
-      X0[i] = X[i];
-   for (i=0;i<st->mode->nbEBands;i++)
+   float X0[3000];
+   float bandE0[60];
+   for (c=0;c<C;c++)
+      for (i=0;i<N;i++)
+         X0[i+c*N] = X[i+c*N];
+   for (i=0;i<C*st->mode->nbEBands;i++)
       bandE0[i] = bandE[i];
 #endif
 
@@ -1061,7 +1062,7 @@ int celt_encode_with_ec_float(CELTEncoder * restrict st, const celt_sig * pcm, c
    quant_energy_finalise(st->mode, st->start, st->end, bandE, st->oldBandE, error, fine_quant, fine_priority, nbCompressedBytes*8-ec_enc_tell(enc, 0), enc, C);
 
 #ifdef MEASURE_NORM_MSE
-   measure_norm_mse(st->mode, X, X0, bandE, bandE0, M);
+   measure_norm_mse(st->mode, X, X0, bandE, bandE0, M, N, C);
 #endif
 
    /* Re-synthesis of the coded audio if required */