具有有限滤波器的快速1D卷积和python中的dirac增量之和

时间:2014-09-30 13:11:49

标签: python numpy scipy convolution

我需要计算以下卷积:

enter image description here

K是一个非常简单的过滤器,它只是一个有限(!)大小的矩形框。 我的数据是狄拉克三角洲时间t_i的列表。

直接的解决方案是将数据分区并使用numpy或scipys卷积函数之一。然而,有更快的方法吗?我可以避免数据的分级并利用a)我的滤波器大小有限(只是一个盒子)和b)我有一个时间点列表这一事实。因此,我只需检查我的时间点当前是否是滑动框的一部分。

所以,我正在寻找一个复杂度为O(d * n)的解决方案,其中d为卷积分辨率的大小。因此,我希望比O(b ** 2)快得多,其中b是箱数。此外,因为n <&lt; b,仍然认为对于基于fft的卷积,O(d * n)远小于O(b * log b)。谢谢!

1 个答案:

答案 0 :(得分:1)

使用cumulative sum of the signal

可以加快使用大型过滤器的卷积

示例信号:

import numpy as np

a = np.random.rand(10)
print a

输出:

[ 0.22501645  0.46078123  0.6788864   0.88293584  0.10379173  0.50422604
  0.4670648   0.22018486  0.96649785  0.44451671]

使用default convolution function进行卷积:

print np.convolve(a, np.ones(3) / 3, mode='valid')

输出:

[ 0.45489469  0.67420116  0.55520466  0.49698454  0.35836086  0.39715857
  0.55124917  0.54373314]

使用累积总和进行卷积:

s = np.cumsum(np.concatenate(([0], a)))
print (s[3:] - s[:-3]) / 3

输出:

[ 0.45489469  0.67420116  0.55520466  0.49698454  0.35836086  0.39715857
  0.55124917  0.54373314]

cumsum计算和列表减法都是O(n),其中n是列表元素的数量,因此整体计算时间为O(n),并且 - 有趣的是 - 与过滤器大小无关