Нужен алгоритм для обнаружения импульса в сингальных данных в R

#r

#r

Вопрос:

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

введите описание изображения здесь

Я хочу извлечь ширину импульса, учитывая, что:

  • мой импульс всегда будет иметь наибольшее значение
  • мой импульс всегда будет иметь наибольшую ширину
  • перед моим импульсом нет заметного шума
  • разрешение импульса равно 1e-09

Мой подход до сих пор описан ниже, но, похоже, он терпит неудачу, когда пик данных ближе к пиковым уровням шума:

  1. Определите начало импульса, отслеживая первую точку — серию из 10, которая превышает 5% от максимумов:
 sPoint <- which(rollapply(wave$mY, 10, function(x) min(x)>max(wave$mY)*0.05))[1]
  
  1. Определите, где находится конечная точка импульса, получив подмножество данных, превышающее 50% от максимумов, определите новое пороговое значение на 5% выше минимального и снова используйте rollapply:
 subData <- subset(wave,wave$mY>max(wave$mY)*0.5)
tresh <- min(subData$mY) min(subData$mY)*0.05
ePoint <- subData$Time[which(rollapply(subData$mY, 10, function(x) max(x)<tresh))[1]]

  
  1. Вычтите два значения времени и округлите до 1e-09
 step <- 1e-09
pulseW <- ceiling((ePoint-sPoint)/step - 0.5)*step
  

Это решение с треском проваливается, когда пик данных близок к пиковым уровням шума, поэтому subset ()-ing при некотором жестко заданном проценте не работает.
Можете ли вы указать мне на лучший алгоритм / решение этой проблемы?

Спасибо

Комментарии:

1. rdocumentation.org/packages/pracma/versions/1.9.9/topics/… функция findpeaks, вероятно, является хорошей отправной точкой