arraysalgorithmsignalssignal-processingperiodicity

An Algorithm Comparing Peaks: are they in phase or not?


I am developing an algorithm for comparing two lists of numbers. The lists represent peaks discovering in a signal using a robust peak detection method. I wish to come up with some way of determining whether the peaks are either in phase, out of phase, or neither (could not be determined). For example:

These arrays would be considered in phase:

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

But these arrays would be out of phase:

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

There is no requirement that the arrays must be the same length. I have looked into measuring periodicity, however in this case I can assume the signal is already periodic.

Another idea I had was to divide all the array elements by their index (or their index+1) to see if they cluster around one or two points, but this is not robust and fails if a single peak is missing.

What approaches might be useful in solving this problem?


Solution

  • One approach would be to find the median distance from each peak in the first list to a peak in the second list.

    If you divide this distance by the median distance between peaks in the first list, you will get a fraction where 0 means in phase, and 0.5 means out of phase.

    For example:

    [ 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