6 /* Didn't the Montium use Q15 instead of Q14? */
\r
7 #define FIXED_POINT 14
\r
10 #define WORDS_PER_LINE 4
\r
11 #define WORDS_PER_GROUP 1
\r
13 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
15 int to_fixed(float n)
\r
17 int res = (int)(n * (1 << FIXED_POINT));
\r
19 if (res > (1 << WORD_SIZE - 1) - 1)
\r
20 return (1 << WORD_SIZE - 1) - 1;
\r
21 if (res < -(1 << WORD_SIZE - 1))
\r
22 return -(1 << WORD_SIZE - 1);
\r
26 float from_fixed(int n)
\r
28 return n / (float)(1<<FIXED_POINT);
\r
31 void print_mem(mem m, int offset, int size, bool fixed)
\r
34 for(i = offset;i<offset+size;i++)
\r
37 printf("%0.4f", from_fixed(get_mem(m->id, i)));
\r
39 printf("%04hx", (short)get_mem(m->id, i));
\r
40 if ((i + 1) % WORDS_PER_LINE == 0)
\r
42 else if ((i + 1) % WORDS_PER_GROUP == 0)
\r
45 if (i % WORDS_PER_LINE != 0)
\r
53 /* Assign memories, at least for the first stage */
\r
54 input_a_re = alloc_mem(P0M0);
\r
55 input_a_im = alloc_mem(P1M0);
\r
56 input_b_re = alloc_mem(P2M0);
\r
57 input_b_im = alloc_mem(P3M0);
\r
58 output_a_re = alloc_mem(P0M1);
\r
59 output_a_im = alloc_mem(P1M1);
\r
60 output_b_re = alloc_mem(P2M1);
\r
61 output_b_im = alloc_mem(P3M1);
\r
63 /* TODO: Init memory and twiddles */
\r
64 for (i=0;i<SIZE/2;i++)
\r
66 set_mem(twiddle_re->id, i, to_fixed(cos(2*M_PI/SIZE*i)));
\r
67 set_mem(twiddle_im->id, i, to_fixed(sin(2*M_PI/SIZE*i)));
\r
70 for (i=0;i<SIZE;i++)
\r
72 int value = to_fixed(sin((float)i/SIZE*2*2*M_PI));
\r
75 set_mem(input_a_re->id, i, value);
\r
76 set_mem(input_a_im->id, i, 0);
\r
80 set_mem(input_a_re->id, i - SIZE / 2, value);
\r
81 set_mem(input_a_im->id, i - SIZE / 2, 0);
\r
89 print_mem(twiddle_re, 0, SIZE, true);
\r
91 print_mem(twiddle_im, 0, SIZE, true);
\r
92 printf("re(in_a)\n");
\r
93 print_mem(input_a_re, 0, SIZE, true);
\r
94 printf("re(in_b)\n");
\r
95 print_mem(input_b_re, 0, SIZE, true);
\r
96 printf("re(out_a)\n");
\r
97 print_mem(output_a_re, 0, SIZE, true);
\r
98 printf("im(out_a)\n");
\r
99 print_mem(output_a_im, 0, SIZE, true);
\r