识别两个信号之间的多个相关性

时间:2018-05-20 13:18:11

标签: python signal-processing cross-correlation

我有两个时间信号,每个信号包含两个相同的脉冲,但位于不同的位置。

描述这两个信号的图片:

picture describing the two signals

我如何通过python获得每个脉冲的两个信号之间的时间偏移? 交叉相关似乎不是一种强有力的工作方式...... 你可以看到互相关函数和我希望恢复的两个时间变化:

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

你有解决方法吗?

非常感谢

2 个答案:

答案 0 :(得分:0)

由于互相关可以很好地与两个脉冲配合使用,因此您可以选择任意一个脉冲作为基线,并与其他脉冲进行成对互相关以确定偏移量,这是一种快速的解决方法。

答案 1 :(得分:0)

如果我理解正确,您需要一种自动方法来提取互相关响应(例如您在问题中提供的响应)中橙色和绿色光标之间的时间偏移。在您的示例中,此时移将是两个脉冲对之间的边际时移。可以直接从互相关结果(例如您提供的结果)中推断出两个脉冲对(例如您示例中的脉冲对)之间的边际时间偏移。您可以通过首先检测互相关结果中的局部最大值点来做到这一点。接下来,按幅度降序对局部最大值点进行排序,同时保留与每个局部最大值关联的时间戳。然后,两个脉冲之间的边际偏移将等于与局部最大值排序列表中的前两个局部最大值点相关联的两个时间戳之间的差值。