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?
53I 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.
© 2012 - Nathan Osman - [About]