赞
踩
传统滤波(如Matlab的filter函数)会造成信号的延迟,延迟程度与滤波器的阶次有关,为了解决延迟问题,Matlab提供了filtfilt函数,该方法一般称为零相位滤波或双向滤波。
本文的目的是对Matlab中的filtfilt函数原理进行解析,并在C++中实现。
参考Matlab中的filter函数和filtfilt函数,对零相位滤波原理进行解析。
零相位滤波的主要流程如下:
为了改善边界效应,对原始信号数据进行延拓,即在首尾处增加数据点。
对于N阶的滤波器,单边延拓的数据长度为nfact =3* N。
延拓数据的计算方式如下:
滤波可以通过差分的方式实现,网上很多资料给出的计算公式如下:
y
(
i
)
=
∑
j
=
0
N
b
j
x
(
j
)
−
∑
j
=
1
N
a
j
y
(
j
)
y(i) = \sum_{j=0}^N b_{j}x(j)-\sum_{j=1}^N a_{j}y(j)
y(i)=j=0∑Nbjx(j)−j=1∑Najy(j)
上述公式从i≥N开始计算起,对于i<N的y(i)则无法使用。
在Matlab中为了进一步优化边界效应,对滤波的算法进行了扩展,具体算法如下:
对于
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。