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 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
17 int to_fixed(float n)
\r
19 int res = (int)(n * (1 << FIXED_POINT));
\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
28 float from_fixed(int n)
\r
30 return n / (float)(1<<FIXED_POINT);
\r
33 void print_mem(mem m, int offset, int size, bool fixed)
\r
36 for(i = offset;i<offset+size;i++)
\r
39 printf("%0.4f", from_fixed(get_mem(m->id, i)));
\r
41 printf("%04hx", (short)get_mem(m->id, i));
\r
42 if ((i + 1) % WORDS_PER_LINE == 0)
\r
44 else if ((i + 1) % WORDS_PER_GROUP == 0)
\r
47 if (i % WORDS_PER_LINE != 0)
\r
56 /* TODO: Init memory and twiddles */
\r
57 for (i=0;i<SIZE/2;i++)
\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
63 for (i=0;i<SIZE;i++)
\r
65 int value = to_fixed(sin((float)i/SIZE*2*2*M_PI));
\r
68 set_mem(input_a_re->id, i, value);
\r
69 set_mem(input_a_im->id, i, 0);
\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
82 print_mem(twiddle_re, 0, SIZE, true);
\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