Amélioration du traitement de signal pour un dispositif de détection de la respiration basé sur la température du souffle nasal
Abstract
Ce document présente le travail réalisé entre mai et août 2024 pour améliorer le traitement de signal du module respiratoire du projet Crocodile. Nous décrivons d’abord les besoins ayant motivé les améliorations logicielles, puis nous détaillons les recherches effectuées pour examiner le type de traitement de signal couramment utilisé pour des applications similaires aux nôtres. Nous expliquons ensuite les expérimentations réalisées pour déterminer la méthode de calcul de température la mieux adaptée à nos besoins et nous décrivons finalement les modifications apportées au traitement de signal respiratoire pour obtenir des données plus significatives en utilisant la bibliothèque Plaquette, spécialisée dans le traitement de signal.
Full text
mXlab Août 2024 MX-24-03-FR Amélioration du traitement de signal pour un dispositif de détection de la respiration basé sur la température du souffle nasal Luana Belinsky Résumé Ce document présente le travail réalisé entre mai et août 2024 pour améliorer le traitement de signal du module respiratoire du projet Crocodile. Nous décrivons d’abord les besoins ayant motivé les améliorations logicielles, puis nous détaillons les recherches effectuées pour examiner le type de traitement de signal couramment utilisé pour des applications similaires aux nôtres. Nous expliquons ensuite les expérimentations réalisées pour déterminer la méthode de calcul de température la mieux adaptée à nos besoins et nous décrivons finalement les modifications apportées au traitement de signal respiratoire pour obtenir des données plus significatives en utilisant la bibliothèque Plaquette, spécialisée dans le traitement de signal. Mots-clés : biofeedback, biométrie à faible coûts, détection de respiration, extraction de caractéristiques, traitement de signal. Un rapport technique du mXlab Université du Québec à Montréal http ://mxlab.uqam.ca Ce document est distribué sous une licence Creative Commons Attribution-Partage dans les Mêmes Conditions 4.0 International Pour voir une copie de la licence, visiter : https ://creativecommons.org/licenses/by-sa/4.0/deed.fr
Introduction Crocodile est un projet d’installation interactive des artistes Sofian Audry et Erin Gee dans laquelle les personnes utilisatrices portent un dispositif captant des données biométriques (respiration, flux sanguin, activité électrodermale). À partir de ces données, un profil émotionnel est déterminé par apprentissage machine et des images correspondantes sont générées en temps réel par intelligence artificielle. Ce projet s’appuie sur la bibliothèque de traitement de données biométriques BioData (Geeet al. 2025a), élaborée majoritairement par Erin Gee. Au début de ce travail, les indicateurs respiratoires obtenus étaient peu représentatifs du cycle respiratoire de la personne utilisatrice. Ce rapport technique traite des améliorations que nous avons apportées au module respiratoire au niveau du traitement de signal; un autre rapport (MX-24-02-FR) détaille les améliorations électroniques et matérielles. Les besoins du projet Crocodile en ce qui concerne l’analyse des données respiratoires incluent : Normalisation du signal : La respiration est analysée par mesure de la température de l’air à la sortie des voies respiratoires. Comme la température ambiante varie selon le contexte d’installation et que les paramètres respiratoires varient selon les personnes utilisatrices, les valeurs des indicateurs respiratoires doivent être normalisées pour pouvoir être comparées. Évolution en temps réel : Le signal doit être traité en temps réel. La rapidité computationnelle doit donc être considérée et le traitement de signal doit pouvoir s’ajuster selon les variations de respiration à moyen terme sans perdre le détail des variations ponctuelles. Idéalement, ce traitement s’effectue en tout ou en partie sur un microcontrôleur présentant des contraintes sur le plan de la mémoire et de la vitesse de calcul. Représentation du cycle respiratoire : Plus les indicateurs respiratoires extraits à partir du signal de température arrivent à refléter les subtilités de la respiration de la personne utilisatrice, plus le module d’apprentissage machine aura d’informations à disposition pour déterminer un profil émotionnel correspondant. 2
Revue de littérature : pratiques courantes en analyse respiratoire Méthodes de calcul de la température La plupart des méthodes d’analyse de la respiration avec des thermistances utilisent comme signal initial la température de l’air à la sortie des voies respiratoires. Généralement, c’est l’équation de Steinhart-Hart – ou une version simplifiée de l’équation – qui est utilisée pour le calcul (Massaroniet al. 2019; Lazaroet al. 2021). Nous avons aussi trouvé un cas de calcul de température respiratoire faisant plutôt appel à une table de correspondance (Bandyopadhyayet al. 2016). Les démarches effectuées pour comparer les deux méthodes seront détaillées dans la prochaine section. Traitement du signal La plupart des applications de surveillance de la respiration décrites dans la littérature s’intéressent surtout au rythme respiratoire (respirations par minute) : le traitement du signal vise donc habituellement à réduire le bruit et à détecter les pics. Par exemple, dans un des cas que nous avons examinés (Lazaroet al. 2021), une normalisation minime est appliquée en soustrayant la température moyenne du signal, puis un filtre passe-bas avec une moyenne mobile exponentielle est utilisé pour réduire le bruit. La méthode de filtrage semble appropriée et ressemble à celle que nous utilisions déjà. La normalisation proposée ici est cependant insuffisante pour nos besoins; comme nous nous intéressons à des paramètres comme l’amplitude des respirations, l’étendue de la variation doit aussi être normalisée. Dans un autre cas examiné (Miliciet al. 2017), l’algorithme de détection de pics est présenté : il est basé sur la détection des valeurs minimales et maximales avec un seuil de tolérance de repli pour ne pas faussement interpréter le bruit comme un pic. Nous avons considéré cette méthode lors de l’amélioration de notre code. Évaluation des méthodes de calcul de la température Au début de ce travail, le signal initial traité était la valeur obtenue directement par le convertisseur analogique-numérique. Cette valeur est représentative de la résistance du capteur mais n’évolue pas de manière linéaire par rapport à la température. Nous avons voulu utiliser comme signal respiratoire initial la température calculée, puisque c’est la méthode privilégiée dans la littérature. 3
Pour déterminer la méthode de calcul la mieux adaptée aux besoins de Crocodile, nous avons d’abord comparé la performance des deux méthodes à l’aide de bibliothèques C++ trouvées dans nos recherches (Shaya2023; Citriena2024). Avec deux thermistances différentes, nous avons pris dix mesures1entre 20°C et 40°C avec un thermomètre digital comme référence et nous avons calculé la différence entre la température de référence et la température calculée avec chaque méthode. Puisque les méthodes de calcul se sont révélées d’exactitude comparable, nous avons examiné d’autres caractéristiques. La méthode de Steinhart-Hart implique des calculs mathématiques relativement complexes : elle demande donc plus de puissance de calcul, mais elle utilise peu de mémoire. La méthode de la table de correspondance, au contraire, est plus rapide car elle implique peu de calculs, mais elle occupe plus de mémoire. Un autre paramètre important à considérer est la flexibilité de la méthode et la facilité de calibration. Celle-ci est nécessaire si une thermistance ne passe pas le processus de contrôle ou si on veut utiliser différents modèles de thermistances. La calibration en trois points de la méthode Steinhart-Hart est relativement simple, alors que pour la table de correspondance, une calibration impliquerait de créer une nouvelle table entièrement, ce qui est beaucoup plus demandant en termes de temps et de travail. Considérant ces caractéristiques, la méthode de Steinhart-Hart nous semble mieux adaptée à nos besoins. Différence entre T° du thermomètre digital et T° calculée avec l’équation Steinhart-Hart Différence entre T° du thermomètre digital et T° calculée avec la méthode de la table de correspondance Médiane Moyenne Médiane Moyenne oldNTC 0,775 0,803 0,71 0,769 MA100 0,475 0,619 0,57 0,676 Table 1 – Comparaison des différences entre les températures calculées par différentes méthodes pour deux thermistances NTC. Le capteur oldNTC est une composante générique de marque inconnue alors que MA100 est une thermistance de grade biomédical. Cependant, nous avons dû mettre de côté l’intégration du calcul de la température pour le moment car elle demande plusieurs valeurs de référence selon la thermistance utilisée : elle était trop complexe à intégrer à la bibliothèque BioData, qui se veut simple d’utilisation et prête à l’emploi. 1Les mesures ont été prises en recouvrant les capteurs d’une couche imperméable et les immergeant dans l’eau. 4
Améliorer le traitement de signal dans BioData Utilisation de la bibliothèque Plaquette Au début de ce travail, les indicateurs respiratoires extraits grâce à la bibliothèque BioData étaient les suivants : le signal initial normalisé par méthode min-max2, le rythme respiratoire en respirations par minute, un indicateur relatif3de rythme respiratoire et un indicateur relatif d’amplitude. L’indicateur relatif d’amplitude était peu significatif et les données obtenues semblaient insuffisantes pour refléter de manière détaillée la respiration de la personne utilisatrice (voir Annexe I). Nous avons entrepris d’améliorer le module respiratoire de BioData en faisant appel à la bibliothèque de traitement de signal Plaquette (Audryet Ouellet Frederickss. d.) car elle offre une méthode robuste de détection de pics, des objets de normalisation basés sur l’écart-type et un paramètre de fenêtre temporelle pour chaque objet permettant d’ajuster facilement le degré d’adaptation temporelle des valeurs. La bibliothèque Plaquette offre plusieurs objets de traitement de données. Les informations suivantes sont tirées du site de Plaquette, référencé précédemment. À moins de mention contraire, le code inclus correspond au constructeur. Lissage L’objet Smoother est un filtre passe-bas utilisant une moyenne mobile exponentielle. Il prend en paramètre un facteur temporel, compris entre [0, 1] représentant l’importance des nouvelles valeurs par rapport aux anciennes valeurs. Smoother(float smoothWindow = PLAQUETTE_DEFAULT_SMOOTH_WINDOW) ; 2Méthode de normalisation dans laquelle la valeur minimale devient 0, la valeur maximale devient 1 et les autres valeurs deviennent des décimales entre 0 et 1. 3L’indicateur relatif représentait le niveau d’un paramètre par rapport à la moyenne personnelle, sur une échelle de 0 à 1 : une valeur proche de 0 indiquait un niveau inférieur à la moyenne tandis qu’une valeur proche de 1 indiquait un niveau supérieur. 5
Normalisation L’objet Normalizer régularise les signaux entrants en les normalisant autour d’une moyenne cible et d’un écart-type cible. Il peut prendre en paramètre la moyenne cible, l’écart-type cible et une fenêtre temporelle (en secondes) pour appliquer une moyenne mobile exponentielle à ces valeurs. Normalizer(float mean, float stdDev, float timeWindow) ; Mise à l’échelle L’objet MinMaxScaler régularise les signaux entrants en les échelonnant dans un nouvel intervalle de [0, 1] en fonction des valeurs minimales et maximales du signal. Pour tenir compte des signaux qui peuvent évoluer au fil du temps, la personne utilisatrice peut spécifier une « fenêtre temporelle » pour contrôler la vitesse de variation des limites minimales et maximales à l’aide d’une moyenne mobile exponentielle. Ce paramètre temporel n’est pas défini dans le constructeur de MinMaxScaler mais une méthode permet de le spécifier : virtual void timeWindow(float seconds) ; Détection de pics L’objet PeakDetector permet la détection de pics (maximums et minimums) en utilisant soit des modes de franchissement, soit des modes d’apex. Nous utilisons les modes d’apex (PEAK_MAX et PEAK_MIN, qui permettent d’identifier le moment du cycle respiratoire où la température atteint son maximum à l’expiration et son minimum à l’inspiration. Dans ces modes, le pic est détecté après que le signal ait franchi le seuil de déclenchement triggerThreshold, atteint son apex, puis redescendu d’un certain pourcentage entre le seuil et l’apex (paramétré par fallbackTolerance). Une fois le pic détecté, le détecteur attend que le signal franchisse à nouveau le reloadThreshold avant de pouvoir être déclenché à nouveau. 6
Le seuil de déclenchement est spécifié dans le constructeur : PeakDetector(float triggerThreshold, uint8_t mode = PEAK_MAX) ; Des méthodes comme la suivante permettent de spécifier les autres paramètres : void reloadThreshold(float reloadThreshold) ; Les données sont envoyées dans ces objets avec un opérateur de canalisation (>>) qui envoie des données d’une unité à une autre de gauche à droite. Par exemple : input >> output ; Le schéma suivant, issu de la documentation officielle de Plaquette (Audryet Ouellet Fredericks s. d.) illustre la détection de pics avec le PeakDetector : 7
Paramètres respiratoires améliorés Signal initial getRaw() : Comme mentionné précédemment, le signal initial est pour l’instant encore la valeur venant directement du convertisseur analogique-numérique (CAN). Nous avons cependant ajouté la possibilité d’utiliser un signal initial provenant d’un CAN externe, pour permettre une résolution plus élevée que celle des CAN standard de 10 bits intégrés normalement dans les microcontrôleurs des plateformes comme Teensy et Arduino. Cette fonctionnalité nous permet notamment l’utilisation d’un CAN externe de 16 bits que nous avons intégré au système électronique du module respiratoire de Crocodile (voir le rapport MX-24-02-FR pour les détails). Constantes : // Default respiration samplerate 50Hz Respiration(uint8_t pin, unsigned long rate=50) ; Lecture du signal initial : if(_getExternalADCValue){ // if using external ADC _adcValue = _getExternalADCValue() ; }else { _adcValue = analogRead(_pin) ; // if using Arduino internal ADC } Obtention de la valeur : unsigned long Respiration ::getRaw() const {return _adcValue ;} Signal initial normalisé getNormalized() : Le signal initial est ensuite lissé avec un Smoother et normalisé avec un Normalizer ayant une courte fenêtre temporelle (5 secondes). Cette normalisation adaptative est nécessaire 8
pour ajuster la régularisation des données en fonction des variations de température à moyen terme. Par exemple, une hausse de la température moyenne peut être causée par une augmentation rapide du rythme respiratoire ou une période de colère entraînant une vascularisation accrue de la peau du visage. Constantes : float normalizerMean = 0 ; float normalizerStdDev = 1 ; float normalizerTimeWindow = 5 ; float smootherFactor = 0.5 ; Objets Plaquette : Normalizer normalizer(normalizerMean, normalizerStdDev, normalizerTimeWindow) ; Smoother smoother(smootherFactor) ; Traitement du signal : value >> smoother >> normalizer ; // smooth and normalize initial signal Obtention de la valeur : // Returns normalized ADC signal (target mean 0, stdDev 1) // (example : −2 is lower than usual, +2 is higher than usual) float Respiration ::getNormalized() const { return normalizer ; } Signal initial mis à l’échelle getScaled() : Le signal normalisé est ensuite mis à l’échelle entre 0 et 1 avec un MinMaxScaler dont la fenêtre temporelle est identique au Normalizer précédent. Dans un cycle respiratoire, à cause 9
getNormalizedRpm(), getScaledRpm(), getRpmLevel(), getRpmChange() et getRpmVariability() : Tous ces indicateurs sont calculés de la même manière que les indicateurs d’amplitude correspondants. La seule différence est l’ajout d’une ligne de code pour calculer la somme des intervalles dans le tampon circulaire, utilisée pour déterminer le taux de variation (getRpmChange()). Cette même valeur est employée pour convertir le taux de variation de l’amplitude en unités par minute. // Calculate sum of intervals _millisPassed = std ::accumulate(std ::begin(intervals), std ::end(intervals), 0) ; Débit respiratoire Nous avons tenté de développer un indicateur de débit respiratoire, similaire au taux de variation pour l’amplitude ou le RPM, mais appliqué au signal initial. Cet indicateur aurait été utile pour identifier les moments où le flux respiratoire varie, par exemple lors d’une inhalation soudaine liée à la surprise ou lors d’une expiration en plusieurs phases. if (flowRateMetro) { // frequency of temperature sampling for flow rate calculation _flowRate = value − pValue ; // Calculate difference between current and previous temperature value _flowRate >> smootherFlowRate >> normalizerFlowRate ; // Smooth and normalize flow rate pValue = value ; // store temperature value of latest sampling } Cependant, les résultats n’ont pas été concluants, car le débit varie considérablement même pendant une respiration normale. Pour détecter un changement de débit significatif, il faudrait pouvoir localiser précisément le moment où il se produit dans le cycle respiratoire et le comparer aux autres respirations. Nous avons mis de côté cet indicateur pour l’instant. 16
Conclusion Entre mai et août 2024, le projet Crocodile a bénéficié d’une amélioration de son module respiratoire grâce à la modification de la bibliothèque BioData sur laquelle il repose. Nous avons intégré la bibliothèque de traitement de signal Plaquette pour optimiser les indicateurs de signal respiratoire normalisé, d’amplitude et de détection de pics, tout en ajoutant de nouvelles caractéristiques extractibles, telles que le taux de variation et le coefficient de variation de l’amplitude et du rythme respiratoire. Nous avons ainsi réussi à obtenir un large spectre d’indicateurs respiratoires qui reflètent la respiration de la personne utilisatrice de manière détaillée (voir Annexes II, III et IV). Ce rapport décrit la méthodologie adoptée pour résoudre le problème initial de fiabilité et d’expressivité des indicateurs respiratoires. Après avoir défini les besoins du projet, nous avons mené une revue de littérature et comparé nos méthodes de traitement du signal avec celles existantes. Nous avons utilisé les outils de la bibliothèque Plaquette pour développer nos indicateurs extractibles et avons documenté leur implémentation. Parmi les faiblesses possibles de ce rapport, notons que nous n’avons pas détaillé le processus d’expérimentation qui a mené aux choix des équations et des fenêtres temporelles utilisées dans le traitement de signal. Certaines décisions ont été prises en tenant compte des avantages et des inconvénients, mais comportent certaines limitations. Par exemple, la normalisation rapide du signal initial (en 5 secondes) peut entraîner la détection d’un faux pic d’inspiration si la personne utilisatrice retient sa respiration. Il reste aussi du travail à faire concernant l’indicateur de débit respiratoire et l’intégration de la température comme signal initial. Les travaux futurs pourraient inclure la modification de la classe « Respiration » pour la rendre compatible avec d’autres types de signaux et une revue de littérature pour identifier des équations existantes pour extraire le débit respiratoire. Notons que des améliorations matérielles et électroniques du module respiratoire de Crocodile ont été développées parallèlement : elles ont fait l’objet du rapport MX-24-02-FR. 17
Références Audry, Sofian et Thomas Ouellet Fredericks(s. d.). Plaquette — Plaquette 0.7.0 documentation. url : https://sofapirate.github.io/Plaquette/index.html. Bandyopadhyay, Sabyasachi et al. (fév. 2016). « A Linearization Scheme for Thermistor-Based Sensing in Biomedical Studies ». In : IEEE Sensors Journal 16.3, p. 603-609. issn : 1558-1748. doi : 10.1109/JSEN.2015.2488700. url : https://ieeexplore.ieee.org/document/7294617 (visité le 22/09/2025). Citriena(7 juin 2024). citriena/SHthermistor. url : https://github.com/citriena/SHthermistor (visité le 22/09/2025). Gee, Erin et al. (3 juin 2025a). eringee/BioData. url : https://github.com/eringee/BioData (visité le 21/09/2025). – (2025b). eringee/BioData at Summer_2024_Respiration. GitHub. url : https : / / github . com / eringee/BioData (visité le 22/09/2025). Lazaro, Marc et al. (10 nov. 2021). « Smart Face Mask with an Integrated Heat Flux Sensor for Fast and Remote People’s Healthcare Monitoring ». In : Sensors 21.22, p. 7472. issn : 1424-8220. doi : 10.3390/s21227472. url : https://www.mdpi.com/1424-8220/21/22/7472 (visité le 22/06/2025). Massaroni, Carlo et al. (21 fév. 2019). « Contact-Based Methods for Measuring Respiratory Rate ». In : Sensors (Basel, Switzerland) 19.4, p. 908. issn : 1424-8220. doi : 10.3390/s19040908. url : https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6413190/ (visité le 22/06/2025). Milici, Stefano et al. (mars 2017). « Wireless Breathing Sensor Based on Wearable Modulated Frequency Selective Surface ». In : IEEE Sensors Journal 17.5, p. 1285-1292. issn : 1558-1748. doi : 10.1109/JSEN.2016.2645766. url : https://ieeexplore.ieee.org/document/7801059 (visité le 22/09/2025). Shaya, Benjamin (13 oct. 2023). beshaya/ArduinoThermistor. url : https://github.com/beshaya/ ArduinoThermistor (visité le 22/09/2025). 18
Annexe I Indicateurs respiratoires obtenus en début mai. Les indicateurs d’amplitude et de fréquence respiratoire (BPM) étaient limités et peu représentatifs de la respiration de la personne utilisatrice. Un délai important entre une variation (ex. : baisse d’amplitude) et sa prise en compte par l’indicateur empêchait de détecter efficacement les changements ponctuels ou rapides en temps réel. 19
Annexe II Indicateurs respiratoires obtenus après l’amélioration logicielle – signal de base. Signal respiratoire brut (valeur du CAN), signal normalisé, signal mis à l’échelle (0-1), booléen indiquant l’expiration. 20
Annexe III Indicateurs respiratoires obtenus après l’amélioration logicielle – amplitude. Amplitude respiratoire brute (valeurs CAN entre le minimum et le maximum du cycle), amplitude normalisée, amplitude mise à l’échelle (0–1), indicateur de niveau d’amplitude, taux de variation (∆amplitude), variabilité de l’amplitude. 21
Annexe IV Indicateurs respiratoires obtenus après l’amélioration logicielle – fréquence (RPM) Intervalle (en ms) entre les cycles respiratoires, fréquence respiratoire (RPM), fréquence normalisée, fréquence mise à l’échelle (0–1), indicateur de niveau de fréquence, taux de variation (∆ fréquence), variabilité de la fréquence. 22