当前位置:   article > 正文

Matlab的filtfilt函数解析与C++实现_零相位滤波器

零相位滤波器

0.前言

传统滤波(如Matlab的filter函数)会造成信号的延迟,延迟程度与滤波器的阶次有关,为了解决延迟问题,Matlab提供了filtfilt函数,该方法一般称为零相位滤波或双向滤波。
本文的目的是对Matlab中的filtfilt函数原理进行解析,并在C++中实现。

1.filtfilt函数的解析

参考Matlab中的filter函数和filtfilt函数,对零相位滤波原理进行解析。

1.1 主要流程

零相位滤波的主要流程如下:
零相位滤波流程

1.2 边界的延拓

为了改善边界效应,对原始信号数据进行延拓,即在首尾处增加数据点。
对于N阶的滤波器,单边延拓的数据长度为nfact =3* N。
延拓数据的计算方式如下:
数据延拓

1.3 边界效应的优化

滤波可以通过差分的方式实现,网上很多资料给出的计算公式如下:
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=0Nbjx(j)j=1Najy(j)
上述公式从i≥N开始计算起,对于i<N的y(i)则无法使用。
在Matlab中为了进一步优化边界效应,对滤波的算法进行了扩展,具体算法如下:
对于

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/236703
推荐阅读
相关标签