Задать вопрос
@Zaher220
Software developer

Анализ данных с термодатчиков и трубки Флейша?

Здравствуйте.
Есть такая вещь в пульмонологии как гипервентиляция легких холодным воздухом. Человек пристыковывается к аппарату подающему холодный воздух через тройник с клапанами. На вдохе впускной клапан открывается и подается холодный воздух, на выдохе открывается выпускной.
В нашем случае на каждом клапане стоит по термодатчику(термодатчики Карманова) соответственно снимающие температуру вдыхаемого и выдыхаемого воздуха. Объем вдыхаемого воздуха измеряется с помощью датчика потока Флейша.
Данные с датчиков через устройство RTUSB3000 передаются в программу. Выглядят они примерно так:
918a573fa6f1ea499e068d6eaac70e06.png
Верхнний график с трубки Флейша. Далее температура вдыхаемого воздуха. Температура выдыхаемого воздуха. Измерения проводятся 10 раз в секунду. На графиках не градусы и не литры, а милливольты, по оси у.
Для того что бы врач мог оценить качество дыхания считается такие параметры как, средняя время вдоха, выдоха, макс . мин. температуры вдоха выдоха, средний макс. минутный объём вентиляции.
Для расчета всех параметров нужно определить дыхательные циклы на графиках, начало и окончание вдоха выдоха. На нижеприведенном графике отмечены точки которые необходимо вычленить.
4caa6a519ed93ac2d00ea49b8d392560.png
Буду благодарен за любую помощь, отсылки к мат аппарату и алгоритмам приветствуются.
  • Вопрос задан
  • 3445 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
С температурами всё достаточно просто, графики без шумов. Можно брать локальные минимумы/максимумы, просто перебираете весь массив считая разницу между значениями в текущей и в следующей точках меняет знак, то записываете точку как локальный экстремум.

d = V[1]-V[0];
for (i = 1; i < N-1, i++) {
    d1 = V[i+1]-V[i];
    if (d < 0 && d1 > 0) {
        // Локальный минимум V[i]
    } else if (d > 0 && d1 < 0) {
        // Локальный максимум V[i]
    }
    d = d1;
}

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

noise = 2; // Уровень шума, поставить нужное значение
t1 = 0; // Точка перехода к нулю
upDown = 0; // Направление движения до нуля, > 0 - вверх, < 0 - вниз, 0 - начало графика
d = V[1]-V[0];
if (abs(d) < noise)
    d = 0;
for (i = 1; i < N-1, i++) {
    d1 = V[i+1]-V[i];
    if (abs(d1) < noise)
        d1 = 0;
    if (d < 0 && d1 > 0) {
        // Локальный минимум V[i]
    } else if (d > 0 && d1 > 0) {
        // Локальный максимум V[i]
    } else if (d != 0 && d1 == 0) {
        t1 = i;
        upDown = d;
    } else if (d == 0 && d1 > 0 && upDown < 0) {
        // Локальный минимум V[(t1+i)/2] или (V[t1]+V[i])/2
    } else if (d == 0 && d1 < 0 && upDown > 0) {
        // Локальный максимум V[(t1+i)/2] или (V[t1]+V[i])/2
    }
    d = d1;
}
Ответ написан
kbtsiberkin
@kbtsiberkin
Вейвлет-дифференцирование позволяет неплохих результатов по фильтрации добиться, хотя алгоритм относительно трудоёмкий и экстремумы там придётся детектировать уже двумерные. Но эффективность грандиозна, особенно на Ваших весьма чистых и красивых сигналах.
Математика описана, например, вот тут.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@molekyla
Для отсеивания шума можно использовать фильтр какой то, например KSmooth или фильтр Гаусса, ну а дальше по производным искать как говорил Rsa97. Не знаю как будет с точностью, но на первый взгляд для определения циклов (имею ввиду их периоды) должны быть вполне приемлемая точность
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы