Inhoudsopgave:

Pulsoximeter met veel verbeterde precisie - Ajarnpa
Pulsoximeter met veel verbeterde precisie - Ajarnpa

Video: Pulsoximeter met veel verbeterde precisie - Ajarnpa

Video: Pulsoximeter met veel verbeterde precisie - Ajarnpa
Video: Diepe Aanpassing (VERBETERDE VERSIE) 2024, Juli-
Anonim
Pulsoximeter met veel verbeterde precisie
Pulsoximeter met veel verbeterde precisie
Pulsoximeter met veel verbeterde precisie
Pulsoximeter met veel verbeterde precisie

Als u onlangs een arts heeft bezocht, is de kans groot dat uw basale vitale functies zijn onderzocht door een verpleegkundige. Gewicht, lengte, bloeddruk, evenals hartslag (HR) en zuurstofsaturatie in perifeer bloed (SpO2). Misschien zijn de laatste twee verkregen van een roodgloeiende elektronische vingersonde die binnen enkele minuten relevante cijfers op een klein scherm weergaf. Die sonde heet pulsoximeter en je kunt er hier alle basisinformatie over vinden.

Je kunt natuurlijk gemakkelijk een eenvoudige pulsoximeter kopen, maar waar zit het plezier in? Ik heb besloten om mijn eigen te bouwen, eerst voor de gek, maar nog belangrijker met een specifieke toepassing in gedachten: nachtelijke oximetrie waarbij zowel HR als SpO2 gegevens zouden continu 's nachts worden verzameld en vastgelegd op een micro SD-kaart. Instructables bevat al verschillende van dit soort projecten, bijvoorbeeld twee met Arduino hier en hier, en één met Raspberry Pi. De mijne gebruikt de iets nieuwere sensor MAX30102 van MAXIM Integrated en Adafruit's Feather M0 Adalogger voor controle en gegevensregistratie.

Ons project is dus niet bijzonder innovatief op het gebied van hardware en als zodanig zou het niet de moeite waard zijn om dit Instructable te schrijven, maar tijdens het maken ervan heb ik cruciale vooruitgang geboekt in de software waarmee ik gegevens uit MAX30102 kon extraheren met een veel hogere consistentie en veel minder ruis dan software geschreven door MAXIM voor deze sensor. De prestaties van ons signaalverwerkingsalgoritme worden geïllustreerd in de bovenstaande grafiek, waar de twee bovenste grafieken de nachtelijke hartslag en zuurstofverzadiging bevatten, berekend op basis van onbewerkte signalen door onze methode (geïdentificeerd door "RF"), terwijl de onderste twee grafieken de resultaten van MAXIM tonen die zijn geproduceerd uit precies dezelfde signalen. Standaarddeviaties voor HR zijn 4,7 bpm en 18,1 bpm, en voor SpO2 0,9% en 4,4%, voor respectievelijk RF en MAXIM.

(Beide RF-grafieken komen overeen met een minimale autocorrelatiedrempel van 0,25 en geen limiet voor R / IR-correlatie; zie stap 4 en 5 voor uitleg van deze termen.)

Stap 1: Hardware

Hardware
Hardware
Hardware
Hardware
Hardware
Hardware
Hardware
Hardware
  1. Pulsoximeter en hartslagsensor MAX30102-systeemkaart van MAXIM Integrated, Inc.
  2. Feather M0 Adalogger van Adafruit, Inc.
  3. Lithium-ionbatterij van Adafruit, Inc.

Aansluitingen:

  • Adalogger-pinnen SCL en SDA op overeenkomstige SCL- en SDA-pinnen op MAX30102-kaart
  • Adalogger pin 10 naar pin INT op MAX30102 board
  • Adalogger GND naar MAX30102 kaart GND
  • Adalogger 3V naar MAX30102 VIN

Stap 2: Digitale signalen geretourneerd door MAX30102

Digitale signalen geretourneerd door MAX30102
Digitale signalen geretourneerd door MAX30102
Digitale signalen geretourneerd door MAX30102
Digitale signalen geretourneerd door MAX30102

De principes van de sensorwerking zijn heel eenvoudig: twee LED's, een rode (660 nm) en een infrarood (880 nm, IR) schijnen licht door de menselijke huid. Het licht wordt gedeeltelijk geabsorbeerd door onderliggende weefsels, inclusief perifeer bloed. De fotodetector van de sensor verzamelt gereflecteerd licht op beide golflengten en retourneert twee overeenkomstige relatieve intensiteiten met behulp van het I2C-protocol. Aangezien de absorptiespectra voor zuurstofrijk en zuurstofarm hemoglobine voor beide golflengten verschillen, heeft het gereflecteerde licht een variabele component aangezien de hoeveelheid arterieel bloed dat onder de huid aanwezig is bij elke hartslag pulseert. Het bepalen van de hartslag en zuurstofverzadiging is aan de signaalverwerkingssoftware.

Voorbeelden van onbewerkte signalen (alleen IR-kanaal) worden geïllustreerd in de bovenstaande afbeeldingen. Men kan een periodieke component opmerken als overlay op een variabele basislijn die verschuift als gevolg van meerdere factoren die op de Wikipedia-pagina worden genoemd. Door beweging veroorzaakte artefacten zijn bijzonder vervelend omdat ze het bruikbare HR-signaal kunnen maskeren en valse resultaten kunnen veroorzaken. Daarom beschikken geavanceerde commerciële oximeters over versnellingsmeters die deze artefacten helpen teniet doen.

Ik kan een versnellingsmeter toevoegen aan de volgende versie van mijn oximeter, maar voor nachtelijke HR/SpO2 opnemen, wanneer de sensor het grootste deel van de tijd bewegingsloos blijft, is het voldoende om vervormde signalen te detecteren en weg te laten.

De MAX30102-sensor zelf wordt geleverd in een klein opbouwpakket, maar MAXIM biedt genadig een breakout-bord (System Board 6300) plus signaalverwerkingssoftware voor Arduino en mbed - allemaal in het referentieontwerppakket MAXREFDES117#. Ik kocht het met plezier in de verwachting dat ik gewoon wat draden tussen de sensor en Adalogger zou solderen en in één dag een werkende, goede oximeter zou hebben. Ik heb de RD117_ARDUINO-versie van de MAXIM-software aangepast om te draaien op de ARM Cortex M0-processor van de Adalogger. Eigenlijk hoefde ik alleen incompatibele SofI2C-functies in max30102.cpp te vervangen door de overeenkomstige Wire-bibliotheekoproepen. De code is prima gecompileerd in de Arduino IDE v1.8.5 en liep zonder fouten op M0. De nettoresultaten waren echter teleurstellend. In de stap Introductie heb ik al een zeer hoge variantie van zowel HR als SpO. aangetoond2. Natuurlijk kan men beweren dat ik iets verkeerd heb gedaan en dit was ook mijn oorspronkelijke gedachte. In de instructievideo van MAXIM kunt u echter ook wild schommelende HR-waarden zien die op het scherm worden weergegeven. Bovendien bevestigen opmerkingen onder de video dat anderen ook een soortgelijk fenomeen hebben opgemerkt.

Om een lang verhaal kort te maken, na wat experimenteren heb ik vastgesteld dat de sensor goed werkt en dat een alternatieve methode van digitale signaalverwerking resulteert in een veel betere stabiliteit. Deze nieuwe methode, aangeduid met "RF", wordt beschreven in de volgende stappen.

Stap 3: Signaalvoorverwerking

Signaalvoorverwerking
Signaalvoorverwerking
Signaalvoorverwerking
Signaalvoorverwerking
Signaalvoorverwerking
Signaalvoorverwerking
Signaalvoorverwerking
Signaalvoorverwerking

In onze implementatie wordt het onbewerkte signaal verzameld met een snelheid van 25 Hz (hetzelfde als MAXIM's) gedurende de volledige 4 seconden (de MAXIM-software verzamelt slechts 1 seconde), wat resulteert in 100 gedigitaliseerde tijdpunten per eindgegevenspunt. Elke reeks van 100 punten moet op de volgende manier worden voorbewerkt:

  1. Mean-centering (ook bekend als "verwijdering van de DC-component" voor elektrotechnici). De onbewerkte gegevens die van de sensor komen, zijn een tijdreeks van gehele getallen in de 105 bereik. Het bruikbare signaal is echter slechts een deel van het licht dat wordt gereflecteerd door arterieel bloed dat in de orde van slechts 10. varieert2 - eerste cijfer. Voor zinvolle signaalverwerking is het daarom wenselijk om het gemiddelde van elk seriepunt af te trekken. Dit onderdeel verschilt niet van wat de MAXIM-software al doet. Wat echter anders is, is de extra gemiddelde centrering van tijdindexen zelf. Met andere woorden, in plaats van seriepunten te indexeren met getallen van 0 tot 99, zijn de nieuwe indices nu getallen -49.5, -48.5, …, 49.5. Het lijkt in eerste instantie misschien raar, maar dankzij deze procedure valt het "zwaartepunt" van de signaalcurve samen met de oorsprong van het coördinatensysteem (tweede figuur). Dit feit wordt heel nuttig in de volgende stap.
  2. Nivellering van de basislijn. Nog een blik op de golfvormen die in stap 2 worden getoond, illustreert dat de basislijn van echte oximetriesignalen verre van horizontaal vlak is, maar varieert via verschillende hellingen. Derde figuur toont een gemiddeld gecentreerd IR-signaal (blauwe curve) en de basislijn (blauwe rechte lijn). In dit geval is de helling van de basislijn negatief. De hierboven beschreven signaalverwerkingsmethode vereist dat de basislijn horizontaal is. Dit kan worden bereikt door eenvoudigweg de basislijn af te trekken van het gemiddelde gecentreerde signaal. Dankzij de gemiddelde centrering van zowel de Y- als de X-coördinaten, is het snijpunt van de basislijn nul en is de hellingsvergelijking bijzonder eenvoudig, zoals weergegeven in de vierde afbeelding. Het signaal op basislijnniveau wordt weergegeven door een oranje curve in de derde afbeelding.

Het voorbewerkte signaal is dus klaar voor de volgende stap.

Stap 4: Het werkpaard: autocorrelatiefunctie

Het werkpaard: autocorrelatiefunctie
Het werkpaard: autocorrelatiefunctie
Het werkpaard: autocorrelatiefunctie
Het werkpaard: autocorrelatiefunctie
Het werkpaard: autocorrelatiefunctie
Het werkpaard: autocorrelatiefunctie

Terugkerend naar de gebruikelijke 1, …, n-indexering, toont de eerste figuur de definitie van de autocorrelatiefunctie rm - een hoeveelheid die zeer nuttig is gebleken bij het detecteren van zowel de periodiciteit als de kwaliteit van het signaal. Het is gewoon een genormaliseerd scalair product van de tijdreeks van het signaal met zelf verschoven met lag m. In onze toepassing is het echter handig om elke autocorrelatiewaarde te schalen met betrekking tot de waarde bij lag = 0, d.w.z. gebruik relatieve autocorrelatie gedefinieerd door rm / R0.

Plot van de relatieve autocorrelatie van een typisch IR-signaal van goede kwaliteit wordt getoond in de tweede afbeelding. Zoals verwacht is de waarde bij lag = 0 bij het globale maximum gelijk aan 1. Het volgende (lokale) maximum vindt plaats bij lag = 23 en is gelijk aan 0,79. De aanwezigheid van lokale minima en maxima in de autocorrelatiegrafiek is gemakkelijk te begrijpen: naarmate het signaal naar rechts verschuift, interfereren de pieken aanvankelijk destructief met elkaar, maar op een bepaald punt wordt de interferentie constructief en bereikt het maximum bij de vertraging gelijk aan het gemiddelde periode van het signaal.

De laatste zin is cruciaal: om de gemiddelde tijdsperiode tussen pieken te bepalen, waaruit men de signaalfrequentie (d.w.z. hartslag) kan berekenen, is het voldoende om het eerste lokale maximum van de autocorrelatiefunctie te vinden! Standaard bemonstert de MAX30102 analoge invoer met een snelheid van 25 punten per seconde, daarom is bij gegeven m de periode in seconden gelijk aan m / 25. Dit leidt tot de hartslag uitgedrukt in slagen per minuut (bpm) door:

HR = 60*25 / m = 1500 / m

Het is natuurlijk niet nodig om dure berekeningen van r. uit te voerenm bij alle lag-waarden. Ons algoritme maakt de eerste schatting van de hartslag = 60 bpm, wat overeenkomt met m = 25. De autocorrelatiefunctie wordt op dat punt geëvalueerd en vergeleken met de waarde bij zijn linkerbuur, m = 24. Als de waarde van de buren hoger is, dan mars gaat verder naar links tot rm-1 < rm. De aldus bepaalde uiteindelijke m wordt dan geretourneerd als de maximale vertraging. De volgende iteratie begint vanaf die waarde in plaats van 25 en het hele proces herhaalt zich. Als de eerste linkerbuur lager is, lopen de bovenstaande routinemarsen op dezelfde manier achter op de punten naar rechts. Meestal vereist lag bij maximum slechts een paar evaluaties van de autocorrelatiefunctie. Daarnaast worden maximaal en minimaal acceptabele vertragingen (die respectievelijk overeenkomen met minimale en maximale hartslag) als grenswaarden gebruikt.

Het bovenstaande werkt heel goed voor signalen van goede kwaliteit, maar de echte wereld is verre van ideaal. Sommige signalen komen vervormd uit, meestal als gevolg van bewegingsartefacten. Een dergelijk signaal is weergegeven in de derde figuur. Een slechte periodiciteit wordt weerspiegeld in de vorm van zijn autocorrelatiefunctie en in de lage waarde, 0,28, van het eerste lokale maximum bij m = 11. Vergelijk dit met de maximale waarde van 0,79 bepaald voor het signaal van goede kwaliteit. Samen met lag-grenswaarden is daarom de waarde van rm / R0 maximaal is een goede indicator van de signaalkwaliteit en een vereiste dat deze een bepaalde drempel overschrijdt, kan worden gebruikt om bewegingsartefacten uit te filteren. De "RF"-grafieken die in de inleidingen worden getoond, waren het resultaat van een dergelijke drempel gelijk aan 0,25.

Stap 5: Zuurstofverzadiging bepalen

Zuurstofverzadiging bepalen
Zuurstofverzadiging bepalen
Zuurstofverzadiging bepalen
Zuurstofverzadiging bepalen
Zuurstofverzadiging bepalen
Zuurstofverzadiging bepalen
Zuurstofverzadiging bepalen
Zuurstofverzadiging bepalen

De vorige stap was voldoende om de hartslag te bepalen. De SpO2 vereist meer werk. Ten eerste moet rekening worden gehouden met het tot dusver verwaarloosde signaal in het rode (R)-kanaal. Vervolgens wordt de verhouding van rode tot infraroodsignalen, Z = R/IR, beide gereflecteerd door het arteriële bloed, berekend. Het gedeelte "arterieel bloed" is cruciaal, omdat het meeste licht in feite wordt gereflecteerd door weefsels en veneus bloed. Hoe kies je een deel van het signaal dat overeenkomt met arterieel bloed? Welnu, dit is de pulserende component die varieert met elke hartslag. In de woorden van elektrotechnici is dit het "AC-gedeelte", terwijl het resterende gereflecteerde licht het "DC-gedeelte" is. Aangezien de absolute intensiteiten van R- en IR-licht niet evenredig zijn, wordt de Z-verhouding berekend op basis van relatieve intensiteiten, zoals weergegeven in de eerste afbeelding. In termen van werkelijk berekende hoeveelheden, gebruik ik de root-mean-square (RMS) van het gemiddelde-gecentreerde, baseline-leveled signaal, y, tot het reeds bekende gemiddelde van het onbewerkte signaal, <Y>; zie tweede figuur. De Z-ratio is echter slechts de helft van het werk. De niet-lineaire sensorrespons vereist een empirische kalibratie tussen Z en de uiteindelijke SpO2 waarden. Ik nam de kalibratievergelijking uit de code van MAXIM:

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

Houd er rekening mee dat deze vergelijking alleen geldig is voor het MAX30102-ontwerpbord dat in 2017 is gekocht! Het is waarschijnlijk dat MAXIM zijn sensoren op een later tijdstip opnieuw zal kalibreren.

Bovenstaande procedure levert nog steeds veel valse SpO. op2 lezingen. Het rode kanaal heeft last van veel artefacten, net als het IR-kanaal. Het is redelijk om aan te nemen dat beide signalen sterk gecorreleerd moeten zijn. In feite correleren signalen van goede kwaliteit, zoals het voorbeeld in de derde afbeelding, heel goed. De Pearson-correlatiecoëfficiënt is in dit geval zo hoog als 0,99. Dit is niet altijd het geval, zoals blijkt uit de vierde figuur. Hoewel het IR-signaal het hartslagkwaliteitsfilter met zijn rm / R0 = 0,76, resulteert het vervormde R-signaal in een slechte correlatiecoëfficiënt tussen de twee die gelijk is aan slechts 0,42. Deze waarneming biedt het tweede kwaliteitsfilter: de correlatiecoëfficiënt tussen kanalen groter dan een bepaalde drempel hebben.

De laatste twee figuren illustreren het netto-effect van een dergelijke kwaliteitsfiltering. Eerst wordt de gemeten zuurstofsaturatie uitgezet met een HR-kwaliteitsdrempel van 0,25, maar zonder de SpO2 filter. Volgende plotresultaten van het uitfilteren van slechte HR en SpO2 resultaten bij de 0,5 rm / R0 en 0,8 correlatiecoëfficiëntdrempels. Al met al werden slechte datapunten van 12% van het totaal uitgefilterd door het strengere regime.

In onze code wordt de correlatiecoëfficiënt, cc, berekend volgens de formule in de vijfde figuur, waarbij y het gemiddelde gecentreerde signaal op basislijnniveau voorstelt, terwijl r0 werd gedefinieerd in de vorige stap.

Stap 6: De broncode

De C-broncode voor dit project, geformatteerd voor de Arduino IDE, is beschikbaar via ons Github-account via de volgende link:

github.com/aromring/MAX30102_by_RF

De Readme-pagina beschrijft individuele componenten.

Ik wil graag even de tijd nemen om Adafruit te prijzen voor het maken van zo'n uitstekend product als op M0 gebaseerde Adalogger. De snelle 48 MHz ARM Cortex M0-processor, met veel RAM, heeft dit project zeker levensvatbaar gemaakt, terwijl de direct aangesloten SD-kaartlezer (plus de SD-bibliotheek van Adafruit) alle problemen van de hobbyist wegneemt die gepaard gaan met realtime opslag van grote hoeveelheden gegevens.

Aanbevolen: