     x += FD_GRAPH_SIZE + 1;
   }
 
+  // Refresh zero-point using a running average
+  fft_zeroPointF += 0.01 * (float) (captureSum / FD_GRAPH_CNT);
+  fft_zeroPoint = (int16_t) fft_zeroPointF;
+
   // Convert the sum of all waveform captures into a graph intensity range
   intensity = map(captureSum,-10000,10000,TD_GRAPH_Y,TD_GRAPH_Y+TD_GRAPH_H);
   intensity = constrain(intensity, TD_GRAPH_Y, TD_GRAPH_Y+TD_GRAPH_H);

#define FD_GRAPH_CNT   62

/* FFT state variables */
volatile byte fft_position = 0;      /* Running position of the FFT */
int16_t fft_capture[FFT_N];          /* Waveform ADC capturing buffer */
complex_t bfly_buff[FFT_N];          /* FFT buffer */

    /* Input ADC value */
    value = ADC;

    /* Subtract zero-offset */
    value -= fft_zeroPoint;

    /* Add random noise */
    if (RANDOM_NOISE) {
      value += random(-RANDOM_NOISE, RANDOM_NOISE);
