Table des matières Python

Analyse spectrale d'un son

1. Analyse spectrale d'un son de fréquence constante

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.zeros(n)
for k in range(n):
    t[k] = te*k
figure(figsize=(12,4))
plot(t,data)
xlabel("t (s)")
ylabel("amplitude") 
axis([0,0.1,data.min(),data.max()])
grid()
			
figAfigA.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.zeros(n)
    for k in range(n):
        freq[k] = 1.0/n*rate*k
    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])
			
figBfigB.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])
			
figCfigC.pdf
Creative Commons LicenseTextes et figures sont mis à disposition sous contrat Creative Commons.