[chuck-users] solving FFT artifacts (vocoder example)
eduard aylon
eduard.aylon at gmail.com
Sat Oct 13 14:37:18 EDT 2007
Hi list,
On the same direction as my previous posts from yesterday, I'd like
to know if anyone has a good tip (i.e. articles, pdfs, books,
personal experience) for spectral transformations. Not only what you
can do with spectrums but more in the direction of what could happen
when you alter the mag-spectrum or phase-spectrum or both and how to
solve possible problems (i.e. artifacts).
Below I have attached a quick vocoder example written in chuck. So
for those who want to enjoy it, just set a sustained music file to be
read by "carrier" and speak thru your computer's mic. Again,
artifacts will be present and quite noticeable! :-(
Eduard
----------------------------
vocoder.ck
SndBuf carrier => FFT fft_c => blackhole; // music signal
"/Volumes/data/samples/music.wav" => carrier.read;
adc => FFT fft_m => blackhole; // voice signal
IFFT ifft => WvOut file => dac;
0.5 => carrier.gain ;
// fft/ifft constants
2048 => int FFT_SIZE => fft_c.size => fft_m.size => ifft.size;
FFT_SIZE/2 => int WIN_SIZE;
WIN_SIZE/2 => int HOP_SIZE;
// windowing:
Windowing.blackmanHarris( WIN_SIZE );
// spectrum array:
complex spectrum_c[WIN_SIZE];
complex spectrum_m[WIN_SIZE];
// temp variables:
polar temp_polar_m, temp_polar_c;
1 => carrier.loop;
while( true )
{
// take ffts:
fft_m.upchuck();
fft_c.upchuck();
fft_m.spectrum( spectrum_m );
fft_c.spectrum( spectrum_c );
// convert complex form to polar, assign magnitudes & back to
complex:
for( 0 => int i; i < WIN_SIZE; i++ )
{
spectrum_m[i]$polar => temp_polar_m;
spectrum_c[i]$polar => temp_polar_c;
temp_polar_m.mag => temp_polar_c.mag;
// store values. Re-use carrier's spectrum:
temp_polar_c$complex => spectrum_c[i];
}
ifft.transform( spectrum_c );
HOP_SIZE::samp => now;
}
More information about the chuck-users
mailing list