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