Table des matières:

Oxymètre de pouls avec une précision nettement améliorée : 6 étapes (avec photos)
Oxymètre de pouls avec une précision nettement améliorée : 6 étapes (avec photos)

Vidéo: Oxymètre de pouls avec une précision nettement améliorée : 6 étapes (avec photos)

Vidéo: Oxymètre de pouls avec une précision nettement améliorée : 6 étapes (avec photos)
Vidéo: Conférence "La cohérence cardiaque" - Dr David O'hare - INCEM 2024, Novembre
Anonim
Oxymètre de pouls avec une précision nettement améliorée
Oxymètre de pouls avec une précision nettement améliorée
Oxymètre de pouls avec une précision nettement améliorée
Oxymètre de pouls avec une précision nettement améliorée

Si vous avez récemment consulté un médecin, il est probable que vos signes vitaux de base aient été examinés par une infirmière. Poids, taille, tension artérielle, ainsi que fréquence cardiaque (FC) et saturation en oxygène dans le sang périphérique (SpO2). Peut-être que les deux derniers ont été obtenus à partir d'une sonde digitale électronique rougeoyante qui affichait les chiffres pertinents sur un petit écran en quelques minutes. Cette sonde est appelée oxymètre de pouls et vous pouvez trouver toutes les informations de base à ce sujet ici.

On peut facilement acheter un simple oxymètre de pouls, bien sûr, mais où est le plaisir ? J'ai décidé de construire le mien, d'abord pour le plaisir, mais plus important encore avec une application spécifique en tête: l'oxymétrie nocturne où à la fois HR et SpO2 les données seraient collectées en continu pendant la nuit et enregistrées sur une carte micro SD. Instructables contient déjà plusieurs projets de ce type, par exemple, deux impliquant Arduino ici et ici, et un utilisant Raspberry Pi. Le mien utilise un capteur légèrement plus récent MAX30102 de MAXIM Integrated et Feather M0 Adalogger d'Adafruit pour le contrôle et l'enregistrement des données.

Notre projet n'est donc pas particulièrement innovant en termes de matériel et en tant que tel ne vaudrait pas la peine d'écrire cet Instructable, mais au cours du processus de création, j'ai fait des avancées cruciales dans le logiciel qui m'ont permis d'extraire des données de MAX30102 avec une cohérence beaucoup plus élevée et beaucoup moins de bruit que le logiciel écrit par MAXIM pour ce capteur. Les performances de notre algorithme de traitement du signal sont illustrées dans le graphique ci-dessus où les deux graphiques du haut contiennent la fréquence cardiaque pendant la nuit et la saturation en oxygène calculées à partir des signaux bruts par notre méthode (identifiée par "RF"), tandis que les deux graphiques du bas montrent les résultats de MAXIM produits à partir de exactement les mêmes signaux. Les écarts types pour la FC sont de 4,7 bpm et 18,1 bpm, et pour la SpO2 0,9% et 4,4%, pour RF et MAXIM, respectivement.

(Les deux graphiques RF correspondent à un seuil d'autocorrélation minimal de 0,25 et aucune limite sur la corrélation R / IR; voir les étapes 4 et 5 pour l'explication de ces termes.)

Étape 1: Matériel

Matériel
Matériel
Matériel
Matériel
Matériel
Matériel
Matériel
Matériel
  1. Carte système d'oxymètre de pouls et de capteur de fréquence cardiaque MAX30102 de MAXIM Integrated, Inc.
  2. Plume M0 Adalogger d'Adafruit, Inc.
  3. Batterie lithium-ion d'Adafruit, Inc.

Connexions:

  • Adalogger broche SCL et SDA sur les broches SCL et SDA correspondantes sur la carte MAX30102
  • Adalogger broche 10 à broche INT sur la carte MAX30102
  • Adalogger GND à la carte MAX30102 GND
  • Adalogger 3V à MAX30102 VIN

Étape 2: Signaux numériques renvoyés par le MAX30102

Signaux numériques renvoyés par le MAX30102
Signaux numériques renvoyés par le MAX30102
Signaux numériques renvoyés par le MAX30102
Signaux numériques renvoyés par le MAX30102

Les principes de fonctionnement du capteur sont très simples: deux LED, une rouge (660 nm) et une infrarouge (880 nm, IR) éclairent la peau humaine. La lumière est partiellement absorbée par les tissus sous-jacents, y compris le sang périphérique. Le photodétecteur du capteur collecte la lumière réfléchie aux deux longueurs d'onde et renvoie deux intensités relatives correspondantes en utilisant le protocole I2C. Étant donné que les spectres d'absorption de l'hémoglobine oxygénée et désoxygénée diffèrent pour les deux longueurs d'onde, la lumière réfléchie a une composante variable car la quantité de sang artériel présente sous la peau bat à chaque battement cardiaque. Déterminer la fréquence cardiaque et la saturation en oxygène appartient au logiciel de traitement du signal.

Des exemples de signaux bruts (canal IR uniquement) sont illustrés dans les images ci-dessus. On peut remarquer un composant périodique superposé sur une ligne de base variable qui se déplace en raison de plusieurs facteurs mentionnés dans la page Wikipédia. Les artefacts induits par le mouvement sont particulièrement gênants car ils peuvent masquer le signal HR utile et provoquer des résultats erronés. Par conséquent, les oxymètres commerciaux avancés disposent d'accéléromètres qui aident à annuler ces artefacts.

Je peux ajouter un accéléromètre à la prochaine version de mon oxymètre, mais pour la FC/SpO nocturne2 enregistrement, lorsque le capteur reste immobile la plupart du temps, il suffit de détecter et d'omettre les signaux déformés.

Le capteur MAX30102 lui-même est livré dans un petit boîtier monté en surface, mais MAXIM propose gracieusement une carte de dérivation (carte système 6300) ainsi qu'un logiciel de traitement du signal pour Arduino et mbed - le tout dans le package de conception de référence MAXREFDES117#. Je l'ai acheté avec plaisir en espérant simplement souder quelques fils entre le capteur et Adalogger et avoir un bon oxymètre fonctionnel en une seule journée. J'ai adapté la version RD117_ARDUINO du logiciel MAXIM pour qu'elle s'exécute sur le processeur ARM Cortex M0 de l'Adalogger. Fondamentalement, tout ce que j'avais à faire était de remplacer les fonctions SofI2C incompatibles dans max30102.cpp par les appels de bibliothèque Wire correspondants. Le code s'est bien compilé dans l'IDE Arduino v1.8.5 et s'est exécuté sur M0 sans aucune erreur. Les résultats nets ont cependant été décevants. Dans l'étape d'introduction, j'ai déjà montré une très grande variance à la fois de la RH et de la SpO2. Naturellement, on peut prétendre que j'ai fait quelque chose de mal et c'était aussi ma pensée initiale. Cependant, dans la vidéo d'instructions de MAXIM, vous pouvez également observer des valeurs de FC très changeantes affichées à l'écran. De plus, les commentaires sous la vidéo confirment que d'autres ont également remarqué un phénomène similaire.

Pour faire court, après quelques expérimentations, j'ai déterminé que le capteur fonctionne correctement et qu'une méthode alternative de traitement du signal numérique donne une bien meilleure stabilité. Cette nouvelle méthode, indiquée par "RF", est décrite dans les prochaines étapes.

Étape 3: Prétraitement du signal

Prétraitement du signal
Prétraitement du signal
Prétraitement du signal
Prétraitement du signal
Prétraitement du signal
Prétraitement du signal
Prétraitement du signal
Prétraitement du signal

Dans notre implémentation, le signal brut est collecté au rythme de 25 Hz (identique à celui de MAXIM) pendant 4 secondes complètes (le logiciel de MAXIM ne collecte que 1 seconde), ce qui donne 100 points de temps numérisés par point de données final. Chaque séquence de 100 points doit être prétraitée de la manière suivante:

  1. Centrage moyen (alias « retrait du composant DC » pour les ingénieurs électriciens). Les données brutes provenant du capteur sont une série temporelle d'entiers dans le 105 gamme. Le signal utile, cependant, n'est qu'une partie de la lumière réfléchie par le sang artériel qui varie de l'ordre de seulement 102 - premier chiffre. Pour un traitement significatif du signal, il est donc souhaitable de soustraire la moyenne de chaque point de la série. Cette partie n'est pas différente de ce que fait déjà le logiciel MAXIM. Ce qui est différent, cependant, c'est le centrage supplémentaire sur la moyenne des indices temporels eux-mêmes. En d'autres termes, au lieu d'indexer les points des séries par des nombres de 0 à 99, les nouveaux indices sont désormais les nombres -49.5, -48.5, …, 49.5. Cela peut sembler étrange au début, mais grâce à cette procédure, le "centre de gravité" de la courbe du signal coïncide avec l'origine du système de coordonnées (deuxième figure). Ce fait devient très utile à l'étape suivante.
  2. Nivellement de base. Un autre regard sur les formes d'onde présentées à l'étape 2 montre que la ligne de base des signaux d'oxymétrie réels est loin d'être horizontalement plate, mais varie selon différentes pentes. La troisième figure montre un signal IR centré sur la moyenne (courbe bleue) et sa ligne de base (ligne droite bleue). Dans ce cas, la pente de la ligne de base est négative. La méthode de traitement du signal décrite ci-dessus nécessite que la ligne de base soit horizontale. Ceci peut être réalisé en soustrayant simplement la ligne de base du signal centré sur la moyenne. Grâce au centrage moyen des coordonnées Y et X, l'interception de la ligne de base est nulle et son équation de pente est particulièrement simple, comme le montre la quatrième figure. Le signal de niveau de base est représenté par une courbe orange sur la troisième figure.

Ainsi, le signal prétraité est prêt pour l'étape suivante.

Étape 4: La bête de somme: fonction d'autocorrélation

La bête de somme: fonction d'autocorrélation
La bête de somme: fonction d'autocorrélation
La bête de somme: fonction d'autocorrélation
La bête de somme: fonction d'autocorrélation
La bête de somme: fonction d'autocorrélation
La bête de somme: fonction d'autocorrélation

En revenant à l'indexation habituelle 1, …, n, la première figure montre la définition de la fonction d'autocorrélation rm - une quantité qui s'avère très utile pour détecter la périodicité ainsi que la qualité du signal. C'est simplement un produit scalaire normalisé de la série temporelle du signal avec lui-même décalé par le décalage m. Dans notre application, cependant, il est pratique de mettre à l'échelle chaque valeur d'autocorrélation par rapport à sa valeur au décalage = 0, c'est-à-dire d'utiliser l'autocorrélation relative définie par rm /r0.

Le tracé de l'autocorrélation relative d'un signal IR typique de bonne qualité est illustré dans la deuxième figure. Comme prévu, sa valeur au décalage = 0 est à son maximum global égal à 1. Le prochain maximum (local) se produit au décalage = 23 et est égal à 0,79. La présence de minima et de maxima locaux dans le tracé d'autocorrélation est facile à comprendre: lorsque le signal se déplace vers la droite, ses pics interfèrent de manière destructive les uns avec les autres au début, mais à un certain point, l'interférence devient constructive et atteint un maximum avec un décalage égal à la moyenne. période du signal.

La dernière phrase est cruciale: pour déterminer la durée moyenne entre les pics, à partir de laquelle on peut calculer la fréquence du signal (c'est-à-dire la fréquence cardiaque), il suffit de trouver le premier maximum local de la fonction d'autocorrélation ! Par défaut, le MAX30102 échantillonne l'entrée analogique à une fréquence de 25 points par seconde, donc à m donné la période en secondes est égale à m / 25. Cela conduit à une fréquence cardiaque exprimée en battements par minute (bpm) par:

FC = 60*25 / m = 1500 / m

Bien sûr, il n'est pas nécessaire de faire des calculs coûteux de rm à toutes les valeurs de décalage. Notre algorithme fait la première estimation de la fréquence cardiaque = 60 bpm, ce qui correspond à m = 25. La fonction d'autocorrélation est évaluée à ce point et comparée à la valeur à son voisin de gauche, m = 24. Si la valeur des voisins est plus élevée, alors le mars continue vers la gauche jusqu'à rm-1 < rm. Le m final ainsi déterminé est alors renvoyé comme le retard au maximum. L'itération suivante commence à partir de cette valeur au lieu de 25 et tout le processus se répète. Si le premier voisin de gauche est plus bas, alors la routine ci-dessus marche en retard pointe vers la droite de la même manière. La plupart du temps, le décalage au maximum ne nécessite que quelques évaluations de la fonction d'autocorrélation. De plus, les décalages maximum et minimum acceptables (correspondant respectivement à la fréquence cardiaque minimale et maximale) sont utilisés comme valeurs limites.

Ce qui précède fonctionne très bien pour des signaux de bonne qualité, mais le monde réel est loin d'être idéal. Certains signaux sortent déformés, principalement en raison d'artefacts de mouvement. Un tel signal est représenté sur la troisième figure. Une mauvaise périodicité se reflète dans la forme de sa fonction d'autocorrélation ainsi que dans la faible valeur, 0,28, du premier maximum local à m = 11. Comparez-la à la valeur maximale de 0,79 déterminée pour le signal de bonne qualité. Avec les valeurs limites de décalage, par conséquent, la valeur de rm /r0 au maximum est un bon indicateur de la qualité du signal et une exigence pour qu'il dépasse un certain seuil peut être utilisée pour filtrer les artefacts de mouvement. Les graphiques "RF" présentés dans les introductions résultaient d'un tel seuil égal à 0,25.

Étape 5: Détermination de la saturation en oxygène

Détermination de la saturation en oxygène
Détermination de la saturation en oxygène
Détermination de la saturation en oxygène
Détermination de la saturation en oxygène
Détermination de la saturation en oxygène
Détermination de la saturation en oxygène
Détermination de la saturation en oxygène
Détermination de la saturation en oxygène

L'étape précédente était suffisante pour déterminer la fréquence cardiaque. Le SpO2 demande plus de travail. Tout d'abord, le signal jusqu'ici négligé dans le canal rouge (R) doit être pris en compte. Ensuite, le rapport des signaux rouges aux signaux infrarouges, Z = R/IR, tous deux réfléchis par le sang artériel, est calculé. La partie "sang artériel" est cruciale, car la majeure partie de la lumière est en fait réfléchie par les tissus et le sang veineux. Comment choisir la portion du signal correspondant au sang artériel ? Eh bien, c'est la composante pulsatile qui varie avec chaque battement de cœur. Selon les mots des ingénieurs électriciens, c'est la "partie AC", tandis que la lumière réfléchie restante est la "partie DC". Étant donné que les intensités absolues de la lumière R et IR ne sont pas proportionnelles, le rapport Z est calculé à partir des intensités relatives, comme le montre la première figure. En termes de quantités réellement calculées, j'utilise la moyenne quadratique (RMS) du signal centré sur la moyenne et nivelé par la ligne de base, y, à la moyenne déjà connue du signal brut, < Y >; voir deuxième figure. Le rapport Z n'est cependant que la moitié du travail. La réponse non linéaire du capteur nécessite un étalonnage empirique entre Z et la SpO finale2 valeurs. J'ai pris l'équation d'étalonnage du code de MAXIM:

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

Gardez à l'esprit que cette équation n'est valable que pour le panneau de conception MAX30102 acheté en 2017 ! Il est probable que MAXIM recalibrera ses capteurs à une date ultérieure.

La procédure ci-dessus produit encore beaucoup de fausses SpO2 lectures. Le canal rouge souffre de nombreux artefacts, tout comme celui de l'IR. Il est raisonnable de supposer que les deux signaux doivent être fortement corrélés. En fait, des signaux de bonne qualité, comme l'exemple de la troisième figure, sont très bien corrélés. Le coefficient de corrélation de Pearson est dans ce cas aussi élevé que 0,99. Ce n'est pas toujours le cas, comme l'illustre la quatrième figure. Bien que le signal IR passe le filtre de qualité de fréquence cardiaque avec son rm /r0 = 0,76, le signal R déformé entraîne un faible coefficient de corrélation entre les deux égal à seulement 0,42. Cette observation offre le deuxième filtre de qualité: avoir le coefficient de corrélation entre canaux supérieur à un certain seuil.

Les deux derniers chiffres illustrent l'effet net d'un tel filtrage de qualité. Tout d'abord, la saturation en oxygène mesurée est tracée avec un seuil de qualité HR de 0,25, mais sans la SpO2 filtre. Résultats du graphique suivant du filtrage des faibles FC et SpO2 résultats à 0,5 rm /r0 et 0,8 seuils de coefficient de corrélation. Dans l'ensemble, les points de données pauvres s'élevant à 12 % du total ont été filtrés par le régime plus strict.

Dans notre code, le coefficient de corrélation, cc, est calculé selon la formule de la cinquième figure, où y représente le signal centré sur la moyenne, au niveau de la ligne de base, tandis que r0 a été défini à l'étape précédente.

Étape 6: Le code source

Le code source C de ce projet, formaté pour l'IDE Arduino, est disponible sur notre compte Github au lien suivant:

github.com/aromring/MAX30102_by_RF

Sa page Lisez-moi décrit les composants individuels.

Je voudrais prendre un moment pour féliciter Adafruit d'avoir fabriqué un produit aussi excellent qu'Adalogger basé sur M0. Son processeur rapide ARM Cortex M0 48 MHz, avec beaucoup de RAM, a certainement contribué à rendre ce projet viable, tandis que le lecteur de carte SD directement connecté (ainsi que la bibliothèque SD d'Adafruit) supprime toutes les douleurs de l'amateur associées au stockage en temps réel de grandes quantités de données.

Conseillé: