我正在尝试计算LTI 系统的输出。我遇到了两个不同的 Matlab 函数,它们应该适合这项工作:filter
和conv
. 他们两个有什么区别?
问问题
27562 次
4 回答
12
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 用于刷新延迟线。
哪一个更合理?这取决于你需要什么!
于 2012-03-28T13:51:34.177 回答
0
一个相关的答案是 Python 中的情况。如上所述,对于 FIR 过滤器的功能scipy.signal.lfilter
并numpy.convolve
执行相同的操作直到边界效应。
假设len(x) > len(h)
。当使用numpy.convolve(h,x,mode='same')
one 时,得到一个向量,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)
给出所有“真”。
这个想法是,模式完全填充两侧最大程度地为零,给出一个大小的向量len(x) + len(h) - 1
(参见Numpy 文档),您需要做的是最后修剪冗余元素。
于 2021-08-19T09:56:56.163 回答
0
如果应用过滤器,结果将具有与应用过滤器相同的尺寸。在应用卷积时,会减少应用过滤器的输入维度。
于 2022-02-17T16:36:23.343 回答