On cherche à faire l'analyse spectrale d'un son émis par un instrument de musique, à une hauteur constante. L'enregistrement du son se fait dans un fichier WAV. On demande à l'instrumentiste de jouer une note en maintenant le son puis on effectue l'enregistrement après l'attaque, pendant une durée d'environ 1 seconde. Avec un instrument à vent ou à corde frottée, il est possible d'obtenit un son d'amplitude à peu près constante pendant une seconde.
Importation des modules :
import math import numpy as np from matplotlib.pyplot import * import scipy.io.wavfile as wave from numpy.fft import fft
Lecture du fichier WAV :
rate,data = wave.read('piano_la3.wav') n = data.size duree = 1.0*n/rate
Fréquence d'échantillonnage (en Hz) et durée de l'enregistrement :
print(rate) --> 44100
print(duree) --> 4.08671201814059
Tracé du signal :
te = 1.0/rate t = np.arange(n)*te figure(figsize=(12,4)) plot(t,data) xlabel("t (s)") ylabel("amplitude") axis([0,0.1,data.min(),data.max()]) grid()figA.pdf
Calcul du spectre avec la transformée de Fourier discrète, pour une fenêtre dont on précise le début et la durée (en secondes) :
def tracerSpectre(data,rate,debut,duree): start = int(debut*rate) stop = int((debut+duree)*rate) spectre = np.absolute(fft(data[start:stop])) spectre = spectre/spectre.max() n = spectre.size freq = np.arange(n)*1.0/n*rate vlines(freq,[0],spectre,'r') xlabel('f (Hz)') ylabel('A') axis([0,0.5*rate,0,1]) grid()
figure(figsize=(12,4)) tracerSpectre(data,rate,0.0,0.5) axis([0,5000,0,1])figB.pdf
Pour une fenêtre de même durée débutant plus tard :
figure(figsize=(12,4)) tracerSpectre(data,rate,2.0,0.5) axis([0,5000,0,1])figC.pdf