home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World 2008 February
/
PCWorld_2008-02_cd.bin
/
audio-video
/
reaper
/
reaper2028-install.exe
/
Effects
/
schwa
/
fft_splitter
next >
Wrap
Text File
|
2007-12-09
|
3KB
|
119 lines
desc: FFT splitter
slider1:2<0,3,1{1024,2048,4096}>FFT size
slider2:5000<0,20000,1>split freq
slider3:0<0,4,1{1/2,3/4,5/6,7/8}>low band dest
slider4:1<0,4,1{1/2,3/4,5/6,7/8}>high band dest
@init
fftsize = -1;
pdc_bot_ch = 0;
pdc_top_ch = 8;
// array pointers
window=0;
buf1 = 16384;
buf2 = 32768;
splitLo1 = 49152;
splitLo2 = 65536;
splitHi1 = 81920;
splitHi2 = 98304;
@slider
pos = 0;
memset(buf1, 0, 2*fftsize);
memset(buf2, 0, 2*fftsize);
memset(splitLo1, 0, 2*fftsize);
memset(splitLo2, 0, 2*fftsize);
memset(splitHi1, 0, 2*fftsize);
memset(splitHi2, 0, 2*fftsize);
sliderfft = (2^(slider1+10))|0;
fftsize != sliderfft ? (
memset(window, 0, fftsize);
fftsize = sliderfft;
w = 2.0*3.14159/fftsize;
i = 0;
loop(fftsize/2,
window[i] = 0.42-0.50*cos(i*w)+0.08*cos(2.0*i*w);
i += 1;
);
pdc_delay = fftsize;
);
splitfreq = (2 * fftsize * slider2 / srate)|0;
wLo_01 = (slider3 == 0 ? 1.0 : 0.0);
wLo_23 = (slider3 == 1 ? 1.0 : 0.0);
wLo_45 = (slider3 == 2 ? 1.0 : 0.0);
wLo_67 = (slider3 == 3 ? 1.0 : 0.0);
wHi_01 = (slider4 == 0 ? 1.0 : 0.0);
wHi_23 = (slider4 == 1 ? 1.0 : 0.0);
wHi_45 = (slider4 == 2 ? 1.0 : 0.0);
wHi_67 = (slider4 == 3 ? 1.0 : 0.0);
@sample
pos >= fftsize ? (
//memcpy(buf1, buf2+fftsize, fftsize);
tmp = buf1;
buf1 = buf2;
buf2 = tmp;
tmp = splitLo1;
splitLo1 = splitLo2;
splitLo2 = tmp;
tmp = splitHi1;
splitHi1 = splitHi2;
splitHi2 = tmp;
fft(buf1, fftsize);
fft_permute(buf1, fftsize);
memcpy(splitLo1, buf1, splitfreq);
memset(splitLo1+splitfreq, 0, 2*(fftsize-splitfreq));
memcpy(splitLo1+2*fftsize-splitfreq, buf1+2*fftsize-splitfreq, splitfreq);
memset(splitHi1, 0, splitfreq);
memcpy(splitHi1+splitfreq, buf1+splitfreq, 2*(fftsize-splitfreq));
memset(splitHi1+2*fftsize-splitfreq, 0, splitfreq);
fft_ipermute(splitLo1, fftsize);
fft_ipermute(splitHi1, fftsize);
ifft(splitLo1, fftsize);
ifft(splitHi1, fftsize);
pos=0;
);
w1 = window[pos/2];
w2 = window[(fftsize-pos)/2-1];
sw = (w1+w2);
sw == 0 ? (sw = fftsize) : (sw *= fftsize);
buf1[pos] = w1*spl0;
buf1[pos+1] = w1*spl1;
buf2[fftsize+pos] = w2*spl0;
buf2[fftsize+pos+1] = w2*spl1;
spl0Lo = (splitLo1[pos]+splitLo2[fftsize+pos])/sw;
spl1Lo = (splitLo1[pos+1]+splitLo2[fftsize+pos+1])/sw;
spl0Hi = (splitHi1[pos]+splitHi2[fftsize+pos])/sw;
spl1Hi = (splitHi1[pos+1]+splitHi2[fftsize+pos+1])/sw;
spl0 = wLo_01*spl0Lo + wHi_01*spl0Hi;
spl1 = wLo_01*spl1Lo + wHi_01*spl1Hi;
spl2 = wLo_23*spl0Lo + wHi_23*spl0Hi;
spl3 = wLo_23*spl1Lo + wHi_23*spl1Hi;
spl4 = wLo_45*spl0Lo + wHi_45*spl0Hi;
spl5 = wLo_45*spl1Lo + wHi_45*spl1Hi;
spl6 = wLo_67*spl0Lo + wHi_67*spl0Hi;
spl7 = wLo_67*spl1Lo + wHi_67*spl1Hi;
pos += 2;