experimental code for choosing whether to apply folding for the high bands
authorJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Thu, 6 Nov 2008 02:54:37 +0000 (21:54 -0500)
committerJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Thu, 6 Nov 2008 02:54:37 +0000 (21:54 -0500)
libcelt/bands.c
libcelt/bands.h
libcelt/celt.c

index d2e682f..37148a4 100644 (file)
@@ -128,6 +128,28 @@ void compute_band_energies(const CELTMode *m, const celt_sig_t *X, celt_ener_t *
    /*printf ("\n");*/
 }
 
+#ifdef EXP_PSY
+void compute_noise_energies(const CELTMode *m, const celt_sig_t *X, const celt_word16_t *tonality, celt_ener_t *bank)
+{
+   int i, c;
+   const celt_int16_t *eBands = m->eBands;
+   const int C = CHANNELS(m);
+   for (c=0;c<C;c++)
+   {
+      for (i=0;i<m->nbEBands;i++)
+      {
+         int j;
+         celt_word32_t sum = 1e-10;
+         for (j=eBands[i];j<eBands[i+1];j++)
+            sum += X[j*C+c]*X[j*C+c]*tonality[j];
+         bank[i*C+c] = sqrt(sum);
+         /*printf ("%f ", bank[i*C+c]);*/
+      }
+   }
+   /*printf ("\n");*/
+}
+#endif
+
 /* Normalise each band such that the energy is one. */
 void normalise_bands(const CELTMode *m, const celt_sig_t * restrict freq, celt_norm_t * restrict X, const celt_ener_t *bank)
 {
index cc9d546..12a3037 100644 (file)
@@ -50,6 +50,8 @@ void exp_rotation(celt_norm_t *X, int len, int dir, int stride, int iter);
  */
 void compute_band_energies(const CELTMode *m, const celt_sig_t *X, celt_ener_t *bands);
 
+void compute_noise_energies(const CELTMode *m, const celt_sig_t *X, const celt_word16_t *tonality, celt_ener_t *bank);
+
 /** Normalise each band of X such that the energy in each band is 
     equal to 1
  * @param m Mode data 
index bda30a7..2bdb7a7 100644 (file)
@@ -374,6 +374,7 @@ int celt_encode_float(CELTEncoder * restrict st, const celt_sig_t * pcm, celt_si
    int has_pitch;
    int pitch_index;
    int bits;
+   int has_fold;
    ec_byte_buffer buf;
    ec_enc         enc;
    celt_word32_t curr_power, pitch_power=0;
@@ -391,6 +392,8 @@ int celt_encode_float(CELTEncoder * restrict st, const celt_sig_t * pcm, celt_si
 #ifdef EXP_PSY
    VARDECL(celt_word32_t, mask);
    VARDECL(celt_word32_t, tonality);
+   VARDECL(celt_word32_t, bandM);
+   VARDECL(celt_ener_t, bandN);
 #endif
    int shortBlocks=0;
    int transient_time;
@@ -529,8 +532,22 @@ int celt_encode_float(CELTEncoder * restrict st, const celt_sig_t * pcm, celt_si
    /* Band normalisation */
    compute_band_energies(st->mode, freq, bandE);
 #ifdef EXP_PSY
-   VARDECL(celt_word32_t, bandM);
+   ALLOC(bandN,C*st->mode->nbEBands, celt_ener_t);
    ALLOC(bandM,st->mode->nbEBands, celt_ener_t);
+   compute_noise_energies(st->mode, freq, tonality, bandN);
+
+   /*for (i=0;i<st->mode->nbEBands;i++)
+      printf ("%f ", (.1+bandN[i])/(.1+bandE[i]));
+   printf ("\n");*/
+   has_fold = 0;
+   for (i=st->mode->nbPBands;i<st->mode->nbEBands;i++)
+      if (bandN[i] < .4*bandE[i])
+         has_fold++;
+   /*printf ("%d\n", has_fold);*/
+   if (has_fold>=2)
+      has_fold = 1;
+   else
+      has_fold = 0;
    for (i=0;i<N;i++)
       mask[i] = sqrt(mask[i]);
    compute_band_energies(st->mode, mask, bandM);