diff --git a/libcelt/arch.h b/libcelt/arch.h
index 76ef86f756a437a8da53906be44d28734ef77e13..519b7f89ea1e6dd6b3288c1dc8a4dbadcbdf7e2a 100644
--- a/libcelt/arch.h
+++ b/libcelt/arch.h
@@ -51,7 +51,7 @@
 typedef celt_int16_t celt_word16_t;
 typedef celt_int32_t celt_word32_t;
 
-typedef float celt_sig_t;
+typedef celt_word32_t celt_sig_t;
 typedef float celt_norm_t;
 
 #define Q15ONE 32767
diff --git a/libcelt/bands.c b/libcelt/bands.c
index dc94e3dc4f525f708d703f9d091fb6855e9f63e8..448abf3dde8b7c76ed1b72c4311e9d2304388991 100644
--- a/libcelt/bands.c
+++ b/libcelt/bands.c
@@ -83,7 +83,7 @@ void compute_band_energies(const CELTMode *m, celt_sig_t *X, float *bank)
          int j;
          float sum = 1e-10;
          for (j=B*eBands[i];j<B*eBands[i+1];j++)
-            sum += X[j*C+c]*X[j*C+c];
+            sum += SIG_SCALING_1*SIG_SCALING_1*X[j*C+c]*X[j*C+c];
          bank[i*C+c] = sqrt(C*sum);
          /*printf ("%f ", bank[i*C+c]);*/
       }
@@ -105,7 +105,7 @@ void normalise_bands(const CELTMode *m, celt_sig_t *freq, celt_norm_t *X, float
          int j;
          float g = 1.f/(1e-10+bank[i*C+c]);
          for (j=B*eBands[i];j<B*eBands[i+1];j++)
-            X[j*C+c] = freq[j*C+c]*g;
+            X[j*C+c] = SIG_SCALING_1*freq[j*C+c]*g;
       }
    }
    for (i=B*C*eBands[m->nbEBands];i<B*C*eBands[m->nbEBands+1];i++)
@@ -135,7 +135,7 @@ void denormalise_bands(const CELTMode *m, celt_norm_t *X, celt_sig_t *freq, floa
          int j;
          float g = bank[i*C+c];
          for (j=B*eBands[i];j<B*eBands[i+1];j++)
-            freq[j*C+c] = X[j*C+c] * g;
+            freq[j*C+c] = SIG_SCALING*X[j*C+c] * g;
       }
    }
    for (i=B*C*eBands[m->nbEBands];i<B*C*eBands[m->nbEBands+1];i++)
diff --git a/libcelt/celt.c b/libcelt/celt.c
index 156716c6009d8d73a769641052e87c30854278d5..7b8cac38091e7defc5bf8ac72847966cb9b41bd7 100644
--- a/libcelt/celt.c
+++ b/libcelt/celt.c
@@ -177,13 +177,13 @@ static float compute_mdcts(mdct_lookup *mdct_lookup, float *window, celt_sig_t *
          int j;
          for (j=0;j<2*N;j++)
          {
-            x[j] = SIG_SCALING*window[j]*in[C*i*N+C*j+c];
+            x[j] = window[j]*in[C*i*N+C*j+c];
             E += SIG_SCALING_1*SIG_SCALING_1*x[j]*x[j];
          }
          mdct_forward(mdct_lookup, x, tmp);
          /* Interleaving the sub-frames */
          for (j=0;j<N;j++)
-            out[C*B*j+C*i+c] = SIG_SCALING_1*tmp[j];
+            out[C*B*j+C*i+c] = tmp[j];
       }
    }
    return E;
@@ -205,16 +205,16 @@ static void compute_inv_mdcts(mdct_lookup *mdct_lookup, float *window, celt_sig_
          int j;
          /* De-interleaving the sub-frames */
          for (j=0;j<N;j++)
-            tmp[j] = SIG_SCALING*X[C*B*j+C*i+c];
+            tmp[j] = X[C*B*j+C*i+c];
          mdct_backward(mdct_lookup, tmp, x);
          for (j=0;j<2*N;j++)
             x[j] = window[j]*x[j];
          for (j=0;j<overlap;j++)
-            out_mem[C*(MAX_PERIOD+(i-B)*N)+C*j+c] = 2*(SIG_SCALING_1*x[N4+j]+mdct_overlap[C*j+c]);
+            out_mem[C*(MAX_PERIOD+(i-B)*N)+C*j+c] = 2*(x[N4+j]+mdct_overlap[C*j+c]);
          for (j=0;j<2*N4;j++)
-            out_mem[C*(MAX_PERIOD+(i-B)*N)+C*(j+overlap)+c] = 2*SIG_SCALING_1*x[j+N4+overlap];
+            out_mem[C*(MAX_PERIOD+(i-B)*N)+C*(j+overlap)+c] = 2*x[j+N4+overlap];
          for (j=0;j<overlap;j++)
-            mdct_overlap[C*j+c] = SIG_SCALING_1*x[N+N4+j];
+            mdct_overlap[C*j+c] = x[N+N4+j];
       }
    }
 }
@@ -257,7 +257,7 @@ int celt_encode(CELTEncoder *st, celt_int16_t *pcm, unsigned char *compressed, i
          in[C*(i+N4)+c] = st->in_mem[C*i+c];
       for (i=0;i<B*N;i++)
       {
-         float tmp = pcm[C*i+c];
+         float tmp = SIG_SCALING*pcm[C*i+c];
          in[C*(i+st->overlap+N4)+c] = tmp - st->preemph*st->preemph_memE[c];
          st->preemph_memE[c] = tmp;
       }
@@ -384,6 +384,7 @@ int celt_encode(CELTEncoder *st, celt_int16_t *pcm, unsigned char *compressed, i
          {
             float tmp = st->out_mem[C*(MAX_PERIOD+(i-B)*N)+C*j+c] + st->preemph*st->preemph_memD[c];
             st->preemph_memD[c] = tmp;
+            tmp *= SIG_SCALING_1;
             if (tmp > 32767) tmp = 32767;
             if (tmp < -32767) tmp = -32767;
             pcm[C*i*N+C*j+c] = (short)floor(.5+tmp);
@@ -558,6 +559,7 @@ static void celt_decode_lost(CELTDecoder *st, short *pcm)
          {
             float tmp = st->out_mem[C*(MAX_PERIOD+(i-B)*N)+C*j+c] + st->preemph*st->preemph_memD[c];
             st->preemph_memD[c] = tmp;
+            tmp *= SIG_SCALING_1;
             if (tmp > 32767) tmp = 32767;
             if (tmp < -32767) tmp = -32767;
             pcm[C*i*N+C*j+c] = (short)floor(.5+tmp);
@@ -660,6 +662,7 @@ int celt_decode(CELTDecoder *st, unsigned char *data, int len, celt_int16_t *pcm
          {
             float tmp = st->out_mem[C*(MAX_PERIOD+(i-B)*N)+C*j+c] + st->preemph*st->preemph_memD[c];
             st->preemph_memD[c] = tmp;
+            tmp *= SIG_SCALING_1;
             if (tmp > 32767) tmp = 32767;
             if (tmp < -32767) tmp = -32767;
             pcm[C*i*N+C*j+c] = (short)floor(.5+tmp);
diff --git a/libcelt/pitch.c b/libcelt/pitch.c
index 54e87d2ba10d2c30319336568c9e086a7816129d..80bceb69954e779f3c79928662a25dba0dca53fb 100644
--- a/libcelt/pitch.c
+++ b/libcelt/pitch.c
@@ -65,9 +65,9 @@ void find_spectral_pitch(kiss_fftr_cfg fft, struct PsyDecay *decay, celt_sig_t *
    for (c=0;c<C;c++)
    {
       for (i=0;i<len;i++)
-         xx[c*lag+i] = SIG_SCALING*x[C*i+c];
+         xx[c*lag+i] = x[C*i+c];
       for (i=0;i<lag;i++)
-         yy[c*lag+i] = SIG_SCALING*y[C*i+c];
+         yy[c*lag+i] = y[C*i+c];
       
    }