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

时间:2018-11-14 12:23:21

标签: python numpy correlation cross-correlation

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

如果我只是想“错”还是相关性是解决此类问题的错误工具,谁能给我提示吗?

我的设置:

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

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

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

2 个答案:

答案 0 :(得分: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(),您也可以使用差异的平方值。

答案 1 :(得分:0)

Mean Squared Error (MSE)是解决问题的一种可能方法。给定两个具有相同尺寸的信号ab,MSE是ab之间的差的元素方平方的平均值。代码如下(基于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)