1

我正在开发一种用于比较两个数字列表的算法。这些列表表示使用稳健的峰值检测方法在信号中发现的峰值。我希望想出一些方法来确定峰值是同相、异相还是两者都没有(无法确定)。例如:

这些阵列将被考虑在阶段:

[ 94 185 278 373 469], [ 89 180 277 369 466]

但是这些数组将是异相的:

[51 146 242 349], [99 200 304 401]

不要求数组必须具有相同的长度。我已经研究过测量周期性,但是在这种情况下,我可以假设信号已经是周期性的。

我的另一个想法是将所有数组元素除以它们的索引(或它们的索引+1),以查看它们是否聚集在一个或两个点周围,但这并不可靠,并且如果缺少单个峰值就会失败。

什么方法可能对解决这个问题有用?

4

2 回答 2

2

一种方法是找到从第一个列表中的每个峰值到第二个列表中的峰值的中间距离。

如果将此距离除以第一个列表中峰之间的中值距离,您将得到一个分数,其中 0 表示同相,0.5 表示异相。

例如:

[ 94 185 278 373 469], [ 89 180 277 369 466]
94->89 = 5
185->180 = 5
278->277 = 1
373->369 = 4
469->466 = 5

Score = median(5,5,1,4,5) / median distance between peaks
      = 5 / 96 = 5.2% => in phase


[51 146 242 349], [99 200 304 401]
51->99 = 48
146->99 = 47
242->200 = 42
349->304 = 45
score = median(48,47,42,45) / median distance between peaks
      = 46 / 95.5
      = 48% => out of phase
于 2017-07-17T19:37:45.383 回答
0

我会将峰值位置作为索引位置输入到一个更大的数组中(最好是数组的长度接近峰值周期性距离的整数倍),然后执行复杂的 Goertzel 滤波器(如果您知道频率),或者对阵列进行 DFT 或 FFT(如果您不知道频率)。然后对复数结果(在 FFT 的峰值幅度频率处)使用 atan2() 来测量相对于阵列起点的相位。然后使用一些差异阈值比较展开的相位。

于 2017-07-18T18:42:41.290 回答