Sisällysluettelo:

Pulssioksimetri, jossa on paljon parempaa tarkkuutta: 6 vaihetta (kuvilla)
Pulssioksimetri, jossa on paljon parempaa tarkkuutta: 6 vaihetta (kuvilla)

Video: Pulssioksimetri, jossa on paljon parempaa tarkkuutta: 6 vaihetta (kuvilla)

Video: Pulssioksimetri, jossa on paljon parempaa tarkkuutta: 6 vaihetta (kuvilla)
Video: Ursan esitelmä: Tuomas Savolainen – Linnunradan supermassiivinen musta aukko Sgr A* 2024, Heinäkuu
Anonim
Pulssioksimetri, jossa on paljon parempaa tarkkuutta
Pulssioksimetri, jossa on paljon parempaa tarkkuutta
Pulssioksimetri, jossa on paljon parempaa tarkkuutta
Pulssioksimetri, jossa on paljon parempaa tarkkuutta

Jos olet äskettäin käynyt lääkärissä, on todennäköistä, että sairaanhoitaja tutki elintoimintosi. Paino, pituus, verenpaine sekä syke (HR) ja perifeerisen veren happisaturaatio (SpO)2). Ehkä kaksi viimeistä saatiin punaisesti hehkuvasta elektronisesta sormenpäästä, joka näytti asiaankuuluvat numerot pienellä näytöllä muutamassa minuutissa. Tätä anturia kutsutaan pulssioksimetriksi ja löydät kaikki perustiedot tästä.

Yksinkertaisen pulssioksimetrin voi helposti ostaa, mutta missä on hauskaa? Olen päättänyt rakentaa oman, ensin helvetin vuoksi, mutta mikä tärkeintä tietyn sovelluksen mielessä: yöllinen oksimetria, jossa sekä HR että SpO2 tiedot kerätään jatkuvasti yön yli ja tallennetaan micro SD -kortille. Instructables sisältää jo useita tällaisia projekteja, esimerkiksi kaksi, joissa Arduino on täällä ja täällä, ja yksi, joka käyttää Raspberry Pi: tä. Kaivos käyttää hieman uudempaa MAXIM Integrated -anturia MAX30102 ja Adafruitin Feather M0 Adaloggeria ohjaukseen ja tietojen tallentamiseen.

Projektimme ei siis ole erityisen innovatiivinen laitteiston suhteen, eikä sellaisenaan kannata kirjoittaa tätä ohjekirjaa, mutta sen luomisprosessissa olen tehnyt ratkaisevia edistysaskeleita ohjelmistojen suhteen, joiden avulla voin poimia tietoja MAX30102: sta paljon johdonmukaisemmin ja paljon vähemmän kohinaa kuin ohjelmisto, jonka MAXIM on kirjoittanut tälle anturille. Signaalinkäsittelyalgoritmimme suorituskykyä havainnollistaa yllä oleva kaavio, jossa kaksi yläkaaviota sisältävät yön sykkeen ja happisaturaation, joka on laskettu raaka -signaaleistamme (tunnistettu "RF": llä), kun taas kaksi alinta kaaviota esittävät MAXIMin tulokset täsmälleen samat signaalit. Keskihajonnat HR: lle ovat 4,7 ja 18,1 lyöntiä minuutissa ja SpO: lle2 0,9% ja 4,4%, RF ja MAXIM.

(Molemmat radiotaajuuskaaviot vastaavat minimaalista automaattisen korrelaation kynnystä 0,25 eivätkä rajoita R / IR -korrelaatiota; katso vaiheet 4 ja 5 selittääksesi nämä termit.)

Vaihe 1: Laitteisto

Laitteisto
Laitteisto
Laitteisto
Laitteisto
Laitteisto
Laitteisto
Laitteisto
Laitteisto
  1. Pulssioksimetri ja sykesensori MAX30102 emolevy, MAXIM Integrated, Inc.
  2. Feather M0 Adalogger, Adafruit, Inc.
  3. Litiumioniakku, valmistaja Adafruit, Inc.

Liitännät:

  • Adalogger -nastat SCL ja SDA vastaaviin SCL- ja SDA -nastoihin MAX30102 -kortilla
  • Adalogger -tappi 10 - INT MAX30102 -kortilla
  • Adalogger GND - MAX30102 kortti GND
  • Adalogger 3V - MAX30102 VIN

Vaihe 2: MAX30102 palauttamat digitaaliset signaalit

Digitaaliset signaalit MAX30102
Digitaaliset signaalit MAX30102
Digitaaliset signaalit MAX30102
Digitaaliset signaalit MAX30102

Anturin toimintaperiaate on hyvin yksinkertainen: kaksi LEDiä, yksi punainen (660 nm) ja yksi infrapuna (880 nm, IR) loistavat valoa ihmisen ihon läpi. Valo imeytyy osittain taustalla oleviin kudoksiin, mukaan lukien perifeerinen veri. Anturin valotunnistin kerää heijastuneen valon molemmilta aallonpituuksilta ja palauttaa kaksi vastaavaa suhteellista voimakkuutta käyttämällä I2C -protokollaa. Koska hapetetun ja hapetetun hemoglobiinin absorptiospektrit vaihtelevat molemmilla aallonpituuksilla, heijastuneessa valossa on vaihteleva komponentti valtimoverin määränä, joka on läsnä ihon pulsseissa jokaisen sykkeen aikana. Sykkeen ja happisaturaation selvittäminen on signaalinkäsittelyohjelmiston tehtävä.

Esimerkkejä raakaviestistä (vain IR -kanava) on esitetty yllä olevissa kuvissa. Voidaan havaita jaksollinen komponentti, joka on peitetty vaihtelevalla perusviivalla ja joka muuttuu useiden Wikipedia -sivulla mainittujen tekijöiden vuoksi. Liikkeen aiheuttamat esineet ovat erityisen ärsyttäviä, koska ne voivat peittää hyödyllisen HR -signaalin ja aiheuttaa vääriä tuloksia. Siksi kehittyneissä kaupallisissa oksimetreissä on kiihtyvyysmittarit, jotka auttavat mitätöimään nämä esineet.

Voin lisätä kiihtyvyysmittarin oksimetrin seuraavaan versioon, mutta yölliselle HR/SpO: lle2 tallennuksen aikana, kun anturi pysyy liikkumattomana suurimman osan ajasta, se riittää havaitsemaan ja jättämään pois vääristyneet signaalit.

MAX30102 -anturi itsessään on pienessä pinta -asennuksessa, mutta MAXIM tarjoaa ystävällisesti jakolevyn (emolevy 6300) sekä signaalinkäsittelyohjelmiston Arduinolle ja mbedille - kaikki MAXREFDES117#-suunnittelupaketissa. Ostin sen onnellisina odottaessani vain juottaa joitakin johtoja anturin ja Adaloggerin välillä ja saada toimivan, hyvän oksimetrin yhdessä päivässä. Muokkasin MAXIM -ohjelmiston RD117_ARDUINO -version toimimaan Adaloggerin ARM Cortex M0 -prosessorilla. Periaatteessa minun täytyi vain korvata yhteensopimattomat SofI2C -toiminnot max30102.cpp -ohjelmassa vastaavilla Wire -kirjaston kutsuilla. Koodi koottiin hienosti Arduino IDE v1.8.5: een ja toimi M0: lla ilman virheitä. Tulokset olivat kuitenkin pettymys. Johdantovaiheessa olen jo osoittanut sekä HR: n että SpO: n erittäin korkean vaihtelun2. Luonnollisesti voidaan väittää, että olen tehnyt jotain väärin ja tämä oli myös alkuperäinen ajatukseni. MAXIMin opetusvideossa voit kuitenkin havaita myös näytöllä näkyvät hurjasti vaihtelevat HR -arvot. Lisäksi videon alla olevat kommentit vahvistavat, että myös muut ovat huomanneet samanlaisen ilmiön.

Lyhyesti sanottuna olen kokeilujen jälkeen todennut, että anturi toimii hyvin ja vaihtoehtoinen digitaalisen signaalinkäsittelymenetelmä johtaa paljon parempaan vakauteen. Tämä uusi menetelmä, joka on merkitty "RF": llä, kuvataan seuraavissa vaiheissa.

Vaihe 3: Signaalin esikäsittely

Signaalin esikäsittely
Signaalin esikäsittely
Signaalin esikäsittely
Signaalin esikäsittely
Signaalin esikäsittely
Signaalin esikäsittely
Signaalin esikäsittely
Signaalin esikäsittely

Toteutuksessamme raakasignaali kerätään 25 Hz: n taajuudella (sama kuin MAXIM: n) 4 sekunnin ajan (MAXIMin ohjelmisto kerää vain 1 sekunnin arvon), jolloin tuloksena on 100 digitoitua aikapistettä loppupistettä kohti. Jokainen 100 pisteen sekvenssi on esikäsiteltävä seuraavalla tavalla:

  1. Keskimääräinen keskitys (alias "DC-komponentin poistaminen" sähköinsinööreille). Anturista tuleva raakadata on 10: n kokonaislukujen aikasarja5 valikoima. Hyödyllinen signaali on kuitenkin vain osa valtimoveristä heijastuvaa valoa, joka vaihtelee vain kymmenen luokkaa2 - ensimmäinen hahmo. Merkityksellistä signaalinkäsittelyä varten on siksi toivottavaa vähentää keskiarvo kustakin sarjapisteestä. Tämä osa ei eroa siitä, mitä MAXIM -ohjelmisto jo tekee. Eri asia on kuitenkin aikaindeksien keskimääräinen keskittäminen. Toisin sanoen sen sijaan, että sarjapisteet indeksoitiin numeroilla 0–99, uudet indeksit ovat nyt numeroita -49,5, -48,5,…, 49,5. Se voi aluksi tuntua oudolta, mutta tämän menettelyn ansiosta signaalikäyrän "painopiste" on sama kuin koordinaatiston alkuperä (toinen kuva). Tästä tosiasiasta tulee varsin hyödyllinen seuraavassa vaiheessa.
  2. Perustason tasoitus. Toinen tarkastelu vaiheessa 2 esitetyistä aaltomuodoista havainnollistaa, että todellisten oksimetrisignaalien perusviiva ei ole kaukana vaakasuorasta, mutta vaihtelee eri rinteiden mukaan. Kolmas kuva esittää keskikohtaisen IR-signaalin (sininen käyrä) ja sen perusviivan (sininen suora viiva). Tässä tapauksessa perusviivan kaltevuus on negatiivinen. Edellä kuvattu signaalinkäsittelymenetelmä edellyttää, että perusviiva on vaakasuora. Tämä voidaan saavuttaa yksinkertaisesti vähentämällä perusviiva keskimääräisestä signaalista. Sekä Y- että X-koordinaattien keskipisteen ansiosta perusviivan leikkaus on nolla ja sen kaltevuusyhtälö on erityisen yksinkertainen, kuten neljännestä kuvasta näkyy.

Näin esikäsitelty signaali on valmis seuraavaan vaiheeseen.

Vaihe 4: Työhevonen: Automaattinen korrelaatiotoiminto

Työhevonen: Autokorrelaatiotoiminto
Työhevonen: Autokorrelaatiotoiminto
Työhevonen: Autokorrelaatiotoiminto
Työhevonen: Autokorrelaatiotoiminto
Työhevonen: Autokorrelaatiotoiminto
Työhevonen: Autokorrelaatiotoiminto

Palaten takaisin tavalliseen 1,…, n -indeksointiin, ensimmäinen kuva esittää automaattisen korrelaatiofunktion r määritelmänm - määrä, jonka todettiin olevan erittäin hyödyllinen signaalin jaksottaisuuden ja laadun havaitsemisessa. Se on yksinkertaisesti signaalin aikasarjojen normalisoitu skalaarituote, jonka itse on siirtynyt viiveellä m. Sovelluksessamme on kuitenkin kätevää skaalata jokainen autokorrelaatioarvo suhteessa sen arvoon viiveellä = 0, eli käyttää r: n määrittämää suhteellista autokorrelaatiotam / r0.

Kaavio tyypillisen hyvälaatuisen IR -signaalin suhteellisesta autokorrelaatiosta on esitetty toisessa kuvassa. Kuten odotettiin, sen arvo viiveellä = 0 on globaalilla maksimillaan yhtä suuri. Seuraava (paikallinen) maksimi esiintyy viiveellä = 23 ja on 0,79. Paikallisten minimien ja maksimien esiintyminen autokorrelaatiokäyrässä on helppo ymmärtää: kun signaali siirtyy oikealle, sen piikit häiritsevät aluksi tuhoisasti toisiaan, mutta jossain vaiheessa häiriö muuttuu rakentavaksi ja saavuttaa maksimin keskimääräisen viiveellä signaalin ajanjakso.

Viimeinen lause on ratkaiseva: keskimääräisen ajanjakson määrittämiseksi huippujen välillä, josta voidaan laskea signaalin taajuus (eli syke), riittää, kun löydetään autokorrelaatiofunktion ensimmäinen paikallinen maksimi! Oletusarvoisesti MAX30102 ottaa analogitulon näytteitä nopeudella 25 pistettä sekunnissa, joten tietyllä m: llä jakso sekunteissa on yhtä suuri kuin m / 25. Tämä johtaa sykkeeseen, joka ilmaistaan lyönteinä minuutissa (bpm):

HR = 60*25 / m = 1500 / m

Tietenkään ei ole tarpeen tehdä kalliita r -laskelmiam kaikilla viivearvoilla. Algoritmimme tekee ensimmäisen arvion sykkeestä = 60 lyöntiä minuutissa, mikä vastaa m = 25. Autokorrelaatiofunktio arvioidaan tässä vaiheessa ja verrataan vasemman naapurin arvoon, m = 24. Jos naapurien arvo on korkeampi, marssi jatkuu vasemmalle, kunnes rm-1 <rm. Näin määritetty lopullinen m palautetaan sitten viiveenä maksimissaan. Seuraava iterointi alkaa tästä arvosta 25 sijasta ja koko prosessi toistetaan. Jos ensimmäinen vasen naapuri on alempi, edellä mainitut rutiinimatkat viivepisteitä oikealle samalla tavalla. Suurin osa viiveestä enimmäkseen vaatii vain muutaman arvioinnin automaattisesta korrelaatiotoiminnosta. Lisäksi raja -arvoina käytetään suurimpia ja pienimpiä sallittuja viiveitä (jotka vastaavat minimi- ja maksimisykkeitä).

Yllä oleva toimii erittäin hyvin laadukkaille signaaleille, mutta todellinen maailma on kaukana ihanteellisesta. Jotkut signaalit tulevat vääristyneinä lähinnä liikeartefaktien vuoksi. Tällainen signaali on esitetty kolmannessa kuvassa. Huono jaksottaisuus heijastuu sen automaattisen korrelaatiofunktion muotoon sekä ensimmäisen paikallisen maksimin alhaiseen arvoon, 0,28, kun arvo on m = 11. Vertaa sitä korkealaatuiseen signaaliin määritettyyn arvoon 0,79. Viiverajoitusarvojen ohella siis r: n arvom / r0 enintään on hyvä signaalin laadun indikaattori, ja vaatimusta, että se ylittää tietyn kynnyksen, voidaan käyttää liikkeen artefaktien suodattamiseen. Esittelyssä esitetyt "RF" -kaaviot tulivat tällaisesta kynnyksestä, joka oli 0,25.

Vaihe 5: Happikyllästymisen määrittäminen

Happikyllästymisen määrittäminen
Happikyllästymisen määrittäminen
Happikyllästymisen määrittäminen
Happikyllästymisen määrittäminen
Happikyllästymisen määrittäminen
Happikyllästymisen määrittäminen
Happikyllästymisen määrittäminen
Happikyllästymisen määrittäminen

Edellinen vaihe riitti sykkeen määrittämiseen. SpO2 vaatii enemmän työtä. Ensinnäkin punaisen (R) kanavan toistaiseksi laiminlyöty signaali on otettava huomioon. Seuraavaksi lasketaan punaisten ja infrapunasignaalien suhde Z = R/IR, jotka molemmat heijastuvat valtimoveristä. "Valtimoveren" osa on ratkaiseva, koska suurin osa valosta heijastuu kudoksista ja laskimoveristä. Kuinka valita osa signaalista, joka vastaa valtimoverta? Tämä on sykkivä komponentti, joka vaihtelee jokaisen sydämenlyönnin mukaan. Sähköinsinöörien sanoin se on "AC -osa", kun taas jäljellä oleva heijastunut valo on "DC -osa". Koska R- ja IR -valon absoluuttiset voimakkuudet eivät ole verrannollisia, Z -suhde lasketaan suhteellisista voimakkuuksista, kuten ensimmäisessä kuvassa. Tosiasiallisesti laskettujen määrien osalta käytän keskiarvo-neliötä (RMS) keskiarvokeskeisen, lähtötason tasoitetun signaalin y suhteen raakasignaalin jo tunnettuun keskiarvoon <Y>; katso toinen kuva. Z -suhde on kuitenkin vain puolet työstä. Epälineaarinen anturivaste vaatii empiirisen kalibroinnin Z: n ja lopullisen SpO: n välillä2 arvot. Otin kalibrointiyhtälön MAXIMin koodista:

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

Muista, että tämä yhtälö koskee vain vuonna 2017 ostettua MAX30102 -suunnittelukorttia! On todennäköistä, että MAXIM voi kalibroida anturinsa myöhemmin uudelleen.

Yllä oleva menettely tuottaa edelleen paljon vääriä SpO: ta2 lukemat. Punainen kanava kärsii monista esineistä, aivan kuten IR -kanava. On järkevää olettaa, että molempien signaalien pitäisi olla vahvasti korreloivia. Itse asiassa laadukkaat signaalit, kuten kolmannen kuvan esimerkki, korreloivat todella hyvin. Pearsonin korrelaatiokerroin on tässä tapauksessa jopa 0,99. Näin ei aina ole, kuten neljännessä kuvassa näkyy. Vaikka IR -signaali läpäisi sykkeen laatusuodattimen r: lläm / r0 = 0,76, vääristynyt R -signaali johtaa heikkoon korrelaatiokerroimeen, joka on vain 0,42. Tämä havainto tarjoaa toisen laatusuodattimen: korrelaatiokerroin kanavien välillä on suurempi kuin tietty kynnys.

Kaksi viimeistä lukua ovat esimerkkejä tällaisen laadun suodattamisen nettovaikutuksesta. Ensinnäkin mitattu happisaturaatio piirretään HR -laatukynnyksellä 0,25, mutta ilman SpO: ta2 suodattaa. Seuraava kuvaaja johtaa huonon HR: n ja SpO: n suodattamiseen2 tulokset 0,5 rm / r0 ja 0,8 korrelaatiokertoimen kynnykset. Kaiken kaikkiaan tiukat järjestelmät suodattivat pois huonot datapisteet, jotka olivat 12 prosenttia kaikista.

Koodissamme korrelaatiokerroin, cc, lasketaan viidennen kuvan kaavan mukaan, missä y edustaa keskikeskistä, lähtötason tasoitettua signaalia, kun taas r0 määriteltiin edellisessä vaiheessa.

Vaihe 6: Lähdekoodi

Tämän projektin C -lähdekoodi, joka on muotoiltu Arduino IDE: lle, on saatavana Github -tililtämme seuraavasta linkistä:

github.com/aromring/MAX30102_by_RF

Sen Readme -sivulla kuvataan yksittäisiä osia.

Haluaisin hetken kehua Adafruitia siitä, että hän teki niin erinomaisen tuotteen kuin M0-pohjainen Adalogger. Sen nopea 48 MHz: n ARM Cortex M0 -prosessori, jossa on paljon RAM -muistia, auttoi varmasti tekemään projektista elinkelpoisen, kun taas suoraan liitetty SD -kortinlukija (sekä Adafruitin SD -kirjasto) poistavat kaikki harrastajan kivut, jotka liittyvät suurten tietomäärien reaaliaikaiseen tallentamiseen.

Suositeltava: