The OAF c-code crashed because of the segmentation fault. We've created arrays of static variables
static int pst[nDOF];
static int isFirst[nDOF];
static adaptive_filter_state state[nDOF];
an tried to give in the to the ITERATE - function their current values
datOut[i] = ITERATE(iterateDatIn, iterateNIn, pst[i], isFirst[i], state[i]);
ITERATE function was declared as
double ITERATE(double *datIn, int nIn, int pst, int isFirst, adaptive_filter_state state) {}
Here the segmentation fault comes out. Static variables are meant to be created only once but here in the function ITERATE we try to create them once again in a local form, because we give the variables by their values.
Instead, we must give the variables by their pointer, then the variables won't be created again during the function call and will be changed in the function.
datOut[i] = ITERATE(iterateDatIn, iterateNIn, &pst[i], &isFirst[i], &state[i]);
double ITERATE(double *datIn, int nIn, int *pst_s, int *isFirst_s, adaptive_filter_state *state_s)
In order not to change significantly Matt's code and use his notations we can add in the ITERATE function
int pst = *pst_s;
int isFirst = *isFirst_s;
static adaptive_filter_state state;
state = *state_s;
..................................Matt's code.........................................
*pst_s = pst;
*isFirst_s = isFirst;
*state_s = state;
I've tested the program, now it does not give any segmentation faults and conserves memory that it uses. |