correlate#
- scipy.signal.correlate(in1, in2, mode='full', метод='auto')[источник]#
Вычислить взаимную корреляцию двух N-мерных массивов.
Взаимная корреляция in1 и in2, с размером вывода, определяемым mode аргумент.
- Параметры:
- in1array_like
Первый вход.
- in2array_like
Второй вход. Должен иметь то же количество измерений, что и in1.
- modestr {‘full’, ‘valid’, ‘same’}, необязательный
Строка, указывающая размер вывода:
fullВыходные данные представляют собой полную дискретную линейную взаимную корреляцию входных данных. (По умолчанию)
validВыходные данные состоят только из тех элементов, которые не зависят от дополнения нулями. В режиме 'valid' либо in1 или in2 должен быть как минимум таким же большим, как другой, по каждому измерению.
sameВыходные данные имеют тот же размер, что и in1, центрированный относительно вывода 'full'.
- методstr {'auto', 'direct', 'fft'}, optional
Строка, указывающая, какой метод использовать для расчета корреляции.
directКорреляция определяется непосредственно из сумм, по определению корреляции.
fftБыстрое преобразование Фурье используется для более быстрого выполнения корреляции (доступно только для числовых массивов).
autoАвтоматически выбирает прямой или метод Фурье на основе оценки того, какой быстрее (по умолчанию). См.
convolveПодробности см. в примечаниях.Добавлено в версии 0.19.0.
- Возвращает:
- correlateмассив
N-мерный массив, содержащий подмножество дискретной линейной кросс-корреляции in1 с in2.
Смотрите также
choose_conv_methodсодержит больше документации по метод.
correlation_lagsвычисляет массив индексов задержки/смещения для одномерной взаимной корреляции.
Примечания
Корреляция z двух d-мерных массивов x и y определяется как:
z[...,k,...] = sum[..., i_l, ...] x[..., i_l,...] * conj(y[..., i_l - k,...])
Таким образом, если
xиyявляются 1-D массивами иz = correlate(x, y, 'full')затем\[z[k] = \sum_{l=0}^{N-1} x_l \, y_{l-k}^{*}\]для \(k = -(M-1), \dots, (N-1)\), где \(N\) является длиной
x, \(M\) является длинойy, и \(y_m = 0\) когда \(m\) находится вне допустимого диапазона \([0, M-1]\). Размер \(z\) является \(N + M - 1\) и \(y^*\) обозначает комплексное сопряжение \(y\).method='fft'работает только для числовых массивов, так как полагается наfftconvolve. В некоторых случаях (т.е., массивы объектов или когда округление целых чисел может привести к потере точности),method='direct'всегда используется.При использовании
mode='same'с входными данными четной длины, выходыcorrelateиcorrelate2dразличаются: между ними существует смещение на 1 индекс.Примеры
Реализуйте согласованный фильтр с использованием взаимной корреляции для восстановления сигнала, прошедшего через зашумлённый канал.
>>> import numpy as np >>> from scipy import signal >>> import matplotlib.pyplot as plt >>> rng = np.random.default_rng()
>>> sig = np.repeat([0., 1., 1., 0., 1., 0., 0., 1.], 128) >>> sig_noise = sig + rng.standard_normal(len(sig)) >>> corr = signal.correlate(sig_noise, np.ones(128), mode='same') / 128
>>> clock = np.arange(64, len(sig), 128) >>> fig, (ax_orig, ax_noise, ax_corr) = plt.subplots(3, 1, sharex=True) >>> ax_orig.plot(sig) >>> ax_orig.plot(clock, sig[clock], 'ro') >>> ax_orig.set_title('Original signal') >>> ax_noise.plot(sig_noise) >>> ax_noise.set_title('Signal with noise') >>> ax_corr.plot(corr) >>> ax_corr.plot(clock, corr[clock], 'ro') >>> ax_corr.axhline(0.5, ls=':') >>> ax_corr.set_title('Cross-correlated with rectangular pulse') >>> ax_orig.margins(0, 0.1) >>> fig.tight_layout() >>> plt.show()
Вычислить кросс-корреляцию зашумленного сигнала с исходным сигналом.
>>> x = np.arange(128) / 128 >>> sig = np.sin(2 * np.pi * x) >>> sig_noise = sig + rng.standard_normal(len(sig)) >>> corr = signal.correlate(sig_noise, sig) >>> lags = signal.correlation_lags(len(sig), len(sig_noise)) >>> corr /= np.max(corr)
>>> fig, (ax_orig, ax_noise, ax_corr) = plt.subplots(3, 1, figsize=(4.8, 4.8)) >>> ax_orig.plot(sig) >>> ax_orig.set_title('Original signal') >>> ax_orig.set_xlabel('Sample Number') >>> ax_noise.plot(sig_noise) >>> ax_noise.set_title('Signal with noise') >>> ax_noise.set_xlabel('Sample Number') >>> ax_corr.plot(lags, corr) >>> ax_corr.set_title('Cross-correlated signal') >>> ax_corr.set_xlabel('Lag') >>> ax_orig.margins(0, 0.1) >>> ax_noise.margins(0, 0.1) >>> ax_corr.margins(0, 0.1) >>> fig.tight_layout() >>> plt.show()