Transformée
de Fourier rapide
Instructions
Utilisation
Exemple
Principe
La
transformée de Fourier rapide est un outil très
utilisé dans le domaine du traitement de signal. Pour qu'elle
soit relativement rapide, il faut qu'elle soit adaptée au type
de processeur qui doit l'effectuer. J'en ai donc fait une version
optimisée pour les calculs en nombres entiers et utilisant les
fonctions trigonometriques SIN et COS présentées dans la page correspondante.
Pour présenter les résultats que l'on peut en obtenir, j'ai utilisé l'application d'affichage de courbes qui requiert l'utilisation de nombres en virgule flottante 64 bits juste avant l'affichage.
Voici
par exemple la transformée de Fourier d'un signal
sinusoïdal de 2 KHz échantilloné à 512 KHz
pendant 1 ms:

Instructions
ln(nbp)/ln(2) correspond au logarithme en base
2 du nombre de points (exemple: 10 pour nbp=1024)
@temp est l'adresse de la table des nombres complexes dans le domaine
temporel
@freq est l'adresse de la table des nombres complexes dans le domaine
fréquenciel
@temp,ln(nbp)/ln(2) TFR @freq
Transformée
de Foutrier rapide (domaie temporel à
fréquenciel).
@freq est nul si problème (pas assez de mémoire
disponible ou bien ln(nbp)/ln(2) inférieur ou
égal
à zéro)
@freq,ln(nbp)/ln(2) TFR-1 @temp
Transformée
de Foutrier rapide inverse (domaine fréquenciel à
temporel).
@freq est nul si problème (pas assez de mémoire
disponible ou bien ln(nbp)/ln(2) inférieur ou
égal
à zéro)
Utilisation
Ces
fonctions sont optimisées pour manipuler des nombres entiers de
16 bits avec des calculs internes sur 32 bits pour limiter la
propagation des erreurs d'arrondi. Les paramètres
d'entrée sont un pointeur (@temp ou @freq) sur une table de
nombres entiers entiers 16 bits complexes (a+bi) et la taille n
(ou ln(nbp)/ln(2)) qui est une puissance de 2:
@temp ou @freq |
--> |
a(1),b(1) |
@temp ou @freq +4 |
--> |
a(2),b(2) |
@temp ou @freq +8 |
--> |
a(3),b(3) |
... |
... |
... |
@temp ou @freq +4*(2^n-1) |
--> |
a(2^n),b(2^n) |
Dans le
domaine temporel (@temp), il suffit d'initialiser les a(n) par les
échantillons du signal en mettant tous les b(n) à 0. Les
fonctions TFR et TFR-1 allouent de la mémoire (avec
l'instruction MEMOIRE_ALLOUE) qu'il ne faudra pas oublier de
libérer (MEMOIRE_LIBERE) dès que le résultat ne
sera plus utilisé.
Déterminons
par exemple la transformée de Fourier d'un signal
sinusoïdal de 2 KHz sur 512 points, il faut commencer par
générer la table des 512 échantillons:
2 512 * ALLOT CONSTANT @SINUS ( 1024 mots de 16 bits )
0 VARIABLE @FREQ
0 VARIABLE @TEMP
: SINUS_2KHz_512
512 0 DO
I 32768 256 */ SIN 1000 32768 */ @TEMP I 4* + ! ( calcul des a(n) avec une amplitude de 1000 )
0 @SINUS I 4* + 2+ ! ( calcul des b(n) )
LOOP
;
SINUS_2KHz_512
Il n'y a plus qu'à lancer la transformée de Fourier:
@SINUS 9 TFR ( fournit l'adresse de la table des résultats dans le domaine fréquentiel ) @FREQ 2!
On peut ensuite retrouver le signal d'origine en lançant la transformée de Fourier inverse:
@FREQ 2@ 9 TFR-1 ( fournit l'adresse de la table des résultats dans le domaine temporel ) @SINUS 2!
Dès que les résultats sont exploités, il ne faut pas oublier de libérer la mémoire:
@FREQ 2@ MEMOIRE_LIBERE DROP @TEMP 2@ MEMOIRE_LIBERE
La
capture d'écran suivante donne la représentation
graphique d'une transformée de Fourier inverse de 512 points
reconstituant un signal rectangulaire à partir de la
fréquence fondamentale et les 4 premières harmoniques
(impaires):

Cette capture d'écran
donne celle reconstituant un signal triangulaire à partir de la
fréquence fondamentale et des 4 premières harmoniques:

Exemple
Voici
par exemple une étude de plusieurs types de modulations
utilisant le programme fichier fft.txt. Les courbes
présentées dans cette page sont de 1024 points, le
programme permet de les calculer aussi en 256, 512, 2048 et 4096 points.
Tout d'abord, le signal modulant f(t) qui est la somme de 5 sinusoïdales de 3, 6, 9, 12 et 15 KHz:

Voici maintenant la porteuse F(t), une sinusoïdale de 80 KHz:

La modulation d'amplitude (MA):


La modulation d'amplitude à porteuse supprimée (MAPS):


Et enfin la modulation d'amplitude à bande latéral unique (BLU):

