Table des matières PDFMathematica

Analyse spectrale d'un son

1. Introduction

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, de manière à obtenir un son constant, en hauteur et en intensité.

2. Traitement avec Mathematica

Le fichier WAV peut être lu sous forme d'un objet son :

 
file = "clarinette_la3.wav";
			
son = Import[file]
plotA.pngplotA.pdf

La courbe du bas est une représentation temporelle du son, qui montre dans le cas présent une amplitude pratiquement constante. La courbe du haut est une analyse temps-fréquence qui montre un spectre constant sur toute la durée du son. On fixe la fréquence d'échantillonnage à la valeur indiquée ci-dessus puis on récupère le signal sous forme d'une liste de valeurs :

  
fe = 22050
signal = Import[file,"Data"][[1]];
			

La fonction suivante effectue le tracé de l'amplitude en fonction du temps, pour une partie du signal. L'unité de temps des arguments debut et duree est la période d'échantillonnage.

tracer[signal_,debut_,duree_]:=Module[{onde},
	onde = Table[{k/fe,signal[[k+debut]]},{k,duree}];
	ListPlot[onde,Joined->True,AxesLabel->{"t (s)","s"}]
]
			
tracer[signal,100,300]
plotB.pngplotB.pdf

Le spectre est obtenu au moyen de la transformée de Fourier discrète. La fonction suivante calcule et trace le spectre sur la partie du signal choisie. La plus grande fréquence du spectre est égale à la moitié de la fréquence d'échantillonnage, ici 10 kHz. La résolution du spectre est égale à l'inverse de la durée de l'échantillon utilisé.

spectre[signal_,debut_,duree_,plotrange_]:=Module[{echantillon,tfd,sp},
	echantillon = Take[signal,{debut,debut+duree}]; 
	tfd = Fourier[echantillon,FourierParameters->{-1,-1}];
	sp = Table[{(k-1)/duree*fe,Abs[tfd[[k]]]*duree/fe},{k,duree/2}];
	ListPlot[sp,Filling->Axis,AxesLabel->{"f(Hz)","|Cn|"},PlotRange->plotrange]
]
			
spectre[signal,100,3000,{{0,5000},{0,0.002}}]
plotC.pngplotC.pdf

Le spectre obtenu est pratiquement discret, avec des raies dont les fréquences sont multiples d'une fréquence fondamentale, ici 440 Hz. Le spectre obtenu fournit donc les coefficients de Fourier du signal, considéré comme une fonction périodique.

Dans l'exemple précédent, l'échantillon choisi a une durée de 3000 points. Voyons une analyse effectuée sur un échantillon de même durée mais situé vers la fin du son :

spectre[signal,20000,3000,{{0,5000},{0,0.002}}]
plotD.pngplotD.pdf

Les 5 premières harmoniques n'ont pratiquement pas changé.

Voyons comment utiliser la TFD pour obtenir la fréquence fondamentale du son, avec une précision de 1 Hz. Pour cela, il faut faire le calcul sur une durée de 1 seconde, ce qui ne pose pas de problème dans le cas présent puisque le spectre semble constant sur cette durée :

spectre[signal,1,22000,{{430,450},{0,0.02}}]
plotE.pngplotE.pdf

La fréquence fondamentale est de 441,0 Hz plus ou moins 0,5 Hz.

3. Exemples

3.a. Clarinette

 
signal = Import["clarinette_re1.wav","Data"][[1]];
				
spectre[signal,1000,3000,{{0,4000},{0,0.001}}]
plotF.pngplotF.pdf

Dans ce registre grave, le spectre est très riche en harmoniques. L'harmonique de rang 3 (correspondant à une octave et une quinte par rapport au fondamental) est ici plus intense que le fondamental. L'harmonique de rang 5 (2 octaves plus une tierce) est le plus intense.

Voyons le Ré une octave plus haut :

signal = Import["clarinette_re2.wav","Data"][[1]];
				
spectre[signal,1000,3000,{{0,4000},{0,0.001}}]
plotG.pngplotG.pdf

Les harmoniques de rang 3 et 5 sont bien présentes mais cette fois-ci plus faibles que le fondamental. L'octave (rang 2) est presque nulle.

Voyons le La une quinte plus haut :

signal = Import["clarinette_la3.wav","Data"][[1]];
				
spectre[signal,1000,3000,{{0,4000},{0,0.001}}]
plotH.pngplotH.pdf

L'harmonique de rang 3 est très intense, alors que le rang 5 est très faible. Une octave plus haut :

signal = Import["clarinette_la4.wav","Data"][[1]];
				
spectre[signal,1000,3000,{{0,6000},{0,0.001}}]
plotI.pngplotI.pdf

Le spectre est ici complètement différent, avec le rang 2 et le rang 3 presque au même niveau.

3.b. Flûte à bec

signal = Import["fluteBec_la4.wav","Data"][[1]];
				
spectre[signal,1000,3000,{{0,6000},{0,0.001}}]
plotJ.pngplotJ.pdf

Les harmoniques de rang 3 et 5 sont visibles, mais sont très faibles par rapport au fondamental.

Creative Commons LicenseTextes et figures sont mis à disposition sous contrat Creative Commons.