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