我正在开发一种比较两个数字列表的算法。列表表示使用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)以查看它们是否聚集在一个或两个点附近,但这不稳健并且如果缺少单个峰值则会失败。 / p>
哪些方法可能有助于解决此问题?
答案 0 :(得分: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
答案 1 :(得分:0)
我会将它们作为索引位置输入峰值位置,形成一个更大的数组(如果数组的长度接近峰的周期距离的整数倍,则最好),然后做一个复杂的Goertzel滤波器(如果您知道频率),或者进行阵列的DFT或FFT(如果您不知道频率)。然后在复数结果(在FFT的峰值幅度频率)上使用atan2()来测量相对于阵列开始的相位。然后使用一些差异阈值比较展开的阶段。