Kazalo:
- 1. korak: Strojna oprema
- Korak: Digitalni signali vrne MAX30102
- 3. korak: Predhodna obdelava signala
- 4. korak: Delovni konj: funkcija samodejne korelacije
- 5. korak: Določanje nasičenosti kisika
- 6. korak: izvorna koda
Video: Pulzni oksimeter z veliko izboljšano natančnostjo: 6 korakov (s slikami)
2024 Avtor: John Day | [email protected]. Nazadnje spremenjeno: 2024-01-30 12:05
Če ste pred kratkim obiskali zdravnika, je verjetno, da je medicinske sestre pregledala vaše osnovne vitalne znake. Teža, višina, krvni tlak ter srčni utrip (HR) in nasičenost s kisikom v periferni krvi (SpO2). Morda sta bila zadnja dva pridobljena iz rdeče žareče elektronske prstne sonde, ki je na majhnem zaslonu v nekaj minutah prikazala ustrezne številke. Ta sonda se imenuje pulzni oksimeter in vse osnovne informacije o njej najdete tukaj.
Seveda lahko preprosto kupite preprost pulzni oksimeter, toda kje je v tem zabava? Odločil sem se, da bom zgradil svojo, najprej za vraga, vendar še pomembneje z mislijo na posebno uporabo: nočno oksimetrijo, kjer sta HR in SpO2 podatki bi se neprestano zbirali čez noč in zabeležili na kartico micro SD. Instructables že vsebuje več tovrstnih projektov, na primer dva, ki vključuje Arduino tukaj in tukaj, in enega, ki uporablja Raspberry Pi. Moj uporablja nekoliko novejši senzor MAX30102 iz MAXIM Integrated in Adafruit's Feather M0 Adalogger za nadzor in beleženje podatkov.
Naš projekt torej ni posebej inovativen v smislu strojne opreme in kot tak ne bi bil vreden pisanja tega navodila, vendar sem v procesu njegovega ustvarjanja bistveno napredoval v programski opremi, ki mi je omogočila pridobivanje podatkov iz MAX30102 z veliko večjo doslednostjo in veliko manj hrupa kot programska oprema, ki jo je za ta senzor napisal MAXIM. Uspešnost našega algoritma za obdelavo signalov je prikazana v zgornjem grafikonu, kjer dva zgornja grafa vsebujeta srčni utrip čez noč in nasičenost s kisikom, izračunana iz surovih signalov po naši metodi (označena z "RF"), medtem ko spodnja grafa prikazujeta rezultate MAXIM, pridobljene iz popolnoma enaki signali. Standardna odstopanja za HR so 4,7 bpm in 18,1 bpm ter za SpO2 0,9% oziroma 4,4% za RF oziroma MAXIM.
(Oba grafa RF ustrezata minimalnemu pragu avtokorelacije 0,25 in brez omejitve korelacije R / IR; za razlago teh izrazov glej 4. in 5. korak.)
1. korak: Strojna oprema
- Pulzni oksimeter in senzor srčnega utripa sistemska plošča MAX30102 podjetja MAXIM Integrated, Inc.
- Adapterger za pero M0 iz Adafruit, Inc.
- Litij -ionska baterija Adafruit, Inc.
Povezave:
- Zatiči za prilagajanje SCL in SDA ustreznim zatičem SCL in SDA na plošči MAX30102
- Adalogger pin 10 do pin INT na plošči MAX30102
- Adalogger GND na ploščo GND MAX30102
- Adalogger 3V na MAX30102 VIN
Korak: Digitalni signali vrne MAX30102
Načela delovanja senzorja so zelo preprosta: dve LED diodi, ena rdeča (660 nm) in ena infrardeča (880 nm, IR) sevata svetlobo skozi človeško kožo. Svetlobo delno absorbirajo spodnja tkiva, vključno s periferno krvjo. Senzorjev fotodetektor zbira odbojno svetlobo na obeh valovnih dolžinah in po protokolu I2C vrne dve ustrezni relativni jakosti. Ker se absorpcijski spektri oksigeniranega in deoksigeniranega hemoglobina razlikujejo za obe valovni dolžini, ima odbojna svetloba spremenljivo komponento kot količino arterijske krvi, ki je prisotna pod kožnimi impulzi pri vsakem srčnem utripu. Ugotavljanje srčnega utripa in nasičenosti s kisikom je odvisno od programske opreme za obdelavo signala.
Primeri surovih signalov (samo IR kanal) so prikazani na zgornjih slikah. Na spremenljivi izhodiščni točki je mogoče opaziti periodično komponento, ki se spreminja zaradi več dejavnikov, omenjenih na strani Wikipedia. Artefakti, ki jih povzroča gibanje, so še posebej moteči, saj lahko prikrijejo uporaben signal HR in povzročijo lažne rezultate. Zato napredni komercialni oksimetri vsebujejo merilnike pospeška, ki pomagajo izničiti te artefakte.
Naslednji različici svojega oksimetra lahko dodam merilnik pospeška, vendar za nočni HR/SpO2 snemanje, ko senzor večino časa ostane negiben, zadostuje za zaznavanje in izpuščanje popačenih signalov.
Senzor MAX30102 je na voljo v majhnem površinsko nameščenem paketu, vendar MAXIM prijazno ponuja odklopno ploščo (sistemska plošča 6300) in programsko opremo za obdelavo signalov za Arduino in mbed - vse v referenčnem paketu MAXREFDES117#. Z veseljem sem ga kupil v pričakovanju, da bom med senzorjem in Adaloggerjem le spajal nekaj žic in imel v enem dnevu delujoč, dober oksimeter. Različico programske opreme MAXIM RD117_ARDUINO sem prilagodil za delovanje na Adaloggerjevem procesorju ARM Cortex M0. V bistvu sem moral samo zamenjati nezdružljive funkcije SofI2C v max30102.cpp z ustreznimi klici knjižnice Wire. Koda se je v Arduino IDE v1.8.5 dobro sestavila in delovala na M0 brez napak. Neto rezultati pa so bili razočarani. V uvodnem koraku sem že pokazal zelo veliko variacijo HR in SpO2. Seveda bi lahko kdo trdil, da sem naredil nekaj narobe in to je bila tudi moja prvotna misel. V videoposnetku z navodili MAXIM -a pa lahko opazujete tudi divje nihajoče vrednosti HR, prikazane na zaslonu. Poleg tega komentarji pod videom potrjujejo, da so podoben pojav opazili tudi drugi.
Če na kratko povem, sem po nekaj poskusih ugotovil, da senzor deluje v redu in da alternativna metoda digitalne obdelave signala prinaša veliko boljšo stabilnost. Ta nova metoda, označena z "RF", je opisana v naslednjih korakih.
3. korak: Predhodna obdelava signala
V naši izvedbi se surovi signal zbira s hitrostjo 25 Hz (enako kot pri MAXIM -u) za polne 4 sekunde (programska oprema MAXIM zbira vrednost samo 1 sekunde), kar ima za posledico 100 digitaliziranih časovnih točk na končno podatkovno točko. Vsako zaporedje 100 točk je treba predhodno obdelati na naslednji način:
- Srednje centriranje (znano tudi kot "odstranitev enosmerne komponente" elektrotehnikom). Neobdelani podatki, ki prihajajo iz senzorja, so časovna vrsta celih števil v 105 obseg. Koristni signal pa je le del svetlobe, ki se odbija od arterijske krvi in se spreminja le 102 - prva številka. Za smiselno obdelavo signala je zato zaželeno, da se od vsake serijske točke odšteje povprečje. Ta del se ne razlikuje od tistega, kar že počne programska oprema MAXIM. Drugačno pa je dodatno centriranje samih časovnih indeksov. Z drugimi besedami, namesto da indeksirajo serijske točke s številkami od 0 do 99, so novi indeksi zdaj številke -49,5, -48,5, …, 49,5. Sprva se morda zdi čudno, vendar zahvaljujoč temu postopku "težišče" signalne krivulje sovpada z izvorom koordinatnega sistema (druga slika). To dejstvo postane zelo koristno v naslednjem koraku.
- Osnovno izravnavo. Drugi pogled na valovne oblike, prikazane v 2. koraku, prikazuje, da izhodišče resničnih oksimetričnih signalov še zdaleč ni vodoravno ravno, ampak se spreminja po različnih naklonih. Tretja slika prikazuje sredinsko usmerjen IR signal (modra krivulja) in njegovo osnovno črto (modra ravna črta). V tem primeru je naklon osnovne črte negativen. Zgoraj opisana metoda obdelave signala zahteva, da je izhodišče vodoravno. To je mogoče doseči s preprostim odštevanjem osnovne vrednosti od srednje osrednjega signala. Zahvaljujoč sredinskemu središču koordinat Y in X je prestrezanje osnovne črte nič, njena enačba nagiba pa je še posebej preprosta, kot je prikazano na četrti sliki. Na tretji sliki je signal izravnalne črte prikazan z oranžno krivuljo.
Tako je vnaprej predelan signal pripravljen za naslednji korak.
4. korak: Delovni konj: funkcija samodejne korelacije
Če se vrnemo k običajnemu indeksiranju 1,…, n, prva slika prikazuje definicijo funkcije avtokorelacije rm - količina, za katero je bilo ugotovljeno, da je zelo koristna pri odkrivanju periodičnosti in kakovosti signala. Je preprosto normaliziran skalarni produkt časovne vrste signala, ki je sam premaknjen za zamik m. V naši aplikaciji pa je primerno vsako vrednost avtokorelacije prilagoditi glede na njeno vrednost pri zamiku = 0, to je, uporabiti relativno avtokorelacijo, definirano z rm / r0.
Diagram relativne avtokorelacije tipičnega kakovostnega IR signala je prikazan na drugi sliki. Po pričakovanjih je njegova vrednost pri zamiku = 0 pri svojem globalnem maksimumu enaka 1. Naslednji (lokalni) maksimum se pojavi pri zamiku = 23 in je enak 0,79. Prisotnost lokalnih minimumov in maksimumov v avtokorelacijskem načrtu je enostavno razumeti: ko se signal premakne v desno, se njegovi vrhovi najprej destruktivno medsebojno motijo, vendar na določeni točki interferenca postane konstruktivna in doseže največji zaostanek, ki je enak povprečju obdobje signala.
Zadnji stavek je ključnega pomena: za določitev povprečnega časovnega obdobja med vrhovi, iz katerega je mogoče izračunati frekvenco signala (t.j. srčni utrip), zadostuje, da se najde prvi lokalni maksimum funkcije avtokorelacije! Privzeto MAX30102 vzorči analogni vhod s hitrostjo 25 točk na sekundo, zato je pri danem m obdobje v sekundah enako m / 25. To vodi do srčnega utripa, izraženega v utripih na minuto (bpm) z:
HR = 60*25 / m = 1500 / m
Seveda ni treba delati dragih izračunov rm pri vseh vrednostih zamika. Naš algoritem naredi prvo ugibanje srčnega utripa = 60 utripov na minuto, kar ustreza m = 25. Funkcija avtokorelacije se na tej točki ovrednoti in primerja z vrednostjo pri njenem levem sosedu, m = 24. Če je vrednost sosedov višja, potem pohod se nadaljuje v levo do rm-1 <rm. Tako določeni končni m se nato vrne kot največji zaostanek. Naslednja ponovitev se začne od te vrednosti namesto 25 in celoten postopek se ponovi. Če je prvi levi sosed nižji, potem zgornji rutinski koraki na podoben način zaostajajo v desno. Največkrat zamik pri največ zahteva le nekaj ocen funkcije avtokorelacije. Poleg tega se kot mejne vrednosti uporabljata največji in najmanjši sprejemljivi zamik (ki ustrezata minimalnemu oziroma maksimalnemu srčnemu utripu).
Zgornje deluje zelo dobro za kakovostne signale, vendar resnični svet še zdaleč ni idealen. Nekateri signali prihajajo izkrivljeni, večinoma zaradi artefaktov gibanja. Tak signal je prikazan na tretji sliki. Slaba periodičnost se odraža v obliki njene funkcije avtokorelacije, pa tudi v nizki vrednosti 0,28 prvega lokalnega maksimuma pri m = 11. Primerjajte ga z največjo vrednostjo 0,79, določeno za signal dobre kakovosti. Poleg mejnih vrednosti zamika je torej vrednost rm / r0 največ je dober pokazatelj kakovosti signala, zato je treba za filtriranje artefaktov gibanja uporabiti zahtevo, da preseže določen prag. Grafi "RF", prikazani v uvodih, so posledica takega praga, ki je enak 0,25.
5. korak: Določanje nasičenosti kisika
Prejšnji korak je zadoščal za določitev srčnega utripa. SpO2 zahteva več dela. Najprej je treba upoštevati doslej zanemarjen signal v rdečem (R) kanalu. Nato se izračuna razmerje rdečih in infrardečih signalov, Z = R/IR, ki se odbijata od arterijske krvi. Del "arterijske krvi" je ključnega pomena, saj se večina svetlobe dejansko odbija od tkiv in venske krvi. Kako izbrati del signala, ki ustreza arterijski krvi? No, to je pulzabilna komponenta, ki se spreminja z vsakim srčnim utripom. Po besedah elektrotehnikov je to "del AC", preostala odsevna svetloba pa "DC del". Ker absolutne jakosti svetlobe R in IR nista sorazmerni, se razmerje Z izračuna iz relativnih jakosti, kot je prikazano na prvi sliki. V smislu dejansko izračunanih količin uporabljam srednji kvadrat (RMS) srednje osrednjega, izhodiščno izravnanega signala, y, na že znano povprečje surovega signala, <Y>; glej drugo sliko. Razmerje Z pa je le polovica dela. Odziv nelinearnega senzorja zahteva empirično kalibracijo med Z in končnim SpO2 vrednote. Umeritveno enačbo sem vzel iz kode MAXIM:
SpO2 = (-45,06*Z + 30,354)*Z + 94,845
Upoštevajte, da ta enačba velja samo za oblikovalsko ploščo MAX30102, kupljeno leta 2017! Verjetno bo MAXIM pozneje ponovno kalibriral svoje senzorje.
Zgornji postopek še vedno proizvaja veliko lažnih SpO2 branja. Rdeči kanal trpi zaradi številnih artefaktov, tako kot IR. Smiselno je domnevati, da morata biti oba signala močno povezana. Pravzaprav signali dobre kakovosti, kot je primer na tretji sliki, zelo dobro korelirajo. Pearsonov korelacijski koeficient je v tem primeru celo 0,99. To ni vedno tako, kot je prikazano na četrti sliki. Čeprav bi IR signal s svojim r prešel filter kakovosti srčnega utripam / r0 = 0,76, popačen signal R povzroči slab koeficient korelacije med obema, ki je enak le 0,42. To opazovanje ponuja drugi filter kakovosti: koeficient korelacije med kanali je večji od določenega praga.
Zadnji dve sliki ponazarjata neto učinek takšnega kakovostnega filtriranja. Najprej se nariše izmerjena nasičenost s kisikom s pragom kakovosti HR 0,25, vendar brez SpO2 filter. Naslednja ploskev je rezultat filtriranja slabih HR in SpO2 rezultati pri 0,5 rm / r0 in 0,8 pragov korelacijskega koeficienta. Na splošno je strožji režim odstranil slabe podatkovne točke, ki predstavljajo 12% skupnega zneska.
V naši kodi se korelacijski koeficient cc izračuna po formuli na peti sliki, kjer y predstavlja sredinsko osrednji signal na ravni izhodišča, medtem ko r0 je bilo definirano v prejšnjem koraku.
6. korak: izvorna koda
Izvorna koda C za ta projekt, oblikovana za Arduino IDE, je na voljo v našem računu Github na naslednji povezavi:
github.com/aromring/MAX30102_by_RF
Njena stran Readme opisuje posamezne komponente.
Rada bi vzela trenutek, da pohvalim Adafruit za izdelavo tako odličnega izdelka, kot je Adalogger na osnovi M0. Njegov hitri 48 MHz procesor ARM Cortex M0 z veliko RAM -a je zagotovo pripomogel k temu, da je bil projekt izvedljiv, medtem ko je neposredno priključen bralnik kartic SD (skupaj s knjižnico SD Adafruit) odstranil vse bolečine hobista, povezane s shranjevanjem velikih količin podatkov v realnem času.
Priporočena:
Pingo: Zaganjalnik žogic z zaznavanjem gibanja in visoko natančnostjo: 8 korakov
Pingo: Zaganjalnik žogic z visoko natančnostjo in zaznavanjem gibanja: Kevin Nitiema, Esteban Poveda, Anthony Mattacchione, Raphael Kay
Arduino pulzni oksimeter: 35 korakov (s slikami)
Arduino pulzni oksimeter: Pulzni oksimetri so standardni instrumenti za bolnišnične nastavitve. Z uporabo relativne absorpcije oksigeniranega in deoksigeniranega hemoglobina te naprave določajo odstotek pacientove krvi, ki prenaša kisik (zdravo območje je 94-9
Mikrokontroliran pulzni oksimeter: 5 korakov
Mikrokontrolirani pulzni oksimeter: V tem projektu vam nameravam pokazati, kaj sem do sedaj storil s svojim projektom mikrokontroliranega pulznega oksimetra. Moja strast do elektronike in fitnesa je zelo močna, zato sem se odločil ustvariti projekt, ki bi mi omogočil uporabo obeh mojih strasti.
Daljinsko beleženje podatkov z visoko natančnostjo z uporabo multimetra/Arduino/pfodApp: 10 korakov (s slikami)
Oddaljeno beleženje podatkov z visoko natančnostjo z uporabo multimetra/Arduino/pfod Aplikacija: Posodobljeno 26. aprila 2017 Prenovljeno vezje in plošča za uporabo z merilniki USB 4000ZC. Ne zahteva kodiranja za Android Ta navodila vam pokažejo, kako dostopati do širokega nabora meritev visoke natančnosti iz vašega Arduina in jih pošiljate tudi na daljavo za beleženje in
Naprava za pulzni oksimeter z uporabo Arduino Nano, MAX30100 in Bluetooth HC06 .: 5 korakov
Naprava za pulzni oksimeter z uporabo Arduino Nano, MAX30100 in Bluetooth HC06 .: Hej fantje, danes bomo izdelali senzorično napravo za beleženje ravni kisika v krvi in srčnega utripa na neinvaziven način s pomočjo senzorja MAX30100. MAX30100 je raztopina senzorja za merjenje srčnega utripa in pulzno oksimetrijo. Združuje dva