поиск непрерывного сигнала в шумных двоичных временных рядах - PullRequest
1 голос
/ 10 апреля 2019

Предположим, у меня есть временной ряд, например:

[1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 , 1, 1, 1, 1]

и я знаю, что в сигнале есть шум. Я хочу убрать шум как можно лучше и по-прежнему выводить двоичный сигнал. Приведенный выше пример может превратиться в нечто вроде:

[1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 1, 1, 1, 1]

Я реализовал наивный подход, основанный на правилах, где я перебираю значения и имею минимальное количество 1 с или 0 с. Мне нужно «поменять» сигнал.

Кажется, должен быть лучший способ сделать это. Многие результаты поиска в Google дают недвоичный вывод. Есть ли какая-нибудь функция scipy, которую я мог бы использовать для этого?

1 Ответ

1 голос
/ 10 апреля 2019

Вам могут помочь две похожие функции: scipy.signal.argrelmin и scipy.signal.argrelmax . Есть поиск локальных мин / макс в дискретных массивах. Вы должны передать свой массив и радиус поиска соседей как order. Ваша проблема может быть решена их комбинацией:

>>> a = np.asarray([1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 , 1, 1, 1, 1], int)

>>> signal.argrelmin(a, order=3)
(array([4], dtype=int32),)

>>> signal.argrelmax(a, order=3)
(array([15], dtype=int32),)

Тогда вы можете просто заменить эти элементы.

...