Matlab中filter和conv的区别是什么?

20

我正在尝试计算一个LTI系统的输出。我遇到了两个不同的Matlab函数,它们都可以完成这项工作:filterconv。它们之间有什么区别?

4个回答

17

filter 可以处理FIR和IIR系统,而conv接受两个输入并返回它们的卷积结果。 因此conv(h,x)filter(h,1,x)将给出相同的结果。 在filter中的1表示滤波器的递归系数只是[1]。 但是,如果您有一个IIR滤波器,则不能使用conv。filter还可以返回滤波器状态,以便在后续调用中使用而不会产生滤波器瞬态。

有关详细信息,请参见convfilter文档。


据我所读,如果它是IIR系统并且使用conv,那么只有在样本数量等于 h 的长度时才会得到正确的输出。这正确吗? - nikos
2
考虑滤波器H(z)=[1-2z^(-1)+z^(-2)]/[1-z^(-1)],如果将输入设置为x=[1 0 0 0],使用conv([1,-2,1],x)您将得到结果[1 -2 1 0],使用filter([1,-2,1],[1,-1],x)您将得到结果[1 -1 0 0] - mtrw
8
实际上,conv(b,x)filter(b,1,x)并不是完全相同的。filter会输出与x相同长度的结果,而conv会输出长度为length(x)+length(b)-1的结果。 - LWZ

14

conv(x,b) 执行完整的卷积操作。结果的长度为 length(x)+ length(b)-1

filter(b,[1],x) 产生与 x 长度相同的输出。它不会清空滤波器的延迟线。

假设 x 是一个行向量。令 x0 = [x zeros(1,length(b)-1)]; 现在 filter(b,[1],x0) 就跟 conv(x,b) 一样了。这是因为额外的 0 被用来清空延迟线。

哪个更合理?这取决于你需要什么!


0
如果应用了过滤器,结果将具有与应用的过滤器相同的维度。在应用卷积时,会减小输入的维度并应用过滤器。

0

一个相关的答案是Python中的情况。如上所述,对于FIR滤波器,函数scipy.signal.lfilternumpy.convolve在边界效应上执行相同的操作。

假设len(x) > len(h)。当使用numpy.convolve(h,x,mode='same')时,会得到一个长度为len(x)的向量,但是用零对称地填充了它。 然而,当使用`scipy.signal.lfilter`时,零填充不是对称的,而是单侧的!

可以检查一下

import numpy as np
from scipy.signal import lfilter

h = np.array([1, 2, 1])
x = np.array([1.0, 2.0, 3.0, 4.0, 5.0])

fx = lfilter(h, 1, x)
cx = np.convolve(h, x, mode='full')[0:len(x)]

print(fx == cx)

给出全部为真(True)。

这个想法是,该模式在两侧最大限度地用零进行填充,从而得到一个大小为 len(x) + len(h) - 1 的向量(参见Numpy文档),你需要做的就是修剪末尾多余的元素。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接