比较峰的算法:它们是否同相?

问题描述:

我正在开发一个比较两个数字列表的算法。这些列表代表使用robust peak detection method在信号中发现的峰值。我想提出一些方法来确定峰值是否处于同相,异相或两者之间(无法确定)。例如:比较峰的算法:它们是否同相?

这些阵列将在阶段考虑:

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

但这些阵列会出的阶段:

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

有没有要求阵列必须长度相同。我已经看过measuring periodicity,但是在这种情况下,我可以假设信号已经是周期性的。

我的另一个想法是将所有数组元素的索引(或其索引+ 1)分开,以查看它们是否围绕一个或两个点进行聚类,但如果单个峰缺失,则这种方法不健壮并失败。

什么方法可能有助于解决这个问题?

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

如果将此距离除以第一个列表中峰值之间的中值距离,您将得到一个分数,其中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 
+0

我喜欢这种方法!然而,不是仅仅使用中位数,而是计算每个峰值的“同相百分比”是否有意义,这样我就有了一个测量值而不是一个?中位数并不意味着太多,除非有最小的变异... –

+0

听起来很明智,也许可以尝试两种方法,看看哪个效果最好? –

我将进入峰值位置,使用它们作为索引位置,到一个更大的阵列(最好的,如果该数组的长度接近周期性距离的整数倍),然后做一个复杂的Goertzel滤波器(如果你知道频率),或者做一个DFT或FFT(如果你不知道频率)的阵列。然后对复数结果(以FFT的峰值幅度频率)使用atan2()来测量相对于阵列开始的相位。然后使用一些差异阈值比较未包裹的阶段。