Кросс-корреляция / сходство сигналов - рассчитать временную задержку - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть два сигнала, которые я хочу сравнить с точки зрения сходства. Один меньше (по времени), чем другой. Если я использую корреляцию, чтобы найти наибольшее сходство, это говорит мне, что самые высокие значения находятся на значении, которое я бы не ожидал.

Может ли кто-нибудь дать мне подсказку, если я просто считаю «неправильным» или корреляция - это неправильный инструмент для такого рода проблемы?

Моя настройка:

import numpy
import matplotlib.pyplot as plt

signal_a = numpy.array([10, 20, 10, 30, 20, 10, 28, 22, 10])
signal_b = numpy.array([28, 22])
correlations = numpy.correlate(signal_a, signal_b, mode = "full")

print(correlations)
plt.plot(correlations)

Выводит этот график и массив корреляций

Наибольшая корреляция [28, 22] рассчитывается в позиции [..., 30, 20, ...]. Я понимаю формулу и почему это 1280. Но я на самом деле ищу [..., 28, 22, ...], поскольку именно (в этом случае) я ищу (Сигнал B).

Корреляция - правильная вещь? Я нашел так много источников, где корреляция используется для обнаружения сходства. Разве одни и те же значения не должны быть более похожими, чем другие?

Ответы [ 2 ]

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

Одним из возможных решений вашей проблемы является Среднее квадратичное отклонение (MSE) . Учитывая два сигнала a и b одинаковых размеров, MSE является средним значением поэлементных квадратов разности между a и b. Код будет выглядеть следующим образом (на основе this ):

import numpy as np
import matplotlib.pyplot as plt

a = np.array([10, 20, 10, 30, 20, 10, 28, 22, 10])
b = np.array([28, 22])
mse = np.ndarray((len(a) - len(b) + 1))

for i in range(c.size):
    mse[i] = np.square(np.subtract(a[i:i+len(b)],b)).mean()

print(mse.argmin())
plt.plot(mse)
0 голосов
/ 14 ноября 2018

Вместо того, чтобы смотреть на корреляцию, вы можете посмотреть на разницу значений, чтобы обнаружить сходство. Например, вы можете выбрать каждые 2 элемента в a (если b имеет длину 2) и посмотреть на абсолютные значения разностей:

 import numpy as np
 import matplotlib.pyplot as plt

 signal_a = np.array([10, 20, 10, 30, 20, 10, 28, 22, 10])
 signal_b = np.array([28, 22])
 N2 = len(signal_b)

 diffs = []
 for i in range(len(signal_a) - len(signal_b) + 1):
      diff_ab = signal_a[i:i+N2] - signal_b
      diffs.append(sum(abs(diff_ab)))

 print(diffs)
 plt.plot(diffs)

И найдите минимум в массиве diffs. Вместо abs () вы также можете использовать квадрат разности разности.

...