This is to show how the pointers move in the buffer.
buffer_size = 32 * 1024; period_size = 5.5 * 1024; /* intentionally odd number */ nfft = 2 * 1024; double *audio_signal {nullptr}; double *signal_start {nullptr}; /* valid data in [start,end) */ double *signal_end {nullptr}; audio_signal = new double [large_enough]; signal_start = audio_signal; signal_end = audio_signal; for (int i = 0; i < period_size; i++) { *signal_end++ = samples[i]; /* get new set of samples */ } while(s->signal_end - s->signal_start >= nfft) { auto p = signal_start; for (int i = 0; i < nfft; i++) { in_real[i] = *p++ * audio_window[i]; /* copy into FFT buffer */ } fftw_execute(s->plan); /* update waterfall, etc. */ signal_start += nfft/2; /* shift the FFT window for half the FFT size */ } /* move a bulk of samples not used for FFT to the top of the buffer */ auto p = s->audio_signal; auto q = s->signal_start; while(q < s->signal_end) { *p++ = *q++; } s->signal_start = s->audio_signal; s->signal_end = p;
It seems that the buffer operation is stable.