Обнаружение пика измеряемого сигнала

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

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

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


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

Ответов (9)

Решение

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

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

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

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

Я хотел бы внести свой вклад в эту тему алгоритм, который я разработал сам :

Он основан на принципе дисперсии : если новая точка данных находится на заданном x стандартном отклонении от некоторого скользящего среднего, алгоритм подает сигнал (также называемый z-оценкой ). Алгоритм очень надежен, поскольку он строит отдельные скользящие среднее и отклонение, так что сигналы не искажают пороговое значение. Таким образом, будущие сигналы идентифицируются примерно с одинаковой точностью, независимо от количества предыдущих сигналов. Алгоритм имеет 3 входа: lag = the lag of the moving window, threshold = the z-score at which the algorithm signals и influence = the influence (between 0 and 1) of new signals on the mean and standard deviation . Например, значение lag 5 будет использовать последние 5 наблюдений для сглаживания данных. Значение threshold 3,5 будет сигнализировать, если точка данных находится на расстоянии 3,5 стандартных отклонений от скользящего среднего. А influence 0,5 дает половину сигналов.влияния, которое имеют обычные точки данных. Аналогичным образом, значение influence 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

Демо

Демонстрация надежного алгоритма определения порога

> Дополнительную информацию см. В исходном ответе.

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

Эта проблема изучена достаточно подробно.

Есть набор очень современных реализаций в TSpectrum* классах ROOT (инструмент анализа ядерной физики / физики элементарных частиц). Код работает с одно- и трехмерными данными.

Исходный код ROOT доступен, так что вы можете получить эту реализацию, если хотите.

Из документации класса TSpectrum :

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

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

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

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

Документы связаны с документацией класса для тех из вас, у кого нет онлайн-подписки NIM.


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

Этот метод в основном взят из книги Дэвида Марра «Видение».

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

Затем обнаружение края (подойдет LOG)

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

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

Есть ли качественная разница между желаемым пиком и нежелательным вторым пиком? Если оба пика являются «резкими», то есть короткими по времени, при просмотре сигнала в частотной области (путем выполнения БПФ) вы получите энергию в большинстве диапазонов. Но если у «хорошего» пика надежно присутствует энергия на частотах, которых нет в «плохом» пике, или наоборот, вы можете автоматически различать их таким образом.

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

  1. Между любыми двумя точками в ваших данных, (x(0), y(0))и (x(n), y(n)), складываются y(i + 1) - y(i)для 0 <= i < nи называют это T( «путешествие») и множество R( «Взлет») в y(n) - y(0) + kтечение соответственно мала k. T/R > 1обозначает пик. Это работает нормально, если большой ход из-за шума маловероятен или если шум распределяется симметрично вокруг формы базовой кривой. Для вашего приложения примите самый ранний пик с оценкой выше заданного порога или проанализируйте кривую хода на подъем для более интересных свойств.

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

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

  4. Сгладьте данные и проверьте наличие троек равноотстоящих точек where, if 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-гауссовскую модель смеси (например, в Numerical Recipes есть хороший готовый кусок кода). Возьмите более ранний пик. Это будет правильно работать с перекрывающимися пиками.

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

Я делал то, что вы делаете раньше: находил пики в данных последовательности ДНК, находил пики производных, рассчитанных по измеренным кривым, и находил пики на гистограммах.

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

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