shithub: opus

Download patch

ref: 9838fecf9f936cea7892b057d6f8976b63b135f6
parent: 4991a568ffaaa24393898b770b05891f1b09d83d
author: Jean-Marc Valin <[email protected]>
date: Mon Feb 18 09:45:11 EST 2008

Can now generate the entire mode struct

--- a/libcelt/modes.c
+++ b/libcelt/modes.c
@@ -179,7 +179,21 @@
    
 const celt_int16_t pitch_freq[PBANDS+1] ={0, 345, 689, 1034, 1378, 2067, 3273, 5340, 6374};
 
+#define BITALLOC_SIZE 10
+int band_allocation[BARK_BANDS*BITALLOC_SIZE] = 
+   {  2,  2,  1,  1,  2,  2,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+      2,  2,  2,  1,  2,  2,  2,  2,  2,  1,  2,  2,  3,  3,  3,  3,  3,  3,  3,  0,  0,  0,  0,  0,  0,
+      2,  2,  2,  2,  3,  2,  2,  2,  2,  2,  3,  2,  4,  4,  4,  4,  4,  4,  4,  4,  0,  0,  0,  0,  0,
+      3,  2,  2,  2,  3,  3,  2,  3,  2,  2,  4,  3,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,  0,
+      3,  3,  2,  2,  3,  3,  3,  3,  3,  2,  4,  4,  7,  7,  5,  5,  5,  5,  5,  5,  5,  5,  5,  0,  0,
+      3,  3,  2,  2,  3,  3,  3,  3,  3,  3,  4,  4,  8,  8,  8,  8,  8,  8,  9, 10, 11, 10, 10,  5,  5,
+      4,  4,  4,  4,  5,  5,  5,  5,  5,  4,  7,  7, 14, 13, 13, 13, 13, 13, 15, 16, 17, 18, 20, 18, 11,
+      7,  7,  6,  6,  9,  8,  8,  8,  8,  8, 11, 11, 20, 18, 19, 19, 25, 22, 25, 30, 30, 35, 35, 35, 35,
+      8,  8,  8,  8, 10, 10, 10, 10,  9,  9, 19, 18, 25, 24, 23, 21, 29, 27, 35, 40, 42, 50, 59, 54, 51,
+     11, 11, 10, 10, 14, 13, 13, 13, 13, 12, 19, 18, 35, 34, 33, 31, 39, 37, 45, 50, 52, 60, 60, 60, 60,
+   };
 
+
 static int *compute_ebands(int Fs, int frame_size, int *nbEBands)
 {
    int *eBands;
@@ -240,7 +254,7 @@
       for (j=0;j<mode->nbEBands;j++)
          if (mode->eBands[j] <= pBands[i] && mode->eBands[j+1] > pBands[i])
             break;
-      printf ("%d %d\n", i, j);
+      //printf ("%d %d\n", i, j);
       if (mode->eBands[j] != pBands[i])
       {
          if (pBands[i]-mode->eBands[j] < mode->eBands[j+1]-pBands[i] && 
@@ -257,6 +271,44 @@
    mode->pitchEnd = pBands[PBANDS];
 }
 
+static void compute_allocation_table(CELTMode *mode, int res)
+{
+   int i, j, eband;
+   int *allocVectors;
+   
+   mode->nbAllocVectors = BITALLOC_SIZE;
+   allocVectors = celt_alloc(sizeof(int)*(BITALLOC_SIZE*mode->nbEBands));
+   for (i=0;i<BITALLOC_SIZE;i++)
+   {
+      eband = 0;
+      for (j=0;j<BARK_BANDS;j++)
+      {
+         int edge, low;
+         edge = mode->eBands[eband+1]*res;
+         if (edge < bark_freq[j+1])
+         {
+            int num, den;
+            num = band_allocation[i*BARK_BANDS+j] * (edge-bark_freq[j]);
+            den = bark_freq[j+1]-bark_freq[j];
+            //low = band_allocation[i*BARK_BANDS+j] * (edge-bark_freq[j])/(bark_freq[j+1]-bark_freq[j]);
+            low = (num+den/2)/den;
+            allocVectors[i*mode->nbEBands+eband] += low;
+            eband++;
+            allocVectors[i*mode->nbEBands+eband] += band_allocation[i*BARK_BANDS+j]-low;
+         } else {
+            allocVectors[i*mode->nbEBands+eband] += band_allocation[i*BARK_BANDS+j];
+         }
+      }
+   }
+   for (i=0;i<BITALLOC_SIZE;i++)
+   {
+      for (j=0;j<mode->nbEBands;j++)
+         printf ("%2d ", allocVectors[i*mode->nbEBands+j]);
+      printf ("\n");
+   }
+   mode->allocVectors = allocVectors;
+}
+
 CELTMode *celt_mode_create(int Fs, int channels, int frame_size, int overlap)
 {
    int res;
@@ -273,6 +325,7 @@
    compute_pbands(mode, res);
    mode->ePredCoef = .8;
    
+   compute_allocation_table(mode, res);
    
    printf ("%d bands\n", mode->nbEBands);
    return mode;