Определить множественные корреляции между двумя сигналами - PullRequest
0 голосов
/ 20 мая 2018

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

изображение, описывающее два сигнала:

picture describing the two signals

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

the cross correlation function and the two time shifts I would like to recover

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

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

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")

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

Большое вам спасибо

1 Ответ

0 голосов
/ 11 августа 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...