原创 50hz IIR 滤波的实现

2022-5-18 16:31 2916 19 4 分类: MCU/ 嵌入式 文集: matlab

使用fdatool Fs 依据采样率,Apass 选择衰减率,如果选为30db,即为衰减1000倍。并不是衰减率越高越好。而是够用就好。

选择完毕后,按Design Filter 即可生成需要的IIR 50hz陷波器。

在界面中也可以查看幅频特性和相频特性。从相频特性中可以看出,小于50HZ的信号会滞后,而大于50hz的信号会超前。

 

将陷波器参数导出到Workspace,即可看到系数。

 

>> Num

Num =

0.996701045864890 -1.993292792228301 0.996701045864890

>> Den

Den =

1.000000000000000 -1.993292792228301 0.993402091729780

分别是传递函数的多项式系数,假设输入为x,输出为Y。b对应Num,a对应Den

 

对应的差分方程为:

Y[n] = (b[0]*x[n]+b[1]*x[n-1]+b[2]*x[n-2]-a[1]*Y[n-1]-a[2]*Y[n-2])/a[0];

注意:在matlab中,向量的索引号是从1开始,而c语言中数组的索引是从0开始的。个人认为从0开始比较科学。

因为系数已经规一化,所以最后的 /a[0]是可以省略的。

C代码如下:

const double iir_b[] = {0.996701045864890,  -1.993292792228301,   0.996701045864890};

const double iir_a[] = {1.000000000000000,  -1.993292792228301,   0.993402091729780};

double Y[LEN];

void iir50hz(int32_t *p,int16_t len){

       int16_t i;

       Y[0] = 0; //初始值选取有讲究

       Y[1] = 0;

       for(i = 2;i

              Y = iir_b[0]*p+iir_b[1]*p[i-1]+iir_b[2]*p[i-2] -iir_a[1]*Y[i-1]-iir_a[2]*Y[i-2];

       }

}

 

对一段50HZ的数据(起始相位并不一样)进行滤波,理想值滤波结果应为直线。实际结果,IIR滤波在开始段有波动。而直接消去法存在误差。




 

作者: southcreek, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-408807.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

文章评论0条评论)

登录后参与讨论
我要评论
0
19
关闭 站长推荐上一条 /2 下一条