Inhaltsverzeichnis:

Pulsoximeter mit viel verbesserter Präzision - Gunook
Pulsoximeter mit viel verbesserter Präzision - Gunook

Video: Pulsoximeter mit viel verbesserter Präzision - Gunook

Video: Pulsoximeter mit viel verbesserter Präzision - Gunook
Video: Blutdruck messen | Schritt für Schritt erklärt | APAK Pflegekanal 2024, November
Anonim
Pulsoximeter mit stark verbesserter Präzision
Pulsoximeter mit stark verbesserter Präzision
Pulsoximeter mit stark verbesserter Präzision
Pulsoximeter mit stark verbesserter Präzision

Wenn Sie kürzlich einen Arzt aufgesucht haben, wurden Ihre grundlegenden Vitalfunktionen wahrscheinlich von einer Krankenschwester untersucht. Gewicht, Größe, Blutdruck sowie Herzfrequenz (HF) und Sauerstoffsättigung im peripheren Blut (SpO2). Vielleicht stammen die letzten beiden von einer rot leuchtenden elektronischen Fingersonde, die innerhalb von Minuten relevante Zahlen auf einem winzigen Bildschirm anzeigte. Diese Sonde heißt Pulsoximeter und Sie finden hier alle grundlegenden Informationen dazu.

Ein einfaches Pulsoximeter kann man leicht kaufen, aber wo ist der Spaß daran? Ich habe mich entschieden, mein eigenes zu bauen, zuerst um es so richtig zu machen, aber vor allem mit Blick auf eine bestimmte Anwendung: die nächtliche Oxymetrie, bei der sowohl HR als auch SpO2 Daten würden über Nacht kontinuierlich gesammelt und auf einer Micro-SD-Karte aufgezeichnet. Instructables enthält bereits mehrere Projekte dieser Art, z. B. zwei mit Arduino hier und hier und eines mit Raspberry Pi. Meins verwendet einen etwas neueren Sensor MAX30102 von MAXIM Integrated und den Feather M0 Adalogger von Adafruit zur Steuerung und Datenaufzeichnung.

Unser Projekt ist daher in Bezug auf die Hardware nicht besonders innovativ und als solches wäre es nicht wert, dieses Instructable zu schreiben, aber bei der Erstellung habe ich entscheidende Fortschritte in der Software gemacht, die es mir ermöglichte, Daten aus MAX30102 mit viel höherer Konsistenz und viel zu extrahieren weniger Rauschen als von MAXIM für diesen Sensor geschriebene Software. Die Leistung unseres Signalverarbeitungsalgorithmus ist in der obigen Grafik dargestellt, wobei die beiden oberen Grafiken die Herzfrequenz und die Sauerstoffsättigung über Nacht enthalten, die nach unserer Methode aus den Rohsignalen berechnet wurden (gekennzeichnet durch "RF"), während die unteren beiden Grafiken die Ergebnisse von MAXIM zeigen, die aus genau die gleichen Signale. Die Standardabweichungen für die Herzfrequenz betragen 4,7 Schläge/min und 18,1 Schläge/min und für SpO2 0,9 % bzw. 4,4 % für RF und MAXIM.

(Beide HF-Diagramme entsprechen einer minimalen Autokorrelationsschwelle von 0,25 und keiner Begrenzung der R/IR-Korrelation; siehe Schritte 4 und 5 zur Erläuterung dieser Begriffe.)

Schritt 1: Hardware

Hardware
Hardware
Hardware
Hardware
Hardware
Hardware
Hardware
Hardware
  1. Pulsoximeter und Herzfrequenzsensor MAX30102 Systemplatine von MAXIM Integrated, Inc.
  2. Feather M0 Adalogger von Adafruit, Inc.
  3. Lithium-Ionen-Akku von Adafruit, Inc.

Anschlüsse:

  • Adalogger-Pins SCL und SDA mit entsprechenden SCL- und SDA-Pins auf der MAX30102-Platine
  • Adalogger-Pin 10 an Pin INT auf der MAX30102-Platine
  • Adalogger GND zu MAX30102 Platine GND
  • Adalogger 3V bis MAX30102 VIN

Schritt 2: Von MAX30102 zurückgegebene digitale Signale

Von MAX30102 zurückgegebene digitale Signale
Von MAX30102 zurückgegebene digitale Signale
Von MAX30102 zurückgegebene digitale Signale
Von MAX30102 zurückgegebene digitale Signale

Die Funktionsweise des Sensors ist denkbar einfach: Zwei LEDs, eine rote (660 nm) und eine infrarote (880 nm, IR) strahlen Licht durch die menschliche Haut. Das Licht wird teilweise von darunter liegenden Geweben, einschließlich peripherem Blut, absorbiert. Der Fotodetektor des Sensors sammelt reflektiertes Licht bei beiden Wellenlängen und gibt zwei entsprechende relative Intensitäten unter Verwendung des I2C-Protokolls zurück. Da sich die Absorptionsspektren für sauerstoffhaltiges und sauerstoffarmes Hämoglobin für beide Wellenlängen unterscheiden, hat das reflektierte Licht eine variable Komponente, da die Menge an arteriellem Blut, die unter der Haut vorhanden ist, bei jedem Herzschlag pulsiert. Die Ermittlung der Herzfrequenz und der Sauerstoffsättigung liegt in der Hand der Signalverarbeitungssoftware.

Beispiele für Rohsignale (nur IR-Kanal) sind in den obigen Bildern dargestellt. Man kann eine periodische Komponente bemerken, die einer variablen Basislinie überlagert ist, die sich aufgrund mehrerer auf der Wikipedia-Seite erwähnter Faktoren verschiebt. Bewegungsinduzierte Artefakte sind besonders ärgerlich, da sie das nützliche HR-Signal maskieren und falsche Ergebnisse verursachen können. Daher verfügen fortschrittliche kommerzielle Oximeter über Beschleunigungsmesser, die helfen, diese Artefakte zu beseitigen.

Ich kann der nächsten Version meines Oximeters einen Beschleunigungsmesser hinzufügen, aber für nächtliche HF/SpO2 Aufnahme, wenn der Sensor die meiste Zeit bewegungslos bleibt, reicht es aus, verzerrte Signale zu erkennen und wegzulassen.

Der MAX30102-Sensor selbst wird in einem winzigen oberflächenmontierten Gehäuse geliefert, aber MAXIM bietet freundlicherweise ein Breakout-Board (System Board 6300) plus Signalverarbeitungssoftware für Arduino und mbed - alles im Referenzdesign-Paket MAXREFDES117#. Ich kaufte es glücklich in der Erwartung, nur einige Drähte zwischen dem Sensor und dem Adalogger zu löten und an einem einzigen Tag ein funktionierendes, gutes Oximeter zu haben. Ich habe die RD117_ARDUINO-Version der MAXIM-Software so angepasst, dass sie auf dem ARM Cortex M0-Prozessor des Adaloggers läuft. Im Grunde musste ich nur inkompatible SofI2C-Funktionen in max30102.cpp durch die entsprechenden Wire-Bibliotheksaufrufe ersetzen. Der Code wurde in der Arduino IDE v1.8.5 gut kompiliert und lief auf M0 ohne Fehler. Die Nettoergebnisse waren jedoch enttäuschend. Im Einführungsschritt habe ich bereits eine sehr hohe Varianz von HR und SpO. gezeigt2. Natürlich kann man behaupten, dass ich etwas falsch gemacht habe und das war auch mein ursprünglicher Gedanke. Im Lehrvideo von MAXIM können Sie aber auch wild schwingende HF-Werte auf dem Bildschirm beobachten. Darüber hinaus bestätigen die Kommentare unter dem Video, dass auch andere ein ähnliches Phänomen bemerkt haben.

Um es kurz zu machen, nach einigen Experimenten habe ich festgestellt, dass der Sensor in Ordnung ist und eine alternative Methode der digitalen Signalverarbeitung zu einer viel besseren Stabilität führt. Diese neue Methode, die mit "RF" gekennzeichnet ist, wird in den nächsten Schritten beschrieben.

Schritt 3: Signalvorverarbeitung

Signalvorverarbeitung
Signalvorverarbeitung
Signalvorverarbeitung
Signalvorverarbeitung
Signalvorverarbeitung
Signalvorverarbeitung
Signalvorverarbeitung
Signalvorverarbeitung

In unserer Implementierung wird das Rohsignal mit einer Rate von 25 Hz (wie bei MAXIM) für volle 4 Sekunden erfasst (die Software von MAXIM erfasst nur den Wert von 1 Sekunde), was zu 100 digitalisierten Zeitpunkten pro Enddatenpunkt führt. Jede 100-Punkte-Sequenz muss wie folgt vorverarbeitet werden:

  1. Mittelwertzentrierung (auch bekannt als "Entfernung des Gleichstromanteils" für Elektroingenieure). Die vom Sensor kommenden Rohdaten sind eine Zeitreihe von ganzen Zahlen im 105 Bereich. Das Nutzsignal ist jedoch nur ein Teil des vom arteriellen Blut reflektierten Lichts, das in der Größenordnung von nur 10 variiert2 - erste Figur. Für eine sinnvolle Signalverarbeitung ist es daher wünschenswert, von jedem Serienpunkt den Mittelwert zu subtrahieren. Dieser Teil unterscheidet sich nicht von dem, was die MAXIM-Software bereits tut. Der Unterschied besteht jedoch in der zusätzlichen Mittelwertzentrierung der Zeitindizes selbst. Mit anderen Worten, anstatt Reihenpunkte nach Zahlen von 0 bis 99 zu indizieren, sind die neuen Indizes jetzt die Zahlen -49,5, -48,5, …, 49,5. Es mag zunächst seltsam erscheinen, aber dank dieses Verfahrens fällt der "Schwerpunkt" der Signalkurve mit dem Ursprung des Koordinatensystems zusammen (zweite Abbildung). Diese Tatsache wird im nächsten Schritt sehr nützlich.
  2. Grundliniennivellierung. Ein weiterer Blick auf die in Schritt 2 gezeigten Wellenformen zeigt, dass die Basislinie echter Oxymetriesignale bei weitem nicht horizontal flach ist, sondern durch verschiedene Steigungen variiert. Die dritte Abbildung zeigt ein mittelwertzentriertes IR-Signal (blaue Kurve) und seine Basislinie (blaue Gerade). In diesem Fall ist die Steigung der Basislinie negativ. Das oben beschriebene Signalverarbeitungsverfahren erfordert, dass die Grundlinie horizontal ist. Dies kann durch einfaches Subtrahieren der Basislinie vom Mittelwert-zentrierten Signal erreicht werden. Dank der Mittelwertzentrierung sowohl der Y- als auch der X-Koordinaten ist der Achsenabschnitt der Basislinie null und ihre Steigungsgleichung ist besonders einfach, wie in der vierten Abbildung gezeigt.

Somit ist das vorverarbeitete Signal für den nächsten Schritt bereit.

Schritt 4: Das Arbeitspferd: Autokorrelationsfunktion

Das Arbeitspferd: Autokorrelationsfunktion
Das Arbeitspferd: Autokorrelationsfunktion
Das Arbeitspferd: Autokorrelationsfunktion
Das Arbeitspferd: Autokorrelationsfunktion
Das Arbeitspferd: Autokorrelationsfunktion
Das Arbeitspferd: Autokorrelationsfunktion

Zurück zur üblichen 1, …, n-Indexierung zeigt die erste Abbildung die Definition der Autokorrelationsfunktion rm - eine Größe, die sich als sehr nützlich bei der Erkennung der Periodizität sowie der Qualität des Signals erwiesen hat. Es ist einfach ein normalisiertes Skalarprodukt der Zeitreihe des Signals mit sich selbst um die Verzögerung m verschoben. In unserer Anwendung ist es jedoch praktisch, jeden Autokorrelationswert in Bezug auf seinen Wert bei Lag = 0 zu skalieren, d. h. die relative Autokorrelation zu verwenden, die durch r. definiert istm / R0.

Das Diagramm der relativen Autokorrelation eines typischen IR-Signals guter Qualität ist in der zweiten Abbildung gezeigt. Wie erwartet ist sein Wert bei Lag = 0 bei seinem globalen Maximum gleich 1. Das nächste (lokale) Maximum tritt bei Lag = 23 auf und ist gleich 0,79. Das Vorhandensein lokaler Minima und Maxima im Autokorrelationsplot ist leicht zu verstehen: Wenn sich das Signal nach rechts verschiebt, interferieren seine Peaks zunächst destruktiv miteinander, aber an einem bestimmten Punkt wird die Interferenz konstruktiv und erreicht ein Maximum bei der Verzögerung gleich dem Durchschnitt Periode des Signals.

Der letzte Satz ist entscheidend: Um die durchschnittliche Zeitspanne zwischen den Peaks zu bestimmen, aus der die Frequenz des Signals (d. h. die Herzfrequenz) berechnet werden kann, reicht es aus, das erste lokale Maximum der Autokorrelationsfunktion zu finden! Standardmäßig tastet der MAX30102 analoge Eingaben mit einer Rate von 25 Punkten pro Sekunde ab, daher ist die Periode in Sekunden bei gegebenem m gleich m / 25. Dies führt zu einer Herzfrequenz ausgedrückt in Schlägen pro Minute (bpm) durch:

HF = 60*25 / m = 1500 / m

Natürlich ist es nicht notwendig, kostspielige Berechnungen von r. durchzuführenm bei allen Lag-Werten. Unser Algorithmus macht die erste Schätzung der Herzfrequenz = 60 bpm, was m = 25 entspricht. Die Autokorrelationsfunktion wird an diesem Punkt ausgewertet und mit dem Wert bei ihrem linken Nachbarn, m = 24, verglichen. Wenn der Nachbarwert höher ist, dann ist die Marsch geht weiter nach links bis rm-1 < rm. Das so bestimmte endgültige m wird dann als maximale Verzögerung zurückgegeben. Die nächste Iteration beginnt mit diesem Wert anstelle von 25 und der gesamte Vorgang wiederholt sich. Wenn der erste linke Nachbar niedriger ist, marschiert die obige Routine auf ähnliche Weise Verzögerungspunkte nach rechts. Meistens erfordert die maximale Verzögerung nur wenige Auswertungen der Autokorrelationsfunktion. Darüber hinaus werden als Grenzwerte maximal und minimal akzeptable Verzögerungen (entsprechend minimaler bzw. maximaler Herzfrequenz) verwendet.

Das obige funktioniert sehr gut für Signale mit guter Qualität, aber die reale Welt ist alles andere als ideal. Einige Signale werden verzerrt ausgegeben, hauptsächlich aufgrund von Bewegungsartefakten. Ein solches Signal ist in der dritten Abbildung dargestellt. Eine schlechte Periodizität spiegelt sich in der Form seiner Autokorrelationsfunktion sowie im niedrigen Wert 0,28 des ersten lokalen Maximums bei m = 11 wider. Vergleichen Sie ihn mit dem maximalen Wert von 0,79, der für das Signal guter Qualität bestimmt wurde. Zusammen mit den Verzögerungsgrenzwerten ist daher der Wert von rm / R0 maximal ist ein guter Indikator für die Signalqualität und eine Anforderung, dass sie einen bestimmten Schwellenwert überschreitet, kann verwendet werden, um Bewegungsartefakte herauszufiltern. Die in den Einleitungen gezeigten "RF"-Diagramme ergaben sich aus einem solchen Schwellenwert von 0,25.

Schritt 5: Bestimmung der Sauerstoffsättigung

Bestimmung der Sauerstoffsättigung
Bestimmung der Sauerstoffsättigung
Bestimmung der Sauerstoffsättigung
Bestimmung der Sauerstoffsättigung
Bestimmung der Sauerstoffsättigung
Bestimmung der Sauerstoffsättigung
Bestimmung der Sauerstoffsättigung
Bestimmung der Sauerstoffsättigung

Der vorherige Schritt war ausreichend, um die Herzfrequenz zu bestimmen. Die SpO2 erfordert mehr Arbeit. Zunächst muss das bisher vernachlässigte Signal im roten (R) Kanal berücksichtigt werden. Als nächstes wird das Verhältnis von Rot- zu Infrarotsignalen, Z = R/IR, die beide vom arteriellen Blut reflektiert werden, berechnet. Der Teil "arterielles Blut" ist entscheidend, da der größte Teil des Lichts tatsächlich von Geweben und venösem Blut reflektiert wird. Wie wählt man einen Teil des Signals aus, das dem arteriellen Blut entspricht? Nun, dies ist die pulsierende Komponente, die mit jedem Herzschlag variiert. In den Worten von Elektroingenieuren ist es der "AC-Teil", während das restliche reflektierte Licht der "DC-Teil" ist. Da die absoluten Intensitäten von R- und IR-Licht nicht übereinstimmen, wird das Z-Verhältnis aus den relativen Intensitäten berechnet, wie in der ersten Abbildung gezeigt. In Bezug auf tatsächlich berechnete Größen verwende ich den quadratischen Mittelwert (RMS) des mittelwertzentrierten, basisliniengepegelten Signals y zum bereits bekannten Mittelwert des Rohsignals, < Y >; siehe zweite Abbildung. Das Z-Verhältnis ist jedoch nur die Hälfte der Arbeit. Die nichtlineare Sensorantwort erfordert eine empirische Kalibrierung zwischen Z und dem endgültigen SpO2 Werte. Ich habe die Kalibrierungsgleichung aus dem Code von MAXIM genommen:

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

Beachten Sie, dass diese Gleichung nur für das Designboard MAX30102 gilt, das 2017 gekauft wurde! Es ist wahrscheinlich, dass MAXIM seine Sensoren zu einem späteren Zeitpunkt neu kalibriert.

Das obige Verfahren produziert immer noch viel falsches SpO2 Lesungen. Der rote Kanal leidet ebenso wie der IR-Kanal unter vielen Artefakten. Es ist vernünftig anzunehmen, dass beide Signale stark korreliert sein sollten. Tatsächlich korrelieren Signale mit guter Qualität, wie im Beispiel in der dritten Abbildung, sehr gut. Der Korrelationskoeffizient nach Pearson liegt in diesem Fall bei 0,99. Dies ist nicht immer der Fall, wie in der vierten Abbildung dargestellt. Obwohl das IR-Signal den Herzfrequenz-Qualitätsfilter mit seinem rm / R0 = 0,76, führt das verzerrte R-Signal zu einem schlechten Korrelationskoeffizienten zwischen den beiden von nur 0,42. Diese Beobachtung bietet den zweiten Qualitätsfilter: der Korrelationskoeffizient zwischen den Kanälen ist größer als ein bestimmter Schwellenwert.

Die letzten beiden Abbildungen veranschaulichen den Nettoeffekt einer solchen Qualitätsfilterung. Zuerst wird die gemessene Sauerstoffsättigung mit einer HF-Qualitätsschwelle von 0,25, jedoch ohne SpO., aufgetragen2 Filter. Das nächste Diagramm resultiert aus dem Herausfiltern von schlechter HF und SpO2 Ergebnisse bei 0,5 rm / R0 und 0,8 Korrelationskoeffizienten-Schwellenwerte. Insgesamt wurden durch das strengere Regime schlechte Datenpunkte in Höhe von 12% der Gesamtmenge herausgefiltert.

In unserem Code wird der Korrelationskoeffizient cc gemäß der Formel in der fünften Abbildung berechnet, wobei y das mittelwertzentrierte, grundliniengepegelte Signal darstellt, während r0 wurde im vorherigen Schritt definiert.

Schritt 6: Der Quellcode

Der C-Quellcode für dieses Projekt, formatiert für die Arduino IDE, ist von unserem Github-Account unter folgendem Link verfügbar:

github.com/aromring/MAX30102_by_RF

Auf der Readme-Seite werden einzelne Komponenten beschrieben.

Ich möchte mir einen Moment Zeit nehmen, um Adafruit dafür zu loben, dass es ein so ausgezeichnetes Produkt wie den M0-basierten Adalogger hergestellt hat. Sein schneller 48-MHz-ARM-Cortex-M0-Prozessor mit viel RAM hat sicherlich dazu beigetragen, dieses Projekt realisierbar zu machen, während ein direkt angeschlossener SD-Kartenleser (plus Adafruits SD-Bibliothek) alle Mühen des Bastlers beseitigt, die mit der Echtzeitspeicherung großer Datenmengen verbunden sind.

Empfohlen: