Dans le traitement des signaux ECG, l’élimination des interférences des lignes électriques 50/60Hz des formes d’onde ECG biomédicales délicates et riches en informations est une tâche difficile! Le défi est encore compliqué par l’ajustement des effets de l’EMG, tels que le mouvement d’un membre ou du torse du patient ou même la respiration. Une approche traditionnelle adoptée par beaucoup consiste à utiliser un filtre coupe-bande IIR de 2e ordre :

\(\displaystyle H(z)=\frac{1-2cosw_oz^{-1}+z^{-2}}{1-2rcosw_oz^{-1}+r^2z^{-2}}\)

où \(w_o=\frac{2\pi f_o}{fs}\) contrôle la fréquence centrale, \(f_o\) de l’encoche, et \(r=1-\frac{\pi BW}{fs}\) contrôle la bande passante (point -3dB) de l’encoche.

Quel est le défi?

Comme nous l’avons vu plus haut, \(H(z) \) est simple à mettre en œuvre, mais la difficulté consiste à trouver une valeur optimale de r, car une encoche nette souhaitable signifie que les pôles sont proches du cercle unitaire (voir à droite).

ECG biomédicaux rii; difficulté consiste à trouver une valeur optimale de r, car une encoche nette souhaitable signifie que les pôles sont proches du cercle unitaire

En présence d’interférences stationnaires, par exemple lorsque le patient est absolument immobile et que les effets de la respiration sur les données du capteur sont minimes, cela peut ne pas être un problème.

Cependant, si l’on considère les effets de l’EMG sur la forme d’onde capturée (une situation beaucoup plus réaliste), la rétroaction (pôles) du filtre IIR provoque un tintement sur la forme d’onde filtrée, comme illustré ci-dessous:

ECG contaminé par des interférences 50Hz non stationnaires (filtrage FIR), traitement des signaux ECG, DSP ECG, mesure ECG

ECG contaminé par des interférences non stationnaires de 50 Hz provenant de lignes électriques (filtrage RII)

Comme nous l’avons vu ci-dessus, bien que la majorité des interférences 50Hz aient été éliminées, il y a toujours un anneau significatif autour des pics principaux (sortie filtrée montrée en rouge). Ce tintement est indésirable pour de nombreuses applications biomédicales, car les informations cardiaques vitales telles que le segment ST ne peuvent pas être clairement analysées.

La réponse en fréquence du filtre IIR utilisé pour filtrer les données ECG ci-dessus est présentée ci-dessous.

Réponse en fréquence du filtre coupe-bande RII, traitement du signal ECG, DSP ECG, mesure ECt

Réponse en fréquence du filtre coupe-bande RII

En analysant le graphique, on peut voir que le délai de groupe (ou délai moyen) du filtre est non linéaire mais presque nul dans les bandes passantes, ce qui signifie qu’il n’y a pas de distorsion. Le délai de groupe à 50Hz s’élève à 15 échantillons, ce qui est la source de la sonnerie – où plus les pôles sont proches du cercle unitaire, plus le délai de groupe est grand.

ASN FilterScript offre aux concepteurs la fonction notch(), qui est une implémentation directe de H(z), comme montré ci-dessous:

ClearH1;  // clear primary filter from cascade
ShowH2DM;   // show DM on chart

interface BW={0.1,10,.1,1};

Main()

F=50;
Hd=notch(F,BW,"symbolic");
Num = getnum(Hd); // define numerator coefficients
Den = getden(Hd); // define denominator coefficients
Gain = getgain(Hd); // define gain

Filtres RIF de Savitzky-Golay

Une solution au problème de l’anneau mentionné ci-dessus ainsi qu’une réduction du bruit peuvent être obtenues grâce à un filtre de lissage passe-bas Savitzky-Golay. Ces filtres sont des filtres RIF, et n’ont donc pas de coefficients de rétroaction et pas de sonnerie !

Les filtres de lissage (polynomiaux) de Savitzky-Golay ou les filtres de lissage des moindres carrés sont des généralisations du filtre moyen FIR qui peuvent mieux préserver le contenu haute fréquence du signal souhaité, au détriment de l’élimination d’autant de bruit qu’une moyenne RIF. La formulation particulière des filtres Savitzky-Golay préserve mieux les différents ordres de moment que d’autres méthodes de lissage, qui ont tendance à mieux préserver les largeurs et hauteurs de pic que Savitzky-Golay. À ce titre, les filtres de Savitzky-Golay conviennent parfaitement aux données biomédicales, telles que les ensembles de données ECG.

Élimination de la composante 50 Hz de la ligne électrique

En concevant un filtre Savitzky-Golay d’ordre 18 avec un ajustement polynomial d’ordre 4 (voir l’exemple de code ci-dessous), nous obtenons un filtre FIR avec une distribution nulle, comme indiqué sur la droite. Cependant, comme nous souhaitons éliminer complètement la composante 50Hz, l’éditeur P-Z de l’outil peut être utilisé pour déplacer une paire de zéros (indiquée en vert) à exactement 50Hz.

La réponse en fréquence résultante est présentée ci-dessous, où l’on peut voir qu’il y a une encoche à exactement 50Hz, et que le retard de groupe de 9 échantillons (présenté en violet) est constant sur toute la bande de fréquence.

Réponse en fréquence du filtre RIF Savitzky-Golay, traitement du signal ECG, DSP ECG, mesure ECG

Réponse en fréquence du filtre RIF Savitzky-Golay

En faisant passer l’ensemble de données ECG contaminées par notre filtre Savitzky-Golay modifié et en ajustant le retard de groupe, nous obtenons :

ECG contaminé par des interférences non stationnaires de 50 Hz (filtrage RIF), traitement du signal ECG, filtre numérique ECG, conception du filtre ECG.

ECG contaminé par des interférences non stationnaires de 50 Hz sur le réseau électrique (filtrage RIF).

Comme on peut le voir, il n’y a pas de signes d’interférence et les segments ST sont maintenant clairement visibles pour l’analyse. Remarquez également comment le filtre (en rouge) a réduit le bruit de mesure, soulignant l’aspect pratique des filtres Savitzky-Golay pour le traitement des signaux biomédicaux.

Un Savitzky-Golay peut être conçu et optimisé dans ASN FilterScript via la fonction savgolay(), comme suit:

ClearH1;  // clear primary filter from cascade

interface L = {2, 50,2,24};
interface P = {2, 10,1,4};

Main()

Hd=savgolay(L,P,"numeric");  // Design Savitzky-Golay lowpass
Num=getnum(Hd);
Den={1};
Gain=getgain(Hd);

Deployment

Ce filtre peut maintenant être déployé dans une variété de domaines via le générateur de code automatique de l’outil, permettant un déploiement rapide dans Matlab, Python et les dispositifs embarqués Arm Cortex-M.

0 replies

Leave a Reply

Want to join the discussion?
Feel free to contribute!

Leave a Reply

Your email address will not be published. Required fields are marked *