dol: initial dol commit
[jump.git] / dol / examples / example7 / src / filter.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include "filter.h"
4
5 /**
6  * Init.
7  */
8 void filter_init(DOLProcess *p)
9 {
10   int k;
11   p->local->process_index = GETINDEX(0);
12
13   srand(0); //initialize random number generator
14   for (k = 0; k < p->local->process_index; k++)
15     rand();
16
17   sprintf(p->local->id, "filter_%d",
18           GETINDEX(0));
19   p->local->first_invocation = 1;
20   //generate a random filter coefficient between -1 and 1
21   p->local->filter_coefficient = ((float) (rand() % 21) - 10)/10.0;
22   p->local->zero = 0.0;
23   printf("init %s: filter coefficient = %+2.1f\n",
24          p->local->id, p->local->filter_coefficient);
25 }
26
27 /**
28  * Filter.
29  */
30 int filter_fire(DOLProcess *p)
31 {
32   //behaviour of the top filter stage
33   if (p->local->process_index == 0) {
34     if (p->local->first_invocation) {
35       DOL_read((void*)PORT_INA, &(p->local->inA), sizeof(float), p);
36       p->local->out = p->local->inA;
37       p->local->inB = 0.0;
38       p->local->first_invocation = 0;
39     }
40     else {
41       DOL_read((void*)PORT_INA, &(p->local->inA), sizeof(float), p);
42       DOL_read((void*)PORT_INB, &(p->local->inB), sizeof(float), p);
43       p->local->out = p->local->inB + p->local->inA;
44     }
45
46     DOL_write((void*)PORT_OUTA, &(p->local->out), sizeof(float), p);
47     DOL_write((void*)PORT_OUTB, &(p->local->out), sizeof(float), p);
48
49     printf("%8s: inA: %6.4f, inB: %6.4f, outA = outB: %6.4f\n",
50            p->local->id, p->local->inA, p->local->inB, p->local->out);
51   }
52   //behaviour of the intermediate filter stages
53   else {
54     if (p->local->first_invocation) {
55       DOL_read((void*)PORT_INA, &(p->local->inA), sizeof(float), p);
56       p->local->out = p->local->filter_coefficient * p->local->inA;
57       p->local->inB = 0.0;
58       p->local->first_invocation = 0;
59     }
60     else {
61       DOL_read((void*)PORT_INA, &(p->local->inA), sizeof(float), p);
62       DOL_read((void*)PORT_INB, &(p->local->inB), sizeof(float), p);
63       p->local->out = p->local->inB + p->local->filter_coefficient
64               * p->local->inA;
65     }
66
67     if (p->local->process_index < N - 1) {
68       DOL_write((void*)PORT_OUTA, &(p->local->inA), sizeof(float), p);
69       DOL_write((void*)PORT_OUTB, &(p->local->out), sizeof(float), p);
70     }
71     //behaviour of the bottom filter stage
72     else {
73       DOL_write((void*)PORT_OUTA, &(p->local->zero), sizeof(float), p);
74       DOL_write((void*)PORT_OUTB, &(p->local->out), sizeof(float), p);
75     }
76
77     printf("%8s: inA: %6.4f, inB: %6.4f, outA: %6.4f, outB: %6.4f\n",
78            p->local->id, p->local->inA, p->local->inB, p->local->inA,
79            p->local->out);
80   }
81
82   return 0;
83 }