信号的互相关/相似性 - 计算时间滞后

问题描述 投票:0回答:2

我有两个信号,我想比较它们的相似性。一个比另一个小(按时间)。 如果我使用相关性来找到最高相似度,它会告诉我最高值位于我意想不到的值。

如果我只是认为“错误”,或者关联是解决此类问题的错误工具,有人可以给我一个提示吗?

我的设置:

import numpy
import matplotlib.pyplot as plt

signal_a = numpy.array([10, 20, 10, 30, 20, 10, 28, 22, 10])
signal_b = numpy.array([28, 22])
correlations = numpy.correlate(signal_a, signal_b, mode = "full")

print(correlations)
plt.plot(correlations)

输出此图表和相关性数组

[28, 22] 的最高相关性是在位置 [..., 30, 20, ...] 处计算的。 我明白了这个公式以及为什么它是 1280。 但我实际上正在寻找 [..., 28, 22, ...] 因为它正是(在这种情况下)我正在寻找的(信号 B)。

相关性是正确的做法吗?我发现了很多使用相关性来检测相似性的来源。相同的值不应该比其他值更相似吗?

python numpy correlation cross-correlation
2个回答
0
投票

解决您的问题的一个可能的解决方案是均方误差(MSE)。给定两个相同维度的信号

a
b
,MSE 是
a
b
之差的逐元素平方的平均值。代码如下所示(基于this):

import numpy as np
import matplotlib.pyplot as plt

a = np.array([10, 20, 10, 30, 20, 10, 28, 22, 10])
b = np.array([28, 22])
mse = np.ndarray((len(a) - len(b) + 1))

for i in range(mse.size):
    mse[i] = np.square(np.subtract(a[i:i+len(b)],b)).mean()

print(mse.argmin())
plt.plot(mse)

0
投票

您可以通过查看值的差异来检测相似性,而不是查看相关性。 例如,您可以选取 a 中的每 2 个元素(如果 b 的长度为 2)并查看差异的绝对值:

 import numpy as np
 import matplotlib.pyplot as plt

 signal_a = np.array([10, 20, 10, 30, 20, 10, 28, 22, 10])
 signal_b = np.array([28, 22])
 N2 = len(signal_b)

 diffs = []
 for i in range(len(signal_a) - len(signal_b) + 1):
      diff_ab = signal_a[i:i+N2] - signal_b
      diffs.append(sum(abs(diff_ab)))

 print(diffs)
 plt.plot(diffs)

并在 diffs 数组中找到最小值。 您也可以使用差值的平方值来代替abs()。

© www.soinside.com 2019 - 2024. All rights reserved.