liteqz.com
import as wavfile # Lecture du fichier rate, data = wavfile. read ( '') x = data [:, 0] # Sélection du canal 1 # Création de instants d'échantillons t = np. linspace ( 0, data. shape [ 0] / rate, data. shape [ 0]) plt. plot ( t, x, label = "Signal échantillonné") plt. ylabel ( r "Amplitude") plt. title ( r "Signal sonore") X = fft ( x) # Transformée de fourier freq = fftfreq ( x. size, d = 1 / rate) # Fréquences de la transformée de Fourier # Calcul du nombre d'échantillon N = x. size # On prend la valeur absolue de l'amplitude uniquement pour les fréquences positives et normalisation X_abs = np. abs ( X [: N // 2]) * 2. 0 / N plt. plot ( freq_pos, X_abs, label = "Amplitude absolue") plt. xlim ( 0, 6000) # On réduit la plage des fréquences à la zone utile plt. title ( "Transformée de Fourier du Cri Whilhelm") Spectrogramme d'un fichier audio ¶ On repart du même fichier audio que précédemment. Le spectrogramme permet de visualiser l'évolution des fréquences du signal au cours du temps. import as signal import as wavfile #t = nspace(0, [0]/rate, [0]) # Calcul du spectrogramme f, t, Sxx = signal.
C'est donc le spectre d'un signal périodique de période T. Pour simuler un spectre continu, T devra être choisi très grand par rapport à la période d'échantillonnage. Le spectre obtenu est périodique, de périodicité fe=N/T, la fréquence d'échantillonnage. 2. Signal à support borné 2. a. Exemple: gaussienne On choisit T tel que u(t)=0 pour |t|>T/2. Considérons par exemple une gaussienne centrée en t=0: dont la transformée de Fourier est En choisissant par exemple T=10a, on a pour t>T/2 Chargement des modules et définition du signal: import math import numpy as np from import * from import fft a=1. 0 def signal(t): return (-t**2/a**2) La fonction suivante trace le spectre (module de la TFD) pour une durée T et une fréquence d'échantillonnage fe: def tracerSpectre(fonction, T, fe): t = (start=-0. 5*T, stop=0. 5*T, step=1. 0/fe) echantillons = () for k in range(): echantillons[k] = fonction(t[k]) N = tfd = fft(echantillons)/N spectre = T*np. absolute(tfd) freq = (N) for k in range(N): freq[k] = k*1.
0/T plot(freq, spectre, 'r. ') xlabel('f') ylabel('S') axis([0, fe, 0, ()]) grid() return tfd Voyons le spectre de la gaussienne obtenue avec la TFD superposée au spectre théorique: T=20. 0 fe=5. 0 figure(figsize=(10, 4)) tracerSpectre(signal, T, fe) def fourierSignal(f): return ()*(**2*f**2) f = (start=-fe/2, stop=fe/2, step=fe/100) spectre =np. absolute(fourierSignal(f)) plot(f, spectre, 'b') axis([-fe/2, fe, 0, ()]) L'approximation de la TF pour une fréquence négative est donnée par: La seconde moitié de la TFD () correspond donc aux fréquences négatives. Lorsque les valeurs du signal sont réelles, il s'agit de l'image de la première moitié (le spectre est une fonction paire). Dans ce cas, l'usage est de tracer seulement la première moitié. Pour augmenter la résolution du spectre, il faut augmenter T. Il est intéressant de maintenir constante la fréquence d'échantillonnage: T=100. 0 axis([0, fe/2, 0, ()]) 2. b. Exemple: sinusoïde modulée par une gaussienne On considère le signal suivant (paquet d'onde gaussien): avec.
get_window ( 'hann', 32)) freq_lim = 11 Sxx_red = Sxx [ np. where ( f < freq_lim)] f_red = f [ np. where ( f < freq_lim)] # Affichage # Signal d'origine plt. plot ( te, x) plt. ylabel ( 'accélération (m/s²)') plt. title ( 'Signal') plt. plot ( te, [ 0] * len ( x)) plt. title ( 'Spectrogramme') Attention Ici vous remarquerez le paramètre t_window('hann', 32) qui a été rajouté lors du calcul du spectrogramme. Il permet de définir la fenêtre d'observation du signal, le chiffre 32 désigne ici la largeur (en nombre d'échantillons) d'observation pour le calcul de chaque segment du spectrogramme.