1876e36ce4302e6cae6511d7113c976b637bcdc6
[matthijs/projects/montium-fft.git] / FFT_support.cpp
1 #include "FFT.h"\r
2 #include <cstdio>\r
3 #include <cmath>\r
4 \r
5 \r
6 /* Didn't the Montium use Q15 instead of Q14? */\r
7 #define FIXED_POINT 14\r
8 #define WORD_SIZE   16\r
9 \r
10 #define WORDS_PER_LINE 4\r
11 #define WORDS_PER_GROUP 1\r
12 \r
13 extern  mem input_a_re, input_a_im, input_b_re, input_b_im, output_a_re, output_a_im, output_b_re, output_b_im, twiddle_re, twiddle_im; \r
14 \r
15 \r
16 \r
17 int to_fixed(float n)\r
18 {\r
19         int res = (int)(n * (1 << FIXED_POINT));\r
20         /* Crop results */\r
21         if (res > (1 << WORD_SIZE - 1) - 1)\r
22                 return (1 << WORD_SIZE - 1) - 1;\r
23         if (res < -(1 << WORD_SIZE - 1))\r
24                 return -(1 << WORD_SIZE - 1);\r
25         return res;\r
26 }\r
27 \r
28 float from_fixed(int n)\r
29 {\r
30         return n / (float)(1<<FIXED_POINT);\r
31 }\r
32 \r
33 void print_mem(mem m, int offset, int size, bool fixed)\r
34 {\r
35         int i;\r
36         for(i = offset;i<offset+size;i++)\r
37         {\r
38                 if (fixed)\r
39                         printf("%0.4f", from_fixed(get_mem(m->id, i)));\r
40                 else\r
41                         printf("%04hx", (short)get_mem(m->id, i));\r
42                 if ((i + 1) % WORDS_PER_LINE == 0)\r
43                         printf("\n");\r
44                 else if ((i + 1) % WORDS_PER_GROUP == 0)\r
45                         printf(" ");\r
46         }\r
47         if (i % WORDS_PER_LINE != 0)\r
48                 printf("\n");\r
49 }\r
50 \r
51 \r
52 void pre_run()\r
53 {\r
54         int i;\r
55 \r
56         /* TODO: Init memory and twiddles */\r
57         for (i=0;i<SIZE/2;i++)\r
58         {\r
59                 set_mem(twiddle_re->id, i, to_fixed(cos(2*M_PI/SIZE*i)));\r
60                 set_mem(twiddle_im->id, i, to_fixed(sin(2*M_PI/SIZE*i)));\r
61         }\r
62         \r
63         for (i=0;i<SIZE;i++)\r
64         {\r
65                 int value = to_fixed(sin((float)i/SIZE*2*2*M_PI));\r
66                 if (i<SIZE/2)\r
67                 {\r
68                         set_mem(input_a_re->id, i, value);\r
69                         set_mem(input_a_im->id, i, 0);\r
70                 }\r
71                 else\r
72                 {\r
73                         set_mem(input_a_re->id, i - SIZE / 2, value);\r
74                         set_mem(input_a_im->id, i - SIZE / 2, 0);\r
75                 }\r
76         }\r
77 }\r
78 \r
79 void post_run()\r
80 {\r
81         printf("re(W)\n");\r
82         print_mem(twiddle_re, 0, SIZE, true);\r
83         printf("im(W)\n");\r
84         print_mem(twiddle_im, 0, SIZE, true);\r
85         printf("re(in_a)\n");\r
86         print_mem(input_a_re, 0, SIZE, true);\r
87         printf("re(in_b)\n");\r
88         print_mem(input_b_re, 0, SIZE, true);\r
89         printf("re(out_a)\n");\r
90         print_mem(output_a_re, 0, SIZE, true);\r
91         printf("im(out_a)\n");\r
92         print_mem(output_a_im, 0, SIZE, true);\r
93 }\r