/*IIR6BPC.C -REAL-TIME 6th-ORDER IIR BANDPASS FILTER*/ #include "aiccomc.c" /*include AIC comm routines*/ #include "iir6coef.h" /*coefficients file */ float dly[stages][2] = {0}; /*delay samples */ int AICSEC[4] = {0x162C,0x1,0x3872,0x67}; /*AIC data*/ int data_in, data_out; float IIR(int *IO_in, int *IO_out, int n, int len) { int i, loop = 0; float un, yn, input; while (loop < len) { asm(" IDLE "); ++loop; input = *IO_in; for (i = 0; i < n; i++) { un = input - b[i][0] * dly[i][0] - b[i][1] * dly[i][1]; yn = a[i][2]*dly[i][1] + a[i][1]*dly[i][0] + a[i][0]*un; dly[i][1] = dly[i][0]; dly[i][0] = un; input = yn; } *IO_out = yn; } } void c_int05() { PBASE[0x48] = data_out << 2; data_in = PBASE[0x4C] << 16 >> 18; } main() { #define length 345 int *IO_OUTPUT, *IO_INPUT; IO_INPUT = &data_in; IO_OUTPUT = &data_out; AICSET_I(); for (;;) IIR((int *)IO_INPUT, (int *)IO_OUTPUT, stages, length); }