Как рассчитать длительность удовлетворяющего требованиям сигнала?

AlexandrZP97
Offline
Зарегистрирован: 12.10.2022

Доброго всем времени суток. Прошу не кидать камнями за вопрос, ибо по образованию медик, но какие-то базовые знания по типу "как залить скетч" есть.

Дано: ардуино нано, модуль ЭКГ. С модуля ЭКГ на А0 подается сигнал. Исполняемая часть программы выглядит по типу: if(sensorValue > порогового значения){выполнить что надо, delay()}. При этом с датчика бывают ложные срабатывания, например от телодвижений.

Суть вопроса:  есть ли способ из сигнала, который удовлетворяет (sensorValue > значение) отфильтровать только те события, которые по длительности больше определенного количества времени в мс, и если таковые имеются - выдавать результат в булевую переменную?

Пытаясь описать точнее: есть пороговое значение (допустим 300), дальнейшие действия программа должна выполнять только если овершот этого значения. Искомые, нужные овершоты имеют известную длительность. Ложные срабатывания от мышечных сокращений длительностью по времени менее известной нужно отсечь.

Помогите пожалуйста в направлении решения поставленной задачи.

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

AlexandrZP97 пишет:

Суть вопроса:  есть ли способ из сигнала, который удовлетворяет (sensorValue > значение) отфильтровать только те события, которые по длительности больше определенного количества времени в мс, и если таковые имеются - выдавать результат в булевую переменную?

 Если "по-простому", то можно так: опрашиваем датчик каждые X мс. Если результат true сохраняется N опросов, где N*X- минимальное время события, то "выдаём true в булеву переменную"))

 А если "по серьёзному", то лучше бы использовать специальное оборудование ИМХО

 

P.S. Ещё можно конденсатор параллельно входу 100 -10 000 пкф

 

 

 

rkit
Offline
Зарегистрирован: 23.11.2016

Время конца - время старта.

А вообще 90% что ты придумал заведомо неправильное решение и тебе надо читать теорию цифровой обработки сигналов.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

вычислить среднее или скользящее среднее за некоторый промежуток времени и всё что не укладывается к примеру в 20% промежуток - выбрасываем, всё что вошло включаем и в расчет среднего

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Задача очень похожа на подавление дребезга. Просто считать, что всё, что короче нужной длительности - дребезг и использовать любой из давно известных и отработанных методов его подавления.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Если исходить именно из той постановки, что описана, то:

- 1-й абзац ответа №1,

- 1-й абзац ответа №2,

- ответ №4.

Но, на на мой взгляд, следовало бы обратить внимания на замечания:

- 2-й абзац ответа № 1,

- 2-й абзац ответа №2,

- один из вариантов - ответ №3.

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

ВН
Offline
Зарегистрирован: 25.02.2016

AlexandrZP97 пишет:
Пытаясь описать точнее: есть пороговое значение (допустим 300), дальнейшие действия программа должна выполнять только если овершот этого значения.

Это пороговое значение насколько часто требуется изменять? 

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

AlexandrZP97
Offline
Зарегистрирован: 12.10.2022

Всем спасибо за ответы.

Насчет наводок, значимые для работы устройства наводки возникали лишь при подключенном к ардуино кабеле к компу. 

Частота измерений требуется около 1 сек.

Насчет скользящего среднего это ЕМА фильтр, если я правильно понял? Находил на гитхабе скетч где используют фильтр высоких и низких частот, настраевамый подбором коэффициента константы ЕМА-альфа, но понятного объяснения как подбирать эти регулирующие значения не нашел.

Вот кусок скетча:

void highpassFilterReset(){ EMA_S = analogRead(sensorInputPin);}

int highpassFilter(int val){ EMA_S = (EMA_a*val) + ((1-EMA_a)*EMA_S);   return val - EMA_S;}

highpassOutput = highpassFilter(sensorValue);
ВН
Offline
Зарегистрирован: 25.02.2016

тас вопрос про изменение уровня порога  был

Upper
Offline
Зарегистрирован: 23.06.2020

AlexandrZP97

Чем вас простой вариант из #1 не устроил?