Simplified the folding normalisation by creating renormalise_vector().
authorJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Mon, 21 Jul 2008 03:14:31 +0000 (23:14 -0400)
committerJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Mon, 21 Jul 2008 03:14:31 +0000 (23:14 -0400)
configure.ac
libcelt/celt.c
libcelt/match-test.sh
libcelt/vq.c

index e2387fd..2ca8ba3 100644 (file)
@@ -5,8 +5,8 @@ AC_INIT(libcelt/arch.h)
 AM_CONFIG_HEADER([config.h])
 
 CELT_MAJOR_VERSION=0
 AM_CONFIG_HEADER([config.h])
 
 CELT_MAJOR_VERSION=0
-CELT_MINOR_VERSION=3
-CELT_MICRO_VERSION=2
+CELT_MINOR_VERSION=4
+CELT_MICRO_VERSION=0
 CELT_EXTRA_VERSION=
 CELT_VERSION=$CELT_MAJOR_VERSION.$CELT_MINOR_VERSION.$CELT_MICRO_VERSION$CELT_EXTRA_VERSION
 
 CELT_EXTRA_VERSION=
 CELT_VERSION=$CELT_MAJOR_VERSION.$CELT_MINOR_VERSION.$CELT_MICRO_VERSION$CELT_EXTRA_VERSION
 
index b320242..175922c 100644 (file)
@@ -565,8 +565,8 @@ int celt_encode(CELTEncoder * restrict st, celt_int16_t * restrict pcm, unsigned
       }
    }
 #endif
       }
    }
 #endif
-   if (ec_enc_tell(&st->enc, 0) < nbCompressedBytes*8 - 7)
-      celt_warning_int ("many unused bits: ", nbCompressedBytes*8-ec_enc_tell(&st->enc, 0));
+   /*if (ec_enc_tell(&st->enc, 0) < nbCompressedBytes*8 - 7)
+      celt_warning_int ("many unused bits: ", nbCompressedBytes*8-ec_enc_tell(&st->enc, 0));*/
    /*printf ("%d\n", ec_enc_tell(&st->enc, 0)-8*nbCompressedBytes);*/
    /* Finishing the stream with a 0101... pattern so that the decoder can check is everything's right */
    {
    /*printf ("%d\n", ec_enc_tell(&st->enc, 0)-8*nbCompressedBytes);*/
    /* Finishing the stream with a 0101... pattern so that the decoder can check is everything's right */
    {
index d2f18a7..f1714b2 100755 (executable)
@@ -9,7 +9,7 @@ outfile=/dev/null
 
 if [ -f mono_test_file.sw ]; then
    echo -n "mono test... "
 
 if [ -f mono_test_file.sw ]; then
    echo -n "mono test... "
-   ./testcelt 44100 1 256 128 32 mono_test_file.sw $outfile
+   ./testcelt 44100 1 256 32 mono_test_file.sw $outfile
    if [ $? != 0 ]; then
       exit 1
    fi
    if [ $? != 0 ]; then
       exit 1
    fi
@@ -19,7 +19,7 @@ fi
 
 if [ -f stereo_test_file.sw ]; then
    echo -n "stereo test... "
 
 if [ -f stereo_test_file.sw ]; then
    echo -n "stereo test... "
-   ./testcelt 44100 2 256 128 92 stereo_test_file.sw $outfile
+   ./testcelt 44100 2 256 92 stereo_test_file.sw $outfile
    if [ $? != 0 ]; then
       exit 1
    fi
    if [ $? != 0 ]; then
       exit 1
    fi
index 6556a63..3e1538c 100644 (file)
@@ -259,21 +259,36 @@ void alg_unquant(celt_norm_t *X, int N, int K, celt_norm_t *P, ec_dec *dec)
    RESTORE_STACK;
 }
 
    RESTORE_STACK;
 }
 
-static celt_word32_t fold(const CELTMode *m, int N, celt_norm_t *Y, celt_norm_t * restrict P, int N0, int B)
+void renormalise_vector(celt_norm_t *X, celt_word16_t value, int N, int stride)
+{
+   int i;
+   celt_word32_t E = EPSILON;
+   celt_word16_t g;
+   celt_norm_t *xptr = X;
+   for (i=0;i<N;i++)
+   {
+      E = MAC16_16(E, *xptr, *xptr);
+      xptr += stride;
+   }
+
+   g = MULT16_16_Q15(value,celt_rcp(SHL32(celt_sqrt(E),9)));
+   xptr = X;
+   for (i=0;i<N;i++)
+   {
+      *xptr = PSHR32(MULT16_16(g, *xptr),8);
+      xptr += stride;
+   }
+}
+
+static void fold(const CELTMode *m, int N, celt_norm_t *Y, celt_norm_t * restrict P, int N0, int B)
 {
    int j;
 {
    int j;
-   celt_word32_t E;
    const int C = CHANNELS(m);
    int id = N0 % (C*B);
    /* Here, we assume that id will never be greater than N0, i.e. that 
       no band is wider than N0. */
    const int C = CHANNELS(m);
    int id = N0 % (C*B);
    /* Here, we assume that id will never be greater than N0, i.e. that 
       no band is wider than N0. */
-   E = EPSILON;
    for (j=0;j<C*N;j++)
    for (j=0;j<C*N;j++)
-   {
       P[j] = Y[id++];
       P[j] = Y[id++];
-      E = MAC16_16(E, P[j],P[j]);
-   }
-   return E;
 }
 
 #define KGAIN 6
 }
 
 #define KGAIN 6
@@ -283,15 +298,14 @@ void intra_prediction(const CELTMode *m, celt_norm_t * restrict x, celt_mask_t *
    int j;
    celt_word16_t s = 1;
    int sign;
    int j;
    celt_word16_t s = 1;
    int sign;
-   celt_word32_t E;
    celt_word16_t pred_gain;
    celt_word32_t xy=0;
    const int C = CHANNELS(m);
    celt_word16_t pred_gain;
    celt_word32_t xy=0;
    const int C = CHANNELS(m);
-   
+
    pred_gain = celt_div((celt_word32_t)MULT16_16(Q15_ONE,N),(celt_word32_t)(N+KGAIN*K));
    pred_gain = celt_div((celt_word32_t)MULT16_16(Q15_ONE,N),(celt_word32_t)(N+KGAIN*K));
-   
-   E = fold(m, N, Y, P, N0, B);
-   
+
+   fold(m, N, Y, P, N0, B);
+
    for (j=0;j<C*N;j++)
       xy = MAC16_16(xy, P[j], x[j]);
    if (xy<0)
    for (j=0;j<C*N;j++)
       xy = MAC16_16(xy, P[j], x[j]);
    if (xy<0)
@@ -304,17 +318,12 @@ void intra_prediction(const CELTMode *m, celt_norm_t * restrict x, celt_mask_t *
    }
    ec_enc_bits(enc,sign,1);
 
    }
    ec_enc_bits(enc,sign,1);
 
-   /*pred_gain = pred_gain/sqrt(E);*/
-   pred_gain = s*MULT16_16_Q15(pred_gain,celt_rcp(SHL32(celt_sqrt(E),9)));
-   for (j=0;j<C*N;j++)
-      P[j] = PSHR32(MULT16_16(pred_gain, P[j]),8);
+   renormalise_vector(P, s*pred_gain, C*N, 1);
 }
 
 void intra_unquant(const CELTMode *m, celt_norm_t *x, int N, int K, celt_norm_t *Y, celt_norm_t * restrict P, int N0, int B, ec_dec *dec)
 {
 }
 
 void intra_unquant(const CELTMode *m, celt_norm_t *x, int N, int K, celt_norm_t *Y, celt_norm_t * restrict P, int N0, int B, ec_dec *dec)
 {
-   int j;
    celt_word16_t s;
    celt_word16_t s;
-   celt_word32_t E;
    celt_word16_t pred_gain;
    const int C = CHANNELS(m);
       
    celt_word16_t pred_gain;
    const int C = CHANNELS(m);
       
@@ -325,25 +334,17 @@ void intra_unquant(const CELTMode *m, celt_norm_t *x, int N, int K, celt_norm_t
    
    pred_gain = celt_div((celt_word32_t)MULT16_16(Q15_ONE,N),(celt_word32_t)(N+KGAIN*K));
    
    
    pred_gain = celt_div((celt_word32_t)MULT16_16(Q15_ONE,N),(celt_word32_t)(N+KGAIN*K));
    
-   E = fold(m, N, Y, P, N0, B);
+   fold(m, N, Y, P, N0, B);
    
    
-   /*pred_gain = pred_gain/sqrt(E);*/
-   pred_gain = s*MULT16_16_Q15(pred_gain,celt_rcp(SHL32(celt_sqrt(E),9)));
-   for (j=0;j<C*N;j++)
-      P[j] = PSHR32(MULT16_16(pred_gain, P[j]),8);
+   renormalise_vector(P, s*pred_gain, C*N, 1);
 }
 
 void intra_fold(const CELTMode *m, celt_norm_t *x, int N, celt_norm_t *Y, celt_norm_t * restrict P, int N0, int B)
 {
 }
 
 void intra_fold(const CELTMode *m, celt_norm_t *x, int N, celt_norm_t *Y, celt_norm_t * restrict P, int N0, int B)
 {
-   int j;
-   celt_word32_t E;
-   celt_word16_t g;
    const int C = CHANNELS(m);
 
    const int C = CHANNELS(m);
 
-   E = fold(m, N, Y, P, N0, B);
+   fold(m, N, Y, P, N0, B);
    
    
-   g = celt_rcp(SHL32(celt_sqrt(E),9));
-   for (j=0;j<C*N;j++)
-      P[j] = PSHR32(MULT16_16(g, P[j]),8);
+   renormalise_vector(P, Q15ONE, C*N, 1);
 }
 
 }