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

StackOverflow https://stackoverflow.com/questions/3260

  •  08-06-2019
  •  | 
  •  

Вопрос

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

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

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


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

Это было полезно?

Решение

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

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

Другие советы

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

  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. Сгладьте данные и проверьте наличие тройняшек из равноудаленных точек, где, если 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 выше.

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

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

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

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

Существует набор очень современных реализаций в TSpectrum* классы из КОРЕНЬ (инструмент анализа ядерной физики / физики элементарных частиц).Код работает как с одномерными, так и с трехмерными данными.

Доступен КОРНЕВОЙ исходный код, так что вы можете воспользоваться этой реализацией, если хотите.

Из самого Спектр документация класса:

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

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

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

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

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


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

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

Она основана на принципе дисперсия:если новая точка данных находится на заданном 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.Например, a lag of 5 будет использовать последние 5 наблюдений для сглаживания данных.A threshold значение 3.5 будет сигнализировать, если точка данных находится на расстоянии 3,5 стандартных отклонений от скользящего среднего.И еще influence из 0,5 выдает сигналы половина о влиянии, которое оказывают обычные точки данных.Аналогично, an 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

ДЕМОНСТРАЦИЯ

Demonstration of robust thresholding algorithm

> Оригинальный ответ

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

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

Затем обнаружение края (подойдет журнал регистрации)

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top