#r
#r
Вопрос:
Я довольно новичок в R, поэтому подумал, что кто-то, возможно, уже придумал более элегантное решение для этого.
У меня есть данные, которые выглядят следующим образом:
Я хочу извлечь ширину импульса, учитывая, что:
- мой импульс всегда будет иметь наибольшее значение
- мой импульс всегда будет иметь наибольшую ширину
- перед моим импульсом нет заметного шума
- разрешение импульса равно 1e-09
Мой подход до сих пор описан ниже, но, похоже, он терпит неудачу, когда пик данных ближе к пиковым уровням шума:
- Определите начало импульса, отслеживая первую точку — серию из 10, которая превышает 5% от максимумов:
sPoint <- which(rollapply(wave$mY, 10, function(x) min(x)>max(wave$mY)*0.05))[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]]
- Вычтите два значения времени и округлите до 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, вероятно, является хорошей отправной точкой