Использование перекрестной корреляции в python

#python #numpy #jupyter-notebook #jupyter #cross-correlation

Вопрос:

Я пытаюсь решить проблему корреляции, когда мне нужно найти, где последовательность шаблонов находится внутри последовательности сигналов. В какой-то момент я смог найти правильное решение только для того, чтобы начать пытаться оптимизировать код, и код, который я выполнил, не был сохранен. Теперь функция перекрестной корреляции просто не будет решаться правильно, и я не знаю, почему. Я несколько раз перезапускал ядро.

Вот код и ссылки на текстовые файлы, содержащие сигнал и шаблон.

https://drive.google.com/file/d/1tBzHMUfmcx_gGR0arYPaQ5GB9MybXKRv/view?usp=sharing
https://drive.google.com/file/d/1TeSe9t8TeVHEp2BxKXYz6Ndlpah—yLg/view?usp=sharing

 import numpy as np
import matplotlib.pyplot as plt

patron = np.loadtxt('patron.txt', delimiter=',', skiprows=1)
senal = np.loadtxt('señal.txt', delimiter=',', skiprows=1)
Fs=100
ts = np.arange(0,len(senal))

plt.figure(figsize=(20,8))
plt.subplot(3,1,1)
plt.plot(ts,patron)
plt.subplot(3,1,2)
plt.plot(ts,senal)


corr = np.correlate(senal,patron,"same")
print(np.where(corr == np.amax(corr))) #this should be where correlation reaches its maximum value, and where the functions are most "similar"

plt.subplot(3,1,3)
plt.plot(ts,corr, 'r')
 

Откуда мне знать, что я все сделал правильно? Я построил последовательность «senal», сдвинутую на 799 мест (значение, которое у меня было, когда код был правильным) с:

 np.roll(senal,799)
plt.plot(senal)
 

что привело к появлению этого графика. Это выглядит довольно интуитивно, когда это привело к максимальной корреляции при индексе 799:

Ответ №1:

Здравствуйте, я перевернул значения «покровитель» и «сенал» в функции корреляции, и это кажется хорошим:

 import numpy as np
import matplotlib.pyplot as plt

patron = np.loadtxt('patron.txt', delimiter=',', skiprows=1)
senal = np.loadtxt('señal.txt', delimiter=',', skiprows=1)
Fs=100
ts = np.arange(0,len(senal))

plt.figure(figsize=(20,8))
plt.subplot(3,1,1)
plt.plot(ts,patron)
plt.subplot(3,1,2)
plt.plot(ts,senal)


corr = np.correlate(patron,senal,'same')
print(np.argmax(corr)) #this should be where correlation reaches its maximum value, and where the functions are most "similar"

plt.subplot(3,1,3)
plt.plot(corr, 'r')
 

введите описание изображения здесь

Комментарии:

1. спасибо, что посмотрели на это. Вы правы, согласно документации numpy о корреляции, я должен был поместить последовательность патронов в качестве второго параметра функции np.correlate. Но я все еще не понимаю, как извлечь смещение 799, которое я получил раньше, что выглядело слишком большим совпадением, чтобы быть неправильным. Индекс, который я получаю, переключая последовательности внутри коррелята и проверяя его максимум, все равно приводит меня к странному индексу, в котором я не могу разобраться.

2. Я не знаю, почему вы думаете, что индекс 799 был хорошим значением, если вы посмотрите на ось сигнала в точке 799, сигнал будет выглядеть совсем не так. В примере, который я опубликовал, они намного ближе. Я не знаю, был ли еще один этап обработки, который вы выполняли, который, возможно, позволил бы рассчитать задержку и перестроить их еще лучше?

3. Потому что это то, что я получил в какой-то момент, сдвинул последовательность патронов на эту величину, и она выглядит идентично. Кроме того, я только что получил решение проблемы, и оно составляет 800 (отклонено на одну позицию), только то, что я не могу решить ее самостоятельно. Возможно, существует какая-то теоретическая проблема, которую я не понимаю в отношении корреляции. И дело не в том, что в 799 последовательностях последовательности выглядят одинаково, а в смещении 799 мест патрона, что делает их идентичными senal, как я показал на последнем графике.

4. @GustavoHenriqueFossNeves да, я понимаю, что если вы сдвинете сигнал на 799, вы скажете, что он выглядит похожим, но если вы на самом деле посмотрите, где на графике находится точка 799, то сигналы вообще не совпадают. Точка 799 гораздо левее. Но, может быть, вы меняете сигнал по-другому, и я этого не знаю, так что хорошо, если это работает нормально. Можете ли вы опубликовать ответ на случай, если у кого-то еще возникнет та же проблема? Я бы тоже хотел посмотреть, что изменилось.