Определение пика измеряемого сигнала

Мы используем карту сбора данных для снятия показаний с устройства, сигнал которого увеличивается до пика, а затем падает до исходного значения. Чтобы найти пиковое значение, мы сейчас ищем в массиве самое высокое показание и используем индекс для определения времени пикового значения, которое используется в наших расчетах.

Это работает хорошо, если наибольшее значение является пиком, который мы ищем, но если устройство работает неправильно, мы можем увидеть второй пик, который может быть выше, чем начальный пик. Мы снимаем 10 показаний в секунду с 16 устройств в течение 90 секунд.

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


Мы используем LabVIEW, и я проверил форумы LAVA, там есть несколько интересных примеров. Это часть нашего тестового программного обеспечения, и мы пытаемся избежать использования слишком большого количества нестандартных библиотек VI, поэтому я надеялся получить отзывы о процессе/алгоритмах, а не о конкретном коде.

Есть партии и много классических пиковых методов обнаружения, любой из которых мог бы работать. You' ll должны видеть то, что, в частности, ограничивает качество Ваших данных. Вот основные описания:

  1. Между любыми двумя пунктами в Ваших данных, '(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' указывает на пик. Это работает хорошо, если большое путешествие из-за шума маловероятно или если шум распределяет симметрично вокруг основной формы кривой. Для Вашего заявления примите самый ранний пик со счетом выше данного порога или проанализируйте кривую путешествия за ценности повышения для более интересных свойств.

  2. Используйте подобранные фильтры, чтобы выиграть подобие стандартной пиковой форме (по существу, используйте нормализованный точечный продукт против некоторой формы, чтобы получить метрику косинуса подобия),

  3. Deconvolve против стандартной пиковой формы и проверки на высокие ценности (хотя я часто нахожу 2 быть менее чувствительным к шуму для простой продукции инструментовки).

  4. Сглаживайте данные и проверку на тройки равномерно распределенных пунктов где, если 'x0 < x1 < x2, y1 > 0.5 * (y0 + y2)', или проверяют Евклидовы расстояния как это: 'D ((x0, y0), (x1, y1)) + D ((x1, y1), (x2, y2)) > D ((x0, y0), (x2, y2))', который полагается на неравенство треугольника. Используя простые отношения снова предоставит Вам механизм выигрыша.

  5. Соответствуйте очень простой 2-гауссовской модели смеси к своим данным (например, Числовые Рецепты имеет хорошую готовую часть кодекса). Возьмите более ранний пик. Это будет иметь дело правильно с перекрыванием на пики.

  6. Найдите лучший матч в данных к простому Гауссовскому, Коши, Пуассону или кривой, «у чего есть Вы». Оцените эту кривую в широком круге и вычтите ее из копии данных после замечания it' s пиковое местоположение. Повториться. Возьмите самый ранний пик, образцовые параметры которого (стандартное отклонение, вероятно, но некоторые заявления могли бы заботиться об эксцессе или других особенностях) соответствуют некоторому критерию. Не упустите артефакты, оставленные позади, когда пики будут вычтены из данных. Лучший матч мог бы быть определен видом выигрыша матча, предложенного в № 2 выше.

I' ve, сделанный, что you' ре, делающее прежде: нахождение пиков в данных о последовательности ДНК, нахождение пиков в производных, оцененных от измеренных кривых и нахождения пиков в гистограммах.

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

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

Комментарии (4)
Решение

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

Я понимаю, что это не зависит от языка, но если предположить, что вы используете LabView, то в LabView есть много готовых ВИ для обработки сигналов, которые можно использовать для сглаживания и уменьшения шума. Форумы NI - отличное место для получения более специализированной помощи по таким вопросам.

Комментарии (0)

Я хотел бы внести в эту нить алгоритм, который [я разработал сам] (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 является поэтому самым прочным выбором.

Это работает следующим образом:

Псевдокодекс

# Let y be a vector of timeseries data of at least length lag+2
# Let mean() be a function that calculates the mean
# Let std() be a function that calculates the standard deviaton
# Let absolute() be the absolute value function

# Settings (the ones below are examples: choose what is best for your data)
set lag to 5;          # lag 5 for the smoothing functions
set threshold to 3.5;  # 3.5 standard deviations for signal
set influence to 0.5;  # between 0 and 1, where 1 is normal influence, 0.5 is half

# Initialise variables
set signals to vector 0,...,0 of length of y;   # Initialise signal results
set filteredY to y(1,...,lag)                   # Initialise filtered series
set avgFilter to null;                          # Initialise average filter
set stdFilter to null;                          # Initialise std. filter
set avgFilter(lag) to mean(y(1,...,lag));       # Initialise first value
set stdFilter(lag) to std(y(1,...,lag));        # Initialise first value

for i=lag+1,...,t do
  if absolute(y(i) - avgFilter(i-1)) > threshold*stdFilter(i-1) then
    if y(i) > avgFilter(i-1)
      set signals(i) to +1;                     # Positive signal
    else
      set signals(i) to -1;                     # Negative signal
    end
    # Adjust the filters
    set filteredY(i) to influence*y(i) + (1-influence)*filteredY(i-1);
    set avgFilter(i) to mean(filteredY(i-lag,i),lag);
    set stdFilter(i) to std(filteredY(i-lag,i),lag);
  else
    set signals(i) to 0;                        # No signal
    # Adjust the filters
    set filteredY(i) to y(i);
    set avgFilter(i) to mean(filteredY(i-lag,i),lag);
    set stdFilter(i) to std(filteredY(i-lag,i),lag);
  end
end

Demo

! [Демонстрация прочного алгоритма пороговой обработки] [1]

[> Оригинальный ответ] (https://stackoverflow.com/questions/22583391/peak-signal-detection-in-realtime-timeseries-data/22640362)

Комментарии (2)

Эта проблема была изучена в некоторых деталях.

Есть ряд очень актуальных внедрений в 'TSpectrum*' классы < href =" http://root.cern.ch/" > ROOT (ядерный аналитический инструмент / аналитический инструмент физики элементарных частиц). Кодекс работает в одном - к трехмерным данным.

Исходный код КОРНЯ доступен, таким образом, Вы можете захватить это внедрение, если Вы хотите.

От < href =" http://root.cern.ch/root/html/TSpectrum.html" > TSpectrum документация класса:

Алгоритмы, используемые в этом классе, были изданы в следующих ссылках:

[1] M.Morhac и др.: Фон методы устранения для многомерный гамма-луч совпадения спектры. Ядерные Инструменты и методы в физике исследуют 401 (1997) 113- 132.

[2] M.Morhac и др.: Эффективный один - и двумерное Золото деконволюция и ее применение к разложение спектров гамма-луча. ядерные инструменты и методы в физика исследует 401 (1997) 385-408.

[3] M.Morhac и др.: Идентификация пиков в многомерный гамма-луч совпадения спектры. Ядерные Инструменты и методы в физике исследования A 443 (2000), 108-125.

Бумаги связаны из документации класса для тех из Вас кто don' у t есть НИМ подписка онлайн.


Короткая версия того, что сделано, - то, что гистограмма, сглаженная, чтобы устранить шум, и затем местные максимумы, обнаружена грубой силой в сглаженной гистограмме.

Комментарии (0)

Этот метод в основном от Дэвида Marr' s заказывают " Vision"

Гауссовское пятно Ваш сигнал с ожидаемой шириной Ваших пиков. это избавляется от шумовых шипов, и Ваши данные о фазе неповреждены.

Тогда край обнаруживает (РЕГИСТРАЦИЯ сделает),

Тогда Ваши края были краями особенностей (как пики). посмотрите между краями для пиков, пиков вида размером и you' сделанное ре.

Я использовал изменения на этом, и они работают очень хорошо.

Комментарии (0)

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

Комментарии (0)

Вы можете применить некоторые Standard Deviation к вашей логике и обратить внимание на пики более x%.

Комментарии (0)

Есть ли качественное различие между желаемым пиком и нежелательным вторым пиком? Если оба пика - " sharp" - т.е. короткий в продолжительности времени - смотря на сигнал в области частоты (делая FFT) you' ll получают энергию в большинстве групп. Но если " good" у пика надежно есть энергетический подарок на частотах, не существующих в " bad" пик, или наоборот, Вы можете быть в состоянии автоматически дифференцировать их тот путь.

Комментарии (0)

Я don' t знают очень много об инструментовке, таким образом, это могло бы быть полностью непрактично, но с другой стороны это могло бы быть полезное различное направление. Если Вы знаете, как чтения могут потерпеть неудачу, и есть определенный интервал между пиками, учитывая такие неудачи, почему бы не спуск градиента в каждом интервале. Если спуск возвращает Вас области you' ve искал прежде, Вы можете оставить его. В зависимости от формы выбранной поверхности это также могло бы помочь Вам найти пики быстрее, чем поиск.

Комментарии (0)