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é.
Le fichier WAV peut être lu sous forme d'un objet son :
file = "clarinette_la3.wav";
son = Import[file]plotA.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.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.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.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.pdf
La fréquence fondamentale est de 441,0 Hz plus ou moins 0,5 Hz.
signal = Import["clarinette_re1.wav","Data"][[1]];
spectre[signal,1000,3000,{{0,4000},{0,0.001}}]plotF.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.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.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.pdf
Le spectre est ici complètement différent, avec le rang 2 et le rang 3 presque au même niveau.
signal = Import["fluteBec_la4.wav","Data"][[1]];
spectre[signal,1000,3000,{{0,6000},{0,0.001}}]plotJ.pdf
Les harmoniques de rang 3 et 5 sont visibles, mais sont très faibles par rapport au fondamental.