Съдържание:

Пулсоксиметър с много подобрена точност: 6 стъпки (със снимки)
Пулсоксиметър с много подобрена точност: 6 стъпки (със снимки)

Видео: Пулсоксиметър с много подобрена точност: 6 стъпки (със снимки)

Видео: Пулсоксиметър с много подобрена точност: 6 стъпки (със снимки)
Видео: Volvo Trucks – 6 key improvements to Volvo FH with I-Save 2024, Ноември
Anonim
Пулсоксиметър с много подобрена точност
Пулсоксиметър с много подобрена точност
Пулсоксиметър с много подобрена точност
Пулсоксиметър с много подобрена точност

Ако наскоро сте посетили лекар, има вероятност основните ви жизнени показатели да бъдат изследвани от медицинска сестра. Тегло, ръст, кръвно налягане, както и сърдечна честота (HR) и насищане с кислород в периферната кръв (SpO2). Може би последните две бяха получени от светеща в червено електронна сонда за пръсти, която показваше съответните числа на малък екран за минути. Тази сонда се нарича пулсов оксиметър и можете да намерите цялата основна информация за нея тук.

Човек лесно може да си купи прост пулсов оксиметър, разбира се, но къде е забавлението в него? Реших да направя своя собствена, първо по дяволите, но по -важното с конкретно приложение предвид: нощна оксиметрия, където HR и SpO2 данните ще се събират непрекъснато през нощта и ще се записват на микро SD карта. Instructables вече съдържа няколко проекта от този вид, например два, включващи Arduino тук и тук, и един, използващ Raspberry Pi. Моят използва малко по -нов сензор MAX30102 от MAXIM Integrated и Adafruit's Feather M0 Adalogger за контрол и запис на данни.

Следователно нашият проект не е особено иновативен по отношение на хардуера и като такъв не би си струвал да напиша тази инструкция, но в процеса на създаването му направих решаващ напредък в софтуера, който ми позволи да извлека данни от MAX30102 с много по -висока последователност и много по -малко шум от софтуера, написан от MAXIM за този сензор. Ефективността на нашия алгоритъм за обработка на сигнали е илюстрирана в горната диаграма, където двете горни графики съдържат сърдечен ритъм за една нощ и насищане с кислород, изчислени от сурови сигнали по нашия метод (идентифициран с "RF"), докато долните две графики показват резултатите на MAXIM, получени от абсолютно същите сигнали. Стандартните отклонения за HR са 4,7 bpm и 18,1 bpm, а за SpO2 0,9% и 4,4% съответно за RF и MAXIM.

(И двете RF графики съответстват на минималния праг на автокорелация от 0,25 и без ограничение на R / IR корелацията; вижте стъпки 4 и 5 за обяснение на тези термини.)

Стъпка 1: Хардуер

Хардуер
Хардуер
Хардуер
Хардуер
Хардуер
Хардуер
Хардуер
Хардуер
  1. Пулсоксиметър и сензор за пулс MAX30102 системна платка от MAXIM Integrated, Inc.
  2. Перо M0 Adalogger от Adafruit, Inc.
  3. Литиево -йонна батерия от Adafruit, Inc.

Връзки:

  • Adalogger пинове SCL и SDA към съответните SCL и SDA щифтове на платка MAX30102
  • Щифт Adalogger 10 към щифт INT на платка MAX30102
  • Adalogger GND към MAX30102 платка GND
  • Adalogger 3V към MAX30102 VIN

Стъпка 2: Цифрови сигнали, върнати от MAX30102

Цифрови сигнали, върнати от MAX30102
Цифрови сигнали, върнати от MAX30102
Цифрови сигнали, върнати от MAX30102
Цифрови сигнали, върнати от MAX30102

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

Примери за необработени сигнали (само за IR канал) са илюстрирани в горните изображения. Човек може да забележи периодичен компонент, наслагван върху променлива базова линия, който се променя поради множество фактори, споменати на страницата на Уикипедия. Артефактите, предизвикани от движение, са особено досадни, тъй като могат да маскират полезния HR сигнал и да причинят фиктивни резултати. Следователно усъвършенстваните търговски оксиметри разполагат с акселерометри, които помагат да се анулират тези артефакти.

Мога да добавя акселерометър към следващата версия на моя оксиметър, но за нощни HR/SpO2 запис, когато сензорът остава неподвижен през повечето време, е достатъчно да се открият и пропуснат изкривените сигнали.

Самият сензор MAX30102 се предлага в малък пакет, монтиран на повърхността, но MAXIM любезно предлага дънна платка (системна платка 6300) плюс софтуер за обработка на сигнали за Arduino и mbed - всичко това в референтния дизайнерски пакет MAXREFDES117#. Щастливо го купих, очаквайки просто да запоя няколко проводника между сензора и Adalogger и да има работещ, добър оксиметър за един ден. Адаптирах версията RD117_ARDUINO на софтуера на MAXIM, за да работи на процесора ARM Cortex M0 на Adalogger. По принцип всичко, което трябваше да направя, беше да заменя несъвместимите функции на SofI2C в max30102.cpp със съответните извиквания на библиотеката Wire. Кодът се компилира добре в Arduino IDE v1.8.5 и работи на M0 без никакви грешки. Нетните резултати обаче бяха разочароващи. В стъпката „Въведение“вече показах много голяма вариация както на HR, така и на SpO2. Естествено, някой може да твърди, че съм направил нещо нередно и това беше и моята първоначална мисъл. Въпреки това, в учебното видео на MAXIM можете също да наблюдавате диво люлеещи се стойности на HR, показани на екрана. Освен това коментарите под видеото потвърждават, че и други са забелязали подобно явление.

Накратко, след някои експерименти установих, че сензорът работи добре и алтернативен метод за цифрова обработка на сигнала води до много по -добра стабилност. Този нов метод, обозначен с "RF", е описан в следващите стъпки.

Стъпка 3: Предварителна обработка на сигнала

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

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

  1. Средно центриране (известен още като „отстраняване на DC компонента“за електроинженери). Необработените данни, идващи от сензора, са времеви ред от цели числа в 105 диапазон. Полезният сигнал обаче е само част от светлината, отразена от артериалната кръв, която варира от порядъка на само 102 - първа фигура. Следователно за смислена обработка на сигнала е желателно да се извади средната стойност от всяка точка от серията. Тази част не се различава от това, което софтуерът MAXIM вече прави. Различното обаче е допълнителното центриране на самите индекси на време. С други думи, вместо да индексират серийни точки с числа от 0 до 99, новите индекси вече са числа -49,5, -48,5, …, 49,5. В началото може да изглежда странно, но благодарение на тази процедура "центърът на тежестта" на кривата на сигнала съвпада с произхода на координатната система (втора фигура). Този факт става доста полезен в следващата стъпка.
  2. Базово изравняване. Друг поглед към вълновите форми, показани в Стъпка 2, илюстрира, че базовата линия на реалните оксиметрични сигнали далеч не е хоризонтално плоска, но варира през различни наклони. Третата фигура показва средноцентриран IR сигнал (синя крива) и неговата базова линия (синя права линия). В този случай наклонът на базовата линия е отрицателен. Описаният по -горе метод за обработка на сигнала изисква базовата линия да бъде хоризонтална. Това може да се постигне чрез просто изваждане на базовата линия от средноцентрирания сигнал. Благодарение на средното центриране както на Y, така и на X координатите, прихващането на базовата линия е нула и уравнението на нейния наклон е особено просто, както е показано на четвъртата фигура. Сигналът на нивото на базовата линия е показан с оранжева крива на третата фигура.

Така предварително обработеният сигнал е готов за следващата стъпка.

Стъпка 4: Работният кон: Функция за автокорелация

Работният кон: Функция за автокорелация
Работният кон: Функция за автокорелация
Работният кон: Функция за автокорелация
Работният кон: Функция за автокорелация
Работният кон: Функция за автокорелация
Работният кон: Функция за автокорелация

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

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

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

HR = 60*25 / m = 1500 / m

Разбира се, не е необходимо да се правят скъпи изчисления на rм при всички стойности на изоставане. Нашият алгоритъм прави първото предположение за сърдечната честота = 60 удара в минута, което съответства на m = 25. Функцията за автокорелация се оценява в тази точка и се сравнява със стойността при нейния ляв съсед, m = 24. Ако стойността на съседите е по -висока, тогава походът продължава наляво до rm-1 <rм. Така определеният краен m след това се връща като максимално изоставане. Следващата итерация започва от тази стойност вместо 25 и целият процес се повтаря. Ако първият ляв съсед е по -нисък, горните рутинни маршове изостават вдясно по подобен начин. През повечето време забавянето максимум изисква само няколко оценки на функцията за автокорелация. В допълнение, максималните и минималните допустими изоставания (съответстващи съответно на минималната и максималната сърдечна честота) се използват като ограничаващи стойности.

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

Стъпка 5: Определяне на насищането с кислород

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

Предишната стъпка беше достатъчна за определяне на сърдечната честота. SpO2 изисква повече работа. Първо, трябва да се вземе предвид досега пренебрегваният сигнал в червения (R) канал. След това се изчислява съотношението на червените към инфрачервените сигнали, Z = R/IR, и двете отразени от артериалната кръв. Частта "артериална кръв" е от решаващо значение, тъй като по -голямата част от светлината всъщност се отразява от тъканите и венозната кръв. Как да изберем част от сигнала, съответстваща на артериалната кръв? Е, това е пулсиращият компонент, който варира при всеки сърдечен ритъм. По думите на електроинженерите това е "AC част", докато останалата отразена светлина е "DC част". Тъй като абсолютните интензитети на R и IR светлината не са съизмерими, съотношението Z се изчислява от относителните интензитети, както е показано на първата фигура. По отношение на действително изчислените количества, използвам средноквадратичен (RMS) на средноцентрирания, изравнен на базата сигнал, y, към вече известната средна стойност на необработения сигнал, <Y>; виж втората фигура. Съотношението Z е само половината от работата обаче. Нелинейният отговор на сензора изисква емпирично калибриране между Z и крайния SpO2 стойности. Взех уравнението за калибриране от кода на MAXIM:

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

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

Горната процедура все още произвежда много фалшиви SpO2 четения. Червеният канал страда от много артефакти, точно като IR. Разумно е да се предположи, че и двата сигнала трябва да бъдат силно свързани. Всъщност качествените сигнали, като примера от третата фигура, корелират много добре. Коефициентът на корелация на Пирсън в този случай достига до 0,99. Това не винаги е така, както е показано на четвъртата фигура. Въпреки че инфрачервеният сигнал ще премине през филтъра за качество на сърдечната честота с неговото rм / r0 = 0,76, изкривеният R сигнал води до лош коефициент на корелация между двете, равен само на 0,42. Това наблюдение предлага втория филтър за качество: като коефициентът на корелация между каналите е по -голям от определен праг.

Последните две цифри илюстрират нетния ефект от такова качествено филтриране. Първо, измереното насищане с кислород се нанася с праг за качество на HR от 0,25, но без SpO2 филтър. Следващият график е резултат от филтриране на лоши HR и SpO2 резултати при 0.5 rм / r0 и 0,8 прагове на коефициента на корелация. Като цяло лошите данни, възлизащи на 12% от общия брой, бяха филтрирани от по -строгия режим.

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

Стъпка 6: Изходният код

Изходният код на C за този проект, форматиран за Arduino IDE, е достъпен от нашия акаунт в Github на следната връзка:

github.com/aromring/MAX30102_by_RF

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

Бих искал да отделя малко време, за да похваля Adafruit за създаването на такъв отличен продукт като Adalogger на базата на M0. Неговият бърз 48 MHz ARM Cortex M0 процесор, с много RAM, със сигурност помогна да направи този проект жизнеспособен, докато директно свързаният четец на SD карти (плюс SD библиотеката на Adafruit) премахва всички болки на любителите, свързани със съхранението на големи количества данни в реално време.

Препоръчано: