【发布时间】:2012-01-14 06:41:08
【问题描述】:
我正在尝试计算LTI system 的输出。我遇到了两个不同的 Matlab 函数,它们应该适合这项工作:filter 和 conv。两者有什么区别?
【问题讨论】:
标签: matlab signal-processing convolution
我正在尝试计算LTI system 的输出。我遇到了两个不同的 Matlab 函数,它们应该适合这项工作:filter 和 conv。两者有什么区别?
【问题讨论】:
标签: matlab signal-processing convolution
【讨论】:
conv,我将仅针对等于 @ 长度的样本量获得正确的输出987654331@。对吗?
H(z) = [1 - 2z^-1 + z^-2]/[1 - z^-1]。如果您将输入设置为x = [1 0 0 0],您将获得[1 -2 1 0] 与conv([1,-2,1],x) 和[1 -1 0 0] 与filter([1,-2,1],[1,-1],x) 的结果。
conv(b,x) 和filter(b,1,x) 并不完全相同。 filter 将为您提供与x 相同长度的输出,而conv 将为您提供长度为length(x)+length(b)-1 的输出。
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)
给出所有“真”。
这个想法是,该模式最大程度地在两侧填充零,给出一个大小为len(x) + len(h) - 1(参见Numpy documentation)的向量,您需要做的是最后修剪冗余元素。
【讨论】: