Turinys:

Impulsinis oksimetras su daug patobulintu tikslumu: 6 žingsniai (su nuotraukomis)
Impulsinis oksimetras su daug patobulintu tikslumu: 6 žingsniai (su nuotraukomis)

Video: Impulsinis oksimetras su daug patobulintu tikslumu: 6 žingsniai (su nuotraukomis)

Video: Impulsinis oksimetras su daug patobulintu tikslumu: 6 žingsniai (su nuotraukomis)
Video: Impulsinis masažuoklis 2024, Liepa
Anonim
Pulso oksimetras su daug geresniu tikslumu
Pulso oksimetras su daug geresniu tikslumu
Pulsų oksimetras su daug geresniu tikslumu
Pulsų oksimetras su daug geresniu tikslumu

Jei neseniai lankėtės pas gydytoją, tikėtina, kad jūsų pagrindinius gyvybinius požymius ištyrė slaugytoja. Svoris, ūgis, kraujospūdis, taip pat širdies susitraukimų dažnis (HR) ir prisotinimas deguonimi periferiniame kraujyje (SpO2). Galbūt paskutiniai du buvo gauti iš raudonai švytinčio elektroninio pirštų zondo, kuris per kelias minutes mažame ekrane rodė atitinkamus skaičius. Šis zondas vadinamas pulso oksimetru ir visą pagrindinę informaciją apie jį rasite čia.

Žinoma, galima lengvai nusipirkti paprastą impulsinį oksimetrą, bet kur čia linksmybės? Aš nusprendžiau sukurti savo, pirmiausia dėl to, kad tai būtų nuostabu, bet dar svarbiau turint omenyje konkretų pritaikymą: naktinę oksimetriją, kurioje HR ir SpO2 duomenys būtų nuolat renkami per naktį ir įrašomi į „micro SD“kortelę. „Instructables“jau yra keletas tokio pobūdžio projektų, pvz., Du, kuriuose „Arduino“yra čia ir čia, o viename - „Raspberry Pi“. Mano valdymui ir duomenų įrašymui naudojamas šiek tiek naujesnis jutiklis MAX30102 iš „MAXIM Integrated“ir „Adafruit Feather M0 Adalogger“.

Taigi mūsų projektas nėra ypač novatoriškas aparatinės įrangos požiūriu ir todėl nėra vertas rašyti šią instrukciją, tačiau ją kurdamas aš padariau esminę pažangą programinės įrangos srityje, kuri leido man gauti daug didesnio nuoseklumo ir daug duomenų iš MAX30102 mažiau triukšmo nei programinė įranga, kurią šiam jutikliui parašė MAXIM. Mūsų signalų apdorojimo algoritmo našumas iliustruotas aukščiau esančioje diagramoje, kurioje dviejose viršutinėse diagramose yra širdies ritmas naktį ir prisotinimas deguonimi, apskaičiuotas pagal neapdorotus signalus pagal mūsų metodą (žymimas „RF“), o apatiniuose dviejuose grafikuose rodomi MAXIM rezultatai, gauti naudojant tie patys signalai. Standartiniai HR nuokrypiai yra 4,7 ir 18,1 smūgio per minutę, o SpO2 0,9% ir 4,4%, atitinkamai RF ir MAXIM.

(Abu RF grafikai atitinka minimalią 0,25 autokoreliacijos slenkstį ir neriboja R / IR koreliacijos; šių terminų paaiškinimą žr. 4 ir 5 žingsniuose.)

1 žingsnis: Aparatūra

Techninė įranga
Techninė įranga
Techninė įranga
Techninė įranga
Techninė įranga
Techninė įranga
Techninė įranga
Techninė įranga
  1. Pulsinio oksimetro ir širdies ritmo jutiklio MAX30102 sistemos plokštė iš MAXIM Integrated, Inc.
  2. „Feather M0 Adalogger“iš „Adafruit, Inc.
  3. Ličio jonų baterija iš „Adafruit, Inc.

Sujungimai:

  • Adaloggerio kaiščiai SCL ir SDA prie atitinkamų SCL ir SDA kaiščių MAX30102 plokštėje
  • Adaloggerio kaištis nuo 10 iki INT kaiščio MAX30102 plokštėje
  • Adalogger GND į MAX30102 plokštė GND
  • Adaloggeris nuo 3V iki MAX30102 VIN

2 veiksmas: skaitmeninius signalus grąžino MAX30102

Skaitmeninius signalus grąžino MAX30102
Skaitmeninius signalus grąžino MAX30102
Skaitmeninius signalus grąžino MAX30102
Skaitmeninius signalus grąžino MAX30102

Jutiklio veikimo principai yra labai paprasti: du šviesos diodai, vienas raudonas (660 nm) ir vienas infraraudonųjų spindulių (880 nm, IR), skleidžia šviesą per žmogaus odą. Šviesą iš dalies sugeria apatiniai audiniai, įskaitant periferinį kraują. Jutiklio fotodetektorius surenka atspindėtą šviesą abiejuose bangos ilgiuose ir grąžina du atitinkamus santykinius intensyvumus naudojant I2C protokolą. Kadangi su deguonimi prisotinto ir deguonies prisotinto hemoglobino absorbcijos spektrai skiriasi abiejuose bangų ilgiuose, atspindėta šviesa turi skirtingą komponentą, kaip arterinio kraujo kiekis, esantis po oda impulsų kiekvienu širdies plakimu. Širdies susitraukimų dažnio ir prisotinimo deguonimi apskaičiavimas priklauso nuo signalų apdorojimo programinės įrangos.

Neapdorotų signalų pavyzdžiai (tik IR kanalas) pavaizduoti aukščiau esančiuose paveikslėliuose. Galima pastebėti periodinį komponentą, padengtą kintama pradine linija, kuri keičiasi dėl daugelio Vikipedijos puslapyje paminėtų veiksnių. Judesio sukelti artefaktai yra ypač erzinantys, nes jie gali užmaskuoti naudingą HR signalą ir sukelti netikrus rezultatus. Taigi, pažangūs komerciniai oksimetrai turi akselerometrus, kurie padeda panaikinti šiuos artefaktus.

Prie kitos oksimetro versijos galiu pridėti akselerometrą, bet naktiniam HR/SpO2 įrašant, kai jutiklis dažniausiai nejuda, pakanka aptikti ir praleisti iškreiptus signalus.

Pats MAX30102 jutiklis yra mažoje ant paviršiaus sumontuotoje pakuotėje, tačiau MAXIM maloniai siūlo pertraukimo plokštę (sistemos plokštė 6300) ir signalų apdorojimo programinę įrangą, skirtą „Arduino“ir „mbed“- visa tai yra orientaciniame dizaino pakete MAXREFDES117#. Aš laimingai nusipirkau jį tikėdamasi tiesiog lituoti kai kuriuos laidus tarp jutiklio ir „Adalogger“ir per vieną dieną turėti veikiantį, gerą oksimetrą. Aš pritaikiau MAXIM programinės įrangos RD117_ARDUINO versiją, kad ji veiktų „Adalogger“ARM Cortex M0 procesoriuje. Iš esmės viskas, ką turėjau padaryti, buvo pakeisti nesuderinamas „SofI2C“funkcijas „max30102.cpp“atitinkamais „Wire“bibliotekos skambučiais. „Arduino IDE v1.8.5“kodas buvo sudarytas gerai ir be klaidų veikė „M0“. Tačiau grynieji rezultatai nuvylė. Įvadiniame etape aš jau parodžiau labai didelį HR ir SpO dispersiją2. Natūralu, kad galima teigti, kad padariau kažką ne taip ir tai buvo mano pirminė mintis. Tačiau MAXIM mokymo vaizdo įraše taip pat galite stebėti, kaip ekrane rodomos nepaprastai besikeičiančios HR vertės. Be to, žemiau esantys vaizdo įrašo komentarai patvirtina, kad panašų reiškinį pastebėjo ir kiti.

Trumpai tariant, po tam tikrų eksperimentų nusprendžiau, kad jutiklis veikia gerai, o alternatyvus skaitmeninio signalo apdorojimo metodas užtikrina daug geresnį stabilumą. Šis naujas metodas, pažymėtas „RF“, aprašytas tolesniuose žingsniuose.

3 žingsnis: Išankstinis signalo apdorojimas

Signalo išankstinis apdorojimas
Signalo išankstinis apdorojimas
Signalo išankstinis apdorojimas
Signalo išankstinis apdorojimas
Signalo išankstinis apdorojimas
Signalo išankstinis apdorojimas
Signalo išankstinis apdorojimas
Signalo išankstinis apdorojimas

Įgyvendinant, neapdorotas signalas renkamas 25 Hz dažniu (toks pat kaip MAXIM) 4 sekundes (MAXIM programinė įranga surenka tik 1 sekundę), todėl galutiniame duomenų taške gaunama 100 suskaitmenintų laiko taškų. Kiekviena 100 taškų seka turi būti iš anksto apdorota taip:

  1. Vidutinis centravimas (dar vadinamas „nuolatinės srovės komponento pašalinimu“elektros inžinieriams). Neapdoroti duomenys, gaunami iš jutiklio, yra sveikųjų skaičių laiko eilutė 105 diapazonas. Tačiau naudingas signalas yra tik dalis iš arterinio kraujo atsispindinčios šviesos, kuri skiriasi tik 10 kartų2 - pirmoji figūra. Norint prasmingai apdoroti signalus, pageidautina atimti vidurkį iš kiekvieno serijos taško. Ši dalis nesiskiria nuo to, ką jau daro MAXIM programinė įranga. Tačiau kas kita, yra papildomas pačių laiko indeksų vidurkio nustatymas. Kitaip tariant, vietoj to, kad serijiniai taškai būtų indeksuojami skaičiais nuo 0 iki 99, nauji indeksai dabar yra skaičiai -49,5, -48,5,…, 49,5. Iš pradžių tai gali atrodyti keista, tačiau šios procedūros dėka signalo kreivės „svorio centras“sutampa su koordinačių sistemos kilme (antrasis paveikslas). Šis faktas tampa gana naudingas kitame žingsnyje.
  2. Bazinis išlyginimas. Kitas žvilgsnis į bangų formas, parodytas 2 žingsnyje, parodo, kad realių oksimetrijos signalų bazinė linija toli gražu nėra horizontali, bet skiriasi skirtingais šlaitais. Trečiame paveikslėlyje parodytas vidutinis IR signalas (mėlyna kreivė) ir jo pradinė linija (mėlyna tiesi linija). Šiuo atveju bazinis nuolydis yra neigiamas. Anksčiau aprašytas signalo apdorojimo metodas reikalauja, kad pradinė linija būtų horizontali. Tai galima pasiekti tiesiog atėmus pradinę liniją iš vidurkio centrinio signalo. Dėl vidurkio centravimo tiek Y, tiek X koordinačių, pradinės linijos perėjimas yra lygus nuliui, o jo nuolydžio lygtis yra ypač paprasta, kaip parodyta ketvirtame paveikslėlyje. Trečiajame paveikslėlyje pradinio lygio signalas parodytas oranžine kreive.

Taigi iš anksto apdorotas signalas yra paruoštas kitam žingsniui.

4 žingsnis: Darbo arklys: automatinio koreliacijos funkcija

Darbo arklys: automatinio koreliacijos funkcija
Darbo arklys: automatinio koreliacijos funkcija
Darbo arklys: automatinio koreliacijos funkcija
Darbo arklys: automatinio koreliacijos funkcija
Darbo arklys: automatinio koreliacijos funkcija
Darbo arklys: automatinio koreliacijos funkcija

Grįžtant prie įprasto 1,…, n indeksavimo, pirmame paveikslėlyje parodyta autokoreliacijos funkcijos r apibrėžtism - kiekis, kuris buvo labai naudingas nustatant signalo periodiškumą ir kokybę. Tai tiesiog normalizuotas signalo laiko eilučių skaliarinis produktas, kurio poslinkis atsilieka m. Tačiau mūsų programoje patogu skaliuoti kiekvieną autokoreliacijos vertę pagal jos vertę, esant atsilikimui = 0, t. Y. Naudoti santykinę autokoreliaciją, apibrėžtą rm / r0.

Tipiško geros kokybės IR signalo santykinio autokoreliacijos grafikas pavaizduotas antrame paveikslėlyje. Kaip ir tikėtasi, jo vertė esant atsilikimui = 0 yra pasiekusi visuotinę maksimalią reikšmę, lygią 1. Kitas (vietinis) maksimumas atsiranda esant atsilikimui = 23 ir lygus 0,79. Vietinių minimumų ir maksimumų buvimas autokoreliacijos grafike yra lengvai suprantamas: kai signalas pasislenka į dešinę, jo smailės iš pradžių destruktyviai trukdo viena kitai, tačiau tam tikru momentu trukdžiai tampa konstruktyvūs ir pasiekia didžiausią atsilikimą, lygų vidutiniam signalo laikotarpis.

Paskutinė frazė yra labai svarbi: norint nustatyti vidutinį laikotarpį tarp smailių, pagal kurį galima apskaičiuoti signalo dažnį (ty širdies ritmą), pakanka rasti pirmąjį vietinį autokoreliacijos funkcijos maksimumą! Pagal numatytuosius nustatymus MAX30102 ima analoginio įėjimo dažnį 25 taškais per sekundę, todėl esant tam tikram m laikotarpiui sekundės yra lygus m / 25. Dėl to širdies susitraukimų dažnis išreiškiamas dūžiais per minutę (bpm):

HR = 60*25 / m = 1500 / m

Žinoma, nebūtina atlikti brangių r skaičiavimųm visomis atsilikimo vertėmis. Mūsų algoritmas pirmą kartą numato širdies ritmą = 60 dūžių per minutę, o tai atitinka m = 25. Autokoreliacijos funkcija vertinama tuo metu ir lyginama su kairiajame kaimyne esančia verte, m = 24. Jei kaimynų vertė yra didesnė, tada žygis tęsiasi į kairę, kol rm-1 <rm. Tada nustatytas galutinis m grąžinamas kaip didžiausias atsilikimas. Kita iteracija prasideda nuo tos vertės, o ne 25, ir visas procesas kartojasi. Jei pirmasis kairysis kaimynas yra žemesnis, pirmiau minėti įprasti žygiai atsilieka taškus į dešinę panašiu būdu. Dažniausiai maksimaliam atsilikimui reikia tik kelių autokoreliacijos funkcijos įvertinimų. Be to, kaip ribinės vertės naudojamos didžiausios ir mažiausios priimtinos delsos (atitinkamai atitinkančios minimalų ir maksimalų širdies ritmą).

Aukščiau aprašyta priemonė puikiai tinka geros kokybės signalams, tačiau tikrasis pasaulis toli gražu nėra idealus. Kai kurie signalai iškraipomi, daugiausia dėl judesio artefaktų. Toks signalas parodytas trečiame paveikslėlyje. Prastas periodiškumas atsispindi jo autokoreliacijos funkcijos formoje ir mažoje, 0,28, pirmojo vietinio maksimumo vertėje, kai m = 11. Palyginkite jį su didžiausia 0,79 reikšme, nustatyta geros kokybės signalui. Taigi, kartu su atsilikimo ribinėmis vertėmis, r reikšmėm / r0 maksimalus yra geras signalo kokybės rodiklis, o reikalavimas, kad jis viršytų tam tikrą slenkstį, gali būti naudojamas judėjimo artefaktų filtravimui. „RF“grafikai, parodyti įžangose, atsirado dėl tokios ribos, lygios 0,25.

5 žingsnis: deguonies prisotinimo nustatymas

Deguonies prisotinimo nustatymas
Deguonies prisotinimo nustatymas
Deguonies prisotinimo nustatymas
Deguonies prisotinimo nustatymas
Deguonies prisotinimo nustatymas
Deguonies prisotinimo nustatymas
Deguonies prisotinimo nustatymas
Deguonies prisotinimo nustatymas

Ankstesnio žingsnio pakako širdies ritmui nustatyti. SpO2 reikalauja daugiau darbo. Pirma, reikia atsižvelgti į iki šiol apleistą raudonojo (R) kanalo signalą. Toliau apskaičiuojamas raudonos ir infraraudonųjų spindulių signalų santykis, Z = R/IR, abu atsispindėję nuo arterinio kraujo. „Arterinio kraujo“dalis yra labai svarbi, nes dauguma šviesos iš tikrųjų atsispindi nuo audinių ir veninio kraujo. Kaip pasirinkti signalo dalį, atitinkančią arterinį kraują? Na, tai yra pulsuojantis komponentas, kuris kinta priklausomai nuo kiekvieno širdies plakimo. Elektros inžinierių žodžiais tariant, tai yra „kintamosios srovės dalis“, o likusi atspindėta šviesa - „nuolatinės srovės dalis“. Kadangi absoliutus R ir IR šviesos intensyvumas nėra proporcingas, Z santykis apskaičiuojamas pagal santykinį intensyvumą, kaip parodyta pirmame paveikslėlyje. Kalbant apie faktiškai apskaičiuotus kiekius, aš naudoju vidurkio kvadrato (RMS) vidurkio centrinį, pradinio lygmens signalą, y, prie jau žinomo neapdoroto signalo vidurkio, <Y>; žr. antrą paveikslą. Tačiau Z santykis yra tik pusė darbo. Netiesiniam jutiklio atsakui reikalingas empirinis kalibravimas tarp Z ir galutinio SpO2 vertybes. Kalibravimo lygtį paėmiau iš MAXIM kodo:

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

Atminkite, kad ši lygtis galioja tik MAX30102 dizaino plokštėms, įsigytoms 2017 m.! Tikėtina, kad vėliau MAXIM gali iš naujo kalibruoti savo jutiklius.

Aukščiau aprašyta procedūra vis tiek sukuria daug klaidingų SpO2 skaitymus. Raudonasis kanalas kenčia nuo daugybės artefaktų, kaip ir IR. Galima pagrįstai manyti, kad abu signalai turėtų būti stipriai koreliuojami. Tiesą sakant, geros kokybės signalai, kaip ir trečiojo paveikslo pavyzdys, labai gerai koreliuoja. Pearsono koreliacijos koeficientas šiuo atveju siekia 0,99. Tai ne visada būna, kaip parodyta ketvirtame paveikslėlyje. Nors IR signalas praleistų širdies ritmo kokybės filtrą su savo rm / r0 = 0,76, iškraipytas R signalas lemia prastą koreliacijos koeficientą tarp dviejų, lygų tik 0,42. Šis stebėjimas siūlo antrą kokybės filtrą: koreliacijos koeficientas tarp kanalų yra didesnis nei tam tikra riba.

Paskutiniai du skaičiai parodo tokio kokybės filtravimo grynąjį poveikį. Pirma, išmatuotas prisotinimas deguonimi nubrėžiamas su HR kokybės slenksčiu 0, 25, bet be SpO2 filtras. Kitas sklypas gaunamas filtruojant prastą HR ir SpO2 rezultatai esant 0,5 rm / r0 ir 0,8 koreliacijos koeficiento slenksčiai. Apskritai, griežtesnis režimas išfiltravo prastus duomenų taškus, sudarančius 12% visų duomenų.

Mūsų kodekse koreliacijos koeficientas, cc, yra apskaičiuojamas pagal penktame paveikslėlyje pateiktą formulę, kur y reiškia vidurkio centrinį, pradinio lygio signalą, o r0 buvo apibrėžta ankstesniame žingsnyje.

6 žingsnis: šaltinio kodas

Šio projekto C šaltinio kodą, suformatuotą pagal „Arduino IDE“, galite rasti mūsų „Github“paskyroje, paspaudę šią nuorodą:

github.com/aromring/MAX30102_by_RF

Jo „Readme“puslapyje aprašomi atskiri komponentai.

Norėčiau šiek tiek laiko pagirti „Adafruit“už tokį puikų produktą kaip „M0-Adalogger“. Greitas 48 MHz „ARM Cortex M0“procesorius su daugybe operatyviosios atminties neabejotinai padėjo įgyvendinti šį projektą, o tiesiogiai prijungtas SD kortelių skaitytuvas (ir „Adafruit“SD biblioteka) pašalino visus mėgėjų skausmus, susijusius su didelių duomenų kiekių saugojimu realiuoju laiku.

Rekomenduojamas: