ec56b825dadf896b7f6f10ad7dd4962d735df423
[jump.git] / dol / examples / example5 / src / fft2.c
1 #include <stdio.h>
2 #include <math.h>
3 #include "fft2.h"
4
5 /**
6  * Determines the twiddle factor of this 2-point FFT based on the
7  * indices of the process.
8  */
9 void fft2_init(DOLProcess *p)
10 {
11   const float PI = 2.0 * asin(1.0);
12   int layer_index = GETINDEX(0);
13   int process_index = GETINDEX(1);
14   float exponent = 2.0 * PI *
15           (float)(process_index % (1 << layer_index)) /
16           (float)(1 << (layer_index + 1));
17
18   sprintf(p->local->id, "FFT2_%d_%d",
19           GETINDEX(0),
20           GETINDEX(1));
21   p->local->twiddle_factor.real = cos(exponent);
22   p->local->twiddle_factor.imag = -sin(exponent);
23
24   printf("%15s: twiddle_factor %9f + j * %9f\n",
25           p->local->id,
26           p->local->twiddle_factor.real,
27           p->local->twiddle_factor.imag);
28 }
29
30 /**
31  * Computes 2-point FFT.
32  */
33 int fft2_fire(DOLProcess *p)
34 {
35   DOL_read((void*)PORT_INA, &(p->local->inA), sizeof(ComplexNumber), p);
36   DOL_read((void*)PORT_INB, &(p->local->inB), sizeof(ComplexNumber), p);
37
38   p->local->rotated_inB.real = p->local->inB.real
39            * p->local->twiddle_factor.real
40            - p->local->inB.imag
41            * p->local->twiddle_factor.imag ;
42   p->local->rotated_inB.imag = p->local->inB.real
43            * p->local->twiddle_factor.imag
44            + p->local->inB.imag
45            * p->local->twiddle_factor.real;
46
47   p->local->outA.real = p->local->inA.real
48            + p->local->rotated_inB.real;
49   p->local->outA.imag = p->local->inA.imag
50            + p->local->rotated_inB.imag;
51
52   p->local->outB.real = p->local->inA.real
53            - p->local->rotated_inB.real;
54   p->local->outB.imag = p->local->inA.imag
55            - p->local->rotated_inB.imag;
56
57   DOL_write((void*)PORT_OUTA, &(p->local->outA), sizeof(ComplexNumber), p);
58   DOL_write((void*)PORT_OUTB, &(p->local->outB), sizeof(ComplexNumber), p);
59
60   /*
61   printf("%15s: ", p->local->id);
62   printf("%9f + j * %9f, %9f + j * %9f => %9f + j * %9f, %9f + j * %9f\n",
63           p->local->inA.real,
64           p->local->inA.imag,
65           p->local->inB.real,
66           p->local->inB.imag,
67           p->local->outA.real,
68           p->local->outA.imag,
69           p->local->outB.real,
70           p->local->outB.imag);
71   */
72
73   DOL_detach(p);
74   return -1;
75 }