diff --git a/libcelt/modes.c b/libcelt/modes.c
index c205db4ff4549bce21119bdba2a13dbf0641042d..ff88f582932af94a755853572017cd8fdf9433f7 100644
--- a/libcelt/modes.c
+++ b/libcelt/modes.c
@@ -206,8 +206,9 @@ static void compute_allocation_table(CELTMode *mode, int res)
       {
          int edge, low, high;
          celt_int32 alloc;
-
-         alloc = mode->shortMdctSize*band_allocation[i*BARK_BANDS+j];
+         /* This compensates for the sampling rate. The 46000 here reflects the fact that we
+            originally tuned using both 44.1 and 48 kHz. */
+         alloc = ((celt_int32)46000*mode->shortMdctSize/mode->Fs)*band_allocation[i*BARK_BANDS+j];
          low = bark_freq[j];
          high = bark_freq[j+1];
 
@@ -216,6 +217,7 @@ static void compute_allocation_table(CELTMode *mode, int res)
          {
             celt_int32 num;
             int den, bits;
+            int N = (mode->eBands[eband+1]-mode->eBands[eband]);
             num = alloc * (edge-low);
             den = high-low;
             /* Divide with rounding */
@@ -225,6 +227,7 @@ static void compute_allocation_table(CELTMode *mode, int res)
             allocVectors[i*mode->nbEBands+eband] -= 1<<BITRES;
             if (allocVectors[i*mode->nbEBands+eband]<0)
                allocVectors[i*mode->nbEBands+eband]=0;
+            allocVectors[i*mode->nbEBands+eband] = (2*allocVectors[i*mode->nbEBands+eband]+N)/(2*N);
             /* Remove the part of the band we just allocated */
             low = edge;
             alloc -= bits;
@@ -238,13 +241,23 @@ static void compute_allocation_table(CELTMode *mode, int res)
       }
       if (eband < mode->nbEBands)
       {
+         int N = (mode->eBands[eband+1]-mode->eBands[eband]);
          allocVectors[i*mode->nbEBands+eband] = (current+128)>>(8-BITRES);
          /* Same hack as above FIXME: again */
          allocVectors[i*mode->nbEBands+eband] -= 1<<BITRES;
          if (allocVectors[i*mode->nbEBands+eband]<0)
             allocVectors[i*mode->nbEBands+eband]=0;
+         allocVectors[i*mode->nbEBands+eband] = (2*allocVectors[i*mode->nbEBands+eband]+N)/(2*N);
       }
    }
+   /*for (i=0;i<BITALLOC_SIZE;i++)
+   {
+      for (j=0;j<mode->nbEBands;j++)
+         printf ("%d ", allocVectors[i*mode->nbEBands+j]);
+      printf ("\n");
+   }
+   exit(0);*/
+
    mode->allocVectors = allocVectors;
 }
 
diff --git a/libcelt/rate.c b/libcelt/rate.c
index 9456b23727c7d71a86edee7a4d0b2f6bd8ddda24..a2b9549bacd4ab9b77929c1188c49181ad215d40 100644
--- a/libcelt/rate.c
+++ b/libcelt/rate.c
@@ -207,7 +207,8 @@ void compute_allocation(const CELTMode *m, int start, int *offsets, int total, i
       int mid = (lo+hi) >> 1;
       for (j=start;j<len;j++)
       {
-         bits1[j] = (C*M*m->allocVectors[mid*len+j] + offsets[j]);
+         int N = m->eBands[j+1]-m->eBands[j];
+         bits1[j] = (C*M*N*m->allocVectors[mid*len+j] + offsets[j]);
          if (bits1[j] < 0)
             bits1[j] = 0;
          psum += bits1[j];
@@ -223,8 +224,9 @@ void compute_allocation(const CELTMode *m, int start, int *offsets, int total, i
    /*printf ("interp between %d and %d\n", lo, hi);*/
    for (j=start;j<len;j++)
    {
-      bits1[j] = C*M*m->allocVectors[lo*len+j] + offsets[j];
-      bits2[j] = C*M*m->allocVectors[hi*len+j] + offsets[j];
+      int N = m->eBands[j+1]-m->eBands[j];
+      bits1[j] = C*M*N*m->allocVectors[lo*len+j] + offsets[j];
+      bits2[j] = C*M*N*m->allocVectors[hi*len+j] + offsets[j];
       if (bits1[j] < 0)
          bits1[j] = 0;
       if (bits2[j] < 0)