Оглавление:

Пульсоксиметр со значительно улучшенной точностью: 6 шагов (с изображениями)
Пульсоксиметр со значительно улучшенной точностью: 6 шагов (с изображениями)

Видео: Пульсоксиметр со значительно улучшенной точностью: 6 шагов (с изображениями)

Видео: Пульсоксиметр со значительно улучшенной точностью: 6 шагов (с изображениями)
Видео: Чем чаще и дальше – тем лучше и легче! 2024, Июль
Anonim
Пульсоксиметр со значительно улучшенной точностью
Пульсоксиметр со значительно улучшенной точностью
Пульсоксиметр со значительно улучшенной точностью
Пульсоксиметр со значительно улучшенной точностью

Если вы недавно посещали врача, скорее всего, медсестра проверила ваши основные жизненно важные функции. Вес, рост, артериальное давление, а также частота сердечных сокращений (ЧСС) и сатурация кислорода в периферической крови (SpO2). Возможно, последние два были получены с помощью светящегося красным электронным датчиком пальца, который отображал соответствующие числа на крошечном экране за считанные минуты. Этот датчик называется пульсоксиметром, и вы можете найти всю основную информацию о нем здесь.

Конечно, можно легко купить простой пульсоксиметр, но где в нем веселье? Я решил создать свою собственную, сначала чертовски важно, но, что более важно, имея в виду конкретное применение: ночная оксиметрия, при которой и ЧСС, и SpO2 данные будут непрерывно собираться в течение ночи и записываться на карту micro SD. Instructables уже содержит несколько проектов такого типа, например, два с участием Arduino здесь и здесь, а один с использованием Raspberry Pi. В шахте для управления и записи данных используется немного более новый датчик MAX30102 от MAXIM Integrated и Adalogger Feather M0 от Adafruit.

Таким образом, наш проект не является особенно инновационным с точки зрения аппаратного обеспечения, и поэтому не стоит писать этот Instructable, но в процессе его создания я добился значительных успехов в программном обеспечении, которое позволило мне извлекать данные из MAX30102 с гораздо большей согласованностью и большим объемом информации. меньше шума, чем программное обеспечение, написанное MAXIM для этого датчика. Производительность нашего алгоритма обработки сигналов проиллюстрирована на приведенной выше диаграмме, где два верхних графика показывают частоту сердечных сокращений за ночь и насыщение кислородом, рассчитанные по необработанным сигналам нашим методом (обозначенным «RF»), а два нижних графика показывают результаты MAXIM, полученные из точно такие же сигналы. Стандартные отклонения для ЧСС составляют 4,7 и 18,1 уд / мин, а для SpO2 0,9% и 4,4% для РФ и МАКСИМ соответственно.

(Оба графика RF соответствуют минимальному порогу автокорреляции 0,25 и отсутствию ограничения на корреляцию R / IR; см. Шаги 4 и 5 для объяснения этих условий.)

Шаг 1. Аппаратное обеспечение

Аппаратное обеспечение
Аппаратное обеспечение
Аппаратное обеспечение
Аппаратное обеспечение
Аппаратное обеспечение
Аппаратное обеспечение
Аппаратное обеспечение
Аппаратное обеспечение
  1. Системная плата пульсоксиметра и датчика ЧСС MAX30102 от MAXIM Integrated, Inc.
  2. Feather M0 Adalogger от Adafruit, Inc.
  3. Литий-ионный аккумулятор от Adafruit, Inc.

Подключения:

  • Контакты SCL и SDA Adalogger к соответствующим контактам SCL и SDA на плате MAX30102
  • Контакт 10 регистратора для вывода INT на плате MAX30102
  • GND Adalogger - GND платы MAX30102
  • Adalogger 3V до MAX30102 VIN

Шаг 2: цифровые сигналы, возвращаемые MAX30102

Цифровые сигналы, возвращаемые MAX30102
Цифровые сигналы, возвращаемые MAX30102
Цифровые сигналы, возвращаемые MAX30102
Цифровые сигналы, возвращаемые MAX30102

Принципы работы датчика очень просты: два светодиода, один красный (660 нм) и один инфракрасный (880 нм, ИК) светят сквозь кожу человека. Свет частично поглощается нижележащими тканями, включая периферическую кровь. Фотодетектор датчика собирает отраженный свет на обеих длинах волн и возвращает две соответствующие относительные интенсивности, используя протокол I2C. Поскольку спектры поглощения оксигенированного и деоксигенированного гемоглобина различаются для обеих длин волн, отраженный свет имеет переменную составляющую, так как количество артериальной крови, которая присутствует под кожей, пульсирует с каждым ударом сердца. Определение частоты сердечных сокращений и насыщения кислородом зависит от программного обеспечения для обработки сигналов.

Примеры необработанных сигналов (только ИК-канал) показаны на изображениях выше. Можно заметить периодический компонент, наложенный на переменную базовую линию, которая смещается из-за множества факторов, упомянутых на странице Википедии. Артефакты, вызванные движением, особенно раздражают, поскольку они могут маскировать полезный сигнал ЧСС и вызывать ложные результаты. Следовательно, современные коммерческие оксиметры оснащены акселерометрами, которые помогают свести на нет эти артефакты.

Я могу добавить акселерометр к следующей версии моего оксиметра, но для ночного ЧСС / SpO2 записи, когда датчик большую часть времени остается неподвижным, достаточно обнаружить и пропустить искаженные сигналы.

Сам датчик MAX30102 поставляется в крошечном корпусе для поверхностного монтажа, но MAXIM любезно предлагает дополнительную плату (системная плата 6300) плюс программное обеспечение для обработки сигналов для Arduino и mbed - все в пакете эталонного дизайна MAXREFDES117 #. Я с радостью купил его, рассчитывая просто припаять несколько проводов между датчиком и Adalogger и получить рабочий, хороший оксиметр за один день. Я адаптировал версию программного обеспечения MAXIM RD117_ARDUINO для работы на процессоре ARM Cortex M0 от Adalogger. По сути, все, что мне нужно было сделать, это заменить несовместимые функции SofI2C в max30102.cpp соответствующими вызовами библиотеки Wire. Код отлично скомпилировался в Arduino IDE v1.8.5 и работал на M0 без каких-либо ошибок. Однако чистые результаты были неутешительными. На этапе «Введение» я уже показал очень высокую дисперсию как ЧСС, так и SpO.2. Естественно, можно утверждать, что я сделал что-то не так, и это тоже было моей первоначальной мыслью. Однако в обучающем видео MAXIM вы также можете наблюдать резко колеблющиеся значения ЧСС, отображаемые на экране. Более того, комментарии под видео подтверждают, что другие тоже заметили подобное явление.

Короче говоря, после некоторых экспериментов я определил, что датчик работает нормально, и альтернативный метод цифровой обработки сигнала дает гораздо лучшую стабильность. Этот новый метод, обозначенный «RF», описан в следующих шагах.

Шаг 3: предварительная обработка сигнала

Предварительная обработка сигнала
Предварительная обработка сигнала
Предварительная обработка сигнала
Предварительная обработка сигнала
Предварительная обработка сигнала
Предварительная обработка сигнала
Предварительная обработка сигнала
Предварительная обработка сигнала

В нашей реализации необработанный сигнал собирается с частотой 25 Гц (такой же, как у MAXIM) в течение полных 4 секунд (программное обеспечение MAXIM собирает значение только за 1 секунду), в результате получается 100 оцифрованных временных точек на конечную точку данных. Каждую последовательность из 100 пунктов необходимо предварительно обработать следующим образом:

  1. Среднее центрирование (также известное как «удаление составляющей постоянного тока» для инженеров-электриков). Необработанные данные, поступающие от датчика, представляют собой временные ряды целых чисел в 105 диапазон. Однако полезный сигнал - это только часть света, отраженного от артериальной крови, которая колеблется всего в 10 раз.2 - первая цифра. Поэтому для осмысленной обработки сигналов желательно вычитать среднее значение из каждой точки серии. Эта часть ничем не отличается от того, что уже делает программное обеспечение MAXIM. Однако отличие заключается в дополнительном центрировании самих индексов времени. Другими словами, вместо индексации точек ряда цифрами от 0 до 99, новые индексы теперь имеют числа -49,5, -48,5,…, 49,5. Сначала это может показаться странным, но благодаря этой процедуре «центр тяжести» сигнальной кривой совпадает с началом системы координат (второй рисунок). Этот факт станет весьма полезным на следующем этапе.
  2. Базовое выравнивание. Другой взгляд на формы волны, показанные на шаге 2, показывает, что базовая линия реальных оксиметрических сигналов далеко не плоская по горизонтали, а варьируется по разным наклонам. На третьем рисунке показан среднецентрованный ИК-сигнал (синяя кривая) и его базовая линия (синяя прямая линия). В этом случае наклон базовой линии отрицательный. Описанный выше метод обработки сигнала требует, чтобы базовая линия была горизонтальной. Это может быть достигнуто простым вычитанием базовой линии из среднецентрованного сигнала. Благодаря среднему центрированию координат Y и X, точка пересечения базовой линии равна нулю, а его уравнение наклона особенно простое, как показано на четвертом рисунке. Выровненный по базовой линии сигнал показан оранжевой кривой на третьем рисунке.

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

Шаг 4: рабочая лошадка: функция автокорреляции

Рабочая лошадка: функция автокорреляции
Рабочая лошадка: функция автокорреляции
Рабочая лошадка: функция автокорреляции
Рабочая лошадка: функция автокорреляции
Рабочая лошадка: функция автокорреляции
Рабочая лошадка: функция автокорреляции

Возвращаясь к обычной индексации 1,…, n, на первом рисунке показано определение автокорреляционной функции rм - величина, которая оказалась очень полезной для определения периодичности и качества сигнала. Это просто нормализованное скалярное произведение временного ряда сигнала с самим собой, сдвинутым на задержку m. Однако в нашем приложении удобно масштабировать каждое значение автокорреляции по отношению к его значению при запаздывании = 0, то есть использовать относительную автокорреляцию, определяемую rм / р0.

График относительной автокорреляции типичного ИК-сигнала хорошего качества показан на втором рисунке. Как и ожидалось, его значение при лаге = 0 имеет глобальный максимум, равный 1. Следующий (локальный) максимум происходит при лаге = 23 и равен 0,79. Наличие локальных минимумов и максимумов на графике автокорреляции легко понять: при смещении сигнала вправо его пики сначала деструктивно интерферируют друг с другом, но в определенный момент интерференция становится конструктивной и достигает максимума при лаге, равном среднему. период сигнала.

Последняя фраза имеет решающее значение: для определения среднего периода времени между пиками, по которому можно вычислить частоту сигнала (то есть частоту сердечных сокращений), достаточно найти первый локальный максимум функции автокорреляции! По умолчанию MAX30102 производит выборку аналогового входа со скоростью 25 точек в секунду, поэтому при заданном m период в секундах равен m / 25. Это приводит к измерению частоты пульса в ударах в минуту (уд / мин) следующим образом:

ЧСС = 60 * 25 / м = 1500 / м

Конечно, делать дорогостоящие вычисления rм при всех значениях запаздывания. Наш алгоритм делает первое предположение о частоте сердечных сокращений = 60 ударов в минуту, что соответствует m = 25. Функция автокорреляции оценивается в этой точке и сравнивается со значением у ее левого соседа, m = 24. Если значение соседей выше, то функция автокорреляции марш продолжается влево до rм-1м. Определенное таким образом конечное m затем возвращается как максимальное запаздывание. Следующая итерация начинается с этого значения вместо 25, и весь процесс повторяется. Если первый левый сосед ниже, то указанная выше процедура перемещает точки запаздывания вправо аналогичным образом. В большинстве случаев максимальное запаздывание требует всего нескольких оценок автокорреляционной функции. Кроме того, в качестве предельных значений используются максимально и минимально допустимые задержки (соответствующие минимальной и максимальной частоте сердечных сокращений соответственно).

Вышеупомянутое очень хорошо работает для сигналов хорошего качества, но реальный мир далек от идеала. Некоторые сигналы выходят искаженными, в основном из-за артефактов движения. Такой сигнал показан на третьем рисунке. Плохая периодичность отражается в форме его автокорреляционной функции, а также в низком значении 0,28 первого локального максимума при m = 11. Сравните его с максимальным значением 0,79, определенным для сигнала хорошего качества. Следовательно, наряду с предельными значениями запаздывания значение rм / р0 на максимуме является хорошим индикатором качества сигнала, и требование превышения определенного порогового значения может использоваться для фильтрации артефактов движения. Графики "RF", представленные во введении, получены при таком пороге, равном 0,25.

Шаг 5: Определение насыщения кислородом

Определение насыщения кислородом
Определение насыщения кислородом
Определение насыщения кислородом
Определение насыщения кислородом
Определение насыщения кислородом
Определение насыщения кислородом
Определение насыщения кислородом
Определение насыщения кислородом

Предыдущего шага было достаточно для определения пульса. SpO2 требует больше работы. Во-первых, необходимо учесть пока что игнорируемый сигнал в красном (R) канале. Затем рассчитывается отношение красного и инфракрасного сигналов, Z = R / IR, оба отраженных от артериальной крови. «Артериальная кровь» имеет решающее значение, поскольку большая часть света фактически отражается от тканей и венозной крови. Как выбрать порцию сигнала, соответствующую артериальной крови? Что ж, это пульсирующий компонент, который меняется с каждым ударом сердца. По словам инженеров-электриков, это «часть переменного тока», а оставшийся отраженный свет - «часть постоянного тока». Поскольку абсолютные интенсивности R- и ИК-света не соизмеримы, отношение Z рассчитывается из относительных интенсивностей, как показано на первом рисунке. Что касается фактически рассчитанных величин, я использую среднеквадратическое значение (RMS) от среднецентрованного, выровненного по базовой линии сигнала y к уже известному среднему необработанного сигнала <Y>; см. второй рисунок. Однако соотношение Z - это только половина работы. Нелинейный отклик датчика требует эмпирической калибровки между Z и окончательным SpO.2 ценности. Я взял уравнение калибровки из кода MAXIM:

SpO2 = (-45,06 * Z + 30,354) * Z + 94,845

Имейте в виду, что это уравнение действительно только для дизайнерской платы MAX30102, купленной в 2017 году! Вполне вероятно, что MAXIM может повторно откалибровать свои датчики позже.

Вышеупомянутая процедура по-прежнему вызывает много ложных SpO.2 чтения. Красный канал страдает множеством артефактов, как и ИК-канал. Разумно предположить, что оба сигнала должны быть сильно коррелированы. Фактически, сигналы хорошего качества, такие как пример на третьем рисунке, действительно очень хорошо коррелируют. Коэффициент корреляции Пирсона в этом случае достигает 0,99. Это не всегда так, как показано на четвертом рисунке. Хотя ИК-сигнал проходит фильтр качества пульса с его rм / р0 = 0,76, искаженный сигнал R приводит к плохому коэффициенту корреляции между ними, равному всего 0,42. Это наблюдение предлагает второй фильтр качества: коэффициент корреляции между каналами превышает определенный порог.

Последние два рисунка иллюстрируют чистый эффект такой качественной фильтрации. Во-первых, измеренная сатурация кислорода отображается с порогом качества ЧСС 0,25, но без SpO.2 фильтр. Следующий график - результат фильтрации плохого ЧСС и SpO2 результаты при 0,5 rм / р0 и 0,8 пороговых значений коэффициента корреляции. В целом точки с плохими данными, составляющие 12% от общего числа, были отфильтрованы более строгим режимом.

В нашем коде коэффициент корреляции cc вычисляется в соответствии с формулой на пятом рисунке, где y представляет среднецентрированный, выровненный по базовой линии сигнал, тогда как r0 был определен на предыдущем шаге.

Шаг 6: Исходный код

Исходный код C для этого проекта, отформатированный для Arduino IDE, доступен в нашей учетной записи Github по следующей ссылке:

github.com/aromring/MAX30102_by_RF

На странице Readme описаны отдельные компоненты.

Я хотел бы воспользоваться моментом, чтобы похвалить Adafruit за создание такого превосходного продукта, как Adalogger на основе M0. Его быстрый процессор ARM Cortex M0 с частотой 48 МГц и большой объем оперативной памяти, безусловно, помог сделать этот проект жизнеспособным, в то время как напрямую подключенный считыватель SD-карт (плюс SD-библиотека Adafruit) устраняет все проблемы любителя, связанные с хранением больших объемов данных в реальном времени.

Рекомендуемые: