通过互相关查找信号或相位延迟

问题描述

我正在使用python,但这是一个通用问题(与算法等相关性更强),因此我跳过了一些步骤以了解问题的要点:

生成这样的正弦信号:

import math as m
signal = [m.sin(2*m.pi*1*(t/n-d)) for t in range(n)]

因此归一化为正弦信号,该频率为1,时间从0到1秒(因此基本上是一个简单的正弦波周期)。还有一个延迟项d,它会延迟信号(导致相移)。 n只是样本数

我还会创建另一个信号,但会有另一个延迟。假设我对第一个信号使用0的延迟,对第二个信号使用x的延迟(为清楚起见,我将其缩写为缩写):

signal1 = signal(delay=0)
signal2 = signal(delay=x)

然后进行关联:

from scipy import signal as sgn
corr11 = sgn.correlate(signal1,signal1,mode = 'full')
corr12 = sgn.correlate(signal1,signal2,mode = 'full')

我也知道信号延迟与相关点的最大值相关,所以我取出了两个点:

import numpy as np

a1 = np.argmax(corr11)
a2 = np.argmax(corr12)

因此,我发现信号与其自身的相关在相关数组(或图/函数)的中间具有最大峰值。但是另一个高峰很奇怪:

  • 在延迟0和1:a2与a1相同
  • 在延迟0.5时:a2与a1的距离是a1(反相信号)的0.5
  • 延迟0.28328:a2为a1的0.75
  • 延迟0.1:a2为a1的0.90888

问题是,在将信号相关之后,延迟d与峰值位置如何相关?

解决方法

似乎延迟大约等于(a1 - a2) / n。但是,我认为答案有些扭曲,因为以下事实:a)您仅使用单个周期的正弦波,b)您使用的是有限数量的数据点(显然)。为了对单周期正弦波的情况获得更准确的答案,您可能希望获得相关性的数学定义,并用正确的限制进行必要的积分(但是我不确定SO是否是正确的位置)。寻求集成帮助。

这是一个独立的脚本,用于绘制信号和相关性,有望提供更多的直觉。注意:当您重复正弦波的周期数时,我上面给出的近似值似乎变得更加准确。例如,在100个周期和100000个数据点的情况下,上面的近似值(此处修改为n_repeats * (a1 - a2) / n)似乎变得更加准确。

脚本

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

# Set parameters

# x = 0.5
x = 0.28328
# x = 0.25
# x = 0.1
# n = 100000
# n_repeats = 100
n = 1000
n_repeats = 1

# Get correlations
t = np.linspace(0,n_repeats,n)

sin_delay = lambda delay: np.sin(2.0 * np.pi * (t - delay))

signal1 = sin_delay(delay=0)
signal2 = sin_delay(delay=x)

corr11 = signal.correlate(signal1,signal1,mode = 'full')
corr12 = signal.correlate(signal1,signal2,mode = 'full')

a1 = np.argmax(corr11)
a2 = np.argmax(corr12)

# Print output
print(a1,a2,x,n_repeats * (a1 - a2) / n)

# Make plots
plt.figure()
plt.plot(signal1,"r")
plt.plot(signal2,"b")
plt.title("Signals,delay = {:.3f}".format(x))
plt.legend(["Original signal","Delayed signal"],loc="upper right")
plt.grid(True)
plt.savefig("Signals")
plt.figure()
plt.plot(corr11,"r")
plt.plot(corr12,"b")
plt.title("Correlations,delay = {:.3f}".format(x))
plt.legend(["Auto-correlation","Cross-correlation"],loc="upper right")
plt.grid(True)
plt.savefig("Correlations")

使用n = 1000,n_repeats = 1控制台输出

999 749 0.28328 0.25

使用n = 100000,n_repeats = 100控制台输出

99999 99716 0.28328 0.283

使用n = 1000,n_repeats = 1

输出图像

enter image description here enter image description here