Обнаруживать основные события в сигнальных данных?

Если у меня есть сигнал, как ниже, как бы я хотел найти начало и конец двух "основных событий" (иллюстрируется зеленой стрелкой, где начинается событие, и красной стрелкой, где она заканчивается)?

Сигнал

Я пробовал метод, предложенный в этом ответе, но кажется, что независимо от того, насколько сильно я играю с lag, threshold и influence, он либо реагирует на крошечные изменения в начале, середине и конце графика (там, где нет крупных событий), либо он вообще не реагирует.

Я не могу просто определить, находится ли сигнал выше фиксированного порога, так как сила сигнала может меняться, поэтому мне нужен какой-то способ обнаружения, когда сигнал сильно отклоняется от "фонового шума". Кроме того, сигнал может иногда находиться в общем тренде, как на графиках ниже.

Экспоненциальный тренд

Линейный тренд

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

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

Ответ 1

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

Скажите, что события, как правило, составляют 100 образцов. Создайте этот сигнал и проверьте пики.

indicator = filtfilt(ones(1, 100) ./ 100, 1, abs(signal));

Это будет выглядеть как оранжевый сигнал.

Во-вторых, вы можете попробовать изучить выборку образца в выборке в сигнале.

indicator = abs(diff(signal));

Если вы действительно хотите разобраться, попробуйте 1D-сверточную нейронную сеть. Для этого требуются данные обучения.