Python - взаимная корреляция двух сигналов с NaN внутри - PullRequest
0 голосов
/ 14 октября 2018

Я получил два сигнала 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 ..

Что-то я не так делаю?

1 Ответ

0 голосов
/ 14 октября 2018

Если какой-либо из сигналов содержит NaN, тогда retusrn будет всеми NaN.


Используйте это для первоначального удаления nans, а затем используйте функцию корреляции:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...