Décomposition en série de Fourier et filtrage linéaire
Le but de ce projet Python est d’étudier le filtrage linéaire par des filtres d’ordre 1 et de retrouver le comportement intégrateur et dérivateur de ces filtres. Il permet de plus de réaliser numériquement la décomposition en série de Fourier d’un signal périodique introduit dans les cours d’électricité et de signaux.
1. Décomposition en série de Fourier d’une fonction carré
On rappelle que tout signal périodique 𝑥(𝑡), de période 𝑇, peut se décomposer en série de Fourier : 𝑥 𝑡 =𝐴!+ 𝐴!cos 2𝜋𝑓𝑛𝑡 +𝐵!sin 2𝜋𝑓𝑛𝑡
!
!!!
avec 𝑓=1
𝑇
Les coefficients de la décomposition en série de Fourier se calculent par les formules suivantes :
𝐴!= 1
𝑇 𝑥(𝑡)𝑑𝑡
!
!
!!!
; 𝐴!= 2
𝑇 𝑥(𝑡)cos 2𝜋𝑓𝑛𝑡 𝑑𝑡
!
!
!!!
; 𝐵!=2
𝑇 𝑥(𝑡)sin 2𝜋𝑓𝑛𝑡 𝑑𝑡
!
!
!!!
1.1. Décomposition en série de Fourier
Le but de cette première partie est de réaliser la décomposition en série de Fourier d’un signal carré.
Pour les modélisations, on prendra les valeurs numériques suivantes :
• 𝑓=1 Hz
• 𝑈=1 V
1.1) Dans l’éditeur, importer les modules scientifiques nécessaires pour le problème : -‐ numpy as np
-‐ matplotlib.pyplot as pl
-‐ scipy.integrate as sp (pour le calcul des coefficients de Fourier) 1.2) Déclarer et affecter les variables suivantes :
-‐ la fréquence (notée f) et la période (notée T) de la tension carré -‐ l’amplitude (notée U) de la tension carré
1.3) Définir une fonction (appelée Carre) définissant une fonction valant -‐U si 𝑡 <0 et +U si 𝑡 >0.
1.4) Sans calcul, prévoir quels sont les termes nuls de la décomposition en série de Fourier de la fonction Carre.
1.5) Initialiser un vecteur (appelé E) contenant 51 valeurs, toutes égales à 0.
1.6) A l’aide de la fonction quad, calculer les 50 premiers termes non nuls de la décomposition en série de Fourier de la fonction Carre. On les affectera dans les composantes du vecteur E.
Aide : La fonction quad du module integrate de scipy permet de réaliser du calcul intégral numérique. Cette fonction possède trois arguments d’entrée obligatoires :
2 Projet Python 3 : Décomposition en série de Fourier et filtrage linéaire 1 -‐ la fonction que l’on souhaite intégrer
2 -‐ la borne inférieure de l’intégrale 3 -‐ la borne supérieure de l’intégrale
Elle renvoie en argument de sortie un nombre complexe, de partie imaginaire négligeable. Pour récupérer la partie réelle de cet argument de sortie, correspondant à la valeur de l’intégrale, on prend sa première composante. On utilise également un argument d’entrée facultatif (selon la syntaxe args=(k)) pour indexer le résultat du calcul. On écrira donc la ligne de commande suivante pour calculer le kième terme de la décomposition en série de Fourier :
E[k]= 2.0*sp.quad(lambda t,k: Carre(t)*np.sin(2*np.pi*k*t),-T/2,T/2,args=(k))[0]
1.7) Tracer le spectre de la fonction créneau. Pour cela, on effectue une boucle, avec, pour chaque valeur de k, un appel de la fonction pl.plot selon la syntaxe :
pl.plot([k,k],[0,np.abs(E[k])],’r’,linewidth=4).
1.2. Retour à la fonction décomposée
Pour vérifier que la décomposition en série de Fourier correspond bien au signal dont on est parti, on peut calculer et tracer les sommes de Fourier.
Définition : La somme de Fourier de rang 𝑁 revient à tracer la fonction 𝑓(𝑡) correspondant à : 𝑓 𝑡 = 𝐸!sin 2𝜋𝑓𝑛𝑡
!
!!!
1.8) Définir un vecteur (noté t) contenant 1000 points et dont les valeurs sont comprises entre −𝑇 et 𝑇.
1.9) Tracer les sommes de Fourier de rang 2, 5, 10 et 50 sur l’intervalle 𝑡= −𝑇,𝑇 . Commenter.
Aide : Pour calculer la somme de Fourier de rang n, on utilisera la fonction sum selon la syntaxe : s = [sum(E[k]*np.sin(2*np.pi*k*x) for k in range(1,n+1)) for x in t]
2. Filtrage par un filtre du premier ordre
On a vu dans le chapitre E6 que tout signal périodique impair pouvant se décomposer en une somme de fonctions sinus et la réponse de chacune de ses composantes étant connue grâce à la fonction de transfert du filtre, il suffit de sommer ces réponses pour obtenir le signal de sortie résultant :
1 -‐ On décompose le signal d’entrée en une somme de fonctions sinusoïdales du temps : 𝑒 𝑡 =𝑒!+ 𝑒!(𝑡)
!
=𝑒!+ 𝐸!sin 𝑛𝜔𝑡
!
!!!
avec 𝜔=2𝜋
𝑇
Dans cette décomposition, 𝑒! correspond à la valeur moyenne du signal d’entrée et les termes 𝑒!(𝑡) correspondent aux différents harmoniques du signal.
2 -‐ On détermine la réponse du filtre à chacune des composantes du signal d’entrée grâce à la fonction de transfert du filtre :
𝑠! = 𝐻(0)𝑒! et 𝑠! 𝑡 =𝑆!sin 𝑛𝜔𝑡+𝜓! avec 𝑆! = 𝐻(𝑛𝜔)𝐸!
𝜓!=Arg 𝐻(𝑛𝜔) Cette étape de traitement effectué sur chaque harmonique du signal est le filtrage.
3 -‐ On superpose les termes obtenus pour déterminer le signal de sortie résultant : 𝑠 𝑡 =𝑠!+ 𝑠!(𝑡)
!
=𝑠!+ 𝑆!sin 𝑛𝜔𝑡+𝜓!
!
Projet Python 3 : Décomposition en série de Fourier et filtrage linéaire 3
2.1. Filtre passe-‐bas d’ordre 1
On s’intéresse ici au filtrage de la fonction carré par un filtre passe-‐bas d’ordre 1.
Pour les modélisations, on prendra les valeurs numériques suivantes :
• 𝐻!=1
• 𝜔!=60 000 rad.s!!
2.1) Rappeler la forme canonique de la fonction de transfert d’un filtre passe-‐bas d’ordre 1.
• Courbe de gain du diagramme de Bode
2.2) Définir un vecteur (noté frequence) contenant 1000 points et dont les valeurs sont comprises entre 𝑓=0 Hz et 𝑓=150 kHz.
2.3) A partir du vecteur précédent, définir le vecteur pulsation réduite : 𝑥=𝜔/𝜔!.
2.3) Définir un vecteur (appelé H_PB) contenant les valeurs de la fonction de transfert complexe du filtre passe-‐bas d’ordre 1 pour les différentes valeurs de la pulsation réduite.
2.4) Définir un vecteur (appelé GdB_PB) contenant la valeur du gain en décibels du filtre passe-‐bas d’ordre 1 pour les différentes valeurs de la pulsation réduite.
La fonction pl.semilogx du module matplotlib.pyplot qui permet de tracer une courbe dans un repère semi-‐logarithmique selon l’axe des abscisses (de même, la fonction pl.semilogy permet de tracer une courbe dans un repère semi-‐logarithmique selon l’axe des ordonnées).
2.5) Tracer la courbe de gain du diagramme de Bode du filtre passe-‐bas d’ordre 1.
• Filtrage du signal carré
Le signal d’entrée est le signal carré de la première partie, dont les différents termes 𝐸! sont stockés dans le vecteur E.
2.6) Initialiser deux vecteurs (appelés S_PB et Phi_PB) contenant 51 valeurs, toutes égales à 0.
2.7) Calculer les 50 premiers termes de 𝑆! et 𝜓! dans le cas où 𝜔=𝜔!. 2.8) Tracer le signal de sortie sur l’intervalle 𝑡= −𝑇,𝑇 .
2.9) Calculer les 50 premiers termes de 𝑆! et 𝜓! dans le cas où 𝜔=𝜔!/100.
2.10) Tracer le signal de sortie sur l’intervalle 𝑡= −𝑇,𝑇 .
2.11) Calculer les 50 premiers termes de 𝑆! et 𝜓! dans le cas où 𝜔=100 𝜔!. 2.11) Tracer le signal de sortie sur l’intervalle 𝑡= −𝑇,𝑇 .
2.12) Quel cas correspondant au comportement intégrateur ? Est-‐ce conforme à la théorie ?
2.2. Filtre passe-‐haut d’ordre 1
On s’intéresse ici au filtrage de la fonction carré par un filtre passe-‐haut d’ordre 1.
2.13) Rappeler la forme canonique de la fonction de transfert d’un filtre passe-‐haut d’ordre 1.
• Courbe de gain du diagramme de Bode
2.14) Définir un vecteur (appelé H_PH) contenant les valeurs de la fonction de transfert complexe du filtre passe-‐bas d’ordre 1 pour les différentes valeurs de la pulsation réduite.
2.15) Définir un vecteur (appelé GdB_PH) contenant la valeur du gain en décibels du filtre passe-‐
bas d’ordre 1 pour les différentes valeurs de la pulsation réduite.
2.16) Tracer la courbe de gain du diagramme de Bode du filtre passe-‐haut d’ordre 1.
4 Projet Python 3 : Décomposition en série de Fourier et filtrage linéaire
• Filtrage du signal carré
Le signal d’entrée est le signal carré de la première partie, dont les différents termes 𝐸! sont stockés dans le vecteur E.
2.17) Initialiser deux vecteurs (appelés S_PH et Phi_PH) contenant 51 valeurs, toutes égales à 0.
2.18) Calculer les 50 premiers termes de 𝑆! et 𝜓! dans le cas où 𝜔=𝜔!. 2.19) Tracer le signal de sortie sur l’intervalle 𝑡= −𝑇,𝑇 .
2.20) Calculer les 50 premiers termes de 𝑆! et 𝜓! dans le cas où 𝜔=𝜔!/100.
2.21) Tracer le signal de sortie sur l’intervalle 𝑡= −𝑇,𝑇 .
2.22) Calculer les 50 premiers termes de 𝑆! et 𝜓! dans le cas où 𝜔=100 𝜔!. 2.23) Tracer le signal de sortie sur l’intervalle 𝑡= −𝑇,𝑇 .
2.24) Quel cas correspondant au comportement dérivateur ? Est-‐ce conforme à la théorie ?