Определить множественные корреляции между двумя сигналами

У меня есть два временных сигнала, каждый из которых содержит два одинаковых импульса, но в разных положениях.

картинка, описывающая два сигнала:

картина, описывающая два сигнала

Как я могу получить с Python сдвиги времени между двумя сигналами для каждого импульса? Кросс-корреляция не выглядит надежным способом сделать работу... вы можете увидеть там функцию кросс-корреляции и два временных сдвига, которые я хотел бы восстановить:

функция взаимной корреляции и двух временных сдвигов, которые я хотел бы восстановить

Хотя временной сдвиг отлично получается из максимума функции взаимной корреляции, если у нас есть только один импульс, вы можете видеть, что он мало помогает в случае нескольких импульсов.

Это моя тестовая программа:

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

N = 200     # Number of points in initial, unshifted signals
N_pad = 500 # Total number of points at the end
t = np.linspace(-1, 1, N) # Dummy time vector
dt = t[1]-t[0] # Time step
Fs = 1.0/dt    # Sampling frequency
pulse1 = signal.gausspulse(t, fc=5) # Create a pulse at 5 Hz
pulse2 = signal.gausspulse(t, fc=8) # Create a pulse at 8 Hz

# Shift and pad the pulses
pulse1_shifted = np.concatenate((pulse1,np.zeros(50)), axis=0)
pulse2_shifted = np.concatenate((pulse2,np.zeros(100)), axis=0)
pulse1_shifted_padded = np.concatenate((np.zeros(N_pad-len(pulse1_shifted)),pulse1_shifted), axis=0)
pulse2_shifted_padded = np.concatenate((np.zeros(N_pad-len(pulse2_shifted)),pulse2_shifted), axis=0)

# Create signal 1 as the sum of the two pulses
sig1 = pulse1_shifted_padded + pulse2_shifted_padded

# Different time shift
pulse1_shifted = np.concatenate((pulse1,np.zeros(60)), axis=0)
pulse2_shifted = np.concatenate((pulse2,np.zeros(150)), axis=0)
pulse1_shifted_padded = np.concatenate((np.zeros(N_pad-len(pulse1_shifted)),pulse1_shifted), axis=0)
pulse2_shifted_padded = np.concatenate((np.zeros(N_pad-len(pulse2_shifted)),pulse2_shifted), axis=0)

# Create signal 2 as the sum of the two pulses
sig2 = pulse1_shifted_padded + pulse2_shifted_padded

# Create new time vector at the same sampling rate
t = np.arange(dt*N_pad,step=dt)

# Plot the two signals
plt.figure()
plt.plot(t,sig1,label="Signal 1")
plt.plot(t,sig2,label="Signal 2")
plt.legend()
plt.xlabel("Time (s)")
plt.ylabel("Amplitude")
plt.title("The two signals. Orange and blue has been recorded at 100 m distance")

# Plot the cross correlation between the two signals
corr = signal.correlate(sig1,sig2)
dt = np.arange(1-N_pad,N_pad)/Fs # Time shift vector
plt.figure()
plt.plot(dt,corr)
plt.plot([0.1,0.1],[-20,20],"--")
plt.plot([0.5,0.5],[-20,20],"--")
plt.ylim([-15,15])
plt.xlabel("Time shift (s)")
plt.ylabel("Cross correlation function")

У тебя есть работа?

огромное спасибо

2 ответа

Поскольку взаимная корреляция отлично работает с двумя импульсами, вы можете выбрать любой импульс в качестве базовой линии и выполнить попарную взаимную корреляцию с остальными, чтобы определить смещения в качестве быстрого обходного пути.

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

Другие вопросы по тегам