Алгоритм обнаружения пиков из записанных, зашумленных данных. Графики внутри - PullRequest
7 голосов
/ 19 января 2011

Итак, я записал некоторые данные с Android GPS, и я пытаюсь найти пики этих графиков, но я не смог найти ничего конкретного, возможно, потому что я не слишком уверен, что ищу. Я нашел некоторые функции MatLab, но я не могу найти реальные алгоритмы, которые делают это. Мне нужно сделать это на Java, но я должен иметь возможность переводить код с других языков.

alt text

Как видите, есть много «мини-пиков», но я просто хочу основные.

Ответы [ 5 ]

2 голосов
/ 16 декабря 2013

Ваше решение зависит от того, что вы хотите сделать с данными.Если вы хотите делать очень серьезные вещи, тогда вам, скорее всего, следует использовать (быстрое) преобразование Фурье и извлечь из него как фазу, так и частоту.Но это очень интенсивно в вычислительном отношении и требует много времени для программирования. Если вы просто хотите сделать что-то простое , которое не требует больших вычислительных ресурсов, то вот предложение:

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

Вам нужно определить среднее значение от пика к пикурасстояние и назовите это PtP.Делайте это измерение как угодно.Судя по графику в вашем случае, он составляет около 35. В моем коде у меня есть другой алгоритм, который я изобрел, чтобы сделать это автоматически.

Затем выберите случайный начальный индекс на графике.С этого момента опрашивайте каждый новый набор данных и ждите, пока график не поднимется или не упадет с начального уровня индекса примерно на 70% от PtP.Если это было падение, то это так.Если это был подъем, то это галочка.Сохраните этот уровень как последний тик или высоту токов.Создайте событие 'tick' или 'tock' с этим индексом.

Продолжайте движение вперед в данных.После тиков, если данные продолжают расти после этой точки, сохраните этот уровень как новую 'высоту тика', но не создайте новое событие тика.После того, как после tocks, если данные продолжают падать после этой точки, сохраните этот уровень как новую 'глубину tock', но не создайте новое событие tock.

Если последнее событие было tock, тогда подождитегалочка, если последнее событие было галочкой, тогда ждите токка.

Каждый раз, когда вы обнаруживаете галочку, это должно быть пиком!Удачи.

1 голос
/ 19 января 2011

Я думаю, что вы хотите сделать это через какой-то фильтр нижних частот. В зависимости от того, что именно вы хотите получить из этого набора данных, может быть использован простой «коробочный автомобиль» достаточно: в каждой точке взять среднее из N выборок с центром в этой точке, и принять среднее значение в качестве отфильтрованного значения. Чем больше N, тем более агрессивно сглаживаются отфильтрованные данные.

0 голосов
/ 25 октября 2012

С особенно неприятными и шумными данными я обычно использую сглаживание. Самый простой пример сглаживания - скользящее среднее. Тогда вы можете найти пик на этой скользящей средней. А затем вы просто возвращаетесь к своим исходным данным и берете самый близкий пик к тому, который вы нашли по скользящей средней.

0 голосов
/ 19 января 2011

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

0 голосов
/ 19 января 2011

Я немного изучил обнаружение пиков и могу сказать вам, что если ваши данные не работают, это может испортить ваш алгоритм. Вдобавок ко всему, вы можете попробовать: выбрать порог, то есть порог = 250. Если данные превышают порог, найдите максимальное значение за этот период. Это предполагает, что у ваших данных есть среднее значение около 230. Не уверен, насколько вы хотите получить. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...