Mathematica, page 1

Contenu : Traitement d'un fichier de nombres

code Mathematica, permettant de charger et traiter un fichier de nombres, FFT


Ce fichier est créé par le logiciel 'Vibrations' (rédigé dans le cadre des olympiades de la physique 1998 - 1999), à partir d'un enregistrement effectué à l'aide d'une carte son, sur 16 bits. Les nombres, résultant des mesures, sont écrits à la suite les uns des autres, séparés par des tabulations.
Ce logiciel vous est proposé en téléchargement gratuit. Voir le chapitre logiciels ou olympiades.

Voici le code Mathematica :
Nous commençons par désaffecter les variables, et vider la mémoire.
ClearAll["Global`*"];
adresse="C:\\Mesdoc\\Olympiades\\Sons\\tmp3";

Remarquez que l'adresse du fichier doit être écrite 'à la main' entièrement. Le séparateur est le double \, comme en langage C, car \ suivi d'une lettre peut parfois être une fonction Mathematica, ce qui entraîne des erreurs difficilement détectables.
Nous lisons la liste créée par 'Vibrations' en tant que nombres.
suite = ReadList[adresse, Number];
nPoints=Length[suite]
suiteCourte = Drop[suite,Ceiling[0.1 nPoints]];
suiteCourte = Drop[suiteCourte,-Ceiling[0.85 nPoints]];
ListPlot[suite, PlotJoined->True, PlotRange->All];
ListPlot[suiteCourte, PlotJoined->True, PlotRange->All];
(* ListPlot[suite, PlotJoined->True, PlotRange->{All,{-32768,+32767}}]; *)

Pour créer un effet de zoom, nous coupons par Drop, les deux extrémités de la suite de nombres obtenue.
La ligne de code mise en remarque, par (* *) permet d'afficher en ordonnées, l'échelle complète des valeurs mesurables sur 16 bits. Nous constatons que les courbes obtenues sont très lisses, bien que notre signal soit relativement faible. Ce ne serait pas du tout le cas sur 8 bits.
Nous effectuons maintenant une transformée de Fourier, numérique rapide, ou FFT, sur un nombre quelconque de points.
Mathematica permet cela, car il ne décompose pas la liste seulement selon des puissances de 2, mais en employant des nombres premiers. Rappelons que notre logiciel 'Vibrations' permet aussi une telle transformation de Fourier numérique sur un nombre quelconque de points, mais selon une méthode 'lente'.
La durée de calcul pour la méthode 'lente' est approximativement proportionnelle au carré du nombre de termes ; celle de la FFT est à peu près proportionnelle au nombre de termes.

amplitude=Abs[Fourier[suite]];
freqEchant=11025 ; nPointsSpectre=Ceiling[nPoints/2]
liste=Table[{((i-1)freqEchant)/Length[suite],amplitude[[i]]},{i, nPointsSpectre}];
La fréquence d'échantillonnage est entrée à la main, car le fichier ne contient que les mesures. Nous constituons une liste de couples (fréquence, module (Abs) donné par la FFT).
ListPlot[liste, PlotJoined->True, PlotRange->All, ImageSize->{500,300}];

Et encore un effet de zoom !
listeCourte= Drop[liste,-Ceiling[0.9 nPointsSpectre]];
listeCourte= Drop[listeCourte,Ceiling[0. nPointsSpectre]];
Length[listeCourte]
ListPlot[listeCourte, PlotJoined->True, PlotRange->All, ImageSize->{500,300}];

Vous pouvez transférer ce code par copier coller, pour limiter les risques d'erreurs.

puce En ce cas, veillez, après le Coller dans une page Mathematica, à tronçonner le texte, par Cell | Divide Cell. Sinon, Mathematica va interpréter les commentaires comme des opérations sur des variables formelles !
Mathematica 3 possède une fonction ReadSoundFile, mais qui ne marche que pour les enregistrements sur 8 bits.

Haut de cette page