Определение пика измеряемого сигнала
Мы используем карту сбора данных для снятия показаний с устройства, сигнал которого увеличивается до пика, а затем падает до исходного значения. Чтобы найти пиковое значение, мы сейчас ищем в массиве самое высокое показание и используем индекс для определения времени пикового значения, которое используется в наших расчетах.
Это работает хорошо, если наибольшее значение является пиком, который мы ищем, но если устройство работает неправильно, мы можем увидеть второй пик, который может быть выше, чем начальный пик. Мы снимаем 10 показаний в секунду с 16 устройств в течение 90 секунд.
Мои первоначальные мысли заключаются в том, чтобы просмотреть показания, проверяя, что предыдущая и следующая точки меньше текущей, чтобы найти пик и построить массив пиков. Возможно, нам следует искать среднее значение по нескольким точкам по обе стороны от текущего положения, чтобы учесть шум в системе. Является ли этот способ наилучшим или есть более эффективные методы?
Мы используем LabVIEW, и я проверил форумы LAVA, там есть несколько интересных примеров. Это часть нашего тестового программного обеспечения, и мы пытаемся избежать использования слишком большого количества нестандартных библиотек VI, поэтому я надеялся получить отзывы о процессе/алгоритмах, а не о конкретном коде.
Есть партии и много классических пиковых методов обнаружения, любой из которых мог бы работать. You' ll должны видеть то, что, в частности, ограничивает качество Ваших данных. Вот основные описания:
Между любыми двумя пунктами в Ваших данных, '(x (0), y (0))' и' (x (n), y (n))', складывают 'y (я + 1) - y (i)' для '0 < = я < n' и требование этот 'T' (" travel") и набор 'R' (" rise") к 'y (n) - y (0) + k' для соответственно маленького 'k'. 'T/R > 1' указывает на пик. Это работает хорошо, если большое путешествие из-за шума маловероятно или если шум распределяет симметрично вокруг основной формы кривой. Для Вашего заявления примите самый ранний пик со счетом выше данного порога или проанализируйте кривую путешествия за ценности повышения для более интересных свойств.
Используйте подобранные фильтры, чтобы выиграть подобие стандартной пиковой форме (по существу, используйте нормализованный точечный продукт против некоторой формы, чтобы получить метрику косинуса подобия),
Deconvolve против стандартной пиковой формы и проверки на высокие ценности (хотя я часто нахожу 2 быть менее чувствительным к шуму для простой продукции инструментовки).
Сглаживайте данные и проверку на тройки равномерно распределенных пунктов где, если 'x0 < x1 < x2, y1 > 0.5 * (y0 + y2)', или проверяют Евклидовы расстояния как это: 'D ((x0, y0), (x1, y1)) + D ((x1, y1), (x2, y2)) > D ((x0, y0), (x2, y2))', который полагается на неравенство треугольника. Используя простые отношения снова предоставит Вам механизм выигрыша.
Соответствуйте очень простой 2-гауссовской модели смеси к своим данным (например, Числовые Рецепты имеет хорошую готовую часть кодекса). Возьмите более ранний пик. Это будет иметь дело правильно с перекрыванием на пики.
Найдите лучший матч в данных к простому Гауссовскому, Коши, Пуассону или кривой, «у чего есть Вы». Оцените эту кривую в широком круге и вычтите ее из копии данных после замечания it' s пиковое местоположение. Повториться. Возьмите самый ранний пик, образцовые параметры которого (стандартное отклонение, вероятно, но некоторые заявления могли бы заботиться об эксцессе или других особенностях) соответствуют некоторому критерию. Не упустите артефакты, оставленные позади, когда пики будут вычтены из данных. Лучший матч мог бы быть определен видом выигрыша матча, предложенного в № 2 выше.
I' ve, сделанный, что you' ре, делающее прежде: нахождение пиков в данных о последовательности ДНК, нахождение пиков в производных, оцененных от измеренных кривых и нахождения пиков в гистограммах.
Я поощряю Вас следить тщательно за надлежащим определением исходного состояния. Винер, фильтрующий или другая фильтрация или простой анализ гистограммы, часто является легким способом к основанию в присутствии шума.
Наконец, если Ваши данные типично шумные и you' данные о получении ре от карты как не имеющая ссылки единственно законченная продукция (или даже ссылаемый, просто не отличительный), и если you' ре, составляющее в среднем много наблюдений в каждую точку данных, попытайтесь сортировать те наблюдения и выбросить первый и последний квартиль и составить в среднем то, что остается. Есть масса такой тактики устранения изолированной части, которая может быть действительно полезной.
Можно попробовать усреднить сигнал, т.е. для каждой точки усреднить значение с окружающими 3 или более точками. Если всплески шума велики, то даже это может не помочь.
Я понимаю, что это не зависит от языка, но если предположить, что вы используете LabView, то в LabView есть много готовых ВИ для обработки сигналов, которые можно использовать для сглаживания и уменьшения шума. Форумы NI - отличное место для получения более специализированной помощи по таким вопросам.
Я хотел бы внести в эту нить алгоритм, который [я разработал сам] (https://stackoverflow.com/questions/22583391/peak-detection-in-realtime-timeseries-data):
Это основано на принципе [дисперсии] (https://en.wikipedia.org/wiki/Statistical_dispersion): если новая точка ввода данных - отданное x количество стандартных отклонений от немного движущихся средний, сигналы алгоритма (также названный [z-счетом] (https://en.wikipedia.org/wiki/Standard_score)). Алгоритм очень прочен, потому что он строит отдельный перемещающийся средний и отклонение, такое, что сигналы не развращают порог. Будущие сигналы поэтому отождествлены приблизительно с той же точностью, независимо от суммы предыдущих сигналов. Алгоритм берет 3 исходных данные: 'отстаньте = задержка движущегося окна', 'порог = z-счет в который сигналы алгоритма и 'влияние = влияние (между 0 и 1) новых сигналов на среднем и стандартном отклонении'. Например, 'задержка' 5 будет использовать последние 5 наблюдений, чтобы сглаживать данные. 'Порог' 3,5 будет сигнализировать, является ли точка ввода данных 3,5 стандартными отклонениями далеко от движущегося среднего. И 'влияние' 0,5 дает сигналы половина влияния, которое имеют нормальные точки ввода данных. Аналогично, 'влияние' 0 игнорирует сигналы полностью для перевычисления нового порога: влияние 0 является поэтому самым прочным выбором.
Это работает следующим образом:
Псевдокодекс
Demo
! [Демонстрация прочного алгоритма пороговой обработки] [1]
[> Оригинальный ответ] (https://stackoverflow.com/questions/22583391/peak-signal-detection-in-realtime-timeseries-data/22640362)
Эта проблема была изучена в некоторых деталях.
Есть ряд очень актуальных внедрений в 'TSpectrum*' классы < href =" http://root.cern.ch/" > ROOT (ядерный аналитический инструмент / аналитический инструмент физики элементарных частиц). Кодекс работает в одном - к трехмерным данным.
Исходный код КОРНЯ доступен, таким образом, Вы можете захватить это внедрение, если Вы хотите.
От < href =" http://root.cern.ch/root/html/TSpectrum.html" > TSpectrum документация класса:
Алгоритмы, используемые в этом классе, были изданы в следующих ссылках:
Бумаги связаны из документации класса для тех из Вас кто don' у t есть НИМ подписка онлайн.
Короткая версия того, что сделано, - то, что гистограмма, сглаженная, чтобы устранить шум, и затем местные максимумы, обнаружена грубой силой в сглаженной гистограмме.
Этот метод в основном от Дэвида Marr' s заказывают " Vision"
Гауссовское пятно Ваш сигнал с ожидаемой шириной Ваших пиков. это избавляется от шумовых шипов, и Ваши данные о фазе неповреждены.
Тогда край обнаруживает (РЕГИСТРАЦИЯ сделает),
Тогда Ваши края были краями особенностей (как пики). посмотрите между краями для пиков, пиков вида размером и you' сделанное ре.
Я использовал изменения на этом, и они работают очень хорошо.
Я думаю, вы хотите кросс-коррелировать ваш сигнал с ожидаемым, образцовым сигналом. Но я так давно не изучал обработку сигналов, и даже тогда я не обратил на это особого внимания.
Вы можете применить некоторые Standard Deviation к вашей логике и обратить внимание на пики более x%.
Есть ли качественное различие между желаемым пиком и нежелательным вторым пиком? Если оба пика - " sharp" - т.е. короткий в продолжительности времени - смотря на сигнал в области частоты (делая FFT) you' ll получают энергию в большинстве групп. Но если " good" у пика надежно есть энергетический подарок на частотах, не существующих в " bad" пик, или наоборот, Вы можете быть в состоянии автоматически дифференцировать их тот путь.
Я don' t знают очень много об инструментовке, таким образом, это могло бы быть полностью непрактично, но с другой стороны это могло бы быть полезное различное направление. Если Вы знаете, как чтения могут потерпеть неудачу, и есть определенный интервал между пиками, учитывая такие неудачи, почему бы не спуск градиента в каждом интервале. Если спуск возвращает Вас области you' ve искал прежде, Вы можете оставить его. В зависимости от формы выбранной поверхности это также могло бы помочь Вам найти пики быстрее, чем поиск.