IIR滤波器编程后遇到问题.

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

...

1:Fpass&nbsp;=&nbsp;1,Fstop&nbsp;=&nbsp;50,不用说巴特沃斯,就是一般的两阶滤波器都能做到,1阶是20倍频程,2阶40倍,你的才30<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

547

主题

1910

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部

547

主题

1910

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部