Hi there, In the following code ifft.last() is sometimes larger than 1, but when the input signal has unity gain, it shouldn't be like this. Actually, what happens, I think, is that the amplification is proportional to the overlap factor. So should setting ifft.gain to hopsize/fftsize be the correct way to handle this? thanks eduard SinOsc s => FFT fft => IFFT ifft => dac; //blackhole; 1024 => int fftsize => fft.size; fftsize/4 => int hopsize; fftsize/2 => int specsize; Windowing.blackmanHarris(fftsize) => fft.window => ifft.window; complex spec[ specsize ]; fun void transform() { fft.upchuck(); fft.spectrum( spec ); ifft.transform( spec ); hopsize::samp => now; } while( true ) { if( Std.fabs(ifft.last() > 1) ) <<< ifft.last() >>>; transform(); }
Also, the final output gain depends on the type of window used. Would it be
possible to have a normalisation parameter for windows? So
ifft_output/overlap_factor/window_normalisation_param equals or aproximates
the input signal gain. Not sure, but the normalisation parameter could be
overcome by just normalising windows thus w[i]=Sum_[0, fftsize](w[i]). A
previous email I sent a few days ago was also related to this, but I got no
reply yet :-(.
Instedad of having to do this manually, IMHO it'd be nice just to use
ifft_output. In this way, one could set the overlap as fft.overlap(
overlap_factor ) and the normalisation should be already set when the user
sets the windowing into the fft, so when windowing.blackmanHarris( size ) =>
fft.window is set. This way the user doesn't really need take care anymore.
eduard
On Nov 21, 2007 4:36 PM, Aylon Eduard
Hi there,
In the following code ifft.last() is sometimes larger than 1, but when the input signal has unity gain, it shouldn't be like this. Actually, what happens, I think, is that the amplification is proportional to the overlap factor. So should setting ifft.gain to hopsize/fftsize be the correct way to handle this?
thanks
eduard
SinOsc s => FFT fft => IFFT ifft => dac; //blackhole; 1024 => int fftsize => fft.size; fftsize/4 => int hopsize; fftsize/2 => int specsize; Windowing.blackmanHarris(fftsize) => fft.window => ifft.window; complex spec[ specsize ]; fun void transform() { fft.upchuck(); fft.spectrum( spec ); ifft.transform( spec ); hopsize::samp => now; }
while( true ) { if( Std.fabs(ifft.last() > 1) ) <<< ifft.last() >>>; transform(); }
participants (1)
-
Aylon Eduard