Innholdsfortegnelse:

Pulsoksymeter med mye forbedret presisjon: 6 trinn (med bilder)
Pulsoksymeter med mye forbedret presisjon: 6 trinn (med bilder)

Video: Pulsoksymeter med mye forbedret presisjon: 6 trinn (med bilder)

Video: Pulsoksymeter med mye forbedret presisjon: 6 trinn (med bilder)
Video: Garmin Forerunner 955 (Solar) detaljert gjennomgang 2024, Juli
Anonim
Pulsoksymeter med mye forbedret presisjon
Pulsoksymeter med mye forbedret presisjon
Pulsoksymeter med mye forbedret presisjon
Pulsoksymeter med mye forbedret presisjon

Hvis du nylig besøkte en lege, er sjansen stor for at de grunnleggende vitale tegnene dine ble undersøkt av en sykepleier. Vekt, høyde, blodtrykk, samt puls (HR) og oksygenmetning i perifert blod (SpO2). Kanskje ble de to siste hentet fra en rødglødende elektronisk fingersonde som viste relevante tall på en liten skjerm på få minutter. Denne sonden kalles pulsoksymeter, og du kan finne all grunnleggende informasjon om den her.

Man kan lett kjøpe et enkelt pulsoksymeter, sikkert, men hvor er moroa i det? Jeg har bestemt meg for å bygge min egen, først, men enda viktigere med tanke på en bestemt applikasjon: nattlig oksimetri der både HR og SpO2 data vil bli samlet kontinuerlig over natten og registrert på et micro SD -kort. Instructables inneholder allerede flere slike prosjekter, for eksempel to som involverer Arduino her og her, og ett som bruker Raspberry Pi. Mine bruker litt nyere sensor MAX30102 fra MAXIM Integrated og Adafruit's Feather M0 Adalogger for kontroll og dataopptak.

Prosjektet vårt er dermed ikke spesielt nyskapende når det gjelder maskinvare, og som sådan ville det ikke vært verdt å skrive denne instruksjonsboken, men i prosessen med å lage den har jeg gjort viktige fremskritt innen programvare som tillot meg å trekke ut data fra MAX30102 med mye høyere konsistens og mye mindre støy enn programvare skrevet av MAXIM for denne sensoren. Ytelsen til vår signalbehandlingsalgoritme er illustrert i diagrammet ovenfor der de to øverste grafene inneholder puls over natten og oksygenmetning beregnet ut fra råsignaler etter vår metode (identifisert med "RF"), mens de to nederste grafene viser MAXIMs resultater produsert fra nøyaktig de samme signalene. Standardavvik 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 -grafene tilsvarer minimal autokorrelasjonsterskel på 0,25 og ingen grense for R / IR -korrelasjon; se trinn 4 og 5 for forklaring av disse begrepene.)

Trinn 1: Maskinvare

Maskinvare
Maskinvare
Maskinvare
Maskinvare
Maskinvare
Maskinvare
Maskinvare
Maskinvare
  1. Pulsoksymeter og pulssensor MAX30102 hovedkort fra MAXIM Integrated, Inc.
  2. Feather M0 Adalogger fra Adafruit, Inc.
  3. Litiumionbatteri fra Adafruit, Inc.

Tilkoblinger:

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

Trinn 2: Digitale signaler returnert av MAX30102

Digitale signaler returnert av MAX30102
Digitale signaler returnert av MAX30102
Digitale signaler returnert av MAX30102
Digitale signaler returnert av MAX30102

Prinsippene for sensoroperasjonen er veldig enkle: to lysdioder, en rød (660 nm) og en infrarød (880 nm, IR) skinner lys gjennom menneskelig hud. Lyset absorberes delvis av underliggende vev, inkludert perifert blod. Sensors fotodetektor samler reflektert lys ved begge bølgelengder og returnerer to tilsvarende relative intensiteter ved hjelp av I2C -protokollen. Siden absorpsjonsspektre for oksygenert og deoksygenert hemoglobin er forskjellige for begge bølgelengdene, har det reflekterte lyset en variabel komponent som mengden arterielt blod som er tilstede under huden pulser med hvert hjerteslag. Å finne ut hjertefrekvens og oksygenmetning er opp til signalbehandlingsprogramvaren.

Eksempler på råsignaler (kun IR -kanal) er illustrert i bildene ovenfor. Man kan legge merke til en periodisk komponent overlagt på en variabel grunnlinje som forskyves på grunn av flere faktorer som er nevnt på Wikipedia -siden. Bevegelsesinduserte artefakter er spesielt irriterende siden de kan maskere det nyttige HR -signalet og forårsake falske resultater. Derfor har avanserte kommersielle oksimetre akselerometre som hjelper til med å oppheve disse gjenstandene.

Jeg kan legge til et akselerometer i neste versjon av oksimeteret mitt, men for nattlig HR/SpO2 når sensoren forblir ubevegelig mesteparten av tiden, er det tilstrekkelig å oppdage og utelate forvrengte signaler.

Selve MAX30102 -sensoren kommer i en liten overflatemontert pakke, men MAXIM tilbyr nådigvis et breakout -kort (systemkort 6300) pluss signalbehandlingsprogramvare for Arduino og mbed - alt i referansedesignpakken MAXREFDES117#. Jeg kjøpte den lykkelig og forventet å bare lodde noen ledninger mellom sensoren og Adalogger og ha et fungerende, godt oksymeter på en enkelt dag. Jeg tilpasset RD117_ARDUINO -versjonen av MAXIMs programvare for å kjøre på Adalogger ARM Cortex M0 -prosessor. I utgangspunktet var alt jeg måtte gjøre å erstatte inkompatible SofI2C -funksjoner i max30102.cpp med de tilsvarende Wire -bibliotekssamtalene. Koden kompilerte fint i Arduino IDE v1.8.5 og kjørte på M0 uten feil. Nettoresultatene var imidlertid skuffende. I introduksjonstrinnet har jeg allerede vist svært høy variasjon av både HR og SpO2. Naturligvis kan man påstå at jeg har gjort noe galt, og dette var også min opprinnelige tanke. I MAXIMs instruksjonsvideo kan du imidlertid også observere vilt svingende HR -verdier som vises på skjermen. Videre bekrefter kommentarene under videoen at andre også har lagt merke til et lignende fenomen.

For å gjøre en lang historie kort, har jeg etter noen eksperimenter funnet ut at sensoren fungerer som den skal, og en alternativ metode for digital signalbehandling resulterer i mye bedre stabilitet. Denne nye metoden, angitt med "RF", er beskrevet i de neste trinnene.

Trinn 3: Signalforbehandling

Signalforbehandling
Signalforbehandling
Signalforbehandling
Signalforbehandling
Signalforbehandling
Signalforbehandling
Signalforbehandling
Signalforbehandling

I vår implementering blir råsignalet samlet inn med en hastighet på 25 Hz (det samme som MAXIM) i hele 4 sekunder (MAXIMs programvare samler bare 1 sekunds verdi), noe som resulterer i 100 digitaliserte tidspunkter per sluttdatapunkt. Hver 100-punktssekvens må forhåndsbehandles på følgende måte:

  1. Middelsentrering (alias "fjerning av DC-komponenten" til elektriske ingeniører). Rådataene fra sensoren er en tidsserie med heltall i 105 område. Det nyttige signalet er imidlertid bare en del av lyset som reflekteres fra arterielt blod, som varierer i størrelsesorden bare 102 - første figur. For meningsfull signalbehandling er det derfor ønskelig å trekke gjennomsnittet fra hvert seriepunkt. Denne delen er ikke forskjellig fra hva MAXIM -programvaren allerede gjør. Det som er annerledes er imidlertid ytterligere gjennomsnittssentrering av tidsindeksene selv. Med andre ord, i stedet for å indeksere seriepunkter med tall fra 0 til 99, er de nye indeksene nå tallene -49,5, -48,5,…, 49,5. Det kan virke rart i begynnelsen, men takket være denne prosedyren faller signalkurvens "tyngdepunkt" sammen med opprinnelsen til koordinatsystemet (andre figur). Dette faktum blir ganske nyttig i neste trinn.
  2. Grunnlinjenivåering. Et annet blikk på bølgeformene vist i trinn 2 illustrerer at grunnlinjen for ekte oksimetri -signaler langt fra er horisontalt flat, men varierer gjennom forskjellige bakker. Tredje figur viser et middel-sentrert IR-signal (blå kurve) og dens grunnlinje (blå rett linje). I dette tilfellet er grunnlinjens skråning negativ. Signalbehandlingsmetoden beskrevet fremover krever at grunnlinjen er horisontal. Dette kan oppnås ved ganske enkelt å trekke grunnlinjen fra middel-sentrert signal. Takket være middel-sentrering av både Y- og X-koordinatene, er grunnlinjens skjæringspunkt null og skråningsligningen er spesielt enkel, som vist i den fjerde figuren. Baseline-nivåert signal er vist med oransje kurve i den tredje figuren.

Dermed er det forhåndsbehandlede signalet klart for neste trinn.

Trinn 4: Arbeidshesten: Autokorrelasjonsfunksjon

Arbeidshesten: Autokorrelasjonsfunksjon
Arbeidshesten: Autokorrelasjonsfunksjon
Arbeidshesten: Autokorrelasjonsfunksjon
Arbeidshesten: Autokorrelasjonsfunksjon
Arbeidshesten: Autokorrelasjonsfunksjon
Arbeidshesten: Autokorrelasjonsfunksjon

Når vi går tilbake til vanlig 1, …, n indeksering, viser den første figuren definisjonen av autokorrelasjonsfunksjonen rm - en mengde funnet å være svært nyttig for å oppdage signalets periodisitet så vel som kvalitet. Det er ganske enkelt et normalisert skalarprodukt av signalets tidsserier med seg selv forskjøvet med etterslep m. I vår applikasjon er det imidlertid praktisk å skalere hver autokorrelasjonsverdi i forhold til verdien ved lag = 0, dvs. bruke relativ autokorrelasjon definert av rm / r0.

Plott av den relative autokorrelasjonen til et typisk IR -signal av god kvalitet er vist i den andre figuren. Som forventet er verdien ved lag = 0 på sitt globale maksimum lik 1. Det neste (lokale) maksimumet skjer ved lag = 23 og tilsvarer 0,79. Tilstedeværelsen av lokale minima og maksima i autokorrelasjonsplott er lett å forstå: Når signalet skifter til høyre, forstyrrer toppene seg destruktivt med hverandre i begynnelsen, men på et bestemt tidspunkt blir interferensen konstruktiv og oppnår maksimum ved etterslepet lik gjennomsnittet perioden for signalet.

Den siste setningen er avgjørende: for å bestemme gjennomsnittlig tidsperiode mellom topper, hvorfra man kan beregne signalets frekvens (dvs. puls) er det tilstrekkelig å finne det første lokale maksimumet for autokorrelasjonsfunksjonen! Som standard prøver MAX30102 analog inngang med en hastighet på 25 poeng per sekund, og derfor er perioden i sekunder lik m / 25. ved gitt m. Dette fører til hjertefrekvens uttrykt i slag per minutt (bpm) med:

HR = 60*25 / m = 1500 / m

Selvfølgelig er det ikke nødvendig å gjøre dyre beregninger av rm ved alle forsinkelsesverdier. Algoritmen vår gjør det første gjetningen om hjertefrekvens = 60 slag i minuttet, som tilsvarer m = 25. Autokorrelasjonsfunksjonen blir evaluert på det tidspunktet og sammenlignet med verdien til venstre nabo, m = 24. Hvis naboverdien er høyere, så er marsjen fortsetter til venstre til rm-1 <rm. Dermed returneres bestemt endelig m som maksimal forsinkelse. Den neste iterasjonen starter fra den verdien i stedet for 25, og hele prosessen gjentas. Hvis den første venstre naboen er lavere, så peker de ovennevnte rutinemarsjene til høyre på lignende måte. Mesteparten av tiden krever maksimal forsinkelse bare noen få evalueringer av autokorrelasjonsfunksjonen. I tillegg brukes maksimal og minimum akseptable forsinkelser (tilsvarende henholdsvis minimal og maksimal hjertefrekvens) som grenseverdier.

Ovenstående fungerer veldig bra for signaler av god kvalitet, men den virkelige verden er langt fra ideell. Noen signaler kommer forvrengt ut, hovedsakelig på grunn av bevegelsesartefakter. Et slikt signal er vist i den tredje figuren. Dårlig periodisitet gjenspeiles i formen på dens autokorrelasjonsfunksjon så vel som i lav verdi, 0,28, av det første lokale maksimumet ved m = 11. Sammenlign det med maksverdien på 0,79 bestemt for signalet av god kvalitet. Sammen med forsinkelsesbegrensende verdier er derfor verdien av rm / r0 på maksimum er en god indikator på signalkvalitet, og et krav for at den skal overskride en viss terskel kan brukes til å filtrere ut bevegelsesartefakter. "RF" -grafene vist i introduksjonene skyldes en slik terskel på 0,25.

Trinn 5: Bestemmelse av oksygenmetning

Bestemmelse av oksygenmetning
Bestemmelse av oksygenmetning
Bestemmelse av oksygenmetning
Bestemmelse av oksygenmetning
Bestemmelse av oksygenmetning
Bestemmelse av oksygenmetning
Bestemmelse av oksygenmetning
Bestemmelse av oksygenmetning

Det forrige trinnet var tilstrekkelig for å bestemme pulsen. SpO2 krever mer arbeid. Først må det så langt forsømte signalet i den røde (R) kanalen tas i betraktning. Deretter beregnes forholdet mellom røde og infrarøde signaler, Z = R/IR, begge reflektert fra arterielt blod. Den "arterielle blod" delen er avgjørende, siden det meste av lyset faktisk reflekteres fra vev og venøst blod. Hvordan velge en del av signalet som tilsvarer arterielt blod? Vel, dette er den pulserende komponenten som varierer med hvert hjerteslag. Med ord fra elektriske ingeniører er det "AC -delen", mens det gjenværende reflekterte lyset er "DC -delen". Siden absolutte intensiteter for R- og IR -lys ikke står i samsvar, beregnes Z -forholdet ut fra relative intensiteter, som vist i den første figuren. Når det gjelder faktisk beregnede mengder, bruker jeg rot-middel-kvadrat (RMS) av middel-sentrert, grunnlinjenivåert signal, y, til det allerede kjente gjennomsnittet av råsignalet, <Y>; se andre figur. Z -forholdet er imidlertid bare halvparten av arbeidet. Den ikke -lineære sensorresponsen krever en empirisk kalibrering mellom Z og den siste SpO2 verdier. Jeg tok kalibreringsligningen fra MAXIMs kode:

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

Husk at denne ligningen bare er gyldig for MAX30102 designkort kjøpt i 2017! Det er sannsynlig at MAXIM kan kalibrere sensorene på nytt senere.

Prosedyren ovenfor gir fremdeles mye falsk SpO2 avlesninger. Den røde kanalen lider av mange artefakter, akkurat som IR. Det er rimelig å anta at begge signalene bør være sterkt korrelert. Faktisk korrelerer signaler av god kvalitet, som eksemplet i tredje figur, veldig godt. Pearson -korrelasjonskoeffisienten er i dette tilfellet så høy som 0,99. Dette er ikke alltid tilfelle, som illustrert i den fjerde figuren. Selv om IR -signalet ville passere pulskvalitetsfilteret med rm / r0 = 0,76, resulterer det forvrengte R -signalet i en dårlig korrelasjonskoeffisient mellom de to lik bare 0,42. Denne observasjonen tilbyr det andre kvalitetsfilteret: å ha korrelasjonskoeffisienten mellom kanaler større enn en viss terskel.

De to siste figurene eksemplifiserer nettoeffekten av slik kvalitetsfiltrering. Først er den målte oksygenmetningen plottet med HR -kvalitetsterskel på 0,25, men uten SpO2 filter. Neste plott er resultatet av filtrering av dårlig HR og SpO2 gir 0,5 rm / r0 og 0,8 korrelasjonskoeffisientterskler. Totalt sett ble dårlige datapunkter på 12% av totalen filtrert bort av det strengere regimet.

I vår kode er korrelasjonskoeffisienten, cc, beregnet i henhold til formelen i femte figur, hvor y representerer det gjennomsnittssentrerte, baselinjenivåerte signalet, mens r0 ble definert i forrige trinn.

Trinn 6: Kildekoden

C -kildekoden for dette prosjektet, formatert for Arduino IDE, er tilgjengelig fra vår Github -konto på følgende lenke:

github.com/aromring/MAX30102_by_RF

Readme -siden beskriver individuelle komponenter.

Jeg vil gjerne bruke et øyeblikk på å rose Adafruit for å lage et så utmerket produkt som M0-basert Adalogger. Den raske 48 MHz ARM Cortex M0 -prosessoren, med mye RAM, bidro absolutt til å gjøre dette prosjektet levedyktig, mens direkte tilkoblet SD -kortleser (pluss Adafruit's SD -bibliotek) fjerner alle amatørens smerter knyttet til lagring av store mengder data i sanntid.

Anbefalt: