Sommario:

Pulsossimetro con precisione molto migliorata: 6 passaggi (con immagini)
Pulsossimetro con precisione molto migliorata: 6 passaggi (con immagini)

Video: Pulsossimetro con precisione molto migliorata: 6 passaggi (con immagini)

Video: Pulsossimetro con precisione molto migliorata: 6 passaggi (con immagini)
Video: Recensione SAMSUNG GALAXY WATCH 6. OTTIMO ma.... PLAY da FLIP 5 2024, Dicembre
Anonim
Pulsossimetro con precisione molto migliorata
Pulsossimetro con precisione molto migliorata
Pulsossimetro con precisione molto migliorata
Pulsossimetro con precisione molto migliorata

Se hai visitato di recente un medico, è probabile che i tuoi parametri vitali di base siano stati esaminati da un'infermiera. Peso, altezza, pressione sanguigna, frequenza cardiaca (FC) e saturazione di ossigeno nel sangue periferico (SpO2). Forse, gli ultimi due sono stati ottenuti da una sonda elettronica a dito rossastra che mostrava i numeri rilevanti su un piccolo schermo in pochi minuti. Quella sonda si chiama pulsossimetro e puoi trovare tutte le informazioni di base a riguardo qui.

Si può facilmente acquistare un semplice pulsossimetro, certo, ma dov'è il divertimento? Ho deciso di costruirne uno mio, prima per il gusto di farlo, ma soprattutto con un'applicazione specifica in mente: l'ossimetria notturna in cui sia HR che SpO2 i dati sarebbero raccolti continuamente durante la notte e registrati su una scheda micro SD. Instructables contiene già diversi progetti di questo tipo, ad esempio due che coinvolgono Arduino qui e qui e uno che utilizza Raspberry Pi. Il mio utilizza un sensore leggermente più recente MAX30102 di MAXIM Integrated e Feather M0 Adalogger di Adafruit per il controllo e la registrazione dei dati.

Il nostro progetto non è quindi particolarmente innovativo in termini di hardware e come tale non varrebbe la pena scrivere questo Instructable, ma nel processo di creazione ho fatto progressi cruciali nel software che mi hanno permesso di estrarre dati da MAX30102 con una consistenza molto più elevata e molto meno rumore rispetto al software scritto da MAXIM per questo sensore. Le prestazioni del nostro algoritmo di elaborazione del segnale sono illustrate nel grafico sopra, dove i due grafici in alto contengono la frequenza cardiaca notturna e la saturazione di ossigeno calcolate dai segnali grezzi con il nostro metodo (identificato da "RF"), mentre i due grafici in basso mostrano i risultati di MAXIM prodotti da esattamente gli stessi segnali. Le deviazioni standard per FC sono 4,7 bpm e 18,1 bpm e per SpO2 0,9% e 4,4%, rispettivamente per RF e MAXIM.

(Entrambi i grafici RF corrispondono alla soglia di autocorrelazione minima di 0,25 e nessun limite alla correlazione R/IR; vedere i passaggi 4 e 5 per la spiegazione di questi termini.)

Passaggio 1: hardware

Hardware
Hardware
Hardware
Hardware
Hardware
Hardware
Hardware
Hardware
  1. Pulsossimetro e sensore di frequenza cardiaca Scheda di sistema MAX30102 di MAXIM Integrated, Inc.
  2. Adalogger Feather M0 di Adafruit, Inc.
  3. Batteria agli ioni di litio di Adafruit, Inc.

Connessioni:

  • Adalogger pin SCL e SDA ai corrispondenti pin SCL e SDA sulla scheda MAX30102
  • Adalogger pin 10 per pin INT sulla scheda MAX30102
  • Adattatore GND alla scheda MAX30102 GND
  • Adattatore 3V a MAX30102 VIN

Passaggio 2: segnali digitali restituiti da MAX30102

Segnali digitali restituiti da MAX30102
Segnali digitali restituiti da MAX30102
Segnali digitali restituiti da MAX30102
Segnali digitali restituiti da MAX30102

I principi di funzionamento del sensore sono molto semplici: due LED, uno rosso (660 nm) e uno a infrarossi (880 nm, IR) illuminano la pelle umana. La luce è parzialmente assorbita dai tessuti sottostanti, compreso il sangue periferico. Il fotorilevatore del sensore raccoglie la luce riflessa a entrambe le lunghezze d'onda e restituisce due intensità relative corrispondenti utilizzando il protocollo I2C. Poiché gli spettri di assorbimento dell'emoglobina ossigenata e deossigenata differiscono per entrambe le lunghezze d'onda, la luce riflessa ha una componente variabile in quanto la quantità di sangue arterioso presente sotto la pelle pulsa ad ogni battito cardiaco. La determinazione della frequenza cardiaca e della saturazione di ossigeno spetta al software di elaborazione del segnale.

Esempi di segnali grezzi (solo canale IR) sono illustrati nelle immagini sopra. Si può notare un componente periodico sovrapposto a una linea di base variabile che si sta spostando a causa di molteplici fattori menzionati nella pagina di Wikipedia. Gli artefatti indotti dal movimento sono particolarmente fastidiosi poiché possono mascherare il segnale HR utile e causare risultati fasulli. Quindi, gli ossimetri commerciali avanzati sono dotati di accelerometri che aiutano ad annullare questi artefatti.

Potrei aggiungere un accelerometro alla prossima versione del mio ossimetro, ma per FC/SpO notturni2 registrazione, quando il sensore rimane immobile per la maggior parte del tempo, è sufficiente rilevare ed omettere segnali distorti.

Il sensore MAX30102 stesso viene fornito in un piccolo pacchetto a montaggio superficiale, ma MAXIM offre gentilmente una scheda breakout (scheda di sistema 6300) più un software di elaborazione del segnale per Arduino e mbed, il tutto nel pacchetto di progettazione di riferimento MAXREFDES117#. L'ho comprato felicemente aspettandomi di saldare solo alcuni fili tra il sensore e Adalogger e avere un ossimetro funzionante e buono in un solo giorno. Ho adattato la versione RD117_ARDUINO del software MAXIM per l'esecuzione sul processore ARM Cortex M0 di Adalogger. Fondamentalmente, tutto ciò che dovevo fare era sostituire le funzioni SofI2C incompatibili in max30102.cpp con le corrispondenti chiamate della libreria Wire. Il codice è stato compilato correttamente nell'IDE Arduino v1.8.5 ed è stato eseguito su M0 senza errori. I risultati netti, tuttavia, sono stati deludenti. Nella fase di introduzione ho già mostrato una varianza molto elevata sia di HR che di SpO2. Naturalmente, si può affermare che ho fatto qualcosa di sbagliato e questo era anche il mio pensiero originale. Tuttavia, nel video didattico di MAXIM è anche possibile osservare i valori della FC che oscillano selvaggiamente visualizzati sullo schermo. Inoltre, i commenti sotto il video confermano che anche altri hanno notato un fenomeno simile.

Per farla breve, dopo alcuni esperimenti ho determinato che il sensore funziona correttamente e un metodo alternativo di elaborazione del segnale digitale si traduce in una stabilità molto migliore. Questo nuovo metodo, indicato con "RF", è descritto nei passaggi successivi.

Passaggio 3: preelaborazione del segnale

Preelaborazione del segnale
Preelaborazione del segnale
Preelaborazione del segnale
Preelaborazione del segnale
Preelaborazione del segnale
Preelaborazione del segnale
Preelaborazione del segnale
Preelaborazione del segnale

Nella nostra implementazione, il segnale grezzo viene raccolto alla frequenza di 25 Hz (lo stesso di MAXIM) per 4 secondi completi (il software di MAXIM raccoglie solo il valore di 1 secondo), risultando in 100 punti temporali digitalizzati per punto dati finale. Ogni sequenza di 100 punti deve essere preelaborata nel modo seguente:

  1. Centraggio medio (a.k.a. "rimozione del componente CC" per gli ingegneri elettrici). I dati grezzi provenienti dal sensore sono una serie temporale di numeri interi nel 105 gamma. Il segnale utile, però, è solo una parte della luce riflessa dal sangue arterioso che varia nell'ordine di soli 102 - prima cifra. Per un'elaborazione del segnale significativa, è quindi desiderabile sottrarre la media da ciascun punto della serie. Questa parte non è diversa da ciò che fa già il software MAXIM. Ciò che è diverso, tuttavia, è l'ulteriore centratura media degli stessi indici temporali. In altre parole, invece di indicizzare i punti della serie per numeri da 0 a 99, i nuovi indici sono ora i numeri -49,5, -48,5, …, 49,5. All'inizio può sembrare strano, ma grazie a questa procedura il "baricentro" della curva del segnale coincide con l'origine del sistema di coordinate (seconda figura). Questo fatto diventa molto utile nel passaggio successivo.
  2. Livellamento della linea di base. Un altro sguardo alle forme d'onda mostrate nel passaggio 2 illustra che la linea di base dei segnali di ossimetria reali è lungi dall'essere piatta orizzontalmente, ma varia attraverso diverse pendenze. La terza figura mostra un segnale IR centrato sulla media (curva blu) e la sua linea di base (linea retta blu). In questo caso, la pendenza della linea di base è negativa. Il metodo di elaborazione del segnale descritto in precedenza richiede che la linea di base sia orizzontale. Ciò può essere ottenuto semplicemente sottraendo la linea di base dal segnale centrato sulla media. Grazie al centraggio medio di entrambe le coordinate Y e X, l'intercetta della linea di base è zero e la sua equazione di pendenza è particolarmente semplice, come mostrato nella quarta figura. Il segnale livellato sulla linea di base è mostrato dalla curva arancione nella terza figura.

Quindi il segnale preelaborato è pronto per il passaggio successivo.

Passaggio 4: il cavallo di battaglia: funzione di autocorrelazione

Il cavallo di battaglia: funzione di autocorrelazione
Il cavallo di battaglia: funzione di autocorrelazione
Il cavallo di battaglia: funzione di autocorrelazione
Il cavallo di battaglia: funzione di autocorrelazione
Il cavallo di battaglia: funzione di autocorrelazione
Il cavallo di battaglia: funzione di autocorrelazione

Tornando alla solita indicizzazione 1, …, n, la prima figura mostra la definizione della funzione di autocorrelazione rm - una quantità che si è rivelata molto utile nel rilevare la periodicità del segnale oltre che la qualità. È semplicemente un prodotto scalare normalizzato della serie temporale del segnale con se stesso spostato di un ritardo m. Nella nostra applicazione, tuttavia, è conveniente scalare ciascun valore di autocorrelazione rispetto al suo valore a lag = 0, ovvero utilizzare l'autocorrelazione relativa definita da rm / R0.

Il grafico della relativa autocorrelazione di un tipico segnale IR di buona qualità è mostrato nella seconda figura. Come previsto, il suo valore a lag = 0 è al suo massimo globale uguale a 1. Il prossimo massimo (locale) si verifica a lag = 23 ed è uguale a 0,79. La presenza di minimi e massimi locali nel grafico dell'autocorrelazione è facile da capire: quando il segnale si sposta verso destra i suoi picchi interferiscono in modo distruttivo l'uno con l'altro all'inizio, ma a un certo punto l'interferenza diventa costruttiva e raggiunge il massimo al ritardo pari alla media periodo del segnale.

L'ultima frase è cruciale: per determinare il periodo di tempo medio tra i picchi, da cui si può calcolare la frequenza del segnale (cioè la frequenza cardiaca) è sufficiente trovare il primo massimo locale della funzione di autocorrelazione! Per impostazione predefinita, MAX30102 campiona l'ingresso analogico ad una frequenza di 25 punti al secondo, quindi a m dato il periodo in secondi è uguale a m / 25. Questo porta alla frequenza cardiaca espressa in battiti al minuto (bpm) da:

FC = 60*25 / m = 1500 / m

Ovviamente non è necessario eseguire costosi calcoli di rm a tutti i valori di ritardo. Il nostro algoritmo fa la prima ipotesi di frequenza cardiaca = 60 bpm, che corrisponde a m = 25. La funzione di autocorrelazione viene valutata in quel punto e confrontata con il valore al suo vicino di sinistra, m = 24. Se il valore dei vicini è più alto, allora il marcia continua a sinistra fino a rm-1 < rm. M finale così determinato viene quindi restituito come ritardo al massimo. L'iterazione successiva inizia da quel valore invece che da 25 e l'intero processo si ripete. Se il primo vicino a sinistra è più basso, il ritardo delle marce di routine sopra indicato punta a destra in modo simile. Il più delle volte, il lag al massimo richiede solo poche valutazioni della funzione di autocorrelazione. Inoltre, i ritardi massimi e minimi accettabili (corrispondenti rispettivamente alla frequenza cardiaca minima e massima) vengono utilizzati come valori limite.

Quanto sopra funziona molto bene per segnali di buona qualità, ma il mondo reale è tutt'altro che ideale. Alcuni segnali risultano distorti, principalmente a causa di artefatti di movimento. Tale segnale è mostrato nella terza figura. La scarsa periodicità si riflette nella forma della sua funzione di autocorrelazione e nel valore basso, 0,28, del primo massimo locale a m = 11. Confrontalo con il valore massimo di 0,79 determinato per il segnale di buona qualità. Insieme ai valori limite di ritardo, quindi, il valore di rm / R0 al massimo è un buon indicatore della qualità del segnale e un requisito per superare una certa soglia può essere utilizzato per filtrare gli artefatti da movimento. I grafici “RF” riportati nelle premesse risultano da tale soglia pari a 0,25.

Passaggio 5: determinazione della saturazione di ossigeno

Determinazione della saturazione di ossigeno
Determinazione della saturazione di ossigeno
Determinazione della saturazione di ossigeno
Determinazione della saturazione di ossigeno
Determinazione della saturazione di ossigeno
Determinazione della saturazione di ossigeno
Determinazione della saturazione di ossigeno
Determinazione della saturazione di ossigeno

Il passaggio precedente era sufficiente per determinare la frequenza cardiaca. La SpO2 richiede più lavoro. Innanzitutto, si deve tenere conto del segnale finora trascurato nel canale rosso (R). Successivamente, viene calcolato il rapporto tra segnali rossi e infrarossi, Z = R/IR, entrambi riflessi dal sangue arterioso. La parte "sangue arterioso" è cruciale, poiché la maggior parte della luce viene effettivamente riflessa dai tessuti e dal sangue venoso. Come selezionare la parte del segnale corrispondente al sangue arterioso? Bene, questa è la componente pulsatile che varia ad ogni battito cardiaco. Nelle parole degli ingegneri elettrici, è la "parte AC", mentre la restante luce riflessa è la "parte DC". Poiché le intensità assolute della luce R e IR non sono commisurate, il rapporto Z viene calcolato dalle intensità relative, come mostrato nella prima figura. In termini di quantità effettivamente calcolate, utilizzo il valore quadratico medio (RMS) del segnale centrato sulla media, livellato dalla linea di base, y, alla media già nota del segnale grezzo, < Y >; vedi seconda figura. Tuttavia, il rapporto Z è solo metà del lavoro. La risposta del sensore non lineare richiede una calibrazione empirica tra Z e la SpO. finale2 valori. Ho preso l'equazione di calibrazione dal codice di MAXIM:

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

Tieni presente che questa equazione è valida solo per la scheda di progettazione MAX30102 acquistata nel 2017! È probabile che MAXIM possa ricalibrare i suoi sensori in un secondo momento.

La procedura di cui sopra produce ancora molti falsi SpO2 letture. Il canale rosso soffre di molti artefatti, proprio come quello IR. È ragionevole presumere che entrambi i segnali dovrebbero essere fortemente correlati. In effetti, segnali di buona qualità, come l'esempio nella terza figura, si correlano molto bene. Il coefficiente di correlazione di Pearson è in questo caso alto come 0,99. Non è sempre così, come illustrato nella quarta figura. Sebbene il segnale IR superi il filtro di qualità della frequenza cardiaca con il suo rm / R0 = 0,76, il segnale R distorto risulta in uno scarso coefficiente di correlazione tra i due pari a solo 0,42. Questa osservazione offre il secondo filtro di qualità: avere il coefficiente di correlazione tra i canali maggiore di una certa soglia.

Le ultime due cifre esemplificano l'effetto netto di tale filtraggio di qualità. Innanzitutto, la saturazione di ossigeno misurata viene tracciata con la soglia di qualità HR di 0,25, ma senza SpO2 filtro. Risultati del grafico successivo dal filtraggio di HR e SpO. scarse2 risultati a 0,5 rm / R0 e 0,8 soglie del coefficiente di correlazione. Nel complesso, i punti dati scarsi pari al 12% del totale sono stati filtrati dal regime più severo.

Nel nostro codice il coefficiente di correlazione, cc, è calcolato secondo la formula in quinta cifra, dove y rappresenta il segnale centrata sulla media, livellata dalla linea di base, mentre r0 è stato definito nel passaggio precedente.

Passaggio 6: il codice sorgente

Il codice sorgente C per questo progetto, formattato per l'IDE Arduino, è disponibile dal nostro account Github al seguente link:

github.com/aromring/MAX30102_by_RF

La sua pagina Leggimi descrive i singoli componenti.

Vorrei dedicare un momento a elogiare Adafruit per aver realizzato un prodotto così eccellente come Adalogger basato su M0. Il suo veloce processore ARM Cortex M0 a 48 MHz, con molta RAM, ha sicuramente contribuito a rendere praticabile questo progetto, mentre il lettore di schede SD collegato direttamente (oltre alla libreria SD di Adafruit) rimuove tutti i problemi dell'hobbista associati all'archiviazione in tempo reale di grandi quantità di dati.

Consigliato: