FFT4

 

void->void pipeline FFT4 {

    add OneSource();

    add FFTKernel(32);

    add FloatPrinter();

}

 

float->float pipeline FFTKernel (int N) {

    /* This bit-reverse stage was published in the original CC paper,

     * but it has a bug and causes the output to be wrong.

 

    add splitjoin {

        split roundrobin(N/2, N/2);

        for (int i=0; i<2; i++) {

            add splitjoin {

                split roundrobin();

                add Identity<float>();

                add Identity<float>();

                join roundrobin(N/4, N/4);

            };

        }

        join roundrobin();

    };

    */

    for (int i=1; i<N; i*=2) {

        add Butterfly(i, N);

    }

}

 

float->float pipeline Butterfly (int N, int W) {

    add splitjoin {

        split roundrobin(N, N);

        add Identity<float>();

        add Multiply();

        join roundrobin();

    };

    add splitjoin {

        split duplicate;

        add Add();

        add Subtract();

        join roundrobin(N, N);

    };

}

 

void->float filter OneSource {

      init {

      }

    work push 1 {

        push(1);

    }

}

 

float->float filter Multiply {

      init {

      }    

    // just multiplying by 2 for now instead of calculating weights

    work push 1 pop 1 {

        push(2 * pop());

    }

}

 

float->float filter Add {

      init {

      }

    work push 1 pop 2 {

        push(peek(0) + peek(1));

        pop();

        pop();

    }

}

 

float->float filter Subtract {

      init {

      }

    work push 1 pop 2 {

        push(peek(0) - peek(1));

        pop();

        pop();

    }

}

 

float->void filter FloatPrinter {

      init {

      }

    work pop 1 {

        print(pop());

    }

}