MATLAB的filtfilt有什么优势

信息处理 matlab 过滤器 无限脉冲响应 理论
2021-12-20 22:04:51

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

filtfilt总是使用而不是filter(即仅前向过滤)会更好吗?是否有任何应用程序需要使用它并且不应该使用它?

2个回答

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

X(ejω)H(ejω)

X(ejω)H(ejω)的傅里叶变换x[n]h[n], 分别。时间倒转对应替换ω经过ω在频域中,所以在时间反转后我们得到

X(ejω)H(ejω)

第二个过滤器通过对应于另一个乘法H(ejω)

X(ejω)H(ejω)H(ejω)

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

(1)Y(ejω)=X(ejω)H(ejω)H(ejω)=X(ejω)|H(ejω)|2

因为对于实值滤波器系数,我们有H(ejω)=H(ejω). 等式(1)表明,输出频谱是通过使用具有频率响应的滤波器进行滤波得到的|H(ejω)|2,它是纯实值的,即它的相位为零,因此没有相位失真。

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

总共:

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

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

  • 如果你有一个 FIR 滤波器,你可以很容易地计算一个新的 FIR 滤波器响应,这相当于使用这种方法。请注意,使用 FIR 滤波器始终可以实现精确的线性相位。

我发现这个视频非常非常有帮助(它详细说明了马特的回答)。

以下是视频中的一些关键想法:

  • 零相位不会导致相位失真,但会导致非因果滤波器。这意味着如果数据在收集时被过滤,这将不是一个选项(仅对我们可以后处理的存储数据有效)。在此处输入图像描述
  • 当你实现一个非因果滤波器时,瞬态会向前和向后模糊(例如,如果我们想要一个 2dB 的纹波,我们将使用滤波器进行向前和向后运行的事实意味着我们需要每个这些有1dB)。在此处输入图像描述
  • 使用离散时间傅里叶变换的时间反转属性。 在此处输入图像描述
  • 由 FILTFILT 引起的有效频率响应是一个方向的幅度的平方。您获取输入信号,x[n]过滤它,反转结果,再次过滤,然后再次反转它(时间反转步骤要求所有数据都可用)。在此处输入图像描述