-1

I have a binary time series with some ASK modulated signals in different frequencies inside of it.

Let's say it's something like this: x = [0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0, ...]

What's matter to me is having all the '1' and '0' in an interval of 4 samples or more, but sometimes the '0' and '1' change places like this: x1 = [0,0,0,1,1,1,1,1] when it had to be x2 = [0,0,0,0,1,1,1,1]

And there's also some noise as spikes as seen in n1 = [0,0,0,0,0,0,1,1,0,0,0,0,0] when it should be only zeros.

I've already tried moving average and it introduced a lag to the signal that was't good for my application.

Do you have some advices about signal processing on binary time series?

1 Answers1

0

The following code finds the indices of all continuous sequences with the length smaller than 4 (min_cont_length). It also gives you the lengths of the problematic sectors, so you can decide how to handle them.

import numpy as np

def find_index_of_err(signal, min_cont_length = 4):
    # pad sides to detect problems at the edges
    signal = np.concatenate(([1-signal[0]],signal,[1-signal[-1]]))
    # calculate differences from 1 element to the next
    delta = np.concatenate(([0], np.diff(signal, 1)))
    # detect discontinuities
    discontinuity = np.where(delta!=0)[0]
    # select discontinuities with matching length (< min_cont_length)
    err_idx = discontinuity[:-1][np.diff(discontinuity) < min_cont_length] - 1
    # get also the size of the gap
    err_val = np.diff(discontinuity)[np.argwhere(np.diff(discontinuity) < min_cont_length).flatten()]
    return err_idx, err_val

# some test signals
signals = np.array([[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                    [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
                    [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
                    [0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0],
                    [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1]])

for sig in signals:
    index, value = find_index_of_err(sig)
    print(sig, index, value)

# Output:
# [1 0 0 0 0 0 0 0 0 0 0] [0] [1]
# [0 0 1 0 0 0 0 0 0 0 0] [0 2] [2 1]
# [0 0 0 0 1 0 0 0 0 0 0] [4] [1]
# [0 0 0 0 0 0 1 1 0 0 0] [6 8] [2 3]
# [0 0 0 0 0 0 1 1 1 1 1] [] []
Marcel
  • 393
  • 3
  • 9