Obsah:
- Krok 1: Hardware
- Krok 2: Digitální signály vrácené MAX30102
- Krok 3: Předzpracování signálu
- Krok 4: Workhorse: Funkce autokorelace
- Krok 5: Stanovení saturace kyslíkem
- Krok 6: Zdrojový kód
Video: Pulzní oxymetr s výrazně vylepšenou přesností: 6 kroků (s obrázky)
2024 Autor: John Day | [email protected]. Naposledy změněno: 2024-01-30 08:21
Pokud jste nedávno navštívili lékaře, je pravděpodobné, že vaše základní vitální funkce vyšetřila sestra. Hmotnost, výška, krevní tlak a také srdeční frekvence (HR) a saturace kyslíkem v periferní krvi (SpO2). Poslední dva byly pravděpodobně získány z červeně zářící elektronické sondy prstů, která během minut zobrazovala příslušná čísla na malé obrazovce. Této sondě se říká pulzní oxymetr a veškeré základní informace o ní najdete zde.
Určitě si můžete snadno koupit jednoduchý pulzní oxymetr, ale kde je v tom zábava? Rozhodl jsem se postavit vlastní, nejprve sakra, ale co je důležitější, s ohledem na konkrétní aplikaci: noční oxymetrii, kde HR i SpO2 data by byla nepřetržitě shromažďována přes noc a zaznamenávána na kartu micro SD. Instructables již obsahuje několik projektů tohoto druhu, například dva zahrnující Arduino zde a zde a jeden využívající Raspberry Pi. Můj využívá k ovládání a záznamu dat o něco novější senzor MAX30102 od MAXIM Integrated a Adafruit's Feather M0 Adalogger.
Náš projekt tedy není nijak zvlášť inovativní z hlediska hardwaru a jako takový by nestál za napsání tohoto Instructable, ale v procesu jeho vytváření jsem učinil zásadní pokroky v softwaru, který mi umožnil extrahovat data z MAX30102 s mnohem vyšší konzistencí a mnohem méně šumu než software napsaný společností MAXIM pro tento senzor. Výkonnost našeho algoritmu zpracování signálu je znázorněna na výše uvedeném grafu, kde dva horní grafy obsahují srdeční frekvenci přes noc a saturaci kyslíkem vypočítanou ze surových signálů naší metodou (identifikovanou pomocí „RF“), zatímco spodní dva grafy ukazují výsledky MAXIM vytvořené z přesně stejné signály. Standardní odchylky pro HR jsou 4,7 bpm a 18,1 bpm a pro SpO2 0,9% a 4,4% pro RF, respektive MAXIM.
(Oba RF grafy odpovídají minimálnímu prahu autokorelace 0,25 a žádnému omezení korelace R / IR; vysvětlení těchto pojmů viz kroky 4 a 5.)
Krok 1: Hardware
- Pulzní oxymetr a snímač tepové frekvence Základní deska MAX30102 od MAXIM Integrated, Inc.
- Feather M0 Adalogger od společnosti Adafruit, Inc.
- Lithium -iontová baterie od společnosti Adafruit, Inc.
Připojení:
- Piny Adalogger SCL a SDA na odpovídající piny SCL a SDA na desce MAX30102
- Adalogger pin 10 na pin INT na desce MAX30102
- Adalogger GND na desku MAX30102 GND
- Adalogger 3V až MAX30102 VIN
Krok 2: Digitální signály vrácené MAX30102
Princip činnosti senzoru je velmi jednoduchý: dvě LED diody, jedna červená (660 nm) a jedna infračervená (880 nm, IR) prosvítají světlo lidskou pokožkou. Světlo je částečně absorbováno podkladovými tkáněmi, včetně periferní krve. Senzorový fotodetektor sbírá odražené světlo na obou vlnových délkách a vrací dvě odpovídající relativní intenzity pomocí protokolu I2C. Protože absorpční spektra okysličeného a odkysličeného hemoglobinu se liší pro obě vlnové délky, odražené světlo má proměnlivou složku jako množství arteriální krve, které je přítomno pod pulsy kůže při každém srdečním tepu. Zjištění srdeční frekvence a saturace kyslíkem je na softwaru pro zpracování signálu.
Příklady surových signálů (pouze IR kanál) jsou znázorněny na výše uvedených obrázcích. Lze si všimnout periodické komponenty překrývající se na proměnné základní linii, která se mění v důsledku více faktorů uvedených na stránce Wikipedie. Pohybem vyvolané artefakty jsou obzvláště nepříjemné, protože mohou maskovat užitečný signál HR a způsobovat falešné výsledky. Pokročilé komerční oxymetry jsou proto vybaveny akcelerometry, které pomáhají tyto artefakty rušit.
Mohu přidat akcelerometr do další verze mého oxymetru, ale pro noční HR/SpO2 nahrávání, když senzor zůstává většinu času nehybný, stačí k detekci a vynechání zkreslených signálů.
Samotný senzor MAX30102 je dodáván v malém balení na povrch, ale MAXIM milostivě nabízí rozbíjecí desku (System Board 6300) plus software pro zpracování signálu pro Arduino a mbed - vše v referenčním designovém balíčku MAXREFDES117#. S potěšením jsem ho koupil v očekávání, že jen připájím nějaké dráty mezi senzorem a Adaloggerem a budu mít funkční dobrý oxymetr za jediný den. Upravil jsem verzi softwaru MAXIM RD117_ARDUINO tak, aby běžela na procesoru ARM Cortex M0 Adaloggeru. V podstatě vše, co jsem musel udělat, bylo nahradit nekompatibilní funkce SofI2C v max30102.cpp odpovídajícími hovory knihovny Wire. Kód byl v Arduino IDE v1.8.5 zkompilován a běžel na M0 bez chyb. Čisté výsledky však byly zklamáním. V úvodním kroku jsem již ukázal velmi vysokou variabilitu HR i SpO2. Přirozeně lze tvrdit, že jsem udělal něco špatného, a to byla také moje původní myšlenka. V instruktážním videu MAXIM však můžete také pozorovat divoce kolísající hodnoty HR zobrazené na obrazovce. Komentáře pod videem navíc potvrzují, že si podobného jevu všimli i ostatní.
Abych to shrnul, po několika experimentech jsem zjistil, že senzor funguje v pořádku a alternativní metoda zpracování digitálního signálu má za následek mnohem lepší stabilitu. Tato nová metoda označená „RF“je popsána v dalších krocích.
Krok 3: Předzpracování signálu
V naší implementaci je surový signál sbírán rychlostí 25 Hz (stejný jako MAXIM) po celé 4 sekundy (software MAXIM shromažďuje hodnotu pouze 1 sekundu), což má za následek 100 digitalizovaných časových bodů na koncový datový bod. Každou 100bodovou sekvenci je třeba předzpracovat následujícím způsobem:
- Střed vycentrování (neboli „odstranění stejnosměrné složky“elektrotechnikům). Surová data pocházející ze senzoru jsou časovou řadou celých čísel v 105 rozsah. Užitečný signál je však pouze částí světla odraženého od arteriální krve, která se mění řádově jen o 102 - první obrázek. Pro smysluplné zpracování signálu je proto žádoucí odečíst průměr od každého sériového bodu. Tato část se nijak neliší od toho, co software MAXIM již dělá. Co se však liší, je dodatečné vycentrování samotných časových indexů. Jinými slovy, namísto indexování řadových bodů čísly od 0 do 99 jsou nyní nové indexy čísla -49,5, -48,5, …, 49,5. Zpočátku to může vypadat divně, ale díky tomuto postupu se „těžiště“signální křivky shoduje s počátkem souřadného systému (druhý obrázek). Tato skutečnost se v dalším kroku stává velmi užitečnou.
- Základní vyrovnání. Další pohled na křivky ukázané v kroku 2 ukazuje, že základní linie skutečných signálů oxymetrie zdaleka není horizontálně plochá, ale mění se v různých svazích. Třetí obrázek ukazuje infračervený signál se středem na střed (modrá křivka) a jeho základní linii (modrá přímka). V tomto případě je sklon základní linie záporný. Metoda zpracování signálu popsaná výše vyžaduje, aby základní linie byla horizontální. Toho lze dosáhnout jednoduchým odečtením základní linie od signálu se středem na střed. Díky střednímu vycentrování souřadnic Y i X je průsečík základní linie nulový a jeho rovnice sklonu je obzvláště jednoduchá, jak ukazuje čtvrtý obrázek. Signál na úrovni základní linie je na třetím obrázku znázorněn oranžovou křivkou.
Předzpracovaný signál je tedy připraven k dalšímu kroku.
Krok 4: Workhorse: Funkce autokorelace
Když se vrátíme zpět k obvyklému indexování 1,…, n, první obrázek ukazuje definici autokorelační funkce rm - množství, které bylo shledáno velmi užitečným při zjišťování periodicity i kvality signálu. Je to prostě normalizovaný skalární součin časových řad signálu, který je sám posunut o zpoždění m. V naší aplikaci je však vhodné škálovat každou hodnotu autokorelace s ohledem na její hodnotu na lag = 0, tj. Použít relativní autokorelaci definovanou rm / r0.
Graf relativní autokorelace typického infračerveného signálu dobré kvality je uveden na druhém obrázku. Jak se dalo očekávat, jeho hodnota při zpoždění = 0 je na jeho globálním maximu rovném 1. Další (místní) maximum nastává při zpoždění = 23 a rovná se 0,79. Přítomnost lokálních minim a maxim v autokorelačním grafu je snadno pochopitelná: jak se signál přesouvá doprava, jeho vrcholy nejprve vzájemně destruktivně interferují, ale v určitém bodě se interference stává konstruktivní a dosahuje maxima v prodlevě rovnající se průměru období signálu.
Poslední věta je klíčová: k určení průměrného časového období mezi vrcholy, ze kterého lze vypočítat frekvenci signálu (tj. Srdeční frekvenci), stačí najít první lokální maximum autokorelační funkce! Standardně MAX30102 vzorkuje analogový vstup rychlostí 25 bodů za sekundu, proto je při daném m období v sekundách rovné m / 25. To vede k srdeční frekvenci vyjádřené v úderech za minutu (bpm) pomocí:
HR = 60*25 / m = 1500 / m
Samozřejmě není nutné provádět drahé výpočty rm při všech hodnotách zpoždění. Náš algoritmus provede první odhad srdeční frekvence = 60 tepů za minutu, což odpovídá m = 25. V tomto bodě je vyhodnocena funkce autokorelace a porovnána s hodnotou u jejího levého souseda, m = 24. Pokud je hodnota sousedů vyšší, pak pochod pokračuje doleva až do rm-1 <rm. Takto určené konečné m se pak vrátí jako zpoždění na maximum. Další iterace začíná od této hodnoty místo 25 a celý proces se opakuje. Pokud je první levý soused nižší, výše uvedené rutinní pochody ukazují body napravo podobným způsobem. Maximální zpoždění většinou vyžaduje jen několik vyhodnocení funkce autokorelace. Kromě toho se jako mezní hodnoty používají maximální a minimální přijatelné zpoždění (odpovídající minimální a maximální srdeční frekvenci).
Výše uvedené funguje velmi dobře pro signály dobré kvality, ale skutečný svět má k ideálu daleko. Některé signály jsou zkreslené, většinou kvůli pohybovým artefaktům. Takový signál je znázorněn na třetím obrázku. Špatná periodicita se odráží ve tvaru její autokorelační funkce i v nízké hodnotě, 0,28, prvního lokálního maxima při m = 11. Porovnejte ji s maximální hodnotou 0,79 určenou pro signál dobré kvality. Spolu s mezními hodnotami zpoždění tedy hodnota rm / r0 maximálně je dobrým indikátorem kvality signálu a k odfiltrování pohybových artefaktů lze použít požadavek, aby překročil určitou prahovou hodnotu. Grafy "RF" zobrazené v úvodu vyplynuly z takového prahu rovného 0,25.
Krok 5: Stanovení saturace kyslíkem
Předchozí krok byl dostačující pro stanovení srdeční frekvence. SpO2 vyžaduje více práce. Nejprve je třeba vzít v úvahu dosud opomíjený signál v červeném (R) kanálu. Dále se vypočítá poměr červených a infračervených signálů Z = R/IR, které se odrážejí od arteriální krve. Část „arteriální krve“je klíčová, protože většina světla se ve skutečnosti odráží od tkání a žilní krve. Jak vybrat část signálu odpovídající arteriální krvi? Toto je pulzující složka, která se mění s každým srdečním tepem. Slovy elektrotechniků, je to „AC část“, zatímco zbývající odražené světlo je „DC část“. Protože absolutní intenzity světla R a IR nejsou úměrné, poměr Z se vypočítá z relativních intenzit, jak je znázorněno na prvním obrázku. Pokud jde o skutečně vypočítané veličiny, používám root-mean-square (RMS) průměrně centrovaného signálu na úrovni základní linie y na již známý průměr surového signálu <Y>; viz druhý obrázek. Poměr Z je však pouze polovina práce. Nelineární odezva senzoru vyžaduje empirickou kalibraci mezi Z a konečným SpO2 hodnoty. Vzal jsem kalibrační rovnici z kódu MAXIM:
SpO2 = (-45,06*Z + 30,354)*Z + 94,845
Mějte na paměti, že tato rovnice platí pouze pro designovou desku MAX30102 zakoupenou v roce 2017! Je pravděpodobné, že MAXIM může rekalibrovat své senzory později.
Výše uvedený postup stále produkuje mnoho falešných SpO2 čtení. Červený kanál trpí mnoha artefakty, stejně jako IR. Je rozumné předpokládat, že oba signály by měly být silně korelovány. Ve skutečnosti signály dobré kvality, jako příklad na třetím obrázku, velmi dobře korelují. Pearsonův korelační koeficient je v tomto případě až 0,99. Ne vždy tomu tak je, jak je znázorněno na čtvrtém obrázku. I když by IR signál svým filtrem prošel filtrem kvality srdečního tepum / r0 = 0,76, zkreslený signál R má za následek špatný korelační koeficient mezi těmito dvěma rovný pouze 0,42. Toto pozorování nabízí druhý filtr kvality: korelační koeficient mezi kanály větší než určitá prahová hodnota.
Poslední dvě čísla ilustrují čistý účinek takové kvality filtrování. Nejprve je naměřená saturace kyslíkem vynesena s prahem kvality HR 0,25, ale bez SpO2 filtr. Další vykreslení vyplývá z odfiltrování špatného HR a SpO2 výsledky při 0,5 rm / r0 a prahové hodnoty korelačního koeficientu 0,8. Přísnější režim celkově odfiltroval špatné datové body ve výši 12% z celkového počtu.
V našem kódu je korelační koeficient, cc, vypočítán podle vzorce na pátém obrázku, kde y představuje průměrný středový signál na úrovni základní linie, zatímco r0 byla definována v předchozím kroku.
Krok 6: Zdrojový kód
Zdrojový kód C pro tento projekt, formátovaný pro Arduino IDE, je k dispozici z našeho účtu Github na následujícím odkazu:
github.com/aromring/MAX30102_by_RF
Stránka Readme popisuje jednotlivé součásti.
Rád bych chvilku pochválil Adafruit za to, že vytvořil tak vynikající produkt, jako je Adalogger na bázi M0. Rychlý 48MHz procesor ARM Cortex M0 se spoustou paměti RAM zajisté přispěl k tomu, aby byl tento projekt životaschopný, zatímco přímo připojená čtečka karet SD (plus knihovna SD společnosti Adafruit) odstraní všechny bolesti fandy spojené s ukládáním velkého množství dat v reálném čase.
Doporučuje:
Pingo: Spouštěč míčků Ping Pong s detekcí pohybu a vysokou přesností: 8 kroků
Pingo: Detektor pohybu a vysoce přesný odpalovač pingpongových míčků: Kevin Nitiema, Esteban Poveda, Anthony Mattacchione, Raphael Kay
Pulzní oxymetr Arduino: 35 kroků (s obrázky)
Pulzní oxymetr Arduino: Pulzní oxymetry jsou standardní nástroje pro nemocniční prostředí. Pomocí relativních absorbancí okysličeného a odkysličeného hemoglobinu tato zařízení určují procento pacientovy krve, která přenáší kyslík (zdravý rozsah je 94–9
Mikrořízený pulzní oxymetr: 5 kroků
Mikro-řízený pulzní oxymetr: U tohoto projektu vám plánuji ukázat, co jsem doposud udělal s mým projektem mikro-kontrolovaného pulzního oxymetru. Moje vášeň pro elektroniku a fitness je velmi silná, a tak jsem se rozhodl vytvořit projekt, který by mi umožnil využít obě mé vášně
Pulzní oxymetr využívající Arduino Nano, MAX30100 a Bluetooth HC06 .: 5 kroků
Zařízení pro pulzní oxymetr využívající Arduino Nano, MAX30100 a Bluetooth HC06 .: Čau lidi, dnes budeme stavět senzorické zařízení, které bude neinvazivním způsobem snímat hladinu kyslíku v krvi a srdeční frekvenci pomocí senzoru MAX30100. MAX30100 je řešení senzoru monitoru pulzní oxymetrie a srdečního tepu. Kombinuje dva
Jednoduché MediaCenter a dálkové ovládání s vylepšenou použitelností: 6 kroků
Jednoduché MediaCenter a dálkové ovládání s vylepšenou použitelností: Ano, to je další multimediální centrum na bázi PC (nebo HTPC) pro kutily, ale s jednou jedinečnou charakteristikou: zatraceně jednoduché ovládání, takže se dobře hodí pro starší lidi, osoby se zdravotním postižením, nebo prostě líní uživatelé. Z Wikipedie: “