У меня есть два сигнала, которые мне нужно коррелировать или свертывать.Каждый сигнал дискретизируется неравномерно, и значения сигнала, который у меня есть, представляют собой временную метку и величину сигнала в этой временной метке.Значения сигнала во все остальные моменты времени можно считать равными нулю.Метки времени имеют разрешение в микросекундах.
Пример того, как выглядит сигнал, показан ниже:
Как видно, разрешение сигнала находится вмикросекунды и сигнал в основном редкие.
Если бы я был в свертке двух сигналов этого типа, мне сначала пришлось бы дополнить сигналы нулями (так как мне пришлось бы дискретизировать сигнал).Хотя заполнение может быть выполнено с разрешением в микросекунды, количество значений, которые нужно умножить, становится слишком большим, и операция становится все более медленной.Большинство умножений в этой свертке будет умножением нулей (которые практически бесполезны).Поэтому я выбрал значение округления 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')
Выходная мощность, рассчитанная вВышеуказанный способ довольно медленный. Так как сигнал довольно редкий, и большинство умножений в сигнале являются умножениями нуля, я думаю, что должен быть лучший способ сделать те же самые операции.Есть ли способ быстрее получить результат свертки двух разреженных сигналов?