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()
Обратите внимание на то какой возвращается результат при различных значениях параметра 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 ])