Innehållsförteckning:

Pulsoximeter med mycket förbättrad precision: 6 steg (med bilder)
Pulsoximeter med mycket förbättrad precision: 6 steg (med bilder)

Video: Pulsoximeter med mycket förbättrad precision: 6 steg (med bilder)

Video: Pulsoximeter med mycket förbättrad precision: 6 steg (med bilder)
Video: Укладка плитки и мозаики на пол за 20 минут .ПЕРЕДЕЛКА ХРУЩЕВКИ от А до Я. #26 2024, November
Anonim
Pulsoximeter med mycket förbättrad precision
Pulsoximeter med mycket förbättrad precision
Pulsoximeter med mycket förbättrad precision
Pulsoximeter med mycket förbättrad precision

Om du nyligen besökte en läkare är chansen stor att dina grundläggande vitala tecken undersöktes av en sjuksköterska. Vikt, höjd, blodtryck, liksom puls (HR) och syremättnad i perifert blod (SpO2). Kanske hämtades de två sista från en rödglödande elektronisk fingersond som visade relevanta siffror på en liten skärm på några minuter. Den sonden kallas pulsoximeter och du kan hitta all grundinformation om den här.

Man kan enkelt köpa en enkel pulsoximeter, visst, men var är det roliga i den? Jag har bestämt mig för att bygga en egen, först för fan, men ännu viktigare med en specifik applikation i åtanke: nattlig oximetri där både HR och SpO2 data samlas kontinuerligt över natten och registreras på ett micro SD -kort. Instructables innehåller redan flera sådana här projekt, t.ex. två som involverar Arduino här och här, och ett som använder Raspberry Pi. Min använder lite nyare sensor MAX30102 från MAXIM Integrated och Adafruit's Feather M0 Adalogger för kontroll och dataregistrering.

Vårt projekt är alltså inte särskilt innovativt när det gäller hårdvara och som sådant skulle det inte vara värt att skriva denna instruktionsbok, men under processen med att skapa det har jag gjort avgörande framsteg inom programvara som gjorde det möjligt för mig att extrahera data från MAX30102 med mycket högre konsistens och mycket mindre brus än mjukvara skriven av MAXIM för denna sensor. Prestanda för vår signalbehandlingsalgoritm illustreras i diagrammet ovan där de två översta graferna innehåller hjärtfrekvens över natten och syremättnad beräknad från råsignaler med vår metod (identifierad med "RF"), medan de två nedre graferna visar MAXIM: s resultat från exakt samma signaler. Standardavvikelser för HR är 4,7 bpm och 18,1 bpm och för SpO2 0,9% och 4,4%, för RF respektive MAXIM.

(Båda RF -graferna motsvarar minimal autokorrelationströskel på 0,25 och ingen gräns för R / IR -korrelation; se steg 4 och 5 för förklaring av dessa termer.)

Steg 1: Hårdvara

Hårdvara
Hårdvara
Hårdvara
Hårdvara
Hårdvara
Hårdvara
Hårdvara
Hårdvara
  1. Pulsoximeter och pulssensor MAX30102 systemkort från MAXIM Integrated, Inc.
  2. Feather M0 Adalogger från Adafruit, Inc.
  3. Litiumjonbatteri från Adafruit, Inc.

Anslutningar:

  • Adalogger -stift SCL och SDA till motsvarande SCL- och SDA -stift på MAX30102 -kortet
  • Adalogger pin 10 to pin INT on MAX30102 board
  • Adalogger GND till MAX30102 -kort GND
  • Adalogger 3V till MAX30102 VIN

Steg 2: Digitala signaler som returneras av MAX30102

Digitala signaler returneras av MAX30102
Digitala signaler returneras av MAX30102
Digitala signaler returneras av MAX30102
Digitala signaler returneras av MAX30102

Principerna för sensoroperationen är mycket enkla: två lysdioder, en röd (660 nm) och en infraröd (880 nm, IR) lyser genom människans hud. Ljuset absorberas delvis av underliggande vävnader, inklusive perifert blod. Sensors fotodetektor samlar reflekterat ljus vid båda våglängderna och returnerar två motsvarande relativa intensiteter med I2C -protokoll. Eftersom absorptionsspektra för syresatt och deoxygenerat hemoglobin skiljer sig åt för båda våglängderna har det reflekterade ljuset en variabel komponent som mängden arteriellt blod som är närvarande under hudpulserna med varje hjärtslag. Att räkna ut hjärtfrekvens och syremättnad är upp till signalbehandlingsprogrammet.

Exempel på råsignaler (endast IR -kanal) illustreras i bilderna ovan. Man kan märka en periodisk komponent överlagrad på en variabel baslinje som skiftar på grund av flera faktorer som nämns på Wikipedia -sidan. Rörelseinducerade artefakter är särskilt irriterande eftersom de kan dölja den användbara HR -signalen och orsaka falska resultat. Därför har avancerade kommersiella oximetrar accelerometrar som hjälper till att upphäva dessa artefakter.

Jag kan lägga till en accelerometer till nästa version av min oximeter, men för nattlig HR/SpO2 inspelning, när sensorn förblir orörlig för det mesta är det tillräckligt att detektera och utelämna förvrängda signaler.

MAX30102 -sensorn i sig kommer i ett litet ytmonterat paket, men MAXIM erbjuder nådigt en utbrottskort (systemkort 6300) plus signalbehandlingsprogramvara för Arduino och mbed - allt i referensdesignpaketet MAXREFDES117#. Jag köpte den gärna och förväntade mig att bara lödda några ledningar mellan sensorn och Adalogger och ha en fungerande, bra oximeter på en enda dag. Jag anpassade RD117_ARDUINO -versionen av MAXIMs programvara för att köras på Adaloggers ARM Cortex M0 -processor. I grund och botten var allt jag behövde göra för att ersätta inkompatibla SofI2C -funktioner i max30102.cpp med motsvarande Wire -bibliotekssamtal. Koden sammanställdes fint i Arduino IDE v1.8.5 och kördes på M0 utan några fel. Nettoresultatet var dock en besvikelse. I introduktionssteget har jag redan visat mycket hög variation av både HR och SpO2. Naturligtvis kan man påstå att jag har gjort något fel och det var också min ursprungliga tanke. Men i MAXIMs instruktionsvideo kan du också observera vilt svängande HR -värden som visas på skärmen. Kommentarer under videon bekräftar dessutom att andra också har märkt ett liknande fenomen.

För att göra en lång historia kort, har jag efter lite experimenterande fastställt att sensorn fungerar OK och en alternativ metod för digital signalbehandling resulterar i mycket bättre stabilitet. Denna nya metod, indikerad med "RF", beskrivs i nästa steg.

Steg 3: Signalförbehandling

Signalförbehandling
Signalförbehandling
Signalförbehandling
Signalförbehandling
Signalförbehandling
Signalförbehandling
Signalförbehandling
Signalförbehandling

I vår implementering samlas råsignalen upp med en hastighet av 25 Hz (samma som MAXIM) i hela 4 sekunder (MAXIMs programvara samlar bara in 1 sekund), vilket resulterar i 100 digitaliserade tidpunkter per slutdatapunkt. Varje 100-punktssekvens måste förbehandlas på följande sätt:

  1. Medelcentrerad (aka "avlägsnande av likströmskomponenten" till elingenjörer). Rådata från sensorn är en tidsserie med heltal i tiotalet5 räckvidd. Den användbara signalen är dock bara en del av ljuset som reflekteras från arteriellt blod som varierar i storleksordningen endast 102 - första figuren. För meningsfull signalbehandling är det därför önskvärt att subtrahera medelvärdet från varje seriepunkt. Denna del skiljer sig inte från vad MAXIM -programvaran redan gör. Vad som är annorlunda är dock ytterligare medelcentrering av själva tidsindexen. Med andra ord, istället för att indexera seriepunkter med siffror från 0 till 99, är de nya indexen nu siffror -49,5, -48,5,…, 49,5. Det kan tyckas konstigt till en början, men tack vare denna procedur sammanfaller signalkurvans "tyngdpunkt" med koordinatsystemets ursprung (andra figuren). Detta faktum blir ganska användbart i nästa steg.
  2. Baslinjenivellering. En annan titt på vågformerna som visas i steg 2 illustrerar att baslinjen för riktiga oximetrisignaler långt ifrån är horisontellt plan, men varierar genom olika sluttningar. Tredje figuren visar en medelcentrerad IR-signal (blå kurva) och dess baslinje (blå rak linje). I detta fall är baslinjens lutning negativ. Signalbehandlingsmetoden som beskrivs i förväg kräver att baslinjen är horisontell. Detta kan uppnås genom att helt enkelt subtrahera baslinjen från medelcentrerad signal. Tack vare medelcentreringen av både Y- och X-koordinaterna är baslinjens avlyssning noll och dess lutningsekvation är särskilt enkel, som visas i den fjärde figuren. Baslinjenivåerad signal visas med orange kurva i den tredje figuren.

Således är förbehandlad signal redo för nästa steg.

Steg 4: Arbetshäst: Autokorrelationsfunktion

Arbetshäst: autokorrelationsfunktion
Arbetshäst: autokorrelationsfunktion
Arbetshäst: autokorrelationsfunktion
Arbetshäst: autokorrelationsfunktion
Arbetshäst: autokorrelationsfunktion
Arbetshäst: autokorrelationsfunktion

När vi återgår till den vanliga 1, …, n indexeringen, visar den första figuren definitionen av autokorrelationsfunktionen rm - en mängd som visar sig vara mycket användbar för att detektera signalens periodicitet såväl som kvalitet. Det är helt enkelt en normaliserad skalärprodukt av signalens tidsserier med sig själv förskjuten med fördröjning m. I vår applikation är det dock bekvämt att skala varje autokorrelationsvärde med avseende på dess värde vid lag = 0, dvs använda relativ autokorrelation definierad av rm / r0.

Diagram över den relativa autokorrelationen för en typisk IR -signal av god kvalitet visas i den andra figuren. Som förväntat är värdet vid fördröjning = 0 vid dess globala maximi lika med 1. Nästa (lokala) maximalt inträffar vid fördröjning = 23 och är lika med 0,79. Närvaron av lokala minima och maxima i autokorrelationsdiagram är lätt att förstå: när signalen skiftar till höger stör dess toppar förstörande med varandra först, men vid en viss tid blir interferensen konstruktiv och uppnår maximalt vid fördröjningen lika med genomsnittet signalens period.

Den sista frasen är avgörande: för att bestämma den genomsnittliga tidsperioden mellan toppar, från vilka man kan beräkna signalens frekvens (dvs hjärtfrekvens) är det tillräckligt att hitta det första lokala maxvärdet för autokorrelationsfunktionen! Som standard samplar MAX30102 analog ingång med en hastighet av 25 poäng per sekund, därför är perioden i sekunder lika med m / 25. vid given m. Detta leder till hjärtfrekvens uttryckt i slag per minut (bpm) med:

HR = 60*25 / m = 1500 / m

Naturligtvis är det inte nödvändigt att göra dyra beräkningar av rm vid alla eftersläpningsvärden. Vår algoritm gör den första gissningen om hjärtfrekvens = 60 slag / minut, vilket motsvarar m = 25. Autokorrelationsfunktionen utvärderas vid den punkten och jämförs med värdet på dess vänstra granne, m = 24. Om grannarnas värde är högre, då är marschen fortsätter till vänster tills rm-1 <rm. Således returneras bestämt slutligt m som fördröjning vid maximalt. Nästa iteration utgår från det värdet istället för 25 och hela processen upprepas. Om den första vänstra grannen är lägre, pekar ovanstående rutinmarscher på höger på liknande sätt. För det mesta kräver fördröjning vid max bara några utvärderingar av autokorrelationsfunktionen. Dessutom används maximala och minsta acceptabla eftersläpningar (motsvarande minimal respektive maximal puls) som gränsvärden.

Ovanstående fungerar mycket bra för signaler av god kvalitet, men den verkliga världen är långt ifrån idealisk. Vissa signaler kommer förvrängda ut, mestadels på grund av rörelseartefakter. En sådan signal visas i den tredje figuren. Dålig periodicitet återspeglas i formen av dess autokorrelationsfunktion såväl som i lågt värde, 0,28, av det första lokala maximalt vid m = 11. Jämför det med det maximala värdet på 0,79 som bestämts för signalen av god kvalitet. Tillsammans med fördröjningsbegränsande värden är därför värdet av rm / r0 på max är en bra indikator på signalkvalitet och ett krav för att den ska överstiga vissa trösklar kan användas för att filtrera bort rörelseartefakter. "RF" -graferna som visas i introduktionerna berodde på en sådan tröskel som är lika med 0,25.

Steg 5: Bestämning av syremättnad

Bestämning av syremättnad
Bestämning av syremättnad
Bestämning av syremättnad
Bestämning av syremättnad
Bestämning av syremättnad
Bestämning av syremättnad
Bestämning av syremättnad
Bestämning av syremättnad

Det föregående steget var tillräckligt för att bestämma hjärtfrekvensen. SpO2 kräver mer arbete. Först måste den hittills försummade signalen i den röda (R) kanalen beaktas. Därefter beräknas förhållandet mellan röda och infraröda signaler, Z = R/IR, båda reflekterade från arteriellt blod. Den "arteriella blod" delen är avgörande, eftersom det mesta av ljuset faktiskt reflekteras från vävnader och venöst blod. Hur väljer man en del av signalen som motsvarar arteriellt blod? Tja, det här är den pulserande komponenten som varierar med varje hjärtslag. Med elektriska ingenjörers ord är det "AC -delen", medan det återstående reflekterade ljuset är "DC -delen". Eftersom absoluta intensiteter för R- och IR -ljus inte står i proportion till beräknas Z -förhållandet utifrån relativa intensiteter, som visas i den första figuren. När det gäller faktiskt beräknade kvantiteter använder jag rot-medel-kvadrat (RMS) av medelcentrerad, baslinjenivåerad signal, y, till det redan kända medelvärdet för råsignalen, <Y>; se andra figuren. Z -förhållandet är dock bara hälften av arbetet. Det olinjära sensorsvaret kräver en empirisk kalibrering mellan Z och den sista SpO2 värden. Jag tog kalibreringsekvationen från MAXIMs kod:

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

Tänk på att denna ekvation endast gäller för MAX30102 designkort som köptes 2017! Det är troligt att MAXIM kan kalibrera om sina sensorer vid ett senare tillfälle.

Ovanstående procedur ger fortfarande mycket falskt SpO2 avläsningar. Den röda kanalen lider av många artefakter, precis som IR. Det är rimligt att anta att båda signalerna bör vara starkt korrelerade. Faktum är att signaler av god kvalitet, liksom exemplet i tredje figuren, korrelerar mycket bra. Pearson -korrelationskoefficienten är i detta fall så hög som 0,99. Detta är inte alltid fallet, som illustreras i den fjärde figuren. Även om IR -signalen skulle passera pulskvalitetsfiltret med dess rm / r0 = 0,76 resulterar den förvrängda R -signalen i en dålig korrelationskoefficient mellan de två lika med endast 0,42. Denna observation erbjuder det andra kvalitetsfiltret: att ha korrelationskoefficienten mellan kanaler som är större än en viss tröskel.

De två sista siffrorna exemplifierar nettoeffekten av sådan kvalitetsfiltrering. Först ritas den uppmätta syremättnaden med HR -kvalitetströskel på 0,25, men utan SpO2 filtrera. Nästa plot resultat från filtrering av dålig HR och SpO2 resultat vid 0,5 rm / r0 och 0,8 korrelationskoefficienttrösklar. Sammantaget filtrerades dåliga datapunkter upp till 12% av totalen ut av den striktare regimen.

I vår kod beräknas korrelationskoefficienten, cc, enligt formeln i femte siffran, där y representerar den medelcentrerade, baslinjenivåerade signalen, medan r0 definierades i föregående steg.

Steg 6: Källkoden

C -källkoden för detta projekt, formaterad för Arduino IDE, är tillgänglig från vårt Github -konto på följande länk:

github.com/aromring/MAX30102_by_RF

Dess Readme -sida beskriver enskilda komponenter.

Jag skulle vilja ta en stund att berömma Adafruit för att ha gjort en så utmärkt produkt som M0-baserad Adalogger. Dess snabba 48 MHz ARM Cortex M0 -processor, med massor av RAM -minne, har verkligen hjälpt till att göra detta projekt livskraftigt, medan direkt ansluten SD -kortläsare (plus Adafruit's SD -bibliotek) tar bort alla hobbyers smärtor i samband med lagring av stora mängder data i realtid.

Rekommenderad: