19

我正在尝试计算LTI 系统的输出。我遇到了两个不同的 Matlab 函数,它们应该适合这项工作:filterconv. 他们两个有什么区别?

4

4 回答 4

17

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

有关详细信息,请参阅转换过滤器文档。

于 2011-12-06T17:02:02.327 回答
12

conv(x,b)执行完整的卷积。结果的长度是length(x)+ length(b)-1filter(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.lfilternumpy.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 回答