diff --git a/celt/celt_decoder.c b/celt/celt_decoder.c
index 397ced362acf017f0184ff07ffecd3458303dd05..5d09512641d8908700cae9ceff51099edf2e71ba 100644
--- a/celt/celt_decoder.c
+++ b/celt/celt_decoder.c
@@ -257,35 +257,6 @@ void deemphasis(celt_sig *in[], opus_val16 *pcm, int N, int C, int downsample, c
    RESTORE_STACK;
 }
 
-/** Compute the IMDCT and apply window for all sub-frames and
-    all channels in a frame */
-#ifndef RESYNTH
-static
-#endif
-void compute_inv_mdcts(const CELTMode *mode, int shortBlocks, celt_sig *X,
-      celt_sig * OPUS_RESTRICT out_mem, int LM)
-{
-   int b;
-   int B;
-   int N;
-   int shift;
-   const int overlap = mode->overlap;
-
-   if (shortBlocks)
-   {
-      B = shortBlocks;
-      N = mode->shortMdctSize;
-      shift = mode->maxLM;
-   } else {
-      B = 1;
-      N = mode->shortMdctSize<<LM;
-      shift = mode->maxLM-LM;
-   }
-   /* IMDCT on the interleaved the sub-frames, overlap-add is performed by the IMDCT */
-   for (b=0;b<B;b++)
-      clt_mdct_backward(&mode->mdct, &X[b], out_mem+N*b, mode->window, overlap, shift, B);
-}
-
 #ifndef RESYNTH
 static
 #endif
@@ -294,9 +265,12 @@ void celt_synthesis(const CELTMode *mode, celt_norm *X, celt_sig * out_syn[],
       int LM, int downsample, int silence)
 {
    int c, i;
-   int M, N;
+   int M;
+   int b;
+   int B;
+   int N, NB;
+   int shift;
    int nbEBands;
-   int shortBlocks;
    int overlap;
    VARDECL(celt_sig, freq);
    SAVE_STACK;
@@ -306,7 +280,17 @@ void celt_synthesis(const CELTMode *mode, celt_norm *X, celt_sig * out_syn[],
    N = mode->shortMdctSize<<LM;
    ALLOC(freq, N, celt_sig); /**< Interleaved signal MDCTs */
    M = 1<<LM;
-   shortBlocks = isTransient ? M : 0;
+
+   if (isTransient)
+   {
+      B = M;
+      NB = mode->shortMdctSize;
+      shift = mode->maxLM;
+   } else {
+      B = 1;
+      NB = mode->shortMdctSize<<LM;
+      shift = mode->maxLM-LM;
+   }
 
    if (CC==2&&C==1)
    {
@@ -317,8 +301,10 @@ void celt_synthesis(const CELTMode *mode, celt_norm *X, celt_sig * out_syn[],
       /* Store a temporary copy in the output buffer because the IMDCT destroys its input. */
       freq2 = out_syn[1]+overlap/2;
       OPUS_COPY(freq2, freq, N);
-      compute_inv_mdcts(mode, shortBlocks, freq2, out_syn[0], LM);
-      compute_inv_mdcts(mode, shortBlocks, freq, out_syn[1], LM);
+      for (b=0;b<B;b++)
+         clt_mdct_backward(&mode->mdct, &freq2[b], out_syn[0]+NB*b, mode->window, overlap, shift, B);
+      for (b=0;b<B;b++)
+         clt_mdct_backward(&mode->mdct, &freq[b], out_syn[1]+NB*b, mode->window, overlap, shift, B);
    } else if (CC==1&&C==2)
    {
       /* Downmixing a stereo stream to mono */
@@ -331,14 +317,15 @@ void celt_synthesis(const CELTMode *mode, celt_norm *X, celt_sig * out_syn[],
             downsample, silence);
       for (i=0;i<N;i++)
          freq[i] = HALF32(ADD32(freq[i],freq2[i]));
-      /* Compute inverse MDCTs */
-      compute_inv_mdcts(mode, shortBlocks, freq, out_syn[0], LM);
+      for (b=0;b<B;b++)
+         clt_mdct_backward(&mode->mdct, &freq[b], out_syn[0]+NB*b, mode->window, overlap, shift, B);
    } else {
       /* Normal case (mono or stereo) */
       c=0; do {
          denormalise_bands(mode, X+c*N, freq, oldBandE+c*nbEBands, start, effEnd, M,
                downsample, silence);
-         compute_inv_mdcts(mode, shortBlocks, freq, out_syn[c], LM);
+         for (b=0;b<B;b++)
+            clt_mdct_backward(&mode->mdct, &freq[b], out_syn[c]+NB*b, mode->window, overlap, shift, B);
       } while (++c<CC);
    }
    RESTORE_STACK;