Filtrage numérique#
Les fonctions de filtrage sont dans scipy.signal
.
Affichage de l’ECG mesuré#
Connaissant le nombre de points dans le signal (numpy.shape
) et la fréquence d’échantillonnage, il est facile de générer un vecteur des abscisses pour tracer le signal en fonction du temps.
Attention : avant de sous-échantillonner, il convient d’appliquer un filtre anti-repliement !
On peut utiliser la fonction scipy.signal.decimate
.
L’observation du spectre nous permet d’affirmer que le signal ECG est plutôt basse fréquence, mais on le savait déjà en observant le signal temporel. La phase n’est pas interprétable ; cela arrive souvent sur les signaux réels.
Finalement, le spectre ne nous permet pas, ici, de déterminer les contenus fréquentiels de la variation basse fréquence d’une part, et des ondes d’autre part.
Définition du gabarit#
Or, on sait que les ondes apparaissent toutes les secondes environ (il y a dix ondes sur presque dix secondes) : leur fréquence d’apparition est donc de l’ordre du hertz. D’autre part, la variation basse fréquence peut être assimilée (très grossièrement) à un sinus de période sept secondes (donc de fréquence 1/7 Hz). Aussi, pour éliminer la composante basse fréquence, il faut réaliser un filtre passe-haut dont la fréquence de coupure est comprise entre 1/7 Hz et 1 Hz.
Nous choisissons donc le gabarit représenté ci-dessous, avec une fréquence de la bande passante à 1 Hz, et une fréquence de la bande atténuée de 0,5 Hz. Seule l’application sur le signal nous permettra d’affiner ces deux valeurs : c’est pourquoi il est important de réaliser un code qui utilise des variables pour ces deux fréquences, afin de les changer facilement.
# Gabarit numérique
fmin, fmax = 0, fe/2
fp = 1
fs = 0.5
edB = 1
AdB = 60
Réalisation d’un filtre RIF avec la méthode des fenêtres#
D’après le tableau vu en cours, pour respecter une atténuation de 60 dB, nous pouvons utiliser les fenêtres de Blackman ou Kaiser (à la condition que \(\beta\) soit suffisamment grand).
largeur_de_transition = (fp-fs) / fe
Ordre des fenêtres (déterminé à partir de la largeur de transition) :
Blackman : N = 1100
Kaiser (beta = 6,76) : N = 864
Kaiser (beta = 8,96) : N = 1142
La fenêtre de Kaiser avec \(\beta=6,76\) est la fenêtre qui donne l’ordre le plus faible : c’est donc celle-ci qu’on choisit.
En pratique, l’ordre donné par la méthode des fenêtres est souvent trop grand. Je choisis donc un ordre plus faible.
Ordre du filtre RIF : 801
Le filtre RIF synthétisé respecte bien le gabarit et ne génère aucune oscillation dans la bande passante. La phase est linéaire, et donc le retard de groupe est constant. Les deux pics visibles sur le retard de groupe sont probablement dus à des erreurs numériques. Enfin, le filtre étant d’ordre très élevé, il existe énormément de zéros, qui sont visibles sur le diagramme pôles-zéros. Le filtre RIF est toujours stable, aucun pôle n’existe.
Réalisation d’un filtre RII avec la transformation bilinéaire#
Le gabarit analogique est le même que le gabarit numérique, à l’exception des fréquences qui sont calculées à partir de l’expression
L’expression de la transformation bilinéaire permettant d’obtenir H(z) à partir de H(s) est :
Cela dit, les formules précédentes ne sont pas nécessaires pour la synthèse du filtre RII puisque la fonction iirdesign
effectue le schéma complet de la transformation bilinéaire :
détermination du gabarit analogique, synthèse du filtre analogique, et enfin transformation de la fonction de transfert analogique en fonction de transfert numérique.
La fonction utilise ordfunc
et iirfilter
puis la transformée bilinéaire bilinear_zpk
.
Ordre du filtre RII : 6
Le filtre RII synthétisé respecte bien le gabarit, quelques oscillations sont visibles dans la bande passante. La phase évolue doucement mais présentent plusieurs « sauts ». Les premiers sauts de phase ont une valeur de \(\pi\) et correspondent à une inversion de signe dans la réponse fréquentielle et se traduisent par un rebond sur le module. Le dernier saut de phase a une valeur de \(2\pi\) et ne traduit aucun phénomène : ce saut existe seulement parce que la phase est ici représentée entre \(-\pi\) et \(\pi\). Comme la phase n’est pas linéaire, le retard de groupe n’est pas constant. Enfin, le diagramme pôles-zéros fait apparaître des pôles qui sont tous dans le cercle unité : le filtre est donc stable.
Réalisation du filtre RIF avec la méthode de Parks-McClellan#
En général, la méthode de Parks-McClellan es très intéressante et fournit des filtres RIF d’ordre moins élevés que ceux produits avec la méthode des fenêtres. Mais dans notre cas, cette méthode ne donne pas de résultat satisfaisant (le gabarit n’est pas du tout respecté) car la bande de transition est très faible et très à gauche dans les fréquences.
Réalisation d’un filtre idéal#
Comme le signal ECG est enregistré, on peut y appliquer un filtre idéal en travaillant dans le domaine de Fourier. Pour cela, on multiplie le spectre du signal par une réponse fréquentielle nulle pour les fréquences inférieures à la fréquence de coupure, et égale à 1 au delà.
Le module du filtre idéal correspond bien à une porte. Dans la représentation ci-dessous, la porte n’est visible que pour des fréquences supérieures à la fréquence de coupure car le module est tracé en échelle logarithmique, donc les amplitudes nulles de la réponse fréquentielle sont renvoyées en \(-\infty\). La phase est linéaire et même constante ; on ne représente pas le retard de groupe qui serait nul. Enfin, le filtre n’ayant pas d’expression sous forme de fonction de transfert, on ne peut pas définir des pôles et des zéros et on ne peut donc pas représenter son diagramme pôles-zéros.
Application#
Nous représentons ci-dessous le signal temporel et son spectre du signal ECG original et des sorties des filtres (RIF, RII et idéal).
On observe que le filtre RIF donne un signal filtré plus « propre » (d’un point de vue médical) que le filtre RII. Le filtre idéal est quant à lui encore meilleur. Cela s’explique par le fait qu’il ne génère aucune oscillation, ni en bande atténuée ni en bande passante, et que par ailleurs le signal basse fréquence de l’ECG est spectralement très différent du signal d’intérêt : on peut donc les séparer proprement par filtrage des fréquences.
Enfin, on peut également observer le retard de groupe important sur le filtre RIF.
Effet de la quantification des coefficients#
En se concentrant sur les deux filtres à réaliser dans ce TP (le filtre RIF et le filtre RII), on constate que la précision des coefficients est importantes. Dans les figures ci-dessous, on a représenté le gain de la réponse fréquentielle des deux filtres en n’utilisant que certains chiffres décimaux des coefficients : une troncature est donc effectuée. On constate que le filtre RIF est plus stable à cette troncature car il respecte le gabarit même si peu de chiffres sont conservés. Cela indique donc que la mémoire utilisée par chaque coefficient peut être moindre avec un filtre RIF qu’avec un filtre RII. Mais ce gain possible en mémoire est contrebalancé par le fait que le filtre RIF nécessite beaucoup plus de coefficients que le filtre RII.