Académique Documents
Professionnel Documents
Culture Documents
Filtrage Numérique
Ce tutorial montre comment synthétiser des filtres numériques en Python.
Home
signal_processing
.ipynb
%matplotlib inline
import scipy.signal as sig # import de la librairie signal (outils pour l'analyse des filtres)
$$H(z)=\frac{2+z^{-1}}{1-0.5z^{-1}}$$
Remarque: Lors de la construction de l'objet TransferFunction, la seconde liste (coefficients $a_l$) doit comporter au minimum
autant d'élements que la première liste (coefficients $b_k$). Dans le cas d'un filtre FIR, il est possible de créer rapidement la
seconde liste de la manière suivante:
num=[1,0,.5,2,0.5,0.3]
den=np.zeros(len(num)) #creation d'un vecteur de même taille que num ne contenant que des 0
print("denominateur: {}".format(den))
denominateur: [ 1. 0. 0. 0. 0. 0.]
L'affichage des pôles et des zéros dans le plan complexe s'obtient en utilisant la librairie matplotlib.
https://www.enib.fr/~choqueuse/articles/signal_processing/filtrage_numerique.html 1/5
08/02/2022 18:08 Vincent Choqueuse Website
plt.plot(np.real(tf.zeros),np.imag(tf.zeros),'ro',label="zeros")
plt.plot(np.real(tf.poles),np.imag(tf.poles),'bx',label="poles")
plt.legend()
ax=plt.gca()
ax.add_patch(patch)
La librairie scipy intègre plusieurs fonctions permettant l'analyse d'un filtre numérique. Dans les différents TP, nous utiliserons les
fonctions suivantes:
Réponse impulsionnelle
La réponse impulsionnelle s'obtient en utilisant la fonction dimpulse. Cette fonction retourne deux paramètres:
Pour afficher une réponse impulsionnelle, au lieu d'utiliser la fonction plot, il est préférable d'utiliser la fonction stem de
matplotlib. Cette affichage permet de mieux mettre en évidence la valeur des échantillons.
plt.stem(h[0])
plt.ylabel("Réponse Impulsionnelle")
https://www.enib.fr/~choqueuse/articles/signal_processing/filtrage_numerique.html 2/5
08/02/2022 18:08 Vincent Choqueuse Website
Réponse Fréquentielle
Scipy intègre différentes fonctions pour le calcul de la réponse fréquentielle (dfreqresp et bode). Nous utiliserons principalement
la fonction dfreqresp. La fonction dfreqresp prend en entrée un objet TransferFunction et renvoie deux sorties:
Pour obtenir le module et l'argument de la réponse fréquentielle, il est ensuite possible d'utiliser les fonctions abs et angle de
numpy.
w, H = sig.dfreqresp(tf)
module=np.abs(H)
plt.plot(w,module)
plt.ylabel("Module")
plt.xlabel("pulsation (rad/s)")
plt.figure()
plt.plot(w,phase)
plt.ylabel("Phase (deg)")
plt.xlabel("pulsation (rad/s)");
Les réponses fréquentielles précédentes sont représentées avec une échelle linéaire. Il est parfois intéressant d'utiliser une
échelle logarithmique. Les instructions suivantes montrent comment passer le gain de l'échelle linéaire à l'échelle logarithmique.
https://www.enib.fr/~choqueuse/articles/signal_processing/filtrage_numerique.html 3/5
08/02/2022 18:08 Vincent Choqueuse Website
plt.semilogx(w,20*np.log10(module))
plt.ylabel("Module (db)")
plt.xlabel("pulsation (rad/s)");
A titre d'illustration, lorsqu'une sinusoide de pulsation $\omega_0=0.1$ rad/s est appliquée en entrée, la réponse du filtre
s'obtient de la manière suivante:
n_vect=np.arange(1000)
x=np.sin(0.1*n_vect)
y=sig.lfilter(b,a,x)
plt.plot(x,label="entree")
plt.plot(y,label="sortie")
plt.xlabel("temps (echantillons)")
plt.legend();
https://www.enib.fr/~choqueuse/articles/signal_processing/filtrage_numerique.html 4/5
08/02/2022 18:08 Vincent Choqueuse Website
Lorsque nous filtrons un signal, le contenu fréquentiel du signal est modifié. Pour analyser l'effet d'un filtre, il peut être
interessant de visualiser le contenu fréquentiel avant et après filtrage. En pratique, la visualisation du contenu fréquentiel peut
s'obtenir en utilisant la technique du périodogramme.
#generation du signal
fe=1000
t=np.arange(0,1,1/fe)
x=sig.square(2*np.pi*50*t)
#filtrage du signal
y=sig.lfilter([1],[1,-0.99],x)
plt.semilogy(f, Pxx,label="avant")
plt.semilogy(f2, Pyy,label="apres")
plt.ylim([1e-6, 1e2])
plt.xlabel('frequence [Hz]')
plt.legend();
#generation du signal
fe=44100
t=np.arange(0,1,1/fe)
Audio("son.wav")
0:00 / 0:00
https://www.enib.fr/~choqueuse/articles/signal_processing/filtrage_numerique.html 5/5