Indholdsfortegnelse:

Pulsoximeter med meget forbedret præcision: 6 trin (med billeder)
Pulsoximeter med meget forbedret præcision: 6 trin (med billeder)

Video: Pulsoximeter med meget forbedret præcision: 6 trin (med billeder)

Video: Pulsoximeter med meget forbedret præcision: 6 trin (med billeder)
Video: Making a BT50 Tool Holder for SIP Jig Borer Tooling! | Shop Made Tools 2024, Juli
Anonim
Pulsoximeter med meget forbedret præcision
Pulsoximeter med meget forbedret præcision
Pulsoximeter med meget forbedret præcision
Pulsoximeter med meget forbedret præcision

Hvis du for nylig besøgte en læge, er chancerne for, at dine grundlæggende vitale tegn blev undersøgt af en sygeplejerske. Vægt, højde, blodtryk samt puls (HR) og iltmætning i perifert blod (SpO2). Måske blev de to sidste hentet fra en rødglødende elektronisk fingersonde, der viste relevante tal på en lille skærm på få minutter. Denne sonde kaldes pulsoximeter, og du kan finde alle de grundlæggende oplysninger om det her.

Man kan sagtens købe et simpelt pulsoximeter, men hvor er det sjove i det? Jeg har besluttet at bygge min egen, først for pokker, men endnu vigtigere med en bestemt applikation i tankerne: natlig oximetri, hvor både HR og SpO2 data vil løbende blive indsamlet natten over og registreret på et micro SD -kort. Instructables indeholder allerede flere sådanne projekter, f.eks. To involverende Arduino her og her, og et med Raspberry Pi. Mine bruger lidt nyere sensor MAX30102 fra MAXIM Integrated og Adafruit's Feather M0 Adalogger til kontrol og dataregistrering.

Vores projekt er således ikke særlig innovativt hvad angår hardware og ville som sådan ikke være værd at skrive denne Instructable, men i processen med at oprette det har jeg gjort afgørende fremskridt inden for software, der tillod mig at udtrække data fra MAX30102 med meget højere konsistens og meget mindre støj end software skrevet af MAXIM til denne sensor. Udførelsen af vores signalbehandlingsalgoritme er illustreret i diagrammet ovenfor, hvor de to øverste grafer indeholder puls over natten og iltmætning beregnet ud fra råsignaler ved vores metode (identificeret med "RF"), mens de to nederste grafer viser MAXIMs resultater frembragt fra præcis de samme signaler. Standardafvigelser for HR er 4,7 bpm og 18,1 bpm og for SpO2 0,9% og 4,4% for henholdsvis RF og MAXIM.

(Begge RF -grafer svarer til minimal autokorrelationstærskel på 0,25 og ingen grænse for R / IR -korrelation; se trin 4 og 5 for forklaring af disse udtryk.)

Trin 1: Hardware

Hardware
Hardware
Hardware
Hardware
Hardware
Hardware
Hardware
Hardware
  1. Pulsoximeter og pulssensor MAX30102 systemkort fra MAXIM Integrated, Inc.
  2. Feather M0 Adalogger fra Adafruit, Inc.
  3. Litiumionbatteri fra Adafruit, Inc.

Tilslutninger:

  • Adalogger ben SCL og SDA til tilsvarende SCL og SDA ben på MAX30102 bord
  • Adalogger pin 10 til pin INT på MAX30102 board
  • Adalogger GND til MAX30102 bord GND
  • Adalogger 3V til MAX30102 VIN

Trin 2: Digitale signaler returneret af MAX30102

Digitale signaler returneret af MAX30102
Digitale signaler returneret af MAX30102
Digitale signaler returneret af MAX30102
Digitale signaler returneret af MAX30102

Principperne for sensorbetjeningen er meget enkle: to lysdioder, en rød (660 nm) og en infrarød (880 nm, IR) skinner lys gennem menneskelig hud. Lyset absorberes delvist af underliggende væv, herunder perifert blod. Sensors fotodetektor opsamler reflekteret lys ved begge bølgelængder og returnerer to tilsvarende relative intensiteter ved hjælp af I2C -protokol. Da absorptionsspektre for oxygeneret og deoxygeneret hæmoglobin er forskellige for begge bølgelængder, har det reflekterede lys en variabel komponent som mængden af arterielt blod, der er til stede under huden, pulserer med hvert hjerteslag. At finde ud af puls og iltmætning er op til signalbehandlingssoftwaren.

Eksempler på rå signaler (kun IR -kanal) er illustreret i ovenstående billeder. Man kan bemærke en periodisk komponent overlejret på en variabel grundlinje, der forskyder sig på grund af flere faktorer nævnt på Wikipedia -siden. Bevægelsesinducerede artefakter er særligt irriterende, da de kan maskere det nyttige HR -signal og forårsage falske resultater. Derfor har avancerede kommercielle oximetre accelerometre, der hjælper med at ophæve disse artefakter.

Jeg kan tilføje et accelerometer til den næste version af mit oximeter, men til natlig HR/SpO2 optagelse, når sensoren forbliver ubevægelig det meste af tiden, er det tilstrækkeligt at registrere og udelade forvrængede signaler.

Selve MAX30102 -sensoren kommer i en lille overflademonteret pakke, men MAXIM tilbyder nådigt et breakout -kort (systemkort 6300) plus signalbehandlingssoftware til Arduino og mbed - alt sammen i referencedesignpakken MAXREFDES117#. Jeg købte den heldigvis og forventede bare at lodde nogle ledninger mellem sensoren og Adalogger og få et fungerende, godt oximeter på en enkelt dag. Jeg tilpassede RD117_ARDUINO -versionen af MAXIMs software til at køre på Adalogger's ARM Cortex M0 -processor. Grundlæggende var alt, hvad jeg skulle gøre, at erstatte inkompatible SofI2C -funktioner i max30102.cpp med de tilsvarende Wire -biblioteksopkald. Koden kompilerede fint i Arduino IDE v1.8.5 og kørte på M0 uden fejl. Nettoresultaterne var imidlertid skuffende. I introduktionstrinnet har jeg allerede vist meget høj variation af både HR og SpO2. Naturligvis kan man påstå, at jeg har gjort noget forkert, og det var også min oprindelige tanke. I MAXIMs instruktionsvideo kan du imidlertid også observere vildt svingende HR -værdier, der vises på skærmen. Desuden bekræfter kommentarerne under videoen, at andre også har bemærket et lignende fænomen.

For at gøre en lang historie kort, har jeg efter nogle eksperimenter fastslået, at sensoren fungerer OK, og en alternativ metode til digital signalbehandling resulterer i meget bedre stabilitet. Denne nye metode, angivet med "RF", er beskrevet i de næste trin.

Trin 3: Signalforbehandling

Signalforbehandling
Signalforbehandling
Signalforbehandling
Signalforbehandling
Signalforbehandling
Signalforbehandling
Signalforbehandling
Signalforbehandling

I vores implementering indsamles råsignalet med en hastighed på 25 Hz (det samme som MAXIM) i hele 4 sekunder (MAXIMs software indsamler kun 1 sekunds værdi), hvilket resulterer i 100 digitaliserede tidspunkter pr. Slutdatapunkt. Hver 100-punktssekvens skal forbehandles på følgende måde:

  1. Middelcentrering (alias "fjernelse af DC-komponenten" til elektriske ingeniører). De rådata, der kommer fra sensoren, er en tidsserie med heltal i 105 rækkevidde. Det nyttige signal er dog kun en del af lyset, der reflekteres fra arterielt blod, og som varierer i størrelsesordenen 102 - første figur. For meningsfuld signalbehandling er det derfor ønskeligt at trække middelværdien fra hvert seripunkt. Denne del er ikke forskellig fra, hvad MAXIM -softwaren allerede gør. Hvad der er anderledes, er imidlertid yderligere middelcentrering af selve tidsindekserne. Med andre ord, i stedet for at indeksere seriepunkter med tal fra 0 til 99, er de nye indekser nu tal -49,5, -48,5,…, 49,5. Det kan virke underligt i starten, men takket være denne procedure falder signalkurvens "tyngdepunkt" sammen med koordinatsystemets oprindelse (anden figur). Denne kendsgerning bliver ganske nyttig i det næste trin.
  2. Baseline nivellering. Et andet kig på bølgeformerne vist i trin 2 illustrerer, at grundlinjen for reelle oximetri -signaler langt fra er horisontalt flad, men varierer gennem forskellige skråninger. Tredje figur viser et middelcentreret IR-signal (blå kurve) og dets basislinje (blå lige linje). I dette tilfælde er grundlinjens hældning negativ. Den signalbehandlingsmetode, der beskrives på forhånd, kræver, at baseline er vandret. Dette kan opnås ved blot at trække basislinjen fra det middelcentrerede signal. Takket være middelcentreringen af både Y- og X-koordinaterne er basislinjens aflytning nul, og dens hældningsligning er særlig enkel, som vist i den fjerde figur. Det baseline-nivellerede signal er vist med orange kurve i den tredje figur.

Således er forbehandlet signal klar til det næste trin.

Trin 4: Arbejdshesten: Autokorrelationsfunktion

Arbejdshesten: Autokorrelationsfunktion
Arbejdshesten: Autokorrelationsfunktion
Arbejdshesten: Autokorrelationsfunktion
Arbejdshesten: Autokorrelationsfunktion
Arbejdshesten: Autokorrelationsfunktion
Arbejdshesten: Autokorrelationsfunktion

Når vi vender tilbage til den sædvanlige 1, …, n indeksering, viser den første figur definition af autokorrelationsfunktionen rm - en mængde, der viser sig at være meget nyttig til at detektere signalets periodicitet såvel som kvalitet. Det er simpelthen et normaliseret skalarprodukt af signalets tidsserier med sig selv forskudt med forsinkelse m. I vores ansøgning er det imidlertid praktisk at skalere hver autokorrelationsværdi i forhold til dens værdi ved lag = 0, dvs. bruge relativ autokorrelation defineret af rm / r0.

Plot af den relative autokorrelation af et typisk IR -signal af god kvalitet er vist i den anden figur. Som forventet er dens værdi ved lag = 0 ved dets globale maksimum lig med 1. Det næste (lokale) maksimum forekommer ved lag = 23 og er lig med 0,79. Tilstedeværelsen af lokale minima og maksima i autokorrelationsplot er let at forstå: Når signalet skifter til højre, forstyrrer dets toppe destruktivt med hinanden i starten, men på et bestemt tidspunkt bliver interferensen konstruktiv og opnår maksimum ved forsinkelsen lig med gennemsnittet periode af signalet.

Den sidste sætning er afgørende: for at bestemme den gennemsnitlige tidsperiode mellem toppe, hvorfra man kan beregne signalets frekvens (dvs. puls) er det tilstrækkeligt at finde det første lokale maksimum for autokorrelationsfunktionen! Som standard prøver MAX30102 analog indgang med en hastighed på 25 point pr. Sekund, derfor er perioden i sekunder lig med m / 25. ved en given m. Dette fører til puls udtrykt i slag pr. Minut (bpm) ved:

HR = 60*25 / m = 1500 / m

Det er naturligvis ikke nødvendigt at foretage dyre beregninger af rm ved alle forsinkelsesværdier. Vores algoritme gør det første gæt på puls = 60 bpm, hvilket svarer til m = 25. Autokorrelationsfunktionen evalueres på det tidspunkt og sammenlignes med værdien ved sin venstre nabo, m = 24. Hvis naboernes værdi er højere, så er marts fortsætter til venstre, indtil rm-1 <rm. Således returneres den bestemmede endelige m som maksimal forsinkelse. Den næste iteration starter fra den værdi i stedet for 25, og hele processen gentages. Hvis den første venstre nabo er lavere, så peger de ovennævnte rutinemarcher på samme måde mod højre. Det meste af tiden kræver maksimal forsinkelse kun få evalueringer af autokorrelationsfunktionen. Desuden bruges maksimal og minimum acceptabel forsinkelse (svarende til henholdsvis minimal og maksimal puls) som grænseværdier.

Ovenstående fungerer meget godt for signaler af god kvalitet, men den virkelige verden er langt fra ideel. Nogle signaler kommer forvrænget ud, mest på grund af bevægelsesartefakter. Et sådant signal er vist i den tredje figur. Dårlig periodicitet afspejles i formen af dens autokorrelationsfunktion såvel som i lav værdi, 0,28, af det første lokale maksimum ved m = 11. Sammenlign det med maksimumværdien på 0,79 bestemt for signalet af god kvalitet. Sammen med forsinkelsesbegrænsende værdier er værdien af r derform / r0 på maksimum er en god indikator for signalkvalitet, og et krav om, at det skal overstige en vis tærskel, kan bruges til at filtrere bevægelsesartefakter ud. "RF" -graferne vist i introduktionerne skyldes en sådan tærskel på 0,25.

Trin 5: Bestemmelse af iltmætning

Bestemmelse af iltmætning
Bestemmelse af iltmætning
Bestemmelse af iltmætning
Bestemmelse af iltmætning
Bestemmelse af iltmætning
Bestemmelse af iltmætning
Bestemmelse af iltmætning
Bestemmelse af iltmætning

Det foregående trin var tilstrækkeligt til at bestemme pulsen. SpO2 kræver mere arbejde. Først skal det hidtil forsømte signal i den røde (R) kanal tages i betragtning. Dernæst beregnes forholdet mellem røde og infrarøde signaler, Z = R/IR, begge reflekteret fra det arterielle blod. Den "arterielle blod" del er afgørende, da det meste af lyset faktisk reflekteres fra væv og venøst blod. Hvordan vælger man en del af signalet, der svarer til arterielt blod? Nå, dette er den pulserende komponent, der varierer med hvert hjerteslag. Med ord fra elektriske ingeniører er det "AC -delen", mens det resterende reflekterede lys er "DC -delen". Da absolutte intensiteter af R- og IR -lys ikke står i rimeligt forhold, beregnes Z -forholdet ud fra relative intensiteter, som vist i den første figur. Med hensyn til faktisk beregnede mængder bruger jeg rod-middel-kvadrat (RMS) af det middelcentrerede, baseline-nivellerede signal, y, til det allerede kendte middel for råsignalet, <Y>; se anden figur. Z -forholdet er dog kun halvdelen af arbejdet. Det ikke -lineære sensorrespons kræver en empirisk kalibrering mellem Z og den sidste SpO2 værdier. Jeg tog kalibreringsligningen fra MAXIMs kode:

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

Husk, at denne ligning kun er gyldig for MAX30102 designkort købt i 2017! Det er sandsynligt, at MAXIM kan kalibrere sine sensorer på et senere tidspunkt.

Ovenstående procedure frembringer stadig meget falsk SpO2 aflæsninger. Den røde kanal lider af mange artefakter, ligesom IR. Det er rimeligt at antage, at begge signaler bør være stærkt korreleret. Faktisk korrelerer signaler af god kvalitet, ligesom eksemplet i tredje figur, meget godt. Pearson -korrelationskoefficienten er i dette tilfælde så høj som 0,99. Dette er ikke altid tilfældet, som illustreret i den fjerde figur. Selvom IR -signalet ville passere pulskvalitetsfilteret med dets rm / r0 = 0,76, resulterer det forvrængede R -signal i en dårlig korrelationskoefficient mellem de to lig med kun 0,42. Denne observation tilbyder det andet kvalitetsfilter: at have korrelationskoefficienten mellem kanaler større end en bestemt tærskel.

De sidste to figurer eksemplificerer nettoeffekten af en sådan kvalitetsfiltrering. Først er den målte iltmætning afbildet med HR -kvalitetstærskel på 0,25, men uden SpO2 filter. Næste plot er resultatet af filtrering af dårlig HR og SpO2 resultater ved 0,5 rm / r0 og 0,8 korrelationskoefficient tærskler. Samlet set blev dårlige datapunkter på 12% af det samlede filtreret fra det strengere regime.

I vores kode beregnes korrelationskoefficienten, cc, efter formlen i femte figur, hvor y repræsenterer det middelcentrerede, baseline-nivellerede signal, hvorimod r0 blev defineret i det foregående trin.

Trin 6: Kildekoden

C -kildekoden til dette projekt, formateret til Arduino IDE, er tilgængelig fra vores Github -konto på følgende link:

github.com/aromring/MAX30102_by_RF

Dens Readme -side beskriver individuelle komponenter.

Jeg vil gerne bruge et øjeblik på at rose Adafruit for at have lavet et så fremragende produkt som M0-baseret Adalogger. Dens hurtige 48 MHz ARM Cortex M0 -processor, med masser af RAM, hjalp bestemt med at gøre dette projekt levedygtigt, mens direkte tilsluttet SD -kortlæser (plus Adafruit's SD -bibliotek) fjerner alle amatørens smerter i forbindelse med lagring af store mængder data i realtid.

Anbefalede: