Как рассчитать длительность удовлетворяющего требованиям сигнала?
- Войдите на сайт для отправки комментариев
Доброго всем времени суток. Прошу не кидать камнями за вопрос, ибо по образованию медик, но какие-то базовые знания по типу "как залить скетч" есть.
Дано: ардуино нано, модуль ЭКГ. С модуля ЭКГ на А0 подается сигнал. Исполняемая часть программы выглядит по типу: if(sensorValue > порогового значения){выполнить что надо, delay()}. При этом с датчика бывают ложные срабатывания, например от телодвижений.
Суть вопроса: есть ли способ из сигнала, который удовлетворяет (sensorValue > значение) отфильтровать только те события, которые по длительности больше определенного количества времени в мс, и если таковые имеются - выдавать результат в булевую переменную?
Пытаясь описать точнее: есть пороговое значение (допустим 300), дальнейшие действия программа должна выполнять только если овершот этого значения. Искомые, нужные овершоты имеют известную длительность. Ложные срабатывания от мышечных сокращений длительностью по времени менее известной нужно отсечь.
Помогите пожалуйста в направлении решения поставленной задачи.
Суть вопроса: есть ли способ из сигнала, который удовлетворяет (sensorValue > значение) отфильтровать только те события, которые по длительности больше определенного количества времени в мс, и если таковые имеются - выдавать результат в булевую переменную?
Если "по-простому", то можно так: опрашиваем датчик каждые X мс. Если результат true сохраняется N опросов, где N*X- минимальное время события, то "выдаём true в булеву переменную"))
А если "по серьёзному", то лучше бы использовать специальное оборудование ИМХО
P.S. Ещё можно конденсатор параллельно входу 100 -10 000 пкф
Время конца - время старта.
А вообще 90% что ты придумал заведомо неправильное решение и тебе надо читать теорию цифровой обработки сигналов.
вычислить среднее или скользящее среднее за некоторый промежуток времени и всё что не укладывается к примеру в 20% промежуток - выбрасываем, всё что вошло включаем и в расчет среднего
Задача очень похожа на подавление дребезга. Просто считать, что всё, что короче нужной длительности - дребезг и использовать любой из давно известных и отработанных методов его подавления.
Если исходить именно из той постановки, что описана, то:
- 1-й абзац ответа №1,
- 1-й абзац ответа №2,
- ответ №4.
Но, на на мой взгляд, следовало бы обратить внимания на замечания:
- 2-й абзац ответа № 1,
- 2-й абзац ответа №2,
- один из вариантов - ответ №3.
В общем, алгоритм немного иной: не сначала определяем превышение порога, а потом думаем, что с нм делать, а сначала обрабатываем входной сигнал, и только потом для обработанного вычисляем превышение порога. И только после этого уже думаем, что делать с этим превышением.
Это пороговое значение насколько часто требуется изменять?
Вы учитываете, что чтобы что-то обработать с человека там сначала требуется подавить наводки, т.е. у вас уже есть эта часть схемы?
Всем спасибо за ответы.
Насчет наводок, значимые для работы устройства наводки возникали лишь при подключенном к ардуино кабеле к компу.
Частота измерений требуется около 1 сек.
Насчет скользящего среднего это ЕМА фильтр, если я правильно понял? Находил на гитхабе скетч где используют фильтр высоких и низких частот, настраевамый подбором коэффициента константы ЕМА-альфа, но понятного объяснения как подбирать эти регулирующие значения не нашел.
Вот кусок скетча:
int highpassFilter(int val){ EMA_S = (EMA_a*val) + ((1-EMA_a)*EMA_S); return val - EMA_S;}
тас вопрос про изменение уровня порога был
AlexandrZP97
Чем вас простой вариант из #1 не устроил?