FFT TD - Lycée Victor Hugo

publicité
Lycée Victor Hugo
MP-MP*-PC-PC*-PSI 2016-2017
TD : Transformée de Fourier discrète et rapide
Le spectre d’un signal est un outil précieux pour analyser et traiter des données : filtrage
analogique ou numérique en électronique, filtrage spatial en imagerie (utilisé notamment dans
la compression d’image au format JPEG), reconnaissance vocale.... Dans le cas d’un signal
numérique, sa détermination s’effectue par le calcul de sa transformée de Fourier discrète (DFT :
Discrete Fourier Transform). Cette séance de TD propose d’étudier deux algorithmes de calcul
de DFT : l’un direct et l’autre récursif, puis de les appliquer sur machine au cas pratique d’une
modulation de fréquence.
I
Définition de la DFT et propriétés
On considère un signal échantillonné à pas constant représenté par une liste ou un tableau x
à N éléments. Comme dans Python, on choisit de commencer les indices à 0. Par définition, sa
transformée de Fourier discrète est une liste (ou un tableau suivant comment on l’implémente)
T F à N éléments tels que :
T F [k] =
N
−1
X
x[i] exp −
i=0
2jπik
N
pour 0 6 k < N
Il est à noter que la présence du nombre complexe j (noté 1j en Python) entraîne que la DFT
est à valeurs complexes dans le cas général. On montre qu’il est possible de retrouver le signal
à l’aide de sa DFT. La formule, appelée la transformée de Fourier discrète inverse (IDFT), est
la suivante 1 :
x[i] =
II
−1
1 NX
2jπik
T F [k] exp +
pour 0 6 i < N
N k=0
N
Calcul direct de la DFT
1. Ecrire une fonction DFT en Python calculant la DFT d’une liste ou d’un tableau. La fonction
doit retourner une liste.
2. Rappeler la ou les différences entre un tableau et une liste dans le langage Python. Comment peut-on passer de l’un à l’autre ?
3. Evaluer la complexité temporelle de DFT.
III
Un algorithme plus efficace : la FFT.
Il est possible d’obtenir une complexité plus faible en utilisant des méthodes récursives : on
dit alors que l’on calcule une transformée de Fourier rapide (FFT : Fast Fourier Transform).
C’est notamment ce type de calcul qui est effectué dans les oscilloscopes numériques que vous
1. Parfois, la DFT et la IDFT sont définies avec le même facteur
des expressions symétriques avec le seul changement j ↔ −j
1
√1
N
devant la somme, ce qui permet d’avoir
Lycée Victor Hugo
MP-MP*-PC-PC*-PSI 2016-2017
utilisez en travaux pratiques de physique. Nous proposons ici d’implémenter la méthode Radix-2
DIT (decimation-in-time).
1
Liste de taille égale à une puissance de 2
Avant d’en comprendre le principe, il faut souligner que la méthode Radix-2 ne fonctionne 2
que pour un signal dont le nombre d’échantillons est une puissance de 2. Si ce n’est pas le cas,
il est nécessaire de compléter la liste des valeurs du signal par un nombre adéquat de zéros.
1. Proposer un moyen de calculer le nombre de zéros nécessaire. On rappelle que le logarithme
en base 2 de N s’écrit en Python log(N,2) et que ceil(p) renvoie l’entier le plus proche
supérieur ou égal à p (fonction log et ceil du module math).
2. Ecrire une fonction a_completer qui prend une liste ou un tableau comme argument et
qui retourne une liste identique mais complétée avec des zéros pour que sa taille soit une
puissance de 2 la plus petite possible.
2
Description de la méthode
On peut montrer que le calcul de la DFT d’une liste x à N éléments peut se découper en
deux si N est pair, chaque moitié pouvant être vue comme une combinaison linéaire de deux
DFT de sous-listes de x à N/2 éléments. Plus précisément, on peut écrire pour 0 6 k < N/2 :
2jπk
O[k]
T F [k] = E[k] + exp −
N
N
2jπk
] = E[k] − exp −
O[k]
2
N
T F [k +
Dans ces formules, E désigne la DFT de la sous-liste de x constituée des éléments d’indices
pairs (E pour even) et O désigne la DFT de la sous-liste de x constituée des éléments d’indices
impairs (O pour odd).
La figure 1 illustre le découpage et la combinaison linéaire
la DFT à 8 éléments en fonction
de des deux DFT à 4 éléments, le terme WNk désignant exp − 2jπk
.
N
3
Implémentation par copie des sous-listes de x
On désire écrire une fonction récursive FFT1 qui retourne la DFT de la liste passée en argument par la méthode Radix-2. On supposera que la liste possède une taille égale à une puissance
de 2.
1. Ecrire le début de la fonction FFT1 en traitant le cas de base.
2. Ecrire le reste de la fonction selon les trois étapes suivantes :
– créer les listes xe et xo des éléments respectivement pairs et impairs de la liste x passée
en argument,
– calculer E et O de manière récursive,
– puis T F par la formule indiquée.
3. En notant C(N ) le nombre d’opérations élémentaires que l’algorithme effectue pour calculer la DFT d’un signal à N éléments, montrer que l’on peut écrire :
C(N ) = aC(N/2) + bN c + d
Donner les valeurs des entiers a et c.
2. A noter qu’il existe des méthodes récursives plus générales sans condition sur la taille de la liste et dont les
cas de bases sont les cas où la taille de la liste est un nombre premier.
2
Lycée Victor Hugo
MP-MP*-PC-PC*-PSI 2016-2017
Figure 1 – principe de la méthode récursive Radix-2 de calcul de FFT
4. En déduire la complexité de cette méthode de calcul de FFT et la comparer avec un calcul
direct de DFT.
4
Implémentation sur place
Afin d’implémenter la méthode Radix-2 "sur place", c’est-à-dire sans avoir à créer les souslistes xe et xo à chaque appel récursif, on écrit une fonction récursive de la forme :
def FFT_rec(x,debut,pas,taille):
qui retourne la DFT de la sous-liste formée à partir de la liste x, cette sous-liste, de taille
égale à taille, étant constituée des éléments de x dont les indices commencent par debut et
augmentent avec un pas égal à pas.
1. Ecrire le contenu de la fonction FFT_rec.
2. Ecrire la fonction FFT qui calcule la FFT d’une liste ou d’un tableau de taille quelconque
passé en argument en utilisant les fonctions a_completer et FFT_rec.
3. Comparer les complexités temporelles et spatiales des deux implémentations précédentes
de la méthode Radix-2.
IV
Mise en pratique
A partir de maintenant, il est demandé de programmer sur machine.
1. Importer l’ensemble des fonctions du module math puis uniquement la fonction exp du
module cmath (pour le calcul de l’exponentielle d’un nombre complexe).
2. Importer les modules matplotlib.pyplot renommé plt et numpy renommé np.
3
Lycée Victor Hugo
MP-MP*-PC-PC*-PSI 2016-2017
3. Ecrire une fonction DFT qui renvoie la DFT d’une liste (ou d’un tableau) passée en argument. On utilisera la méthode au choix parmi les trois proposées précédemment. On
rappelle que le nombre π s’écrit pi et que le nombre complexe j s’écrit 1j en Python.
4. Ecrire une fonction DFTinv qui renvoie la DFT inverse d’une liste (ou d’un tableau) passée
en argument.
5. Calculer TFDinv(TFD([0,1,2])) et commenter.
V
Illustration : spectre d’un signal modulé de fréquence
Les stations radio émettent en France dans la bande FM entre 87 et 108 MHz. Pour chaque
antenne émettrice, une station diffuse son programme autour d’une fréquence précise, appelée
"la porteuse", allouée par les pouvoirs publics (par exemple, on écoute à Dijon France Info sur
101,2 MHz). FM signifie modulation de fréquence : on injecte le signal s(t) à transmettre en
faisant varier légérement la fréquence de l’onde émise autour de la fréquence porteuse fp . Plus
précisément, la fréquence instantanée du signal émis est de la forme f (t) = fp + Ks(t) où K
désigne un facteur de proportionnalité.
On traite le cas simple d’un signal à transmettre sinusoïdal de fréquence fm et d’amplitude
égale à l’unité. Le signal émis par l’antenne s’écrit alors sF M (t) = cos(2πfp t + b sin(2πfm t)), où
b désigne l’indice de modulation. On choisit les valeurs numériques suivantes :
– fréquence de la porteuse : 50 Hz.
– fréquence du signal modulant à transmettre : 5 Hz.
– indice de modulation b = 3.
– durée totale d’émission : 1 s (début d’émission à t = 0).
– nombre d’échantillons N = 512.
1. Avec la fonction linspace, créer le tableau t du temps.
2. Créer ensuite le tableau s_fm des différentes valeurs du signal émis sF M (t).
3. Tracer la courbe sF M (t) sur une figure nommée "signal FM".
On montre que le spectre de sF M (t) est constitué de pics dont les fréquences valent fp +nfm ,
où n est un entier relatif. La règle de Carlson montre que la quasi-totalité (environ 98%)
de la puissance du signal émis se trouve dans les pics dont la fréquence se situe dans
l’intervalle centré sur fp de largeur 2(1 + b)fm .
4. Vérifier qualitativement la régle de Carlson en traçant la densité spectrale en puissance du
signal sF M (t), définie comme la norme au carré de sa transformée de Fourier. Pour cela,
on pourra :
– convertir la TFD de s_fm en tableau.
– calculer la densité spectrale en puissance avec np.abs.
– extraire le sous-tableau de la densité spectrale de 0 à 100 Hz, sachant que la TFD de
s_fm est calculée pour des fréquences de 0 à l’inverse du pas de temps de s_fm, avec un
pas de fréquence égal à l’inverse de la durée d’émission.
– créer le tableau des abscisses des fréquences de 0 à 100 Hz ayant le même nombre
d’éléments du sous-tableau.
4
Téléchargement