MATLAB的filtfilt有什么优势


30

MATLAB filtfilt进行向前-向后过滤,即过滤,反转信号,再次过滤然后再次反转。显然这样做是为了减少相位滞后?使用这种过滤的优缺点是什么(我想这会导致过滤顺序的有效增加)。

使用filtfilt始终代替filter(即,仅前向过滤)会更好吗?是否有任何应用程序需要使用它,而不应该使用它?


不要对音频使用零相位滤波,因为它会导致听起来很奇怪的“预振铃”。最小相位滤波更为自然。ccrma.stanford.edu/~jos/filters/Linear_Phase_Really_Ideal.html
endolith,2014年

Answers:


34

您最好在频域中查看它。如果是输入序列,是滤波器的脉冲响应,则第一次滤波器通过的结果为h [ n ]X[ñ]H[ñ]

XËĴωHËĴω

用和对和进行傅立叶变换。时间反转对应于替换的在频域,让时间逆转后,我们得到ħ Ë Ĵ ωX [ Ñ ] ħ [ Ñ ] ω - ωXËĴωHËĴωX[ñ]H[ñ]ω-ω

XË-ĴωHË-Ĵω

第二遍过滤器对应于另一个与H(e ^ {j \ omega})的乘法HËĴω

XË-ĴωHËĴωHË-Ĵω

经过时间反转后最终给出了输出信号的频谱

(1)ÿËĴω=XËĴωHËĴωHË-Ĵω=XËĴω|HËĴω|2

因为对于实值滤波器系数,我们有。公式(1)显示,输出频谱是通过使用频率响应为的滤波器进行滤波而获得的,该滤波器是纯实数值,即其相位为零,因此存在没有相位失真。HË-Ĵω=HËĴω|HËĴω|2

这是理论。在实时处理中,当然会有很大的延迟,因为只有当您允许与输入块的长度相对应的延迟时,时间反转才起作用。但是,这不会改变没有相位失真的事实,只是输出数据的额外延迟。对于FIR过滤,此方法并不是特别有用,因为您还可以定义一个新的过滤器并获得与普通过滤相同的结果。将此方法与IIR滤波器一起使用会更有趣,因为它们不能具有零相位(或线性相位,即纯延迟)。H^[ñ]=H[ñ]H[-ñ]

总共:

  • 如果您有或需要IIR滤波器,并且想要零相位失真,并且处理延迟没有问题,那么此方法很有用

  • 如果处理延迟是一个问题,则不应使用它

  • 如果您有FIR滤波器,则可以轻松计算出一个新的FIR滤波器响应,等效于使用此方法。注意,使用FIR滤波器,始终可以实现完全线性的相位。


我创建了一个名为的标签maximum-aposteriori-estimation。您能否将其重命名为maximum-a-posteriori-estimation?我误会了-之后的事情a。谢谢。
Royi

15

我发现这段视频非常非常有用(详细介绍了Matt的回答)。

这是视频中的一些关键思想:

  • 零相位不会导致相位失真,但会导致无因果的滤波器。这意味着,如果在收集数据时对其进行过滤,这将不是一个选择(仅对我们可以进行后处理的存储数据有效)。在此处输入图片说明
  • 当您实现一个非因果滤波器时,瞬态会变得前后模糊(例如,如果我们想要一个2dB的纹波,那么我们将要使用滤波器进行正向和反向运行的事实意味着我们将需要每个这些有1dB)。在此处输入图片说明
  • 使用离散时间傅立叶变换的时间反转属性。 在此处输入图片说明
  • 由FILTFILT引起的有效频率响应是一个方向的幅度的平方。您可以对输入信号进行x[n]滤波,过滤,反转结果,再次过滤并再次反转(时间反转步骤要求所有数据都可用)。在此处输入图片说明
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.