diff --git a/libcelt/rate.c b/libcelt/rate.c
index c7d3a2a323f4e1a443d49d0b416071951eac42b6..62470bda4c1064d2377abd160d3ffc08fc4e237a 100644
--- a/libcelt/rate.c
+++ b/libcelt/rate.c
@@ -154,13 +154,22 @@ static inline void interp_bits2pulses(const CELTMode *m, int start, int end, int
    }
    for (j=start;j<end;j++)
    {
-      int N, d;
+      int N0, N, d;
       int offset;
-
-      N=M*(m->eBands[j+1]-m->eBands[j]);
+      int fine_offset;
+      N0 = m->eBands[j+1]-m->eBands[j];
+      N=M*N0;
       /* Compensate for the extra DoF in stereo */
-      d=(C*N+ ((C==2 && N>2) ? 1 : 0))<<BITRES; 
-      offset = FINE_OFFSET - ((m->logN[j] + logM)>>1);
+      d=(C*N+ ((C==2 && N>2) ? 1 : 0))<<BITRES;
+
+      if (N0==1)
+         fine_offset = 19;
+      else if (N0<=4)
+         fine_offset = 14;
+      else
+         fine_offset = 12;
+
+      offset = fine_offset - ((m->logN[j] + logM)>>1);
       /* Offset for the number of fine bits compared to their "fair share" of total/N */
       offset = bits[j]-offset*N*C;
       /* Compensate for the prediction gain in stereo */
diff --git a/libcelt/rate.h b/libcelt/rate.h
index 7312609599f15e7e256ac8bc73fea51533e7fcb7..6466f75f48d2de723653d60d7f47e9e3dfebb0fc 100644
--- a/libcelt/rate.h
+++ b/libcelt/rate.h
@@ -40,7 +40,6 @@
 #define LOG_MAX_PULSES 7
 
 #define BITRES 3
-#define FINE_OFFSET 14
 #define QTHETA_OFFSET 6
 #define QTHETA_OFFSET_STEREO 4