Tartalomjegyzék:

Impulzus -oximéter nagy pontossággal: 6 lépés (képekkel)
Impulzus -oximéter nagy pontossággal: 6 lépés (képekkel)

Videó: Impulzus -oximéter nagy pontossággal: 6 lépés (képekkel)

Videó: Impulzus -oximéter nagy pontossággal: 6 lépés (képekkel)
Videó: Григорий Хайтин: сложность, метабиология, Гёдель, холодный синтез 2024, Július
Anonim
Impulzus -oximéter nagy pontossággal
Impulzus -oximéter nagy pontossággal
Impulzus -oximéter nagy pontossággal
Impulzus -oximéter nagy pontossággal

Ha nemrégiben járt orvosnál, akkor valószínű, hogy alapvető létfontosságú jeleit ápolónő vizsgálta meg. Súly, magasság, vérnyomás, valamint pulzusszám (HR) és oxigén telítettség a perifériás vérben (SpO2). Talán az utolsó kettőt egy pirosan izzó elektronikus ujjszondából szerezték be, amely percek alatt megjelenítette a megfelelő számokat egy apró képernyőn. Ezt a szondát pulzoximéternek hívják, és itt megtalálhatja az összes alapvető információt.

Az ember könnyen vásárolhat egyszerű impulzus -oximétert, de hol van benne a szórakozás? Úgy döntöttem, hogy a sajátomat építem fel, először a fenébe, de ami még fontosabb, egy konkrét alkalmazást szem előtt tartva: az éjszakai oximetriát, ahol a HR és az SpO is2 az adatokat folyamatosan gyűjtenék egyik napról a másikra, és rögzítenék egy micro SD kártyára. Az Instructables már több ilyen jellegű projektet tartalmaz, például kettőt, amelyekben itt és itt Arduino vesz részt, és egy Raspberry Pi -t használ. Az enyém a MAXIM Integrated és az Adafruit Feather M0 Adalogger valamivel újabb MAX30102 érzékelőjét használja a vezérléshez és az adatok rögzítéséhez.

Projektünk tehát nem különösebben innovatív hardver szempontjából, és mint ilyen nem lenne érdemes megírni ezt az utasításokat, de létrehozásuk során döntő előrelépéseket tettem a szoftverek terén, amelyek lehetővé tették számomra, hogy a MAX30102 -ből sokkal nagyobb következetességgel és sokoldalúan nyerjek ki adatokat kevesebb zaj, mint a MAXIM által ehhez az érzékelőhöz írt szoftver. Jelfeldolgozási algoritmusunk teljesítményét a fenti táblázat szemlélteti, ahol a két felső grafikon a nyers jelekből számított egy éjszakai pulzusszámot és oxigén telítettséget tartalmazza a módszerünkkel ("RF" jelzéssel), míg az alsó két grafikon a MAXIM eredményeit mutatja. pontosan ugyanazokat a jeleket. A HR standard eltérése 4,7 bpm és 18,1 bpm, az SpO esetében pedig2 0,9% és 4,4%, az RF és a MAXIM esetében.

(Mindkét RF -grafikon megfelel a minimális 0,25 autokorrelációs küszöbnek, és nincs korlátozás az R / IR korrelációra; ezen kifejezések magyarázatát lásd a 4. és 5. lépésben.)

1. lépés: Hardver

Hardver
Hardver
Hardver
Hardver
Hardver
Hardver
Hardver
Hardver
  1. Pulzus -oximéter és pulzusmérő MAX30102 alaplap a MAXIM Integrated, Inc. -től
  2. Feather M0 Adalogger az Adafruit, Inc. -től
  3. Lítium -ion akkumulátor az Adafruit, Inc. -től

Csatlakozások:

  • Adlogáló SCL és SDA csapok a megfelelő SCL és SDA csapokhoz a MAX30102 táblán
  • Adalogger 10 -es érintkező az INT -hez a MAX30102 táblán
  • Adalogger GND - MAX30102 kártya GND
  • Adalogger 3V - MAX30102 VIN

2. lépés: MAX30102 által visszaadott digitális jelek

Digitális jelek: MAX30102
Digitális jelek: MAX30102
Digitális jelek: MAX30102
Digitális jelek: MAX30102

Az érzékelő működésének elvei nagyon egyszerűek: két LED, egy piros (660 nm) és egy infravörös (880 nm, IR) világít az emberi bőrön. A fényt részben elnyelik az alatta lévő szövetek, beleértve a perifériás vért is. Az érzékelő fényérzékelője mindkét hullámhosszon összegyűjti a visszavert fényt, és két megfelelő relatív intenzitást ad vissza az I2C protokoll használatával. Mivel az oxigén- és dezoxigenizált hemoglobin abszorpciós spektruma mindkét hullámhosszon eltér, a visszavert fénynek változó összetevője van, mint az artériás vér mennyisége, amely minden szívdobbanás alatt a bőr lüktetése alatt van. A pulzusszám és az oxigéntelítettség kiszámítása a jelfeldolgozó szoftver feladata.

A nyers jelekre példákat (csak IR csatorna) a fenti képek szemléltetnek. Észrevehető egy periodikus összetevő, amely egy változó alapvonalon van, és amely a Wikipédia oldalon említett számos tényező miatt eltolódik. A mozgás által kiváltott műtermékek különösen bosszantóak, mivel elfedhetik a hasznos HR jelet, és hamis eredményeket okozhatnak. Ezért a fejlett kereskedelmi oximéterek gyorsulásmérőkkel rendelkeznek, amelyek segítenek semlegesíteni ezeket a műtermékeket.

Hozzáadhatok egy gyorsulásmérőt az oximéter következő verziójához, de az éjszakai HR/SpO esetén2 rögzítéskor, amikor az érzékelő legtöbbször mozdulatlan marad, elegendő a torz jelek észlelése és kihagyása.

Maga a MAX30102 érzékelő apró, felületre szerelt csomagolásban érkezik, de a MAXIM kegyesen kínál kitörőlapot (System Board 6300) és jelfeldolgozó szoftvert az Arduino és az mbed számára - mindezt a MAXREFDES117 referenciatervező csomagban. Boldogan vettem, és azt vártam, hogy csak huzalokat forrasztok az érzékelő és az Adalogger között, és egyetlen nap alatt lesz egy működő, jó oximéter. A MAXIM szoftver RD117_ARDUINO verzióját úgy alakítottam ki, hogy az Adalogger ARM Cortex M0 processzorán fusson. Alapvetően csak annyit kellett tennem, hogy a max30102.cpp -ben lévő inkompatibilis SofI2C függvényeket lecseréltem a megfelelő Wire library hívásokra. A kód jól összeállt az Arduino IDE v1.8.5 verziójában, és hiba nélkül futott az M0 -n. A nettó eredmények azonban csalódást okoztak. A Bevezetés lépésben már a HR és az SpO nagyon nagy szórását mutattam2. Természetesen azt állíthatjuk, hogy valamit rosszul csináltam, és ez volt az eredeti gondolatom is. A MAXIM oktatóvideójában azonban megfigyelheti a képernyőn megjelenő vadul lengő HR értékeket is. Sőt, a videó alatti megjegyzések megerősítik, hogy mások is észleltek hasonló jelenséget.

Röviden, néhány kísérlet után megállapítottam, hogy az érzékelő megfelelően működik, és a digitális jelfeldolgozás alternatív módszere sokkal jobb stabilitást eredményez. Ezt az új módszert, amelyet "RF" jelöl, a következő lépések ismertetik.

3. lépés: A jel előfeldolgozása

A jel előfeldolgozása
A jel előfeldolgozása
A jel előfeldolgozása
A jel előfeldolgozása
A jel előfeldolgozása
A jel előfeldolgozása
A jel előfeldolgozása
A jel előfeldolgozása

A mi megvalósításunk során a nyers jelet 25 Hz -es frekvencián (ugyanaz, mint a MAXIM -ok) gyűjtjük teljes 4 másodpercig (a MAXIM szoftvere mindössze 1 másodperc értéket gyűjt), ami 100 digitalizált időpontot eredményez végpontonként. Minden 100 pontos sorozatot elő kell dolgozni a következő módon:

  1. Átlagos központosítás (más néven "az egyenáramú komponens eltávolítása" villamosmérnököknek). Az érzékelőből származó nyers adatok a 10 -es számok egész sora5 hatótávolság. A hasznos jel azonban csak egy része az artériás vérből visszaverődő fénynek, amely csak 10 nagyságrendben változik2 - első figura. Az értelmes jelfeldolgozás érdekében ezért kívánatos az átlagot kivonni minden sorozatpontból. Ez a rész nem különbözik attól, amit a MAXIM szoftver már tesz. Ami azonban más, az az időindexek további átlagközpontúságának meghatározása. Más szóval, ahelyett, hogy a sorozatpontokat 0 és 99 közötti számokkal indexelnék, az új indexek most -49,5, -48,5,…, 49,5 számok. Elsőre furcsának tűnhet, de ennek az eljárásnak köszönhetően a jelgörbe "súlypontja" egybeesik a koordináta -rendszer eredetével (második ábra). Ez a tény nagyon hasznos lesz a következő lépésben.
  2. Alapvonal kiegyenlítése. A 2. lépésben bemutatott hullámformák egy másik pillantása azt mutatja, hogy a valós oximetriajelek alapvonala messze nem vízszintesen lapos, hanem különböző lejtőkönként változik. A harmadik ábra egy átlagközpontú IR jelet (kék görbe) és alapvonalát (kék egyenes) mutatja. Ebben az esetben az alapvonal meredeksége negatív. Az előre leírt jelfeldolgozási módszer megköveteli, hogy az alapvonal vízszintes legyen. Ezt úgy érhetjük el, hogy egyszerűen kivonjuk az alapvonalat az átlagközpontú jelből. Mind az Y, mind az X koordináták közép-központosításának köszönhetően az alapvonal metszete nulla, és meredekségi egyenlete különösen egyszerű, amint az a negyedik ábrán is látható. Az alapszintű jelet narancssárga görbe mutatja a harmadik ábrán.

Így az előfeldolgozott jel készen áll a következő lépésre.

4. lépés: A Workhorse: Autocorrelation Function

A Workhorse: Autocorrelation Function
A Workhorse: Autocorrelation Function
A Workhorse: Autocorrelation Function
A Workhorse: Autocorrelation Function
A Workhorse: Autocorrelation Function
A Workhorse: Autocorrelation Function

Visszatérve a szokásos 1,…, n indexeléshez, az első ábra az r autokorrelációs függvény definícióját mutatjam - olyan mennyiség, amelyet nagyon hasznosnak találtak a jel periodicitásának és minőségének észlelésében. Ez egyszerűen a jel idősorának normalizált skaláris szorzata, önmagát m késéssel eltolva. Alkalmazásunkban azonban kényelmes az egyes autokorrelációs értékek skálázása a késleltetés = 0 értékéhez képest, azaz az r által definiált relatív autokorrelációt kell használnim / r0.

A tipikus jó minőségű IR jel relatív autokorrelációjának diagramját a második ábra mutatja. A várakozásoknak megfelelően a késleltetés = 0 értéke a globális maximumon 1. A következő (helyi) maximum akkor következik be, ha a késés = 23 és 0,79. A helyi minimumok és maximumok jelenléte az autokorrelációs ábrán könnyen érthető: mivel a jel jobbra tolódik, csúcsai eleinte rombolóan zavarják egymást, de egy bizonyos ponton az interferencia konstruktívvá válik, és az átlaggal egyenlő késleltetéskor éri el a maximumot. a jelzés időszaka.

Az utolsó mondat döntő fontosságú: a csúcsok közötti átlagos időtartam meghatározásához, amelyből ki lehet számítani a jel frekvenciáját (azaz a pulzusszámát), elegendő megtalálni az autokorrelációs függvény első lokális maximumát! Alapértelmezés szerint a MAX30102 analóg bemenetről 25 pont / másodperc sebességgel mintát vesz, ezért adott m -nél a másodpercben megadott időtartam m / 25. Ez pulzusszámot ad ütés / perc (bpm) értékben:

HR = 60*25 / m = 1500 / m

Természetesen nem szükséges drága számításokat végezni r -rőlm minden lag értéknél. Algoritmusunk először a pulzusszámot = 60 ütés / percre tippeli, ami m = 25 -nek felel meg. Az autokorrelációs függvényt ezen a ponton értékelik ki, és összehasonlítják a bal szomszédjához tartozó értékkel, m = 24. Ha a szomszédok értéke magasabb, akkor menet folytatódik balra, amíg rm-1 <rm. Az így meghatározott végső m ezután maximális késleltetésként kerül visszaadásra. A következő iteráció ebből az értékből indul 25 helyett, és az egész folyamat megismétlődik. Ha az első bal szomszéd alacsonyabb, akkor a fenti rutin vonulások hasonló módon jobbra haladnak. A legtöbb esetben a maximális késleltetés csak néhány értékelést igényel az autokorrelációs függvényből. Ezenkívül a maximális és a minimális elfogadható késleltetéseket (a minimális és a maximális pulzusszámnak megfelelően) használják határértékként.

A fentiek nagyon jól működnek a jó minőségű jeleknél, de a valós világ messze nem ideális. Egyes jelek torzan jönnek ki, főleg a mozgási műtermékek miatt. Ilyen jel látható a harmadik ábrán. A gyenge periodicitás tükröződik az autokorrelációs funkció alakjában, valamint az első lokális maximum alacsony értékében, 0,28 -ban, m = 11 -nél. Hasonlítsa össze a jó minőségű jel 0,79 maximális értékével. A késleltetési határértékekkel együtt tehát az r értékem / r0 maximum a jel jó jelzője, és a követelmény, hogy bizonyos küszöbértéket meghaladjon, felhasználható a mozgási műtermékek kiszűrésére. A bevezetésben bemutatott "RF" grafikonok 0,25 -ös küszöbértékből származtak.

5. lépés: Az oxigén telítettségének meghatározása

Az oxigén telítettségének meghatározása
Az oxigén telítettségének meghatározása
Az oxigén telítettségének meghatározása
Az oxigén telítettségének meghatározása
Az oxigén telítettségének meghatározása
Az oxigén telítettségének meghatározása
Az oxigén telítettségének meghatározása
Az oxigén telítettségének meghatározása

Az előző lépés elegendő volt a pulzusszám meghatározásához. Az SpO2 több munkát igényel. Először is figyelembe kell venni a piros (R) csatorna eddig elhanyagolt jelét. Ezután kiszámítjuk a vörös és az infravörös jelek arányát, Z = R/IR, mindkettő az artériás vérről tükröződik. Az "artériás vér" része kulcsfontosságú, mivel a fény nagy része valójában visszaverődik a szövetekről és a vénás vérről. Hogyan válasszuk ki a jelnek az artériás vérnek megfelelő részét? Nos, ez az lüktető összetevő, amely minden szívverésnél változik. Villamosmérnökök szavaival élve ez az "AC alkatrész", míg a visszamaradt fény a "DC rész". Mivel az R és IR fény abszolút intenzitása nem arányos, a Z arányt a relatív intenzitásokból számítják ki, amint az az első ábrán látható. A ténylegesen kiszámított mennyiségeket tekintve az átlagközpontú, alapszintű jel y értékét használom, y, a nyers jel már ismert átlagához, <Y>; lásd a második ábrát. A Z arány azonban csak a fele a munkának. A nemlineáris szenzorválasz empirikus kalibrációt igényel Z és a végső SpO között2 értékeket. A kalibrációs egyenletet a MAXIM kódjából vettem:

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

Ne feledje, hogy ez az egyenlet csak a 2017 -ben vásárolt MAX30102 tervezőlapra érvényes! Valószínű, hogy a MAXIM később újrakalibrálhatja érzékelőit.

A fenti eljárás még mindig sok hamis SpO -t termel2 olvasmányokat. A vörös csatorna sok műterméket szenved, akárcsak az IR. Ésszerű feltételezni, hogy mindkét jelnek erősen korrelálni kell. Valójában a jó minőségű jelek, mint a harmadik ábra példája, nagyon jól korrelálnak. A Pearson -korrelációs együttható ebben az esetben eléri a 0,99 -et. Ez nem mindig van így, amint azt a negyedik ábra szemlélteti. Bár az infravörös jel áthaladna a pulzusminőségi szűrőnm / r0 = 0,76, a torzított R jel gyenge korrelációs együtthatót eredményez a kettő között, csak 0,42. Ez a megfigyelés a második minőségi szűrőt kínálja: a csatornák közötti korrelációs együttható nagyobb, mint egy bizonyos küszöbérték.

Az utolsó két ábra az ilyen minőségi szűrés nettó hatását szemlélteti. Először a mért oxigénszaturációt ábrázoljuk 0,25 HR minőségi küszöbértékkel, de SpO nélkül2 szűrő. A következő diagram a rossz HR és SpO kiszűréséből származik2 eredmények a 0,5 rm / r0 és 0,8 korrelációs együttható küszöbértékét. Összességében a teljes adat 12% -át kitevő rossz adatpontokat szűrte ki a szigorúbb rendszer.

Kódunkban a korrelációs együtthatót, cc, az ötödik ábra képletének megfelelően számoljuk ki, ahol y az átlagközpontú, kiindulási jel jelét jelenti, míg r0 az előző lépésben definiálták.

6. lépés: A forráskód

Ennek a projektnek az Arduino IDE -re formázott C forráskódja elérhető a Github fiókunkból az alábbi linken:

github.com/aromring/MAX30102_by_RF

A Readme oldala leírja az egyes összetevőket.

Szeretnék egy pillanatra dicsérni az Adafruitot, amiért olyan kiváló terméket készített, mint az M0-alapú Adalogger. Gyors, 48 MHz -es, sok RAM -mal rendelkező ARM Cortex M0 processzora minden bizonnyal elősegítette a projekt életképességét, míg a közvetlenül csatlakoztatott SD -kártyaolvasó (valamint az Adafruit SD -könyvtára) megszünteti a hobbista minden fájdalmát, amely nagy mennyiségű adat valós idejű tárolásával jár.

Ajánlott: