Приведу оптимизированную версию кода, которая "хавает" как floating-point, так и fixed-point IIR из С-Header-ов, сгенерированных FDATOOL из MATLABa
Код
#include "fdacoefs.h"
typedef double real;
#define Fs 3600 // Частота сэмплирования
#define IIR_hist_size 5 // Кол-во ячеек памяти в реализации фильтра
real History[IIR_hist_size];
real IIR_filter (real X, real* Hist){
for (int i=0; i<MWSPT_NSEC; i++){
int jmax = ((NL[i]>DL[i])?(NL[i]):(DL[i]))-1;
if (jmax>0){
// Блок фильтра из каскада
real W = 0;
for (int j=0; j<jmax; j++){
W += DEN[i][j+1] * Hist[j];
};
W = X - W;
W *= (1/DEN[i][0]);
X = W * NUM[i][0];
for (int j=0; j<jmax; j++){
X += NUM[i][j+1] * Hist[j];
};
for (int j=1; j<jmax; j++){
Hist[j] = Hist[j-1];
};
Hist[0] = W;
Hist += jmax;
} else if (jmax==0){
// Блок "Gain" между каскадами фильтра
X *= NUM[i][0] * (1/DEN[i][0]);
};
};
return X;
};
int main(){
// Обнуляем ячейки памяти
for (int i=0; i<IIR_hist_size; i++){
History[i]=0;
};
real X,Y,F;
F = 10.0; // 10 Гц
F=2*CONST_PI*F/(real)Fs;
for (int i=0; i<1000000; i++){
X=cos(F*(real)i);
Y=IIR_filter (X,History);
};
return 0;
}