* Actually make the output addressing different in the second half, it was
[matthijs/projects/montium-fft.git] / FFT_support.cpp
index 6f21e5a24afa1e9cca6fe74a37bfa4965ff6d2ea..23d07f08ca102e114e7428807701f364fcdcc566 100644 (file)
@@ -4,7 +4,7 @@
 \r
 \r
 /* Didn't the Montium use Q15 instead of Q14? */\r
 \r
 \r
 /* Didn't the Montium use Q15 instead of Q14? */\r
-#define FIXED_POINT 14\r
+#define FIXED_POINT 15\r
 #define WORD_SIZE   16\r
 \r
 #define WORDS_PER_LINE 4\r
 #define WORD_SIZE   16\r
 \r
 #define WORDS_PER_LINE 4\r
@@ -55,46 +55,73 @@ void pre_run()
        input_a_im   = alloc_mem(P1M0);\r
        input_b_re   = alloc_mem(P2M0);\r
        input_b_im   = alloc_mem(P3M0);\r
        input_a_im   = alloc_mem(P1M0);\r
        input_b_re   = alloc_mem(P2M0);\r
        input_b_im   = alloc_mem(P3M0);\r
-       output_a_re  = alloc_mem(P0M1);\r
-       output_a_im  = alloc_mem(P1M1);\r
-       output_b_re  = alloc_mem(P2M1);\r
-       output_b_im  = alloc_mem(P3M1);\r
+       \r
+       twiddle_re   = alloc_mem(P4M0);\r
+       twiddle_im   = alloc_mem(P4M1);\r
        \r
        /* TODO: Init memory and twiddles */\r
        \r
        /* TODO: Init memory and twiddles */\r
-       for (i=0;i<SIZE/2;i++)\r
+       for (i=0;i<PARAM_N_t/2;i++)\r
        {\r
        {\r
-               set_mem(twiddle_re->id, i, to_fixed(cos(2*M_PI/SIZE*i)));\r
-               set_mem(twiddle_im->id, i, to_fixed(sin(2*M_PI/SIZE*i)));\r
+               set_mem(twiddle_re->id, i, to_fixed(cos(i*2*M_PI/PARAM_N_t)));\r
+               set_mem(twiddle_im->id, i, to_fixed(sin(i*2*M_PI/PARAM_N_t)));\r
        }\r
        \r
        }\r
        \r
-       for (i=0;i<SIZE;i++)\r
+       for (i=0;i<PARAM_N_t;i++)\r
        {\r
        {\r
-               int value = to_fixed(sin((float)i/SIZE*2*2*M_PI));\r
-               if (i<SIZE/2)\r
+               int value = to_fixed(sin((float)i*2*M_PI/PARAM_N_t));\r
+\r
+               if (i<PARAM_N_t/2)\r
                {\r
                {\r
-                       set_mem(input_a_re->id, i, value);\r
-                       set_mem(input_a_im->id, i, 0);\r
+                       if (i % 2 == 0) {\r
+                               set_mem(input_a_re->id, i, value);\r
+                               set_mem(input_a_im->id, i, 0);\r
+                       } else {\r
+                               set_mem(input_b_re->id, i, value);\r
+                               set_mem(input_b_im->id, i, 0);\r
+                       }\r
                }\r
                else\r
                {\r
                }\r
                else\r
                {\r
-                       set_mem(input_a_re->id, i - SIZE / 2, value);\r
-                       set_mem(input_a_im->id, i - SIZE / 2, 0);\r
+                       if (i % 2 == 0) {\r
+                               set_mem(input_b_re->id, i - PARAM_N_t/2, value);\r
+                               set_mem(input_b_im->id, i - PARAM_N_t/2, 0);\r
+                       } else {\r
+                               set_mem(input_a_re->id, i - PARAM_N_t/2, value);\r
+                               set_mem(input_a_im->id, i - PARAM_N_t/2, 0);\r
+                       }\r
                }\r
        }\r
                }\r
        }\r
-}\r
-\r
-void post_run()\r
-{\r
+       \r
        printf("re(W)\n");\r
        printf("re(W)\n");\r
-       print_mem(twiddle_re, 0, SIZE, true);\r
+       print_mem(twiddle_re, 0, PARAM_N_t/2, true);\r
        printf("im(W)\n");\r
        printf("im(W)\n");\r
-       print_mem(twiddle_im, 0, SIZE, true);\r
+       print_mem(twiddle_im, 0, PARAM_N_t/2, true);\r
        printf("re(in_a)\n");\r
        printf("re(in_a)\n");\r
-       print_mem(input_a_re, 0, SIZE, true);\r
+       print_mem(input_a_re, 0, PARAM_N_t/2, true);\r
        printf("re(in_b)\n");\r
        printf("re(in_b)\n");\r
-       print_mem(input_b_re, 0, SIZE, true);\r
+       print_mem(input_b_re, 0, PARAM_N_t/2, true);\r
+}\r
+\r
+void post_run()\r
+{\r
+       if (PARAM_n_t % 2 == 0) {\r
+               /* When the number of stages is odd, the \r
+                * outputs end up at the left memories again */\r
+               output_a_re  = alloc_mem(P0M0);\r
+               output_a_im  = alloc_mem(P1M0);\r
+               output_b_re  = alloc_mem(P2M0);\r
+               output_b_im  = alloc_mem(P3M0);\r
+       } else {\r
+               output_a_re  = alloc_mem(P0M1);\r
+               output_a_im  = alloc_mem(P1M1);\r
+               output_b_re  = alloc_mem(P2M1);\r
+               output_b_im  = alloc_mem(P3M1);\r
+       }\r
        printf("re(out_a)\n");\r
        printf("re(out_a)\n");\r
-       print_mem(output_a_re, 0, SIZE, true);\r
+       print_mem(output_a_re, 0, PARAM_N_t/2, true);\r
+       print_mem(output_b_re, 0, PARAM_N_t/2, true);\r
        printf("im(out_a)\n");\r
        printf("im(out_a)\n");\r
-       print_mem(output_a_im, 0, SIZE, true);\r
+       print_mem(output_a_im, 0, PARAM_N_t/2, true);\r
+       print_mem(output_b_im, 0, PARAM_N_t/2, true);\r
+\r
 }\r
 }\r