【问题标题】:apply a filter to x[n] in python在 python 中对 x[n] 应用过滤器
【发布时间】:2013-11-11 18:46:11
【问题描述】:

在 Python 中将 FIR 滤波器应用于 x[n] 的最聪明的方法是什么(适用于所有 n <= N

y[n] = a[0]*x[n] + a[1]*x[n-1] + a[2]*x[n-2] + ... + a[K]*x[n-K]

我知道如何使用双 for 循环来做到这一点,但我想还有更多“漂亮”的方式可以用 Python 编写它?

【问题讨论】:

    标签: python arrays list signal-processing


    【解决方案1】:

    你可以这样做:

    y[n] = sum(a[k]*x[n-K] for k in xrange(K + 1))
    

    这使用内置的sum()xrange 函数和生成器表达式来计算最终结果。

    【讨论】:

    • 谢谢!有没有像y[n] = sum(a * reverse(x[n-K:n]) ) 这样的列表/数组的解决方案?
    • 其他:当k 为负数时,有没有办法定义x[k] = 0?如果不可能,当n < Kx[n-K]如何处理?
    • 不确定数组,但我想您可以使用(0 if k < 0 else x[n-K]) 而不是x[n-K]
    【解决方案2】:

    这避免了使用索引:

    y[n] = sum(aa * xx for aa, xx in zip(a, x[n::-1]))
    

    zip 的一个很酷的地方是它的输出长度将是两个输入中较短的长度。

    要对所有n 执行此操作,最简单的方法可能是对外部循环使用索引:

    y = [sum(aa * xx for aa, xx in zip(a, x[n::-1])) for n in xrange(0, len(x))]
    

    如果您只想包含“有效”项(使用 a 中所有系数之和的项),您可以将 xrange(0, len(x)) 替换为 xrange(len(a), len(x))

    如果这是你要做的很多事情,或者需要大量输入,我建议你检查一下 Numpy,特别是它的 convolve 函数。该实现将比我在此处描述的要快得多。

    【讨论】:

    • 确实很漂亮! zip的用途很好,那我就不用区分if n<K then do something else than x[n-K]了……
    • 创建列表 y 的最佳方法是什么? y = [] ; for n in range(N): ; y.append(sum(aa * xx ....)) 或者有没有最好的办法填表y
    • @JosBas:您可以使用显式的 for 循环,就像您建议的那样,但我更喜欢列表推导。请参阅我编辑的答案。
    • 感谢您的 cmets。给定 FIR 滤波器的 taps 数组 a[n],计算滤波器的输出 y[n] 的传统方法是什么? convolve?
    • 是的,convolve 就是你想要的。 Scipy 还有一个函数scipy.signal.fftconvolve,它使用 FFT 和乘法而不是显式卷积;这是否更快取决于您输入的具体特征。一般来说,我认为如果您的过滤器很短(最多 1000 个左右的元素),convolve 可能会更快,但对于更长的过滤器,您可能需要查看 fftconvolve。不过,我只是在猜测这些数字,实际上你必须在硬件上测试你的输入。
    【解决方案3】:

    对于信号处理,您应该真正使用 NumPy。特别是,过滤信号将只是convolution,使其成为单线。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-11
      • 2012-11-24
      • 2019-06-10
      • 2019-05-22
      • 1970-01-01
      • 1970-01-01
      • 2018-03-24
      • 2023-02-23
      相关资源
      最近更新 更多