La transformée de Fourier rapide

(Fast Fourier Transform, FFT)

par Don Cross - dcross@intersrv.com

Dernière mise à jour : 15 Décembre 1999

traduit par Jean Debord (JDebord@compuserve.com)


Merci à Don Cross pour avoir autorisé la traduction de ce document. La version originale se trouve à :

http://www.intersrv.com/~dcross/fft.html

Elle est citée dans :


Table des matières


Code source en C/C++

fft.zip - [Dernière mise à jour : 15 Mars 1998.]
Ce fichier contient le code C (compatible C++) permettant de calculer des transformées de Fourier rapides (FFTs). Mon implémentation est basée sur les idées décrites dans le livre Numerical Recipes in Fortran par Press, Teukolsky, Vetterling et Flannery, publié par Cambridge University Press. [Note: Une version intitulée Numerical Recipes in C contient la même information avec des sources C à la place du Fortran.]

Ce code source contient une implémentation pour les tableaux de type float et une autre pour les tableaux de double. Chaque fonction peut calculer la transformée ou son inverse, selon un indicateur passé en paramètre.

fftdom.cpp - Ceci est un exemple de fonction C++ pour trouver la fréquence correspondant au pic de puissance dans les tableaux produits par la FFT. Cette fonction retourne la fréquence en Hz de la partie du spectre ayant le maximum de puissance. Notez que la valeur obtenue peut être un multiple non entier de la fréquence de base f0 = samplingRate / numSamples. Ce code calcule une moyenne pondérée du spectre de puissance encadrant le pic, pour déterminer de manière plus précise la fréquence du pic. Cette technique est analogue à celle qui permettrait de calculer le centre de gravité d'une poutre horizontale dont la densité varie continuellement selon la longueur.



Code source en Turbo Pascal

fourier.pas - [Dernière mise à jour : 11 Décembre 1996.]
Voici l'algorithme de la FFT sous forme d'unité Turbo Pascal. Utilisez la procédure fft pour calculer la transformée directe, et ifft pour la transformée inverse.

testfft.pas - Ceci est un petit programme de test de fourier.pas, qui montre comment utiliser le code.

testfft.zip - Ce fichier ZIP contient testfft.exe et egavga.bgi. Téléchargez-le si vous voulez utiliser le programme testfft sans avoir accès au compilateur Turbo Pascal de Borland.



Code source en Visual Basic

vbfft.bas - [Dernière mise à jour : 1 Août 1999.]
Cette implémentation de l'algorithme FFT en Visual Basic a été faite par Murphy McCauley à partir de mon code Turbo Pascal. L'utilisation de ce code est probablement la manière la plus simple pour inclure la FFT dans votre projet Visual Basic. Avec une version de VB antérieure à la 5, l'exécution risque d'être très lente car le code sera interprété au lieu d'être compilé. Dans ce cas, vous pouvez utiliser ce qui suit :

fftdll.zip - [Dernière mise à jour : 1 Août 1999.]
Ce fichier ZIP contient une DLL que l'on peut lier à un projet VB, ainsi que le code source de la DLL en C. Les instructions sont comprises dans le fichier. Assurez-vous de recréer l'arbre des répertoires lors de la décompression (p.ex. 'pkunzip -d fftdll').

Note : L'auteur original (Don Cross) déclare tout ignorer du Visual Basic. Si vous avez des questions ou des commentaires concernant ce code, veuillez vous adresser à Murphy McCauley à MurphyMc@Concentric.NET, ou bien visitez son site web. Les mises à jour sont publiées régulièrement sur le site de Don Cross (http://www.intersrv.com/~dcross/fft.html).


Code source en Ada

adafft.zip - [Dernière mise à jour : 13 Décembre 1999.]
adafft.tar.gz - [Dernière mise à jour : 13 Décembre 1999.]
Grâce aux efforts de Brian Neal < bneal@ia.net > nous disposons maintenant d'une version de l'algorithme FFT en Ada ! Ces deux fichiers contiennent la même chose ; ils ne diffèrent que par la méthode de compression : format zip ou tar+gzip. Tous les deux sont courts (environ 6K) : choisissez le plus facile à décompresser.

Voyez aussi les techniques de filtrage dans le domaine temporel (en anglais)


Didacticiel sur la transformée de Fourier rapide

1. Introduction à l'audio numérique

Si les concepts de l'audio numérique vous sont familiers, vous pouvez sauter cette section.

Le type le plus courant d'enregistrement audio numérique est appelé modulation par impulsions codées (pulse code modulation, PCM). C'est la technique utilisée par les disques compacts et la plupart des fichiers WAV. Dans un système d'enregistrement PCM, un microphone convertit les variations de pression de l'air (ondes sonores) en variations de voltage. Ensuite, un convertisseur analogique-numérique mesure (échantillonne) le voltage à intervalles de temps réguliers. Par exemple, sur un disque compact, il y a exactement 44,100 échantillons par seconde. Chaque voltage est converti en un entier de16 bits. Un CD contient deux canaux de données : un pour l'oreille droite et un pour l'oreille gauche, afin de produire l'effet stéréophonique. Les deux canaux sont des enregistrements indépendants placés "côte à côte" sur le disque compact. (En fait, les données des deux canaux alternent... gauche, droite, gauche, droite, ... comme les pieds pendant la marche.)

Les données qui résultent d'un enregistrement PCM représentent une fonction du temps. Les gens sont souvent surpris d'apprendre qu'une séquence de millions d'entiers enregistrée sur un disque compact peut reproduire la musique et la parole. Ils ont tendance à demander "Comment un flux de nombres peut-il sonner comme un orchestre entier ?" ; ça paraît magique, et ça l'est ! Cependant la magie n'est pas dans l'enregistrement numérique ; elle est dans votre oreille et votre cerveau. Pour le comprendre, imaginez que vous puissiez placer une caméra microscopique dans votre oreille pour filmer votre tympan au ralenti. Supposez que la caméra soit assez rapide pour prendre une image chaque 1/44100 de seconde. Supposez aussi que les images prises par cette caméra soient si précises que vous puissiez discerner 65536 (64K) positions distinctes du tympan dans son mouvement de va-et-vient en réponse aux ondes sonores incidentes. Si vous utilisiez cette caméra hypothétique pour filmer votre tympan pendant que votre meilleur(e) ami(e) prononce votre nom, puis que vous preniez le film et notiez numériquement la position du tympan dans chaque plan du film, vous auriez un enregistrement PCM. Si vous pouviez ensuite imprimer à votre tympan un mouvement de va-et-vient en accord avec les milliers de nombres que vous avez notés, vous entendriez la voix de votre ami(e) prononçant votre nom exactement comme la première fois. La nature exacte du son importe peu - votre ami(e), une foule, une symphonie - le concept reste le même. Quand vous écoutez plusieurs choses à la fois, les différents sons se combinent dans vos oreilles en une unique variation de pression. Vos oreilles et votre cerveau collaborent pour décomposer ce signal en sensations auditives distinctes. Tout se passe littéralement dans votre tête !

2. Information fréquentielle d'une fonction du temps

Un organe de notre oreille interne appelé la cochlée nous permet de détecter la tonalité des sons que nous entendons. La cochlée est acoustiquement couplée au tympan par une série de trois osselets. Elle consiste en une spirale de tissu baignant dans un liquide et couverte de milliers de cils. Les cils de la face externe de la spirale sont plus longs que ceux de la face interne. En fait, les cils deviennent de plus en plus courts lorsqu'on approche du centre de la spirale. Chaque cil est connecté à une fibre nerveuse qui rejoint le nerf auditif en direction du cerveau. Les cils les plus longs entrent en résonance avec les sons ayant les plus basses fréquences, les cils les plus courts avec les plus hautes fréquences. Ainsi la cochlée transforme les variations de pression captées par le tympan en une information fréquentielle que le cerveau interprète comme une tonalité et une texture. C'est ce qui nous permet de différencier deux touches adjacentes du piano, même si elles sont jouées avec la même intensité. La transformée de Fourier est une technique mathématique qui réalise une tâche analogue : décomposer une fonction du temps en un spectre de fréquences, à la manière d'un prisme qui décompose la lumière en un spectre de couleurs. Cette analogie n'est pas parfaite, mais elle retient l'idée de base.

3. La transformée de Fourier en tant que concept mathématique

La transformée de Fourier est basée sur la découverte que toute fonction périodique du temps x(t) peut être décomposée en une somme infinie de sinus et cosinus dont les fréquences commencent à zéro et augmentent par multiples entiers d'une fréquence de base f0 = 1/T, où T est la période de x(t). Ce développement se présente ainsi :
Fourier Series equation
L'expression du membre de droite est appelée série de Fourier. Le rôle de la transformée de Fourier est de trouver toutes les valeurs ak et bk qui composent la série, connaissant la fréquence de base et la fonction x(t). Vous pouvez considérer le terme a0 à l'extérieur de la somme comme le coefficient du cosinus pour k=0. Il n'y a pas de coefficient correspondant b0 pour le sinus car le sinus de zéro vaut zéro, et donc ce coefficient n'aurait pas d'effet.

Bien sûr, aucun ordinateur réel ne peut calculer de sommes infinies ; il nous faut donc trouver un ensemble fini de sinus et cosinus. C'est facile à faire pour une entrée numérique échantillonnée, si nous stipulons qu'il y ait autant de fréquences en sortie qu'il y a de valeurs temporelles en entrée. Nous profitons aussi du fait que tout enregistrement audio numérique a une longueur finie. Nous pouvons prétendre que la fonction x(t) est périodique, et que la période est égale à la longueur de l'enregistrement. En d'autres termes, imaginons que l'enregistrement se répéte continuellement, et appelons x(t) cette fonction. La durée de la section répétée définit la fréquence de base f0 dans l'équation ci-dessus. En d'autres termes, f0 = samplingRate / N, où N est le nombre d'échantillons dans l'enregistrement.

Par exemple, si vous utilisez un taux d'échantillonnage (samplingRate)de 44100 échantillons / seconde, et que la longueur de votre enregistrement (N) est de 1024 échantillons, la durée représentée par l'enregistrement est 1024 / 44100 = 0.02322 seconde, de sorte que la fréquence de base f0 sera 1 / 0.02322 = 43.07 Hz. Si vous soumettez ces 1024 échantillons à la FFT, vous obtiendrez les coefficients ak et bk des sinus et cosinus pour les fréquences 43.07Hz, 2*43.07Hz, 3*43.07Hz, etc. Pour vérifier que la transformée fonctionne correctement, vous pourriez générer tous les sinus et cosinus correspondant à ces fréquences, les multiplier par leur coefficients ak et bk respectifs, tout additionner, et vous retrouveriez votre enregistrement d'origine ! Il est un peu étrange que tout cela fonctionne !

4. L'algorithme de la transformée de Fourier rapide

La transformée de Fourier discrète est un algorithme qui convertit une fonction du temps à valeurs complexes échantillonnées en une fonction à valeurs complexes de la fréquence, également échantillonnée. La plupart du temps, nous travaillons sur des fonctions à valeurs réelles, donc nous fixons toutes les parties imaginaires des entrées à zéro. Si vous voulez utiliser mon code source, voici quelques points à connaître :

5. Applications de la FFT

L'algorithme FFT convient mieux à l'analyse des enregistrements audio numériques qu'au filtrage ou à la synthèse sonore. Elle permet par exemple d'obtenir l'équivalent logiciel d'un analyseur de spectre, que les ingénieurs utilisent pour tracer le graphe des fréquences contenues dans un signal électrique. Vous pouvez utiliser la FFT pour déterminer la fréquence d'une note dans une musique enregistrée, pour essayer d'identifier des oiseaux ou des insectes, etc. La FFT s'utilise aussi dans des domaines qui n'ont rien à voir avec le son, tels que le traitement d'image (avec une version bi-dimensionnelle de la FFT). La FFT a aussi des applications scientifiques ou statistiques, par exemple pour essayer de détecter des fluctuations périodiques dans les prix du marché, les populations animales, etc. La FFT s'applique aussi à l'analyse des informations sismographiques, qui permettent de prendre des "sonogrammes" de l'intérieur de la Terre. Même l'analyse des séquences d'ADN utilise la transformée de Fourier !

Le principal inconvénient de la FFT dans le traitement du son est que l'enregistrement numérique doit être divisé en blocs de n valeurs, où n doit toujours être une puissance entière de 2. On pourrait prendre la FFT d'un bloc, modifier le tableau de sortie en mettant à zéro les valeurs correspondant aux fréquences situées en dehors d'un certain intervalle, puis calculer la transformée inverse pour retrouver un signal temporel filtré. Quand le signal audio est décomposé de la sorte et traité par la FFT, le résultat filtré présente des discontinuités qui se traduisent par un "clic" à chaque changement de bloc. Par exemple, si l'enregistrement a un taux d'échantillonnage de 44100 Hz, et que les blocs ont une taille n = 1024, il y aura un "clic" audible chaque1024 / (44100 Hz) = 0.0232 seconde, ce qui est extrêmement ennuyeux pour dire le moins.

J'ai pu me débarrasser partiellement de ces discontinuités avec la méthode suivante. Supposez que la taille du tampon est n = 2N. A la première itération, lisez n valeurs du signal d'entrée, calculez la FFT, modifiez la sortie si nécessaire, calculez la transformée inverse, et conservez les données temporelles résultantes dans un premier tampon de sortie. Ensuite, copiez la deuxième moitié du tableau d'entrée sur la première (rappelez-vous que n est une puissance de 2, donc divisible par 2), et lisez n/2 nouveaux points dans la deuxième moitié du tableau. Effectuez à nouveau le traitement (FFT, modification, IFFT) et conservez le résultat dans un nouveau tampon de sortie. Sur la deuxième moitié du premier tampon de sortie, appliquez une atténuation linéaire en multipliant chaque valeur par un coefficient variant de 1 (pour le point d'indice n/2) à 0 (pour le point d'indice n - 1). Sur la la première moitié du deuxième tampon de sortie, appliquez une expansion linéaire (avec des coefficients allant de 0 à 1) et regroupez les deux moitiés pour obtenir une sortie qui soit une transition douce entre les deux parties. Notez que les zones entourant chaque discontinuité sont virtuellement effacées de la sortie, bien qu'un niveau constant soit maintenu. Cette technique marche bien lorsque le traitement ne modifie pas l'information de phase du spectre de fréquences. Par exemple, un filtre passe-bas marchera très bien, mais vous pourrez avoir des distorsions lors d'un décalage de hauteur (pitch shifting).

Voici un exemple de programme en C++ pour cette méthode. Notez en particulier comment les fonctions FadeMix et ShiftData sont appelées par main.

Si vous voulez vraiment un filtrage "propre" des enregistrements audio, vous devriez considérer les filtres temporels (également appelés filtres linéaires), qui traitent les signaux d'entrée un par un, plutôt que par blocs.


Autres sites sur la FFT


Quelques sites apparentés


[Aller à la page de l'audio numérique]
[Aller à la page de Don Cross]