A UGen performing short-time forward fourier transformations. In order to
properly link the spectral ugens ( PV_... ), you should begin by using the
output of each UGen (which is just the fft buffer identifier), and use that as
buffer input of the next UGen. That way, the UGen graph is correctly sorted.
E.g. IFFT(PV_...(FFT(buf, in))) .
The UGen will initially output zero until the first FFT can be performed. This
is the case after hop * fftSize . Thus for a default fft buffer size of 1024
and a hop of 0.5, and for a default control block size of 64, for the first
1024*0.5/64 = 8 control blocks the UGen will output zero. This also implies that
the first FFT in this case if performed on the first 512 samples of the in
signal (prepended by 512 zeros). In other words, the first 'full' FFT of the
input happens after fftSize/controlBlockSize cycles, no matter what hop size was
chosen.
If you use FFT for performing signal analysis and not phase vocoder effects,
make sure you change the window type accordingly.
Examples
// perfect reconstruction
play {
// with a hop of 0.5 and forward Hann window,// we get a perfect reconstruction delayed// by the fftSize minus one control-block.// (alternatively, you can use a hop of 1.0,// and winType of 1 for both FFT and IFFT)val n = 1024val hop = 0.5val buf = LocalBuf(n)
val in = PinkNoise.ar(0.5)
val fft = FFT(buf, in, hop = hop, winType = 1)
val out = IFFT.ar(fft, winType = -1)
val dur = (2 * n * hop) / SampleRate.ir - ControlDur.ir
val dly = DelayN.ar(in, dur, dur)
out - dly
}
A UGen performing short-time forward fourier transformations. In order to properly link the spectral ugens (
PV_...
), you should begin by using the output of each UGen (which is just the fft buffer identifier), and use that as buffer input of the next UGen. That way, the UGen graph is correctly sorted. E.g.IFFT(PV_...(FFT(buf, in)))
.The UGen will initially output zero until the first FFT can be performed. This is the case after
hop * fftSize
. Thus for a default fft buffer size of 1024 and ahop
of 0.5, and for a default control block size of 64, for the first 1024*0.5/64 = 8 control blocks the UGen will output zero. This also implies that the first FFT in this case if performed on the first 512 samples of thein
signal (prepended by 512 zeros). In other words, the first 'full' FFT of the input happens after fftSize/controlBlockSize cycles, no matter what hop size was chosen.If you use FFT for performing signal analysis and not phase vocoder effects, make sure you change the window type accordingly.
Examples
FFTTrigger
IFFT