Pour commencer, un peu de code qui vous permettra de charger, puis
de traiter (représentation graphique, spectre en fréquences
par transformation de Fourier rapide, ou FFT, fit) un fichier de nombres.
Ce fichier est calculé par le logiciel 'Vibrations' (rédigé
dans le cadre des olympiades de la physique 1998 - 1999, voir le chapitre
olympiades), à partir d'un enregistrement effectué à
l'aide d'une carte son, sur 16 bits.
Ce logiciel a été modifié le 25 / 12 / 1999, pour
vous permettre d'effectuer un transfert dans Maple.
Les nombres, résultant des mesures, sont écrits à
la suite les uns des autres, (en colonne), séparés par des
retour chariot (caractère ASCII 10).
Ce logiciel vous est proposé en téléchargement
gratuit, dans les chapitres logiciels ou olympiades.
Voici le code Maple :
>restart;
>Adresse:=`C:/Tempo/Tmp1` :
Ceci initialise Maple, auquel, nous donnons ensuite l'adresse du fichier
de nombres créé par notre logiciel 'Vibrations'.
Vibrations range le fichier converti, sous le nom tmp1, tmp2 ... dans
le dossier contenant les fichiers sons .Wav à convertir.
Notez les accents graves, obtenus avec les touches Alt Gr et 7 pressées
simultanément, suivies d'un appui sur la barre d'espacement, ainsi
que les barres de division.
>longueurFichier:=filepos(Adresse,infinity);
longueurFichier :=579
Ceci nous donne la taille en octets du fichier, mais place le pointeur
en fin dudit fichier. Nous initialisons à nouveau :
>restart;Adresse:=`C:/Tempo/Tmp1` : frequenceEchant := 25 :
>tableauMesures:=array(1..256) :
>for i from 1 to 256 do nombreLu:=readline(Adresse) ;tableauMesures[i]:=[i/frequenceEchant,op(sscanf(nombreLu,`%f`))]
:
od:
Nous donnons à Maple, la fréquence d'échantillonnage,
25 Hz, 'à la main', car le fichier ne contient que les mesures.
>listeCouplesLue:=convert(tableauMesures, `list`):
>plot(listeCouplesLue):
Remarquer les nécessités de conversion de types, en Maple.
(Pour Mathematica, tout est liste).
Passons maintenant à la transformation de Fourier. Maple propose
une transformation numérique, rapide, ou FFT, uniquement pour un
nombre de points de mesure qui soit une puissance de 2. Mathematica effectue
des FFT, sur un nombre quelconque de points. Notre logiciel 'Vibrations'
effectue des FFT sur un nombre de points, puissance de 2 ; mais il accepte
aussi de calculer une transformée numérique de Fourier sur
un nombre quelconque de points (pas trop grand). En ce cas, il adopte une
méthode de calcul 'lente'.
Nous devons fournir à Maple l'exposant du nombre 2, ici 8 pour
une FFT sur 256 points. Nous devons lui donner deux tableaux de nombres,
l'un contenant les valeurs imaginaires de nos mesures, ici des 0, l'autre,
les valeurs réelles, c'est à dire nos mesures. Compte tenu
du fait que, plus haut, nous avons créé une liste de couples
lue, formée des dates de mesure (calculées) et des tensions
mesurées, nous devons récupérer à chaque fois,
le deuxième terme de chaque couple.
>exposant := 8 : longueur := 2^exposant :
>listeImaginaires := array([seq(0, i=1..longueur)]) :
>listeReels := array([seq(listeCouplesLue[i,2], i=1..longueur)]) :
>readlib(FFT) :
>FFT(exposant, listeReels, listeImaginaires) :
Nous chargeons une librairie FFT, et effectuons la transformation rapide.
Les : évitent l'affichage de toutes les valeurs. Lorsque nous souhaitons
les voir pour tester notre code, la ligne doit se terminer par un ;.
A ce stade, Maple a rangé dans nos deux tableaux initiaux, les
parties imaginaires et réelles obtenues par FFT.
Nous formons un tableau comportant les fréquences successives
correspondant aux points du spectre, puis construisons un tableau de couples
(fréquence, module de la FFT). Il ne nous reste plus qu'à
tracer le spectre.
>dureeEnregistrement := longueur/frequenceEchant :
>listeFrequences := array([seq((i-1)/dureeEnregistrement, i=1..longueur)])
:
>tableauSpectre := NULL :
>for k from 1 to longueur/2 do tableauSpectre := tableauSpectre, [listeFrequences[k],
sqrt(listeReels[k]^2 + listeImaginaires[k]^2)] : od :
> plot([tableauSpectre]) ;