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 被用来清空延迟线。
哪个更合理?这取决于你需要什么!
一个相关的答案是Python中的情况。如上所述,对于FIR滤波器,函数scipy.signal.lfilter
和numpy.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文档),你需要做的就是修剪末尾多余的元素。
conv
,那么只有在样本数量等于h
的长度时才会得到正确的输出。这正确吗? - nikosH(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]
。 - mtrwconv(b,x)
和filter(b,1,x)
并不是完全相同的。filter
会输出与x
相同长度的结果,而conv
会输出长度为length(x)+length(b)-1
的结果。 - LWZ