IIR波器相位补偿

一.数字滤波器分类

 系统的传递函数可设定为   H(Z)=\frac{Y(z)}{X(Z)}= \frac{\sum_{k=0}^{M} b_{k}z^{-k}}{1-\sum_{k=1}^{M} a_{k}z^{-k}},其中常系数线性方程为:y(n)=\sum_{k=1}^{M}a_{k}y(n-k)+\sum_{k=0}^{M}b_{k}x(n-k)

         根据该方程滤波器可分为两类滤波器,分别为FIR滤波器和IIR滤波器。

        其中FIR滤波器输出只跟以前的输入信号有关,其结构可写成H(z)=\sum_{k=0}^{M}b_{k}z^{-k} 。

         IIR滤波器的输出不仅跟以前的输入信号有关,而且和以前的输出有关,其结构函数可以写成

H(Z)=\frac{\sum_{k=0}^{M}b_{r}z^{-k}}{\sum_{k=0}^{M}a_{r}z^{-k}}

        其中FIR滤波器相位是线性的,其相位延迟为\frac{M-1}{2*f_{s}},而IIR滤波器的幅频特性精度高,但是相位是非线性的。

二.IIR滤波器相位补偿原理

        IIR滤波器相位补偿原理通过matlab的filtfilt函数。

        滤波器的变换,其时域的卷积为:

        y_{1}(n)=x(n)*h(n)

        Z域的变换为:

        Y_{1}(Z)=X(Z)\times H(Z)

        对y(n)的数据进行反转则,y_{2}=y_{1}(N-1-n)

        

        并通过滤波器y_{3}(n)=y_{2}*h(n),则其Z域变换为:

    Y_{3}(Z)=H(Z)\times Y_{2}(Z)=H(Z)\times Y_{1}(Z^{^{-1}})\times Z^{-(N-1)},

        并对y_{3}(n)再次进行反转,则可得到:

y_{4}=y_{3}(N-1-n)

        对其变换可得:

Y_{3}(Z^{^{-1}})\times Z^{-(N-1)}=H(Z^{-1})\times Y_{1}(Z)\times Z^{(N-1)}\times Z^{-(N-1)}=X(Z)\times H(Z)\times H(Z^{-1})

        由于IIR滤波器理论上理解为理想滤波器,其:

\left | H(Z) \right |=1,且相位\angle H(Z)\times H(Z^{-1})=0,则认为其相位无延迟。

三.IIR滤波器实现

        IIR滤波器通过matlab例程代码:

fs = 100;
t = 0:1/fs:1;
x = sin(2*pi*t*3)+.25*sin(2*pi*t*40);
[b,a] = butter(6,20/(fs/2));

y = filtfilt(b,a,x);
yy = filter(b,a,x);

plot(t,x,t,y,t,yy)
legend('Original','filtfilt','filter')

        IIR滤波器代码通过C实现:

    for (i = 0; i < 3; i++)
	{
		x[1] = 0;
		x[2] = 0;
		y[1] = 0;
		y[2] = 0;
	}
	for (i = 0; i < NUMSIZE; i = i + 1)
	{
		result = a[0] * pInput[i] + a[1] * x[1] + a[2] * x[2] - b[1] * y[1] - b[2] * y[2];
		x[2] = x[1];
		x[1] = pInput[i];

		y[2] = y[1];
		y[1] = result;
		pOutput1[i] = result;
	}
	for (i = 0; i < NUMSIZE; i = i + 1)
	{
		
		pOutput2[NUMSIZE -1-i] = pOutput1[i];
	}
	for (i = 0; i < 3; i++)
	{
		x[1] = 0;
		x[2] = 0;
		y[1] = 0;
		y[2] = 0;
	}
	for (i = 0; i < NUMSIZE; i = i + 1)
	{
		result = a[0] * pOutput2[i] + a[1] * x[1] + a[2] * x[2] - b[1] * y[1] - b[2] * y[2];
		x[2] = x[1];
		x[1] = pOutput2[i];

		y[2] = y[1];
		y[1] = result;
		pOutput3[i] = result;
	}
	for (i = 0; i < NUMSIZE; i = i + 1)
	{

		pOutput4[NUMSIZE - 1 - i] = pOutput3[i];
	}

并通过gunplot进行画图:

更多相关内容请关注振动噪声公众号。

 

  • 5
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大风起兮云飞扬——飞云之下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值