numpy.correlate

numpy.correlate(a, v, mode='valid')

Функция correlate() вычисляет значения взаимнокорреляционной функции (кросс-корреляцию) двух одномерных последовательностей.

Данная функция часто используется для поиска некоторой короткой последовательности в другой длинной последовательности. Для двух дискретных рядов a и v взаимная корреляция определяется по формуле:

$$C_{av} = \sum_{n=0}^{n}a_{n+k}\cdot v^{*}_n$$

Где k - это сдвиг между последовательностями относительно друг друга, а \(v^{*}\) означает комплексное сопряжение \(v\).

Параметры:
a, v - массивы NumPy или подобные массивам объекты.
Входные одномерные последовательности. В случае необходимости, данные последовательности могут дополняться нулями.
mode - {‘full’, ‘valid’, ‘same’} (необязательный параметр).
Определяет режим вычисления линейной свертки:
  • 'full' - В данном режиме функция вычисляет свертку в каждой точке перекрытия, а длина выходного массива будет равна (N + M - 1,). На краях свертки массивы могут перекрываться не полностью, что вызывает граничные эффекты;
  • 'valid' - Режим установленный по умолчанию. Возвращает массив длинны max(N, M), при этом так же наблюдаются граничные эффекты;
  • 'same' - Свертка вычисляетя только в точках с перекрытием сигналов, поэтому граничные эффекты не возникают. Длина результирующего массива определяется как max(N,M) - min(N, M) + 1.
Возвращает:
результат - массив NumPy или число
Кросс-корреляция двух одномерных функций a и v.

Смотрите так же:
convolve


Примеры

Допустим у нас есть два сигнала:

>>> import numpy as np
>>> 
>>> a = [0,0,0,5,5,5,5,5,0,0,0]
>>> v = [0,0,0,5,4,3,2,1,0,0,0]

Вычислим значения их взаимнокорреляционной функции:

>>> c = np.correlate(a, v, 'full')

Теперь мы можем визуализировать все имеющиеся данные.

import numpy as np
import matplotlib.pyplot as plt

a = [0,0,0,5,5,5,5,5,0,0,0]
v = [0,0,0,5,4,3,2,1,0,0,0]

c = np.correlate(a, v, 'full')

fig, axes = plt.subplots(3, 1)

axes[0].plot(a, color = 'purple')
axes[0].set_title(r'Сигнал $\mathbf{a}$')

axes[1].plot(v, color = 'orangered')
axes[1].set_title(r'Сигнал $\mathbf{v}$')

axes[2].plot(c, color = 'darkred')
axes[2].set_title(r'Кросс-корреляция $\mathbf{C_{av}}$')

fig.suptitle('Взаимнокорреляционная функция двух сигналов')
fig.subplots_adjust(hspace=0.6)

plt.show()

Кросс-корреляция двух сигналов в NumPy

Обратите внимание на то какой возвращается результат при различных значениях параметра mode:

>>> np.correlate([1, 2, 3, 4], [0.5, 2, 1])
array([ 7.5, 11. ])
>>> 
>>> np.correlate([1, 2, 3, 4], [0.5, 2, 1], mode = 'full')
array([ 1. ,  4. ,  7.5, 11. ,  9.5,  2. ])
>>> 
>>> np.correlate([1, 2, 3, 4], [0.5, 2, 1], mode = 'same')
array([ 4. ,  7.5, 11. ,  9.5])

Так же данная функция позволяет использовать комплексные числа

>>> a = [1 + 1j, 2 + 0.5j, 3 + 0.1j, 4]
>>> v = [0.5, 2 + 1j, 1 + 2j]
>>> 
>>> np.correlate(a, v, mode = 'full')
array([ 3.  -1.j  ,  6.  -2.5j ,  8.2 -6.4j , 11.1-10.55j,  9.5 -3.95j,
        2.  +0.j  ])