使用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条评论)
登录后参与讨论