void->void pipeline FFT2() { add FFTTestSource(64); add FFTKernel2(64); add FloatPrinter(); } float->float filter CombineDFT(int n) { // coefficients, real and imaginary interleaved float[n] w; init { float wn_r = (float)cos(2 * 3.141592654 / n); float wn_i = (float)sin(-2 * 3.141592654 / n); float real = 1; float imag = 0; float next_real, next_imag; for (int i=0; ifloat filter FFTReorderSimple(int n) { int totalData; init { totalData = 2*n; } work push 2*n pop 2*n { int i; for (i = 0; i < totalData; i+=4) { push(peek(i)); push(peek(i+1)); } for (i = 2; i < totalData; i+=4) { push(peek(i)); push(peek(i+1)); } for (i=0;ifloat pipeline FFTReorder(int n) { for(int i=1; i<(n/2); i*= 2) add FFTReorderSimple(n/i); } float->float pipeline FFTKernel1(int n) { if(n>2) { add splitjoin { split roundrobin(2); add FFTKernel1(n/2); add FFTKernel1(n/2); join roundrobin(n); } } add CombineDFT(n); } float->float splitjoin FFTKernel2(int n) { split roundrobin(2*n); for(int i=0; i<2; i++) { add pipeline { add FFTReorder(n); for(int j=2; j<=n; j*=2) add CombineDFT(j); } } join roundrobin(2*n); } void->float filter FFTTestSource(int N) { work push 2*N pop 0 { int i; push(0.0); push(0.0); push(1.0); push(0.0); for(i=0; i<2*(N-2); i++) push(0.0); } } float->void filter FloatPrinter { work push 0 pop 1 { println(pop()); } }