@Zaher220
Software developer

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

Здравствуйте.
Есть такая вещь в пульмонологии как гипервентиляция легких холодным воздухом. Человек пристыковывается к аппарату подающему холодный воздух через тройник с клапанами. На вдохе впускной клапан открывается и подается холодный воздух, на выдохе открывается выпускной.
В нашем случае на каждом клапане стоит по термодатчику(термодатчики Карманова) соответственно снимающие температуру вдыхаемого и выдыхаемого воздуха. Объем вдыхаемого воздуха измеряется с помощью датчика потока Флейша.
Данные с датчиков через устройство RTUSB3000 передаются в программу. Выглядят они примерно так:
918a573fa6f1ea499e068d6eaac70e06.png
Верхнний график с трубки Флейша. Далее температура вдыхаемого воздуха. Температура выдыхаемого воздуха. Измерения проводятся 10 раз в секунду. На графиках не градусы и не литры, а милливольты, по оси у.
Для того что бы врач мог оценить качество дыхания считается такие параметры как, средняя время вдоха, выдоха, макс . мин. температуры вдоха выдоха, средний макс. минутный объём вентиляции.
Для расчета всех параметров нужно определить дыхательные циклы на графиках, начало и окончание вдоха выдоха. На нижеприведенном графике отмечены точки которые необходимо вычленить.
4caa6a519ed93ac2d00ea49b8d392560.png
Буду благодарен за любую помощь, отсылки к мат аппарату и алгоритмам приветствуются.
  • Вопрос задан
  • 3420 просмотров
Решения вопроса 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. Не знаю как будет с точностью, но на первый взгляд для определения циклов (имею ввиду их периоды) должны быть вполне приемлемая точность
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы