Цитата(sysel @ Apr 26 2010, 11:49)

Поделитесь, пожалуйста, рабочим кодом.
Код
typedef struct structIIR{
double* b;
int lb;
double* a;
int la;
}IIR, *PIIR;
int conv(double *a, int la, double *b, int lb, double *c){
if((!a)||(!b)||(!c)||(!la)||(!lb))
return 0;
memset(c, 0, (la+lb-1)*sizeof(double));
for(int i = 0; i < la; i++){
for(int j = 0; j < lb; j++)
c[i+j] += a[i]*b[j];
}
return 1;
}
int iir_filter(PIIR piir, double *s, int n){
double* c = (double*)malloc(piir->la*sizeof(double));
double* d = (double*)malloc(piir->lb*sizeof(double));
double* v = (double*)malloc((piir->lb+n-1)*sizeof(double));
for(int i =0; i<piir->la; i++)
c[i] = piir->a[i]/piir->a[0];
for(int i =0; i<piir->lb; i++)
d[i] = piir->b[i]/piir->a[0];
conv(d,piir->lb,s,n,v);
s[0] = v[0];
for(int i = 1; i<n; i++){
int k = 1;
s[i] = v[i];
while(((i-k)>=0)&&(k<piir->la)){
s[i]-=c[k]*s[i-k];
k++;
}
}
free(c);
free(d);
free(v);
return 1;
}
Коэффициенты пишем в структуру IIR и указатель на нее в функцию фильтрации. А вообще
вот dll весит 20 кБ умеет считать фильтры аналогично матлабу. Есть документация с примерами.
Сообщение отредактировал bahurin - Apr 26 2010, 10:07