使用FDAtool得到系数,由于是实验,我搞了个简单的巴特喔兹低通滤波器。 1, Fpass = 1,Fstop = 50,采样率1000Hz,通带最大幅度变化1dB,阻带最小幅度变化30dB. 得出的滤波器是最简单的1个2阶滤波器。所以我用一个single section表示。系数如下 double NUM[3] = { 0.0007626824721372, 0.001525364944274,0.0007626824721372 }; double DEN[3] = { 1, -1.920377688644, 0.9234284185322 }; 3.问题:使用1个50Hz的直流加直流作为输入,但是不知道输入幅度大小有没有要求? 我在VC上使用浮点实现。输入用1个0.8的直流加50Hz的正弦波 sinA = 0.8 + 0.1 * sin(PI * i / 10); 4.调整Xn和Yn的数据 void DataMovX(double *xn, int L, double ADC) { *(xn + 2) = *(xn +1); *(xn + 1) = *(xn + 0); *(xn + 0) = ADC; } 5.IIR函数 /* Function: 直接一型IIR滤波器实现
x: 输入数组 y: 输出数组 b: 滤波器分子 nb: 分子系数长度 a: 滤波器分母数组 na: 分母系数数组长度 */ double iir1(double *x, double *y, double *b, int nb, double *a, int na) { double yn = 0; double yn1 = 0; double yn2 = 0; int i,j;
for (i=0; i<nb; ++i) yn1+= b * x;
//yn1 *= 0.0007626824721372; for (j=1; j<na; ++j) yn2 += a[j] * y[j];
yn = yn1 - yn2;
return yn; }
|