Taula de continguts:

Oxímetre de pols amb una precisió molt millorada: 6 passos (amb imatges)
Oxímetre de pols amb una precisió molt millorada: 6 passos (amb imatges)

Vídeo: Oxímetre de pols amb una precisió molt millorada: 6 passos (amb imatges)

Vídeo: Oxímetre de pols amb una precisió molt millorada: 6 passos (amb imatges)
Vídeo: DJI Mavic Mini Fly More Combo with Hard Shell Travel Case Black BH # DJMAVICMCK 2020 2024, De novembre
Anonim
Oxímetre de pols amb una precisió molt millorada
Oxímetre de pols amb una precisió molt millorada
Oxímetre de pols amb una precisió molt millorada
Oxímetre de pols amb una precisió molt millorada

Si recentment heu visitat un metge, és probable que una infermera examinés els vostres signes vitals bàsics. Pes, alçada, pressió arterial i freqüència cardíaca (FC) i saturació d’oxigen a la sang perifèrica (SpO2). Potser, els dos darrers es van obtenir a partir d’una sonda electrònica que brillava de color vermell i que mostrava números rellevants en una petita pantalla en qüestió de minuts. Aquesta sonda s’anomena pulsioxímetre i aquí hi trobareu tota la informació bàsica.

Es pot comprar fàcilment un oxímetre de pols senzill, però, on hi ha la diversió? He decidit construir el meu propi, primer per a la vergonya, però el que és més important, tenint en compte una aplicació específica: l’oximetria nocturna on tant HR com SpO2 les dades es recopilarien contínuament durant la nit i es gravarien en una targeta micro SD. Instructables ja conté diversos projectes d’aquest tipus, per exemple, dos que impliquen Arduino aquí i aquí, i un que utilitza Raspberry Pi. El meu utilitza el sensor MAX30102 una mica més recent de MAXIM Integrated i l’Adalogger Feather M0 d’Adafruit per al control i la gravació de dades.

El nostre projecte, per tant, no és especialment innovador en termes de maquinari i, com a tal, no valdria la pena escriure aquest instructiu, però en el procés de crear-lo he realitzat avenços crucials en programari que em van permetre extreure dades del MAX30102 amb una consistència molt superior i molt menys soroll que el programari escrit per MAXIM per a aquest sensor. El rendiment del nostre algorisme de processament de senyals s’il·lustra al gràfic anterior on els dos gràfics superiors contenen la freqüència cardíaca durant la nit i la saturació d’oxigen calculats a partir de senyals bruts pel nostre mètode (identificat per "RF"), mentre que els dos gràfics inferiors mostren els resultats de MAXIM produïts a partir de exactament els mateixos senyals. Les desviacions estàndard per a HR són de 4,7 bpm i 18,1 bpm i per a SpO2 0,9% i 4,4%, per a RF i MAXIM, respectivament.

(Ambdós gràfics de RF corresponen a un llindar d’autocorrelació mínim de 0,25 i sense límit de correlació R / IR; vegeu els passos 4 i 5 per a l’explicació d’aquests termes.)

Pas 1: maquinari

Maquinari
Maquinari
Maquinari
Maquinari
Maquinari
Maquinari
Maquinari
Maquinari
  1. Oxímetre de pols i sensor de freqüència cardíaca targeta del sistema MAX30102 de MAXIM Integrated, Inc.
  2. Feather M0 Adalogger d'Adafruit, Inc.
  3. Bateria d'ions de liti d'Adafruit, Inc.

Connexions:

  • Adalogger pins SCL i SDA als corresponents pins SCL i SDA a la placa MAX30102
  • Adalogger pin 10 a pin INT al tauler MAX30102
  • Adalogger GND a la placa GND MAX30102
  • Adalogger de 3V a MAX30102 VIN

Pas 2: senyals digitals retornats per MAX30102

Senyals digitals retornats per MAX30102
Senyals digitals retornats per MAX30102
Senyals digitals retornats per MAX30102
Senyals digitals retornats per MAX30102

Els principis del funcionament del sensor són molt senzills: dos LEDs, un de color vermell (660 nm) i un d’infraroig (880 nm, IR) brillen a través de la pell humana. La llum és parcialment absorbida pels teixits subjacents, inclosa la sang perifèrica. El fotodetector del sensor recull la llum reflectida a les dues longituds d’ona i retorna dues intensitats relatives corresponents mitjançant el protocol I2C. Atès que els espectres d’absorció de l’hemoglobina oxigenada i desoxigenada difereixen per ambdues longituds d’ona, la llum reflectida té un component variable, ja que la quantitat de sang arterial que es troba present a les pulsacions de la pell amb cada batec del cor. Esbrinar la freqüència cardíaca i la saturació d’oxigen depèn del programari de processament del senyal.

A les imatges anteriors s’il·lustren exemples de senyals en brut (només canal IR). Es pot notar un component periòdic superposat en una línia base variable que canvia a causa dels múltiples factors esmentats a la pàgina de Viquipèdia. Els artefactes induïts per moviment són particularment molestos, ja que poden emmascarar el senyal útil de HR i causar resultats falsos. Per tant, els oxímetres comercials avançats presenten acceleròmetres que ajuden a anul·lar aquests artefactes.

Puc afegir un acceleròmetre a la següent versió del meu oxímetre, però per a HR / SpO nocturn2 la gravació, quan el sensor roman immòbil la major part del temps, és suficient per detectar i ometre els senyals distorsionats.

El sensor MAX30102 es presenta en un petit paquet muntat a la superfície, però MAXIM ofereix amb gràcia una placa de sortida (System Board 6300), a més de programari de processament de senyal per Arduino i mbed, tot al paquet de disseny de referència MAXREFDES117 #. El vaig comprar feliçment esperant només soldar alguns cables entre el sensor i Adalogger i tenir un oxímetre bo en un sol dia. Vaig adaptar la versió RD117_ARDUINO del programari de MAXIM perquè s'executés al processador ARM Cortex M0 d'Adalogger. Bàsicament, tot el que havia de fer era substituir funcions SofI2C incompatibles a max30102.cpp per les corresponents trucades de la biblioteca de filferro. El codi es va compilar bé a l’Arduino IDE v1.8.5 i va funcionar a M0 sense cap error. Els resultats nets, però, van ser decebedors. Al pas d'Introducció ja he mostrat una variació molt alta tant de HR com de SpO2. Naturalment, es pot afirmar que he fet alguna cosa malament i aquest també era el meu pensament original. Tanmateix, al vídeo d’instruccions de MAXIM també podeu observar els valors de HR que es mouen de forma fulgurant i que es mostren a la pantalla. A més, els comentaris que apareixen a continuació del vídeo confirmen que altres persones també han notat un fenomen similar.

Per resumir una llarga història, després d’haver experimentat alguna cosa, he determinat que el sensor funciona correctament i que un mètode alternatiu de processament del senyal digital resulta en una millor estabilitat. Aquest nou mètode, indicat per "RF", es descriu en els passos següents.

Pas 3: preprocessament del senyal

Preprocessament del senyal
Preprocessament del senyal
Preprocessament del senyal
Preprocessament del senyal
Preprocessament del senyal
Preprocessament del senyal
Preprocessament del senyal
Preprocessament del senyal

En la nostra implementació, el senyal en brut es recopila a la velocitat de 25 Hz (el mateix que MAXIM) durant 4 segons complets (el programari de MAXIM només recull el valor d’1 segon), donant lloc a 100 punts de temps digitalitzats per punt de dades final. Cada seqüència de 100 punts s'ha de preprocessar de la següent manera:

  1. Centratge mitjà (també conegut com "eliminació del component de CC" als enginyers elèctrics). Les dades brutes que provenen del sensor són una sèrie temporal d’enters del 105 abast. El senyal útil, però, és només una part de la llum reflectida a partir de la sang arterial que varia de l’ordre de només 102 - primera figura. Per a un processament de senyal significatiu, per tant, és desitjable restar la mitjana de cada punt de sèrie. Aquesta part no és diferent del que ja fa el programari MAXIM. El que és diferent, però, és la centració mitjana addicional dels propis índexs de temps. Dit d'una altra manera, en lloc d'indexar els punts de sèrie per números del 0 al 99, els nous índexs són ara els números -49,5, -48,5, …, 49,5. Al principi pot semblar estrany, però gràcies a aquest procediment el "centre de gravetat" de la corba del senyal coincideix amb l'origen del sistema de coordenades (segona figura). Aquest fet es fa força útil en el següent pas.
  2. Anivellament de la línia de base. Una altra mirada a les formes d'ona que es mostren al pas 2 il·lustra que la línia de base dels senyals reals d'oximetria està lluny de ser horitzontalment plana, però varia a través de diferents pendents. La tercera figura mostra un senyal IR centrat mitjà (corba blava) i la seva línia base (línia recta blava). En aquest cas, el pendent de la línia de base és negatiu. El mètode de processament del senyal descrit anteriorment requereix que la línia base sigui horitzontal. Això es pot aconseguir simplement restant la línia base del senyal centrat en la mitjana. Gràcies al centre mitjà de les coordenades Y i X, la intersecció de la línia de base és nul·la i la seva equació de pendent és particularment senzilla, com es mostra a la quarta figura.

Per tant, el senyal preprocessat està preparat per al següent pas.

Pas 4: el cavall de treball: funció d’autocorrelació

El cavall de treball: funció d’autocorrelació
El cavall de treball: funció d’autocorrelació
El cavall de treball: funció d’autocorrelació
El cavall de treball: funció d’autocorrelació
El cavall de treball: funció d’autocorrelació
El cavall de treball: funció d’autocorrelació

Tornant a la indexació 1,…, n habitual, la primera figura mostra la definició de la funció d'autocorrelació rm - Una quantitat que és molt útil per detectar la periodicitat i la qualitat del senyal. Simplement és un producte escalar normalitzat de la sèrie temporal del senyal amb si mateix desplaçat per un retard m. A la nostra aplicació, però, és convenient escalar cada valor d’autocorrelació respecte del seu valor a lag = 0, és a dir, utilitzar una autocorrelació relativa definida per rm / r0.

El gràfic de l’autocorrelació relativa d’un senyal IR típic de bona qualitat es mostra a la segona figura. Com era d’esperar, el seu valor a lag = 0 és al màxim global igual a 1. El següent màxim (local) es produeix a lag = 23 i és igual a 0,79. La presència de mínims i màxims locals a la trama d’autocorrelació és fàcil d’entendre: a mesura que el senyal es desplaça cap a la dreta, els seus pics interfereixen de manera destructiva els uns amb els altres al principi, però en cert punt la interferència esdevé constructiva i aconsegueix el màxim en el desfasament igual a la mitjana període del senyal.

L’última frase és crucial: per determinar el període mitjà de temps entre pics, a partir del qual es pot calcular la freqüència del senyal (és a dir, la freqüència cardíaca), és suficient trobar el primer màxim local de la funció d’autocorrelació. Per defecte, MAX30102 mostra una entrada analògica a una velocitat de 25 punts per segon, per tant, a m determinats, el període en segons és igual a m / 25. Això condueix a la freqüència cardíaca expressada en batecs per minut (bpm) per:

HR = 60 * 25 / m = 1500 / m

Per descomptat, no cal fer càlculs costosos de rm en tots els valors de retard. El nostre algorisme fa la primera conjectura de la freqüència cardíaca = 60 bpm, que correspon a m = 25. La funció d’autocorrelació s’avalua en aquest punt i es compara amb el valor del veí esquerre, m = 24. Si el valor dels veïns és superior, la marxa continua cap a l'esquerra fins a la rm-1 <rm. Així doncs, la m final determinada es retorna com el retard màxim. La següent iteració comença a partir d’aquest valor en lloc de 25 i es repeteix tot el procés. Si el primer veí esquerre és més baix, la marxa rutinària anterior apunta cap a la dreta de manera similar. La majoria de les vegades, el retard màxim requereix només algunes avaluacions de la funció d’autocorrelació. A més, s’utilitzen retards màxims i mínims acceptables (corresponents a la freqüència cardíaca mínima i màxima, respectivament) com a valors limitants.

L’anterior funciona molt bé per obtenir senyals de bona qualitat, però el món real és lluny de ser ideal. Alguns senyals surten distorsionats, principalment a causa d’artefactes de moviment. Aquest senyal es mostra a la tercera figura. La periodicitat deficient es reflecteix en la forma de la seva funció d’autocorrelació, així com en el valor baix, 0,28, del primer màxim local a m = 11. Compareu-lo amb el valor màxim de 0,79 determinat per al senyal de bona qualitat. Per tant, juntament amb els valors limitants del retard, el valor de rm / r0 com a màxim hi ha un bon indicador de la qualitat del senyal i es pot utilitzar un requisit per superar cert llindar per filtrar els artefactes de moviment. Els gràfics "RF" que es mostren a les introduccions van resultar d'un llindar igual a 0,25.

Pas 5: Determinació de la saturació d’oxigen

Determinació de la saturació d’oxigen
Determinació de la saturació d’oxigen
Determinació de la saturació d’oxigen
Determinació de la saturació d’oxigen
Determinació de la saturació d’oxigen
Determinació de la saturació d’oxigen
Determinació de la saturació d’oxigen
Determinació de la saturació d’oxigen

El pas anterior va ser suficient per determinar la freqüència cardíaca. El SpO2 requereix més feina. En primer lloc, s’ha de tenir en compte el senyal fins ara descuidat al canal vermell (R). A continuació, es calcula la proporció de senyals vermells a infrarojos, Z = R / IR, reflectits a la sang arterial. La part "sang arterial" és crucial, ja que la major part de la llum es reflecteix en els teixits i la sang venosa. Com triar una part del senyal corresponent a la sang arterial? Bé, aquest és el component polsable que varia amb cada batec del cor. En paraules dels enginyers elèctrics, és la "part de corrent altern", mentre que la llum reflectida restant és la "part de corrent continu". Com que les intensitats absolutes de la llum R i IR no són proporcionals, la proporció Z es calcula a partir d’intensitats relatives, com es mostra a la primera figura. Pel que fa a quantitats realment calculades, faig servir arrel-mitjana-quadrat (RMS) del senyal centrat en la mitjana de nivell basal, y, a la mitjana ja coneguda del senyal en brut, <Y>; vegeu la segona figura. Tanmateix, la proporció Z és només la meitat del treball. La resposta del sensor no lineal requereix un calibratge empíric entre Z i SpO final2 valors. He pres l’equació de calibratge del codi de MAXIM:

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

Tingueu en compte que aquesta equació només és vàlida per al tauler de disseny MAX30102 comprat el 2017. És probable que MAXIM pugui tornar a calibrar els seus sensors més endavant.

El procediment anterior encara produeix molts SpO falsos2 lectures. El canal vermell pateix de molts artefactes, igual que el IR. És raonable suposar que tots dos senyals haurien d’estar fortament correlacionats. De fet, els senyals de bona qualitat, com l’exemple de la tercera figura, es correlacionen molt bé. En aquest cas, el coeficient de correlació de Pearson és de fins a 0,99. No sempre és així, com es mostra a la quarta figura. Tot i que el senyal IR passaria el filtre de qualitat de la freqüència cardíaca amb la seva rm / r0 = 0,76, el senyal R distorsionat resulta en un coeficient de correlació deficient entre els dos igual a només 0,42. Aquesta observació ofereix el segon filtre de qualitat: tenir el coeficient de correlació entre canals superior a cert llindar.

Les dues darreres xifres mostren l’efecte net d’aquest filtratge de qualitat. En primer lloc, la saturació mesurada d’oxigen es representa amb un llindar de qualitat HR de 0,25, però sense el SpO2 filtre. La següent trama resulta de filtrar HR i SpO pobres2 resultats a 0,5 rm / r0 i 0,8 llindars de coeficient de correlació. En general, els pobres punts de dades que representen el 12% del total van ser filtrats pel règim més estricte.

En el nostre codi, el coeficient de correlació, cc, es calcula segons la fórmula de la cinquena figura, on y representa el senyal centrat mitjà, basat en la línia de base, mentre que r0 es va definir al pas anterior.

Pas 6: el codi font

El codi font C d’aquest projecte, formatat per l’IDE Arduino, està disponible al nostre compte de Github al següent enllaç:

github.com/aromring/MAX30102_by_RF

La seva pàgina Llegeix-me descriu components individuals.

M’agradaria dedicar-me un moment a elogiar Adafruit per haver fabricat un producte tan excel·lent com l’Adalogger basat en M0. El seu ràpid processador ARM Cortex M0 de 48 MHz, amb molta memòria RAM, sens dubte va ajudar a fer viable aquest projecte, mentre que el lector de targetes SD connectat directament (a més de la biblioteca SD d’Adafruit) elimina tots els dolors de l’aficionat associats a l’emmagatzematge en temps real de grans quantitats de dades.

Recomanat: