Более быстрый способ свертывания / корреляции двух разреженных 1-D сигналов в питоне - PullRequest
2 голосов
/ 17 июня 2019

У меня есть два сигнала, которые мне нужно коррелировать или свертывать.Каждый сигнал дискретизируется неравномерно, и значения сигнала, который у меня есть, представляют собой временную метку и величину сигнала в этой временной метке.Значения сигнала во все остальные моменты времени можно считать равными нулю.Метки времени имеют разрешение в микросекундах.

Пример того, как выглядит сигнал, показан ниже:

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')

Выходная мощность, рассчитанная вВышеуказанный способ довольно медленный. Так как сигнал довольно редкий, и большинство умножений в сигнале являются умножениями нуля, я думаю, что должен быть лучший способ сделать те же самые операции.Есть ли способ быстрее получить результат свертки двух разреженных сигналов?

...