打印

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

[复制链接]
1698|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
snakeemail|  楼主 | 2008-8-18 15:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用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;
}

相关帖子

沙发
sjnh| | 2008-8-19 08:30 | 只看该作者

...

1:Fpass = 1,Fstop = 50,不用说巴特沃斯,就是一般的两阶滤波器都能做到,1阶是20倍频程,2阶40倍,你的才30

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

547

主题

1910

帖子

8

粉丝