Один размер пиковой установки - PullRequest
6 голосов
/ 25 мая 2010

У меня есть одномерный массив значений с плавающей запятой (c # удваивает FYI), и мне нужно найти «пик» значений ... как в графике.

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

Пример массива может выглядеть следующим образом:

1,2,1,1,2,1,3,2,4,4,4,5,6 8,8,8,8,7,8,7,9,7 , 5,4,4,3,3,2,2,1,1,1,1,1,2,1,1,1,1

где пик находится где-то в выделенном жирным сечением.

Есть идеи?

Ответы [ 4 ]

6 голосов
/ 25 мая 2010

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

for i = 0, samplecount-1
  if (i < boxcar_radius) or (i >= (samplecount - boxcar_radius))  then
       filtered_data[i] = 0 // boxcar runs off edge of input array, don't use
  else
    filtered_data[i] = 0
    for j = i-boxcar_radius, i+boxcar_radius
       filtered_data[i] = filtered_data[i] + input_data[j]
    endfor
  endif
endfor

Если у вас есть представление о ширине «плато», вы можете выбрать радиус вагона (примерно половину ожидаемой ширины плато), чтобы обнаружить объекты в соответствующем масштабе.

3 голосов
/ 25 мая 2010

Вы должны сначала определить, что вы подразумеваете под «маленький». Скажем, «небольшое» колебание вокруг максимума определяется как любое значение, которое находится в пределах & plusmn; the от максимума. Тогда легко определить плато.

Пройдите через данные, чтобы определить максимум, а затем сделайте второй проход, чтобы определить все значения, которые находятся в пределах & plusmn; ϵ от максимальной.

2 голосов
/ 26 мая 2010

Обнаружение пиков - это один из этапов Фазовая корреляция и других алгоритмов оценки движения, используемых в таких местах, как сжатие видео. Один из подходов заключается в следующем: рассмотреть кандидата на пик и окно определенного количества соседей. Теперь установите квадратичную функцию, используя стандартную регрессию. Пик с субпиксельной точностью находится на максимуме установленного квадрата.

1 голос
/ 26 мая 2010

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

def GetPeak(l):
  large = max(l) * 0.8
  above_large = [i for i in xrange(len(l)) if l[i] > large]
  left_peak = min(above_large)
  right_peak = max(above_large)
  return (left_peak, right_peak)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...