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

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

评论

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

#1 楼

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

$$ X(e ^ {j \ omega})H(e ^ {j \ omega})$$

以及$ X(e ^ {j \ omega})$和$ H(e ^ {j \ omega})$分别对$ x [n] $和$ h [n] $进行傅立叶变换。时间反转对应于在频域中用$-\ omega $替换$ \ omega $,因此在时间反转之后,我们得到

$$ X(e ^ {-j \ omega})H( e ^ {-j \ omega})$$

第二个过滤器遍历与$ H(e ^ {j \ omega})$的另一个乘法相对应:

$ $ X(e ^ {-j \ omega})H(e ^ {-j \ omega})H(e ^ {-j \ omega})$$

经过时间反转后,最终得到对于输出信号的频谱

$$ Y(e ^ {j \ omega})= X(e ^ {j \ omega})H(e ^ {j \ omega})H( e ^ {-j \ omega})=
X(e ^ {j \ omega})| H(e ^ {j \ omega})| ^ 2 \ tag {1} $$

因为实值滤波器系数为$ H(e ^ {-j \ omega})= H ^ {**(e ^ {j \ omega})$。等式(1)显示,通过使用频率响应为$ | H(e ^ {j \ omega})| ^ 2 $的滤波器进行滤波获得输出频谱,该滤波器是纯实数值,即相位为零,因此没有相位失真。

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

总而言之:


如果您有或需要一个IIR滤波器,并且想要零相位失真,并且处理延迟没有问题,那么此方法很有用
如果处理延迟是一个问题,则不应该使用它。
如果您有FIR滤波器,则可以轻松计算出一个新的FIR滤波器响应,等效于使用此方法。请注意,使用FIR滤波器始终可以实现完全线性的相位。


评论


$ \ begingroup $
我创建了一个名为maximum-aposteriori-estimation的标签。您能否将其重命名为最大后验估计?错误地我忘了-之后。谢谢。
$ \ endgroup $
–罗伊
17-09-27在12:39

#2 楼

我发现该视频非常非常有用(详细说明了Matt的回答)。

视频中有一些关键思想:


零相将不会导致相位失真,但会导致无因果的滤波器。这意味着,如果在收集数据时对其进行过滤,这将不是一个选项(仅对可以进行后处理的存储数据有效)。

当您实现非因果滤波器时,瞬态会变得前后模糊(例如,如果我们想要2dB的纹波,我们将使用滤波器意味着我们希望每个都具有1dB)。

利用离散时间傅立叶变换的时间反转特性。方向,平方。取输入信号x[n],对其进行滤波,对结果进行反转,再次对其进行滤波,然后再次对其进行反转(时间反转步骤要求所有数据都可用)。