Как правильно определять локальные максимумы и кривые окна в полусложных сценариях? - PullRequest
2 голосов
/ 09 февраля 2012

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

Данные являются поплавками высокой точности.

Вот быстрый набросок, который фиксирует наиболее распространенные сценарии, с которыми я сталкиваюсь визуально: enter image description here

Один из методов, которые я попытался, состоял в том, чтобы пропустить окно размера X вдоль кривой, идущей назад, чтобы обнаружить пики. Это начало работать хорошо, но я пропустил много условий, которые изначально не ожидались. Еще один метод, который я начал разрабатывать, - это растущее окно, которое обнаружит кривые большей продолжительности. Еще один подход использовал подход, основанный на более исчислении, который отслеживает некоторые аспекты скорости / градиента. Похоже, ни один из них не попал в точку, вероятно, из-за отсутствия у меня опыта статистического анализа.

Может быть, мне нужно использовать какой-то пакет статистического анализа, чтобы покрыть мои основы по сравнению с написанием моего собственного алгоритма? Или будет эффективный метод для непосредственного решения этой проблемы с помощью SQL с использованием каких-то локальных методов max? Я просто не уверен, как подойти к этому эффективно. Каждый метод, который я пробую, кажется, что я пропускаю различные пороги, обнаруживая слишком много пиковых значений или не фиксируя целые события (сообщая о пиковом назначении данных слишком рано в процессе чтения).

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

Ответы [ 4 ]

2 голосов
/ 09 февраля 2012

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

Я написал один простой источник в Matlab, чтобы показать свою идею!

Мой пример взят из аудио файла: -)

waveFile='Chick_eco.wav';

[y, fs, nbits]=wavread(waveFile);

subplot(2,2,1); plot(y); legend('Original signal');

startIndex=15000;
WindowSize=100;
endIndex=startIndex+WindowSize-1;
frame = y(startIndex:endIndex);

nframe=length(frame)

%find the peaks 

peaks = zeros(nframe,1);

k=3;

while(k <= nframe - 1)
    y1 = frame(k - 1);
    y2 = frame(k);
    y3 = frame(k + 1);
    if (y2 > 0)
    if (y2 > y1 && y2 >= y3)
        peaks(k)=frame(k);
    end
    end
    k=k+1;
end



peaks2=peaks;
peaks2(peaks2<=0)=nan;


subplot(2,2,2); plot(frame); legend('Get Window Length = 100');


subplot(2,2,3); plot(peaks); legend('Where are the PEAKS');



subplot(2,2,4); plot(frame); legend('Peaks in the Window');
hold on; plot(peaks2, '*');


for j = 1 : nframe
if (peaks(j) > 0)
     fprintf('Local=%i\n', j);
     fprintf('Value=%i\n', peaks(j));   

end
end


%Where the Local Maxima occur
[maxivalue, maxi]=max(peaks)

вы можете увидеть все пики и где это происходит

Local = 37

Значение = 3.266296e-001

Local = 51

значение = 4,333496e-002

локальное = 65

значение = 5,049438e-001

локальное = 80

значение = 4,286804e-001

Local = 84

Значение = 3.110046e-001

2 голосов
/ 09 февраля 2012

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

Я собираюсь сделать некоторые предположения относительно вашей проблемы:

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

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

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

Теперь, чтобы детально изучить оставшиеся окна (помните, что их можно обрабатывать индивидуально).Пик легко найти: пройдите через окно и держите локальный макс.Что касается переднего и заднего фронтов сигнала, вы можете увидеть на рисунке, что у вас есть окно, которое немного больше, чем фактическая точка, в которой сигнал превышает минимальный уровень шума.В этом случае вы можете использовать метод конечных разностей для вычисления первой производной сигнала.Вы знаете, что передний край будет несколько левее от окна на графике: найдите точку, в которой первая производная превышает собственный положительный минимальный уровень шума (наклон резко увеличивается вверх).Сделайте то же самое для заднего фронта (который всегда будет справа от окна).

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

2 голосов
/ 09 февраля 2012

Я предложу пару разных идей.Один из них заключается в использовании дискретных вейвлетов, а другой - в концепции выдающегося положения географа.

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

Известность: эти шумные пики и впадины представляют ключевой интерес для географов.Они хотят точно знать, какая из многочисленных маленьких вершин горы является самой высокой, точное местоположение самой низкой точки в долине.Найдите локальные минимумы и максимумы в вашем наборе данных.Вы должны иметь последовательность мин / макс / мин / макс /.../ мин.(Возможно, вы захотите добавить произвольные конечные точки, которые ниже, чем ваш глобальный минимум.) Рассмотрим последовательность мин / макс / мин.Классифицируйте каждую из этих троек по разнице между максимальным и большим из двух минимумов.Сделайте сокращенную последовательность, которая заменяет наименьшее из этих троек меньшим из двух минимумов.Повторяйте, пока не дойдете до одной тройки мин / макс / мин.В вашем примере вы хотите, чтобы следующий слой был ниже, последовательность min / max / min / max / min.

0 голосов
/ 09 февраля 2012

Похоже, что определение окна - это диапазон х, в котором у выше порога. Так что используйте это, чтобы определить размер окна. В пределах этого найдите самое большое значение, таким образом находя пик.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...