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

Cross correlation / similarity of signals - calculate time lag

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

如果我只是在想 "wrong" 或者相关性是解决此类问题的错误工具,谁能给我提示?

我的设置:

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)

Outputs this chart and correlations array

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

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

与其查看相关性,不如查看值的差异来检测相似性。 例如,您可以选择 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() 之外,您还可以使用差值的平方值。

您的问题的一个可能解决方案是 Mean Squared Error (MSE). Given two signals a and b of same dimensions, MSE is the average value of the element-wise squares of the difference between a and b. The code would look like follows (based on 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(c.size):
    mse[i] = np.square(np.subtract(a[i:i+len(b)],b)).mean()

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