iir滤波器c语言程序,请教C语言做iir滤波器问题

在轴承故障检测中,使用C语言编程遇到iir巴特沃兹滤波问题。虽然C语言和LabVIEW的频域结果相同,但在时域上存在显著差异。C语言的滤波程序采用了双线性变换,导致时域表现不正常。文章探讨了可能的原因并展示了C语言滤波程序的代码细节。
摘要由CSDN通过智能技术生成

最近在做轴承故障检测,C语言编程,在滤波部分遇到了问题,由于本人对滤波知之甚少,想求助:

56860a9f6a056cb72852af58e4093133.png

这是测得的振动信号,在这个基础上我分别用C语言与LabVIEW对其做了滤波,都是用iir巴特沃兹滤波,频域上两者结果一样(我就不放图了),但时域差距很大。

60ee2fef080a756037b7e0741bcec5a6.png

这是LabVIEW做得滤波之后的时域图像看上去很正常,iir巴特沃兹滤波3阶

431108054b00ee6c99b8c5adfb9f925a.png

这是C语言同样采用iir巴特沃兹滤波的时域结果,非常不像。为什么会出现这样的问题。C语言是用的双线性变换

void iirbcf(short ifilt,short band,short ns,short n,double f1,double f2,double f3,double f4,double db,double b[],double a[])

{

short k;

double omega,lamda,epslon,fl,fh;

double d[5],c[5];

if((band==1)||(band==4)) fl=f1;

if((band==2)||(band==3)) fl=f2;

if(band<=3) fh=f3;

if(band==4) fh=f4;

if(ifilt<3)

{ switch (band)

{ case 1:

case 2:

{ omega=warp(f2)/warp(f1);

break;

}

case 3:

{ omega=omin(bpsub(warp(f1),fh,fl),bpsub(warp(f4),fh,fl));

break;

}

case 4:

{ omega=omin(1.0/bpsub(warp(f2),fh,fl),1.0/bpsub(warp(f3),fh,fl));}

}

lamda=pow(10.0,(db/20.0));

epslon=lamda/cosh(2*ns*cosh1(omega));

}

for(k=0;k

{ switch

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值