MATLABfiltfilt
会进行前向后向滤波,即滤波、反转信号、再次滤波然后再次反转。显然这样做是为了减少相位滞后?使用这种过滤器的优点/缺点是什么(我想它会导致过滤器顺序的有效增加)。
filtfilt
总是使用而不是filter
(即仅前向过滤)会更好吗?是否有任何应用程序需要使用它并且不应该使用它?
MATLABfiltfilt
会进行前向后向滤波,即滤波、反转信号、再次滤波然后再次反转。显然这样做是为了减少相位滞后?使用这种过滤器的优点/缺点是什么(我想它会导致过滤器顺序的有效增加)。
filtfilt
总是使用而不是filter
(即仅前向过滤)会更好吗?是否有任何应用程序需要使用它并且不应该使用它?
您最好在频域中查看它。如果是输入序列和是滤波器的脉冲响应,那么第一次滤波器通过的结果是
和和的傅里叶变换和, 分别。时间倒转对应替换经过在频域中,所以在时间反转后我们得到
第二个过滤器通过对应于另一个乘法:
经过时间反转后,最终给出了输出信号的频谱
因为对于实值滤波器系数,我们有. 等式(1)表明,输出频谱是通过使用具有频率响应的滤波器进行滤波得到的,它是纯实值的,即它的相位为零,因此没有相位失真。
这就是理论。在实时处理中当然会有相当大的延迟,因为时间反转只有在您允许与输入块的长度相对应的延迟时才有效。但这并没有改变没有相位失真的事实,它只是输出数据的额外延迟。对于 FIR 过滤,这种方法并不是特别有用,因为您不妨定义一个新的过滤器并通过普通过滤得到相同的结果。将此方法与 IIR 滤波器一起使用会更有趣,因为它们不能具有零相位(或线性相位,即纯延迟)。
总共:
如果您有或需要 IIR 滤波器并且想要零相位失真,并且处理延迟没问题,那么这种方法很有用
如果处理延迟是一个问题,您不应该使用它
如果你有一个 FIR 滤波器,你可以很容易地计算一个新的 FIR 滤波器响应,这相当于使用这种方法。请注意,使用 FIR 滤波器始终可以实现精确的线性相位。
我发现这个视频非常非常有帮助(它详细说明了马特的回答)。
以下是视频中的一些关键想法:
x[n]
过滤它,反转结果,再次过滤,然后再次反转它(时间反转步骤要求所有数据都可用)。