【问题标题】:What is the difference between filter and conv in Matlab?Matlab中的filter和conv有什么区别?
【发布时间】:2012-01-14 06:41:08
【问题描述】:

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

【问题讨论】:

    标签: matlab signal-processing convolution


    【解决方案1】:

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

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

    【讨论】:

    • 就我所读到的而言,如果它是一个 IIR 系统并且我使用 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 的输出。
    【解决方案2】:

    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 用于刷新延迟线。

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

    【讨论】:

      【解决方案3】:

      一个相关的答案是 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)
      

      给出所有“真”。

      这个想法是,该模式最大程度地在两侧填充零,给出一个大小为len(x) + len(h) - 1(参见Numpy documentation)的向量,您需要做的是最后修剪冗余元素。

      【讨论】:

        猜你喜欢
        • 2019-05-11
        • 1970-01-01
        • 1970-01-01
        • 2015-08-24
        • 1970-01-01
        • 2011-10-17
        • 2013-03-26
        • 2013-03-22
        • 1970-01-01
        相关资源
        最近更新 更多