TP3 : Analyse Temps-Fréquence
Introduction
L'analyse temps-frequence est une technique essentielle pour etudier des signaux non
stationnaires, c'est-a-dire des signaux dont les caracteristiques frequentielles evoluent
au cours du temps. Contrairement a la Transformee de Fourier (TF) classique, qui donne
une vue globale du spectre, les methodes temps-frequence permettent de suivre les
evolutions spectrales locales.
Dans ce TP, nous allons explorer differentes methodes d'analyse temps-frequence :
• La Transformee de Fourier a Court Terme, (Short-Time Fourier Transform ‘STFT’)
• La Transformee de Wigner-Ville, (Wigner-Ville transform)
• La Transformee en ondelettes continues, (Continuous wavelet transform ‘CWT’)
Objectifs
1. Comprendre les limitations de la TF classique pour les signaux non stationnaires.
2. Appliquer la STFT pour visualiser l'evolution frequentielle des signaux.
3. Experimenter la distribution de Wigner-Ville.
4. Decouvrir la transformee en ondelettes continues et ses avantages.
Program1
import numpy as np ;import [Link] as plt ;import [Link] as sp ;import
pywt
# Parametres du signal
NF = 1024 # Taille de la FFT ;Te = 0.0025 # Periode d'echantillonnage
fe = 1 / Te # Frequence d'echantillonnage ;N = round(2 / Te) # Nombre d'echantillons
t = [Link](0, 2, N)
# Generation des signaux Chirp
x1 = [Link](t, f0=100, t1=2, f1=2, method='linear')
x2 = [Link](t, f0=2, t1=2, f1=100, method='linear')
# Calcul de la TF par FFT
TFx1 = [Link](x1, NF) ;TFx1 = [Link](TFx1)
TFx2 = [Link](x2, NF) ;TFx2 = [Link](TFx2)
freq = [Link](-NF / 2, NF / 2) * fe / NF
# Affichage des signaux et de leur spectre
[Link](figsize=(12, 8)) ;[Link](221) ;[Link](t, x1) ;[Link]('Chirp de 100 a 2 Hz')
1
[Link](222) ;[Link](freq, [Link](TFx1)) ;[Link]('Spectre Chirp de 100 a 2 Hz')
[Link](223) ;[Link](t, x2) ;[Link]('Chirp de 2 a 100 Hz') ;
[Link](224) ;[Link](freq, [Link](TFx2)) ;[Link]('Spectre Chirp de 2 a 100 Hz')
plt.tight_layout() ;[Link]()
# Calcul des spectrogrammes
f, tt, Sxx1 = [Link](x1, fe, nperseg=100, noverlap=20)
f, tt, Sxx2 = [Link](x2, fe, nperseg=100, noverlap=20)
# Affichage des spectrogrammes
[Link](figsize=(12, 8)) ;[Link](221) ;[Link](t, x1) ;[Link]('Chirp de 100 a 2 Hz')
[Link](222) ;[Link](tt, f, Sxx1) ;[Link]('Frequence [Hz]')
[Link]('Temps [sec]') ;[Link]('Spectrogramme Tfen=100, TRec=20')
[Link](223) ;[Link](t, x2) ;[Link]('Chirp de 2 a 100 Hz')
[Link](224) ;[Link](tt, f, Sxx2) ;[Link]('Frequence [Hz]')
[Link]('Temps [sec]') ;[Link]('Spectrogramme Tfen=100, TRec=20')
plt.tight_layout() ;[Link]()
# Calcul des spectrogrammes avec des parametres differents
f, tt, Sxx1 = [Link](x1, fe, nperseg=20, noverlap=4)
f, tt, Sxx2 = [Link](x2, fe, nperseg=20, noverlap=4)
# Affichage des spectrogrammes avec des parametres differents
[Link](figsize=(12, 8)) ;[Link](221) ;[Link](t, x1) ;[Link]('Chirp de 100 a 2 Hz')
[Link](222) ;[Link](tt, f, Sxx1) ;[Link]('Frequence [Hz]')
[Link]('Temps [sec]') ;[Link]('Spectrogramme Tfen=20, TRec=4')
[Link](223) ;[Link](t, x2) ;[Link]('Chirp de 2 a 100 Hz')
[Link](224) ;[Link](tt, f, Sxx2) ;[Link]('Frequence [Hz]')
[Link]('Temps [sec]') ;[Link]('Spectrogramme Tfen=20, TRec=4')
plt.tight_layout() ;[Link]()
# Calcul et affichage de la CWT
Larg = [Link](1, 31) ;cwtmatr, fs = [Link](x2, Larg, 'mexh')
# Affichage de la CWT
[Link](figsize=(10, 6))
2
[Link](cwtmatr, aspect='auto', vmax=abs(cwtmatr).max(), vmin=-
abs(cwtmatr).max())
[Link]('Transformee en Ondelette Continue (CWT) du Chirp de 2 a 100 Hz')
[Link]('Echelle') ;[Link]('Temps [sec]') ;[Link](label='Amplitude')
[Link]()
Questions
1. Quel est le role de la fonction [Link]() utilisee dans ce code ?
2. A quoi sert [Link]() dans le calcul de la transformee de Fourier ?
3. Quelle est la frequence d’echantillonnage fe utilisee dans le script ?
4. Explique la difference entre les deux signaux x1 et x2 en termes de variation de
frequence.
5. Pourquoi observe-t-on des differences entre les spectrogrammes obtenus avec
nperseg=100 et nperseg=20 ? Explique la difference entre les deux spectrogrammes.
6. Pourquoi observe-t-on des pentes ascendantes ou descendantes dans les
spectrogrammes des signaux x1 et x2 ?
7. Pourquoi la CWT est-elle pertinente ici, et que revele-t-elle par rapport au
spectrogramme classique ?
8. Interpretez le contenu de la figure de la Transformee en Ondelette Continue (CWT).
Qu’est-ce que les variations d’amplitude et d’echelle revelent sur la structure
frequentielle du signal x2 ?
9. Comparez l'information fournie par la FFT, le spectrogramme et la CWT dans ce code.
Quels sont les avantages et les inconvenients de chaque methode d'analyse du signal
non-stationnaire ?
Program2
import numpy as np ;import [Link] as plt ;import [Link] as signal
from [Link] import WignerVilleDistribution
# Parametres
fe = 1000 # Frequence d'echantillonnage (Hz) ;T = 2 # Duree du signal (s)
t = [Link](0, T, T * fe, endpoint=False) # Axe temporel
# Generation du chirp (frequence de 10 Hz a 200 Hz)
f0 = 10 # Frequence initiale ;f1 = 200 # Frequence finale
chirp_signal = [Link](t, f0=f0, f1=f1, t1=T, method='linear')
# Affichage du signal temporel
3
[Link](figsize=(10, 4)) ;[Link](t, chirp_signal) ;[Link]("Temps (s)")
[Link]("Amplitude") ;[Link]("Signal Chirp lineaire (10 Hz → 200 Hz)")
[Link]() ;[Link]()
# Calcul de la distribution de Wigner-Ville
wvd = WignerVilleDistribution(chirp_signal, timestamps=t) .[Link]()
[Link](kind='contour', show_tf=True)
Questions
1. Que represente l’axe vertical dans le graphique issu de la distribution de Wigner-Ville?
2. Pourquoi le signal `chirp_signal` est-il bien adapte a une analyse temps-frequence ?
3. Quel est l’effet de la frequence d’echantillonnage (`fe = 1000 Hz`) sur la representation
temps-frequence ?
4. Que permet l’instruction [Link]() dans le code ?
5. La distribution de Wigner-Ville est dite "quadratique". Explique pourquoi.
6. Decrivez un inconvenient majeur de la distribution de Wigner-Ville pour les signaux
multicomposants.
7. Pourquoi la Wigner-Ville peut-elle surpasser un spectrogramme en resolution, et a
quel prix ?
Exercice
1. Generer un signal multi-composant :
o Un sinus a 10 Hz entre t=0s et t=1s.
o Un sinus a 50 Hz entre t=1s et t=2s.
o Un sinus a 100 Hz entre t=2s et t=3s.
2. Appliquer la Transformee de Fourier classique et commenter les resultats.
3. Appliquer la STFT avec deux longueurs de fenetres differentes 128 et 32. Afficher et
Compare les spectrogrammes obtenus.
4. Que se passe-t-il quand tu diminues la longueur de la fenetre ?
5. Quelle configuration donne une meilleure resolution en temps ? En frequence ?
6. Appliquer la CWT avec une ondelette de Morlet. # Generation d'un signal non-stationnaire
7. Analyser les differences avec la STFT. t = [Link](0, 3, 1000, endpoint=False)
signal1 = [Link](2 * [Link] * 10 * t[t < 1])
signal2 = [Link](2 * [Link] * 50 * t[(t >= 1) & (t < 2)])
signal3 = [Link](2 * [Link] * 100 * t[t >= 2]])
4 sig = [Link]([signal1, signal2, signal3])