Table des matières Mathematica

Filtres à réponse impulsionnelle finie

1. Signal discret et transformée en Z

Soit x(t) un signal continu échantillonné avec une période Te. Le signal discret correspondant est la suite

xn=x(nTe)(1)

Considérons la transformée de Fourier du signal continu :

X˜(f)=-+x(t)exp(-i2πft)dt(2)

Une approximation de la transformée de Fourier est obtenue à partir du signal discret par la méthode des rectangles :

X˜(f)n=-n=+xnexp(-i2πfnTe)(3)

Lorsque la somme est stoppée à un rang fini, on retrouve la transformée de Fourier discrète.

On pose :

Z=exp(i2πfTe)(4)

La transformée en Z ([1],[2]) du signal discret est définie par :

X(Z)=n=-n=+xnZ-n(5)

La transformée en Z est ainsi l'équivalent pour les signaux discrets de la transformée de Fourier pour les signaux continus. En reportant l'expression (4) de Z dans la transformée en Z, on retrouve en effet l'approximation (3) de la transformée de Fourier.

2. Système linéaire causal à réponse impulsionnelle finie

2.a. Définition

Un système linéaire causal à réponse impulsionnelle finie calcule une suite yn à partir de la suite xn par la relation :

yn=k=0N-1 hkxn-k(6)

où les N coefficients hk sont des constantes réelles. La valeur du signal discret yn à l'instant n est donc obtenue par une combinaison linéaire des N valeurs précédentes du signal xn. Ce système est dit causal car l'état de la sortie ne dépend que des états antérieurs de l'entrée.

On appelle impulsion un signal discret défini par :

x0=1(7)xn=0sin0(8)

Pour une impulsion en entrée, le système linéaire fournit en sortie le signal :

yn=hn(9)

C'est pourquoi la suite hn est appelée la réponse impulsionnelle (discrète) du système. La réponse impulsionnelle est ici finie puisqu'elle comporte N valeurs.

On remarque que le signal de sortie est le produit de convolution du signal d'entrée par la réponse impulsionnelle.

2.b. Fonction de transfert en Z

Ce système constitue un filtre à réponse impulsionnelle finie (filtre RIF). Considérons alors la transformée en Z du signal de sortie :

Y(Z)=n=-n=+k=0N-1 hkxn-kZ-n(10)=n'=-n'=+k=0N-1 hkxn'Z-n'Z-k(11)=(k=0N-1hkZ-k)n'=-n'=+xn'Z-n'(12)=H(Z)X(Z)(13)

H(Z) est la fonction de transfert en Z définie par :

H(Z)=k=0N-1hkZ-k(14)

2.c. Réponse fréquentielle

La réponse fréquentielle du filtre est obtenue en remplaçant Z par l'expression (4) :

H(f)=k=0N-1hkexp(-i2πkfTe)(15)

On remarque que cette réponse fréquentielle ne dépend que de fTe, qui est le rapport de la fréquence du signal sinusoïdal sur la fréquence d'échantillonnage. D'après le théorème de Shannon, ce rapport doit être inférieur à 1/2.

En remarquant que la réponse fréquentielle est de périodicité fe=1/Te (la fréquence d'échantillonnage), considérons les N fréquences suivantes :

fn=nNTe(16)

On a alors

H(fn)=k=0N-1hkexp(-i2πknN)(17)

qui est (à un facteur N près) la transformée de Fourier discrète de la réponse impulsionnelle.

2.d. Exemple

Considérons comme exemple simple un filtre qui réalise la moyenne arithmétique de deux valeurs consécutives de l'entrée :

yn=12(xn+xn-1)(18)

Sa fonction de transfert en Z est :

H(Z)=12(1+Z-1)(19)

Voyons comment tracer sa réponse fréquentielle avec Mathematica :

H[Z_]:=0.5*(1+Z^(-1));
Hf[f_]:=H[Exp[I*2*Pi*f]];
                
Plot[Abs[Hf[f]],{f,0,0.5},PlotRange->{{0,0.5},{0,1}},AxesLabel->{"f/fe","|H|"}]
plotA.pngplotA.pdf
Plot[Arg[Hf[f]],{f,0,0.5},PlotRange->{{0,0.5},{-Pi,Pi}},AxesLabel->{"f/fe","phi"}]
plotB.pngplotB.pdf

Le filtre moyenneur est un filtre passe-bas (assez peu sélectif). Le déphasage varie linéairement avec la fréquence. Cela se vérifie sur l'expression suivante de la réponse fréquentielle :

H(f)=cos(πfTe)exp(-iπfTe)(20)

Pour simuler l'action de ce filtre sur un signal, considérons le signal continu suivant et son échantillonnage :

x[t_]:=Cos[2*Pi*t]+0.05*Random[];
tmax=5;
n=1000;
tn=Table[(k-1)*tmax/n,{k,n}];
xn=Table[x[tn[[k]]],{k,n}];
                
ListPlot[Transpose[{tn,xn}],Joined->True,AxesLabel->{"t","x"}]
plotC.pngplotC.pdf

Pour obtenir le signal discret filtré, il suffit d'effectuer la convolution avec la réponse impulsionnelle. Le premier point calculé correspond à l'instant Te, c'est pourquoi l'échelle de temps doit être modifiée.

h={0.5,0.5};
yn=ListConvolve[h,xn];
tn=Table[k*tmax/n,{k,n-1}];
                
ListPlot[Transpose[{tn,yn}],Joined->True,AxesLabel->{"t","y"}]
plotD.pngplotD.pdf

3. Filtres RIF à phase linéaire

3.a. Définition et propriétés

Pour un filtre à phase linéaire, le déphasage est une fonction linéaire de la fréquence. La réponse fréquentielle a donc la forme suivante :

H(f)=G(f)exp(-iφ(f))(21)φ(f)=2πfτ(22)

La phase d'une composante de fréquence f devient en sortie du filtre :

2πft-φ(f)=2πf(t-τ)(23)

Toutes les fréquences du signal subissent le même décalage τ en traversant le filtre. τ est le temps de propagation. Si toutes les composantes spectrales sont dans la bande passante, pour laquelle G(f)=1, on obtient :

y(t)=x(t-τ)(24)

La forme du signal n'est pas modifiée par le filtrage en bande passante. Si on pose P=feτ (P entier), la fonction de transfert en Z d'un filtre à phase linéaire dans la bande passante est donc :

Hbp(Z)=Z-P(25)

En isolant le terme contenant la phase, la réponse fréquentielle s'écrit d'après l'expression(15) :

H(f)=exp(-i2πfPTe)k=0N-1hkexp(-i2π(k-P)fTe)(26)

Après un changement de variable dans la somme, on en déduit l'expression du gain :

G(f)=k=-PN-1-Phk+Pexp(-i2πkfTe)(27)

On veut que G(f) soit réel. Il faut donc que la réponse impulsionnelle soit symétrique par rapport à l'indice P, c'est-à-dire :

hk+P=h-k+P(28)

On en déduit que N=2P+1. N est donc impair. Il est toutefois possible d'obtenir un filtre RIF à phase linéaire avec N pair en posant P-12=feτ .

3.b. Synthèse par série de Fourier

Soit la suite définie par :

gk=hk+P(-PkP)(29)

Elle vérifie la propriété g-k=gk. La réponse fréquentielle s'écrit

H(f)=exp(-i2πfτ)k=-PPgkexp(-i2πkfTe)=exp(-i2πfτ)G(f)(30)

En considérant la limite P , on obtient alors :

G(f)=k=-+gkexp(-i2πkfTe)(31)

On obtient un filtre à phase linéaire mais à réponse impulsionnelle infini (impossible à réaliser). Cette expression a toutefois l'avantage de faire apparaître gk comme les coefficients de Fourier de la fonction G(f), fonction de période fe=1/Te. On a ainsi :

gk=1fe0feG(f)exp(i2πkffe)df(32)

Puisque g-k=gk, ces coefficients sont réels et la fonction G(f) est paire.

Pour une fonction de gain G(f) souhaitée, on calcule les coefficients de Fourier gk puis on tronque la série de Fourier à un rang P de manière à obtenir la réponse impulsionnelle finie définie par :

hk=gk-P(0k2P)(33)

Cette méthode revient à appliquer un fenêtrage rectangulaire aux coefficients de Fourier. La fonction G(f) effectivement obtenue après troncature est donc le produit de convolution de la fonction souhaitée par la transformée de Fourier de la fenêtre. En pratique, il est préférable d'appliquer d'autres types de fenêtres, comme les fenêtres de Hanning ou Hamming.

3.c. Exemple : filtre RIF passe-bas

La fonction de gain souhaitée est définie sur l'intervalle [-fe/2,fe/2] par :

G(f)=1pour-fcffc(34)=0pourfc<|f|fe2(35)

Les coefficients de Fourier de cette fonction sont :

gk=1kπsin(2πkfcfe)(36)

Le résultat peut s'exprimer avec la fonction sinus cardinal et ne dépend que du rapport de la fréquence de coupure sur la fréquence d'échantillonnage a=fcfe :

gk=2asinc(2πka)(37)

Considérons le cas d'une troncature par une fenêtre rectangulaire au rang P. La fonction suivante calcule les coefficients hk :

reponseImp[a_,p_]:=Table[2*a*Sinc[2*Pi*(k-p)*a],{k,0,2*p}];

Par exemple pour un filtre d'ordre N=21 (P=10) avec a=0.2, on obtient :

h=reponseImp[0.2,10];

La fonction suivante permet d'obtenir la réponse fréquentielle :

reponseFreq[h_,f_]:=Sum[h[[k]]*Exp[-I*2*Pi*k*f],{k,Length[h]}];

Voici le tracé du gain et de la phase du filtre :

Plot[Abs[reponseFreq[h,f]],{f,0,0.5},AxesLabel->{"f/fe","G"}]
plotE.pngplotE.pdf
Plot[Arg[reponseFreq[h,f]],{f,0,0.5},AxesLabel->{"f/fe","phi"}]
plotF.pngplotF.pdf

On constate que la phase est bien linéaire dans la bande passante, mais le gain présente des ondulations très fortes. Dans la bande atténuée, il y a des discontinuités de π de la phase. Bien sûr, les différences par rapport à la fonction de transfert souhaitée sont dûes à la troncature de la réponse impulsionnelle.

Essayons une troncature par une fenêtre de Hann :

reponseImp[a_,p_]:=Table[2*a*Sinc[2*Pi*(k-p)*a]*0.5*(1+Cos[(k-p)*2*Pi/(2*p+1)]),
                {k,0,2*p}];
p=10;
h=reponseImp[0.2,p];
                
Plot[Abs[reponseFreq[h,f]],{f,0,0.5},AxesLabel->{"f/fe","G"}]
plotG.pngplotG.pdf
Plot[Arg[reponseFreq[h,f]],{f,0,0.5},AxesLabel->{"f/fe","phi"}]
plotH.pngplotH.pdf

Les ondulations dans la bande passante et dans la bande atténuée sont considérablement réduites. La linéarité de la phase dans la bande passante est toujours assurée.

Lorsque ce filtre est utilisé dans un système de traitement du signal temps-réel, pour un signal situé dans la bande passante, la sortie présente un retard de τ=PTe par rapport à l'entrée. Cela se comprend aisément en remarquant que le point prépondérant pour le calcul de yn est xn-P (terme g0). Pour obtenir un filtre très sélectif, il faut augmenter P. Si le retard τ doit rester fixe, il faut parallèlement augmenter la fréquence d'échantillonnage.

Pour l'analyse de données expérimentales (échantillon fini), le retard τ n'a aucune signification physique et peut être annulé de la manière suivante. Soit Q le nombre de points de l'échantillon. Le premier point de la sortie calculé est y2P puisqu'il faut au moins 2P+1 valeurs antérieures de xn pour appliquer la convolution. Ce premier point est en retard de τ=PTe par rapport à l'entrée. Annuler le retard revient donc à attribuer l'instant (2P-P)Te=PTe à ce premier point. Ainsi, le dernier point calculé yQ-2P correspond à l'instant (Q-P)Te. L'application du filtrage revient donc à enlever les P premiers instants et les P derniers instants de l'échantillon. Voyons cela sur un exemple.

On fait un échantillonnage d'un signal comportant du bruit :

x[t_]:=Cos[2*Pi*t]+0.1*Random[];
tmax=2;
n=200;
tnx=Table[(k-1)*tmax/n,{k,n}];
xn=Table[x[tnx[[k]]],{k,n}];
                

Le filtrage se fait avec la fonction de convolution :

yn=ListConvolve[h,xn];

Comparons les longueurs des deux listes :

{200, 180}

Comme prévu, la sortie a perdu 2P points par rapport à l'entrée. Pour ne pas avoir de décalage entre le signal filtré et le signal d'origine, l'échelle de temps du signal filtré est calculée comme suit :

tny=Table[tnx[[p+k]],{k,Length[yn]}];

On trace les deux signaux :

ListPlot[Transpose[{tnx,xn}],Joined->True,AxesLabel->{"t","x"}]
plotI.pngplotI.pdf
ListPlot[Transpose[{tny,yn}],Joined->True,AxesLabel->{"t","y"}]
plotJ.pngplotJ.pdf

Le signal traité est bien synchrone avec le signal d'origine; les P premiers et les P derniers points sont perdus. Dans un filtre numérique temps-réel, la sortie serait décalée de τ=PTe vers la droite.

Références
[1]  M. Bellanger,  Traitement numérique du signal,  (Dunod, 1998)
[2]  E. Tisserand, J.F. Pautex, P. Schweitzer,  Analyse et traitement des signaux,  (Dunod, 2008)
Creative Commons LicenseTextes et figures sont mis à disposition sous contrat Creative Commons.