Tuning the folding gain to be higher when there's only one pulse and lower
authorJean-Marc Valin <jean-marc.valin@octasic.com>
Fri, 3 Jul 2009 19:09:07 +0000 (15:09 -0400)
committerJean-Marc Valin <jean-marc.valin@octasic.com>
Fri, 3 Jul 2009 19:09:07 +0000 (15:09 -0400)
when there are many pulses.

doc/ietf/draft-valin-celt-codec.xml
libcelt/vq.c

index 1b0f60f..99e27f5 100644 (file)
@@ -684,11 +684,7 @@ both on the width of the band, N and the number of pulses allocated, K:
 </t>
 
 <t>
 </t>
 
 <t>
-g = N / (N + kf * K),
-</t>
-
-<t>
-where kf = 6. 
+g = N / (N + 2*K*(K+1)),
 </t>
 
 <t>
 </t>
 
 <t>
index 488fbcd..3f71395 100644 (file)
@@ -360,6 +360,16 @@ static void fold(const CELTMode *m, int N, celt_norm_t *Y, celt_norm_t * restric
    /* Here, we assume that id will never be greater than N0, i.e. that 
       no band is wider than N0. In the unlikely case it happens, we set
       everything to zero */
    /* Here, we assume that id will never be greater than N0, i.e. that 
       no band is wider than N0. In the unlikely case it happens, we set
       everything to zero */
+   /*{
+          int offset = (N0*C - (id+C*N))/2;
+          if (offset > C*N0/16)
+                  offset = C*N0/16;
+          offset -= offset % (C*B);
+          if (offset < 0)
+                  offset = 0;
+          //printf ("%d\n", offset);
+          id += offset;
+   }*/
    if (id+C*N>N0*C)
       for (j=0;j<C*N;j++)
          P[j] = 0;
    if (id+C*N>N0*C)
       for (j=0;j<C*N;j++)
          P[j] = 0;
@@ -368,8 +378,6 @@ static void fold(const CELTMode *m, int N, celt_norm_t *Y, celt_norm_t * restric
          P[j] = Y[id++];
 }
 
          P[j] = Y[id++];
 }
 
-#define KGAIN 6
-
 void intra_fold(const CELTMode *m, celt_norm_t * restrict x, int N, int K, celt_norm_t *Y, celt_norm_t * restrict P, int N0, int B)
 {
    celt_word16_t pred_gain;
 void intra_fold(const CELTMode *m, celt_norm_t * restrict x, int N, int K, celt_norm_t *Y, celt_norm_t * restrict P, int N0, int B)
 {
    celt_word16_t pred_gain;
@@ -378,7 +386,7 @@ void intra_fold(const CELTMode *m, celt_norm_t * restrict x, int N, int K, celt_
    if (K==0)
       pred_gain = Q15ONE;
    else
    if (K==0)
       pred_gain = Q15ONE;
    else
-      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+2*K*(K+1)));
 
    fold(m, N, Y, P, N0, B);
    renormalise_vector(P, pred_gain, C*N, 1);
 
    fold(m, N, Y, P, N0, B);
    renormalise_vector(P, pred_gain, C*N, 1);