diff --git a/src/analysis.c b/src/analysis.c
index e4156d6df3d16ad6af062dae78c222ef377f24e0..7dc792bbcb6718a19307a2103917a8c0d5368b3f 100644
--- a/src/analysis.c
+++ b/src/analysis.c
@@ -37,6 +37,7 @@
 #include <stdio.h>
 #include "analysis.h"
 #include "mlp.h"
+#include "stack_alloc.h"
 
 extern const MLP net;
 
@@ -190,17 +191,18 @@ void tonality_analysis(TonalityAnalysisState *tonal, AnalysisInfo *info_out, con
 {
     int i, b;
     const kiss_fft_state *kfft;
-    kiss_fft_cpx in[480], out[480];
+    VARDECL(kiss_fft_cpx, in);
+    VARDECL(kiss_fft_cpx, out);
     int N = 480, N2=240;
     float * OPUS_RESTRICT A = tonal->angle;
     float * OPUS_RESTRICT dA = tonal->d_angle;
     float * OPUS_RESTRICT d2A = tonal->d2_angle;
-    float tonality[240];
-    float noisiness[240];
+    VARDECL(float, tonality);
+    VARDECL(float, noisiness);
     float band_tonality[NB_TBANDS];
     float logE[NB_TBANDS];
     float BFCC[8];
-    float features[100];
+    float features[25];
     float frame_tonality;
     float max_frame_tonality;
     /*float tw_sum=0;*/
@@ -218,6 +220,7 @@ void tonality_analysis(TonalityAnalysisState *tonal, AnalysisInfo *info_out, con
     float noise_floor;
     int remaining;
     AnalysisInfo *info;
+    SAVE_STACK;
 
     tonal->last_transition++;
     alpha = 1.f/IMIN(20, 1+tonal->count);
@@ -234,12 +237,17 @@ void tonality_analysis(TonalityAnalysisState *tonal, AnalysisInfo *info_out, con
     {
        tonal->mem_fill += len;
        /* Don't have enough to update the analysis */
+       RESTORE_STACK;
        return;
     }
     info = &tonal->info[tonal->write_pos++];
     if (tonal->write_pos>=DETECT_SIZE)
        tonal->write_pos-=DETECT_SIZE;
 
+    ALLOC(in, 480, kiss_fft_cpx);
+    ALLOC(out, 480, kiss_fft_cpx);
+    ALLOC(tonality, 240, float);
+    ALLOC(noisiness, 240, float);
     for (i=0;i<N2;i++)
     {
        float w = analysis_window[i];
@@ -587,6 +595,7 @@ void tonality_analysis(TonalityAnalysisState *tonal, AnalysisInfo *info_out, con
     info->valid = 1;
     if (info_out!=NULL)
        OPUS_COPY(info_out, info, 1);
+    RESTORE_STACK;
 }
 
 int run_analysis(TonalityAnalysisState *analysis, const CELTMode *celt_mode, const void *pcm,