Распознавание образов (мышечная активность) - PullRequest
1 голос
/ 27 мая 2019

Мне нужна рекомендация с вашей стороны. В настоящее время я работаю с датчиком EMG (мышца) на Arduino, и моя цель - определить и измерить время мышечной активности. На картинке ниже вы найдете необработанные данные. Serial plotter Как видите, во время мышечной деятельности диапазон аналогового выхода намного выше. Но я не знаю, какой математический подход подходит для этой задачи.

1 Ответ

0 голосов
/ 28 мая 2019

Использовать скользящее окно ...

  1. выберите размер окна

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

  2. теперь передавайте ваш сигнал через FIFO размером, равным размеру вашего окна

    после того, как ваш FIFO заполнится при каждом новом входном значении, удалите первое из него и вычислите минимальное и максимальное значения содержимого FIFO. Такой FIFO лучше всего реализован в виде циклического буфера фиксированной длины. Разница в max-min заключается в динамическом диапазоне окна и сообщит вам, обнаруживает ли ваш датчик активность.

    windowed min/max

  3. Порог 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, чтобы вы могли использовать битовые операции вместо деления и по модулю в реализации циклического буфера.

...