Doing intra-frame prediction backwards (and a few comments)
authorJean-Marc Valin <Jean-Marc.Valin@csiro.au>
Thu, 21 Feb 2008 01:16:57 +0000 (12:16 +1100)
committerJean-Marc Valin <Jean-Marc.Valin@csiro.au>
Thu, 21 Feb 2008 01:16:57 +0000 (12:16 +1100)
libcelt/bands.c
libcelt/celt.c
libcelt/vq.c

index cad1cc9..edc2f3f 100644 (file)
@@ -39,7 +39,7 @@
 #include "vq.h"
 #include "cwrs.h"
 
-/* Applies a series of rotations so that pulses are spread like a two-sided
+/** Applies a series of rotations so that pulses are spread like a two-sided
 exponential. The effect of this is to reduce the tonal noise created by the
 sparse spectrum resulting from the pulse codebook */
 static void exp_rotation(float *X, int len, float theta, int dir, int stride, int iter)
index 2a29337..f9c42c4 100644 (file)
@@ -154,7 +154,7 @@ void celt_encoder_destroy(CELTEncoder *st)
    celt_free(st);
 }
 
-
+/** Apply window and compute the MDCT for all sub-frames and all channels in a frame */
 static float compute_mdcts(mdct_lookup *mdct_lookup, float *window, float *in, float *out, int N, int B, int C)
 {
    int i, c;
@@ -182,6 +182,7 @@ static float compute_mdcts(mdct_lookup *mdct_lookup, float *window, float *in, f
    return E;
 }
 
+/** Compute the IMDCT and apply window for all sub-frames and all channels in a frame */
 static void compute_inv_mdcts(mdct_lookup *mdct_lookup, float *window, float *X, float *out_mem, float *mdct_overlap, int N, int overlap, int B, int C)
 {
    int i, c, N4;
@@ -506,6 +507,8 @@ void celt_decoder_destroy(CELTDecoder *st)
    celt_free(st);
 }
 
+/** Handles lost packets by just copying past data with the same offset as the last
+    pitch period */
 static void celt_decode_lost(CELTDecoder *st, short *pcm)
 {
    int i, c, N, B, C;
index 8557d76..8d284f8 100644 (file)
@@ -367,8 +367,8 @@ void intra_prediction(float *x, float *W, int N, int K, float *Y, float *P, int
       float score;
       for (j=0;j<N;j++)
       {
-         xy += x[j]*Y[i+j];
-         yy += Y[i+j]*Y[i+j];
+         xy += x[j]*Y[i+N-j-1];
+         yy += Y[i+N-j-1]*Y[i+N-j-1];
       }
       score = xy*xy/(.001+yy);
       if (score > best_score)
@@ -397,7 +397,7 @@ void intra_prediction(float *x, float *W, int N, int K, float *Y, float *P, int
    E = 1e-10;
    for (j=0;j<N;j++)
    {
-      P[j] = s*Y[best+j];
+      P[j] = s*Y[best+N-j-1];
       E += P[j]*P[j];
    }
    E = pred_gain/sqrt(E);
@@ -444,7 +444,7 @@ void intra_unquant(float *x, int N, int K, float *Y, float *P, int B, int N0, ec
    E = 1e-10;
    for (j=0;j<N;j++)
    {
-      P[j] = s*Y[best+j];
+      P[j] = s*Y[best+N-j-1];
       E += P[j]*P[j];
    }
    E = pred_gain/sqrt(E);