Maple, page 1

Contenu : Charger un fichier de nombres

Du code Maple permettant de charger et traiter un fichier de nombres, FFT


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]) ;

Haut de cette page