比较峰值的算法:它们是否同相?
An Algorithm Comparing Peaks: are they in phase or not?
我正在开发一种算法来比较两个数字列表。这些列表表示使用 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
我会将峰值位置输入到一个更大的数组中,将它们用作索引位置(最好是数组的长度接近峰值周期距离的整数倍),然后执行以下任一操作复杂的 Goertzel 滤波器(如果您知道频率),或者对阵列进行 DFT 或 FFT(如果您不知道频率)。然后对复数结果(在 FFT 的峰值幅度频率处)使用 atan2() 来测量相对于阵列开始的相位。然后使用一些差异阈值比较展开的相位。
我正在开发一种算法来比较两个数字列表。这些列表表示使用 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
我会将峰值位置输入到一个更大的数组中,将它们用作索引位置(最好是数组的长度接近峰值周期距离的整数倍),然后执行以下任一操作复杂的 Goertzel 滤波器(如果您知道频率),或者对阵列进行 DFT 或 FFT(如果您不知道频率)。然后对复数结果(在 FFT 的峰值幅度频率处)使用 atan2() 来测量相对于阵列开始的相位。然后使用一些差异阈值比较展开的相位。