我得到了两个信号S1和S2(两个值的数组),我想知道S1是否与S2是相同的信号但发生了移位(S1和S2的图形表示相同,但是S1将移至左右)
问题是:我的算法包含插值scipy.interpolate.interp1d
,并且此函数在数组中输入NaN值。
当我尝试将S1和S2与内部的NaN相关时,相关数组始终为[NaN, NaN, NaN, ... , NaN, NaN, NaN]
我的目的是: 1)检测S1和S2是否是同一信号(如果相关性高于某个阈值,我将认为它们是同一信号) 2)如果有,请检测它们之间的偏移,以便将其删除
为了说明我的算法,我创建了一个简单的代码
import numpy as np
from scipy.signal import correlate
norm = np.linalg.norm
x = np.array([np.nan,1,2,3,0,0,np.nan])
y = np.array([1,2,3,0,0,np.nan,np.nan,np.nan])
corr = correlate(x, y)
print(corr/(norm(x)*norm(y)))
此处的相关函数为scipy.signal.correlate
,但我也尝试使用np.correlate,结果也相同
从stackoverflow帖子中,我尝试过这种方式:
x = np.array([np.nan,1,2,3,0,0,np.nan])
y = np.array([1,2,3,0,0,np.nan,np.nan,np.nan])
normx = norm(x[~np.isnan(x)])
normy = norm(y[~np.isnan(y)])
maskx = np.ma.array(x, mask=np.isnan(x))
masky = np.ma.array(y, mask=np.isnan(y))
corr = correlate(maskx, masky)
但是我仍然只有NaN值。
我做错了什么吗?
答案 0 :(得分:1)
如果任何信号包含NaN,则复数将全部为NaN。
使用此方法首先删除nan,然后使用相关函数:
x = np.array([np.nan,1,2,3,0,0,np.nan])
y = np.array([1,2,3,0,0,np.nan,np.nan,np.nan])
x = x[~np.isnan(x)]
y = y[~np.isnan(y)]
corr = np.corrcoef(x, y)
#corrcoef returns the normalised covariance matrix so you want the [1,0] or [0,1] element of this matrix
print(corr[1,0])
#1.0