在python中对两个稀疏一维信号进行卷积/相关的更快方法

时间:2019-06-17 05:36:39

标签: python signal-processing convolution

我有两个信号需要关联或卷积。每个信号都是不均匀采样的,我和我在一起的信号值是时间戳和该时间戳的信号强度。可以将所有其他时间的信号值假定为零。信号的时间戳具有以微秒为单位的分辨率。

下面是信号外观的示例:

enter image description here

可以看出,信号的分辨率以微秒为单位,并且信号几乎是稀疏的。

如果要对两个这种类型的信号进行卷积,则必须首先用零填充信号(因为我必须离散化信号)。尽管可以用微秒的分辨率完成填充,但是要乘的值的数量变得太大,并且操作变得越来越慢。该卷积中的大多数乘法将是零的乘法(这几乎没有用)。因此,我选择了2个舍入值(0.xxxxxx变为0.xx),因为我必须执行40,000次类似的卷积。我已经编写了如下所示的重采样功能。

import numpy as np
import math

def resampled_signal_lists_with_zeros(signal_dict, xlimits):
  '''
      resamples the given signal with precision determined by the round function. 
      signal_dict is a dictionary with timestamp as key and signal magnitude is the value of the key. 
      xlimits is an array containing the start and stop time of the signal.
  '''
  t_stamps_list = list(signal_dict.keys())
  t_list = list(np.arange(int(math.floor(xlimits[0])), int(math.ceil(xlimits[1])), 0.005))
  t_list = [round(t, 2) for t in t_list]
  s_list = list()
  time_keys = [round(t, 2) for t in t_stamps_list]

  i = 0
  for t in t_list:
    if i < len(t_stamps_list):
      if t==time_keys[i]:
        s_list.append(signal_dict[t_stamps_list[i]])
        i+=1

      else:
        s_list.append(0)
    else:
      s_list.append(0)
  return t_list, s_list

以如下方式使用scipy完成以上述方式填充的两个信号的相关:

from scipy.signal import correlate
output = correlate(s_1, s_2, mode='same')

以上述方式计算的输出非常慢,因为信号非常稀疏并且信号中的大多数乘法都是零的乘法,所以我认为应该有更好的方法来执行相同的操作。有没有一种方法可以更快地获得两个稀疏信号的卷积结果?

0 个答案:

没有答案