Обнаруживать основные события в сигнальных данных?
Если у меня есть сигнал, как ниже, как бы я хотел найти начало и конец двух "основных событий" (иллюстрируется зеленой стрелкой, где начинается событие, и красной стрелкой, где она заканчивается)?
![Сигнал]()
Я пробовал метод, предложенный в этом ответе, но кажется, что независимо от того, насколько сильно я играю с lag
, threshold
и influence
, он либо реагирует на крошечные изменения в начале, середине и конце графика (там, где нет крупных событий), либо он вообще не реагирует.
Я не могу просто определить, находится ли сигнал выше фиксированного порога, так как сила сигнала может меняться, поэтому мне нужен какой-то способ обнаружения, когда сигнал сильно отклоняется от "фонового шума". Кроме того, сигнал может иногда находиться в общем тренде, как на графиках ниже.
![Экспоненциальный тренд]()
![Линейный тренд]()
Я уже применяю простой фильтр низких и высоких частот к сигналу. То, что я хотел бы иметь, это что-то вроде оранжевого сигнала в приведенной ниже таблице (я нарисовал его вручную, чтобы проиллюстрировать).
![введите описание изображения здесь]()
Ответы
Ответ 1
Вы можете попробовать пару вещей. Оба этих параметра зависят как-то от знания типа необычного события, которое следует ожидать.
Скажите, что события, как правило, составляют 100 образцов.
Создайте этот сигнал и проверьте пики.
indicator = filtfilt(ones(1, 100) ./ 100, 1, abs(signal));
Это будет выглядеть как оранжевый сигнал.
Во-вторых, вы можете попробовать изучить выборку образца в выборке в сигнале.
indicator = abs(diff(signal));
Если вы действительно хотите разобраться, попробуйте 1D-сверточную нейронную сеть. Для этого требуются данные обучения.