Série de Fourier d’un créneau¶
On considère le signal créneau de période défini par :
avec et .
Tracez avec Python le spectre de ce signal pour allant de -10 à 10, c’est-à-dire le module (
numpy.abs) et la phase (numpy.angle) de la série de Fourier de (qui a été calculée en TD)
On souhaite maintenant reconstruire le signal temporel en ne considérant que les premières harmoniques.
Grâce à la formule de la série de Fourier inverse, tracez le signal temporel reconstruit pour une valeur de fixée (c’est-à-dire pour ). Il peut être utile dans ce cas d’utiliser une boucle
forsur . Attention, il faut considérer la partie réelle du résultat car le signal obtenu peut contenir une composante imaginaire due aux erreurs numériques.Quel signal obtenez-vous pour , puis pour ?
Tracez ensuite le signal reconstruit en prenant des valeurs de de plus en plus grandes. Que constatez-vous ?
Transformée de Fourier discrète d’un signal numérique¶
On considère le signal suivant de longueur échantillons :
Créez et affichez le signal . Une façon élégante de faire cela est de s’inspirer du premier exercice du TP 1.
L’algorithme FFT (Fast Fourier Transform), qui permet de calculer rapidement une TFD (transformée de Fourier discrète),
est implémenté dans la fonction numpy.fft.fft.
La TFD étant périodique de période , elle n’est tracée que sur une seule période.
Les questions suivantes ont pour objectif de représenter la TFD de trois façons différentes.
Spectre non centré, en fonction des échantillons¶
La fonction numpy.fft.fft retourne la TFD de
en fonction des échantillons fréquentiels , numérotés de 0 à .
Représentez le module et la phase de la TFD entre 0 et . Prenez soin de définir le vecteur des abscisses que l’on réutilisera par la suite (vous pouvez par exemple utiliser
numpy.arange).
Spectre centré, en fonction des échantillons¶
En général, on préfère centrer la TFD autour de 0, donc entre les échantillons et (si est pair), ou et (si est impair).
Pour cela, il faut d’une part redéfinir le vecteur des abscisses
(la fonction numpy.floor renvoie la partie entière qui permet de gérer la parité de ) :
k = np.arange(N) - np.floor(N/2)et d’autre part utiliser numpy.fft.fftshift qui déplace la deuxième moitié d’un vecteur au début de celui-ci, par exemple :
Tracez le module et la phase de en les centrant autour de 0.
Spectre centré, en fonction des fréquences¶
Chaque échantillon du spectre peut être relié à une fréquence particulière, à condition de connaître la « période d’échantillonnage » entre deux échantillons du signal temporel. On peut montrer (cf. Échantillonnage) que la fréquence correspondant à l’échantillon est .
Tracez le module et la phase de centrée et avec un axe des abscisses gradué en fréquences, dans le cas où s.
Application¶
Chargez le signal inconnu.csv ( ms) et tracez sa TFD pour déterminer quelle est la fréquence principale de ce signal.
Représentation temps-fréquence¶
Le fichier gamme.wav est un enregistrement d’une gamme musicale au piano. Nous allons chercher quelles sont les notes jouées.
Chargez (
scipy.io.wavfile.read) et affichez le signal.Vérifiez sur la TFD qu’il n’est pas facile de trouver la partition musicale correspondante.
La représentation temps-fréquence du signal permet de retrouver très simplement la partition musicale.
Par exemple, la fonction matplotlib.pyplot.specgram permet d’afficher le spectrogramme d’un signal.
Affichez le spectrogramme du signal en conservant les paramètres par défaut.
Étudiez l’influence des paramètres principaux de la fonction
matplotlib.pyplot.specgrampour comprendre leur signification.Déterminez alors les notes jouées à partir de leur fréquence.