从互相关中查找信号或相位延迟

2024-03-28 17:33:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是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)
<> P>因此,发现信号与自身的相关性在相关阵列(或图/函数)的中间具有最大峰值。但另一个高峰很奇怪:

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

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


Tags: importa2signal信号modea1asnp
1条回答
网友
1楼 · 发布于 2024-03-28 17:33:27

似乎延迟大约等于(a1 - a2) / n。然而,我认为答案有点扭曲,因为a)你只使用单周期正弦波,b)你使用有限数量的数据点(显然)。对于单周期正弦波的情况,要得到更准确的答案,您可能需要获得相关性的数学定义,并使用正确的限值进行必要的积分(但我不确定在积分方面寻求帮助的正确位置是否正确)

这是一个自足的脚本,它描绘了信号和相关性,希望能提供更多的直觉。注:当你重复正弦波的周期数时,我上面给出的近似值似乎变得更精确。例如,对于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 hereenter image description here

相关问题 更多 >