我有两个信号需要关联或卷积。每个信号都是不均匀采样的,我和我在一起的信号值是时间戳和该时间戳的信号强度。可以将所有其他时间的信号值假定为零。信号的时间戳具有以微秒为单位的分辨率。
下面是信号外观的示例:
可以看出,信号的分辨率以微秒为单位,并且信号几乎是稀疏的。
如果要对两个这种类型的信号进行卷积,则必须首先用零填充信号(因为我必须离散化信号)。尽管可以用微秒的分辨率完成填充,但是要乘的值的数量变得太大,并且操作变得越来越慢。该卷积中的大多数乘法将是零的乘法(这几乎没有用)。因此,我选择了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')
以上述方式计算的输出非常慢,因为信号非常稀疏并且信号中的大多数乘法都是零的乘法,所以我认为应该有更好的方法来执行相同的操作。有没有一种方法可以更快地获得两个稀疏信号的卷积结果?