Использовать скользящее окно ...
выберите размер окна
это время, когда вы будете анализировать свойства сигнала. Он должен быть достаточно длинным, чтобы удерживать хотя бы один период сигнала, но лучше 2-3 периода.
теперь передавайте ваш сигнал через FIFO размером, равным размеру вашего окна
после того, как ваш FIFO заполнится при каждом новом входном значении, удалите первое из него и вычислите минимальное и максимальное значения содержимого FIFO. Такой FIFO лучше всего реализован в виде циклического буфера фиксированной длины. Разница в max-min
заключается в динамическом диапазоне окна и сообщит вам, обнаруживает ли ваш датчик активность.
Порог max(t)-min(t)
так для каждого вычисляемого окна t
вычислить:
d(t) = max(t) - min(t)
, где t
- время начала вашего окна. Сейчас:
if (d(t)>=threshold) muscle_is_working;
Пассивная область в вашем сигнале имеет разницу до ~40
, поэтому установите порог, который будет больше этого, но меньше, чем активная область в вашем сигнале, например
threshold = 50
Если вам нужна большая скорость (поскольку вы знаете, какой MCU ... и да, Arduino не MCU, а просто его структура), вы можете вместо этого использовать абсолютную сумму окна, которая не требует обработки всего содержимого FIFO в каждый слайд окна. Вместо этого вы просто удаляете первый элемент из суммы и добавляете к нему последний. Таким образом, уравнение будет:
d(t) = sum(i=t,...,t+size-1) of abs(signal(t)-inactive_average)
Также неплохо округлить размер окна до степени 2, чтобы вы могли использовать битовые операции вместо деления и по модулю в реализации циклического буфера.