I'm trying to make a channel vocoder that takes two inputs, one a frequency rich carrier (a musical sound) and the other a modulator (vocals). Applying operations involved in the channel vocoder generates an output that makes the vocals sing in the tone of the carrier. (Think Songify.)

Presently I'm splitting both the signals into windows of a specified size and also overlapping two consecutive windows by a certain factor. FFTs of the windows of the carrier and modulator are then computed. The fft is further split into bands of equal length. The average of magnitudes of modulator's fft in that particular

for band_no = 0 to band_count:
        for i = 0 to band_length:
                avg+=magnitudeOfModulatorFFT[band_no*band_length + i];

I am then multiplying "avg" to each of carrierFFT's frequency value lying within the band, and then taking the inverse FFT. Although this produces the desired output, it also includes a clicking sound. Even after multiplying both the signals by a window function.

Any way I could solve this?

  • 1
    $\begingroup$ Have you try your "framing -> FFT -> IFFT -> overlap add" chain independently of any processing to make sure that it reconstructed the original correctly without clicks? $\endgroup$ Jun 7, 2012 at 10:21
  • $\begingroup$ Yup, that works perfectly fine. I suspect that there's some problem in the averaging bit, although I can't really point at exactly what that is. $\endgroup$
    – rounak
    Jun 7, 2012 at 13:41
  • $\begingroup$ Could it be that the multiplication of the carrier FFT by the band-wise avg causes the output signal to have a larger amplitude than the original, and thus make it clip? You could also try smoothing the value of avg - something like avg[band_no] = 0.5 * avg[band_no] + 0.5 * (value_computed_for_this_frame) to prevent discontinuities resulting in abrupt variations of the modulator spectrum. Hardware vocoder usually have a simple RC network slew-limiting the output of the channel envelope follower. $\endgroup$ Jun 7, 2012 at 14:17
  • $\begingroup$ I've ensured that the output doesn't go out of range. I'll try to smooth the output as you said. To be clear, what you're saying is to take the mean of the computed average and the previous frame average, right? $\endgroup$
    – rounak
    Jun 7, 2012 at 19:05
  • $\begingroup$ Yes, though you can try a different pair of coefficients (summing to 1) to adjust the amount of smoothing. $\endgroup$ Jun 7, 2012 at 19:40

1 Answer 1


I think it could be one of two issues.

What is your frame overlap? if the frame overlap is something less than 40% or so you will begin to get undesired artefacts when you perform overlap add synthesis at the end. Try an overlap of 50-80% (although more computationally expensive, it provides greater frequency resolution).

The second consideration which goes hand in hand with the above suggestion. Are you using any kind of analysis window on your framed signal? Perhaps try using a tapered window such has hamming, Blackmann or Hanning. This will help minimise spectral leakage between frames. Hope this helps.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.