FFT based Phase Vocoder/Pitch Shifter
Posted: Sun Jul 14, 2013 5:08 pm
Hi gang,
here is another application of the stream FFT: a basic phase vocoder used for pitch shifting in real time (with some latency though). There is a lot of relevant reading on the Web about the phase vocoder. One useful implementation guide is http://www.ece.uvic.ca/~peterd/48409/Bernardini.pdf.
The schematic below is, however, rather academic - the quality is not overwhelming. Various improvements to the basic structure were published in the late nineties, the keyword here is vertical coherence. The schematic below only cares about horizontal coherence, i.e. the proper phase continuity between subsequent frames. Vertical coherence considers, in addition, the phase relations between frequency bins within each frame. The result is a better impulse response and less phasing.
Anyway, I thought I share this as a first demonstration. I have to say that I learned a lot from this little exercise.
@MyCo, how do you get those useful looking Spectrum Plot modules to respond? There seems to be a problem with the Prepare Data module inside. My Ruby skills are too limited to figure it out.
here is another application of the stream FFT: a basic phase vocoder used for pitch shifting in real time (with some latency though). There is a lot of relevant reading on the Web about the phase vocoder. One useful implementation guide is http://www.ece.uvic.ca/~peterd/48409/Bernardini.pdf.
The schematic below is, however, rather academic - the quality is not overwhelming. Various improvements to the basic structure were published in the late nineties, the keyword here is vertical coherence. The schematic below only cares about horizontal coherence, i.e. the proper phase continuity between subsequent frames. Vertical coherence considers, in addition, the phase relations between frequency bins within each frame. The result is a better impulse response and less phasing.
Anyway, I thought I share this as a first demonstration. I have to say that I learned a lot from this little exercise.
@MyCo, how do you get those useful looking Spectrum Plot modules to respond? There seems to be a problem with the Prepare Data module inside. My Ruby skills are too limited to figure it out.