s
19 708 Pages

en mathématiques, la transformée de Fourier rapide, souvent raccourcie FFT (anglais Transformée de Fourier rapide), Il est algorithme optimisé pour le calcul de la transformée de Fourier discrète (DFT) et son inverse.

La FFT est utilisée dans une grande variété d'applications, de 'traitement numérique du signal à la solution de équation différentielle partielle à algorithmes multiplier entiers grande en raison du faible coût de calcul.

définition

les deux un -pla nombres complexes. La DFT est définie par la formule:

Calculer cette somme directement nécessite une quantité d'opérations arithmétiques . Un algorithme de FFT obtient le même résultat avec un certain nombre d'opérations . En général, ces algorithmes sont basés sur factorisation de , mais il existe des algorithmes FFT pour tout , aussi Les nombres premiers.

Parce que l'inverse de la transformée de Fourier discrète est égale à la DFT, mais avec un signe opposé et exposant un facteur, tout algorithme de FFT peut être facilement inversée.

algorithme de Cooley-Tukey

La FFT le plus courant est l'algorithme de Cooley-Tukey. Cet algorithme est basé sur le principe de diviser et conquérir, et rompt récursive une DFT de toute taille , avec nombre tel que le composé DFT dans les petites tailles et , avec multiplications pour l'unité imaginaire, ladite facteurs tripoter.

Cette méthode (et en général l'idée d'une transformation de Fourier rapide) a été popularisé par une publication de James et William Cooley John Wilder Tukey en 1965, mais plus tard il a été découvert que les deux auteurs avaient indépendamment réinventés un algorithme connu Carl Friedrich Gauss en 1805 [1] (Et ensuite redécouvert dans de nombreuses autres formes limitées).

L'utilisation la plus connue de l'algorithme de Cooley-Tukey est de diviser et de se transformer en deux morceaux à chaque étape, et il est donc optimisée que pour les dimensions qui sont des puissances de deux, mais en général, on peut utiliser tout factorisation (comme il était connu à la fois Gauss que Cooley et Tukey). Ces cas sont appelés respectivement cas racine 2 et racine mélangée (Mais il existe d'autres approches avec des noms spécifiques). Bien que l'idée de base est mise en oeuvre récursive, la plupart des traditionnels réarranger l'algorithme pour éviter la récursivité explicite. De plus, parce que l'algorithme de Cooley-Tukey brise la DFT en plus petits DFT, il peut être arbitrairement combiné avec tout autre algorithme pour la TFD, tels que ceux décrits ci-dessous.

Une mise en œuvre itérative C ++ FFT basé sur l'algorithme de Cooley-Tukey est la suivante:

#include 
#include 
#define MAX 200
en utilisant espace de noms std;
int log2(int N)    // fonction pour calculer le logarithme en base 2 d'un nombre entier
{
int k = N, la = 0;
tandis que(k) {
k >> = 1;
la++;
}
retour la - 1;
}
int vérifier(int n)    // utilisé pour vérifier si le nombre de composantes du vecteur d'entrée est une puissance de 2
{
retour n > 0  (n  (n - 1)) == 0;
}
int inverse(int N, int n)    // calcule le nombre de sens inverse tout entier n par rapport au nombre maximal N
{
int j, p = 0;
pour(j = 1; j <= log2(N); j++) {
si(n  (1 << (log2(N) - j)))
p | = 1 << (j - 1);
}
retour p;
}
vide ordre(complexe<double> * f1, int N)     // a les éléments du vecteur leur ordonnant d'inverser l'ordre
{
complexe<double> f2[MAX];
pour(int la = 0; la < N; la++)
f2[la] = f1[inverse(N, la)];
pour(int j = 0; j < N; j++)
f1[j] = f2[j];
}
vide transformer(complexe<double> * fa, int N)     // calculer le vecteur transformé
{
ordre(fa, N);    // premier ordre avec l'ordre inverse
complexe<double> W[N / 2]; // unité de vecteur de zéros.
// Première N / 2-1, mais génère l'erreur avec le cycle suivant
// comme il essaie de copier dans une zone non affectée « W [N / 2-1] »
W[1] = polaire(1., -2. * M_PI / N);
W[0] = 1;
pour(int la = 2; la < N / 2; la++)
W[la] = bang(W[1] la);
int n = 1;
int à = N / 2;
pour(int j = 0; j < log2(N); j++) {
pour(int la = 0; la < N; la++) {
si(!(la  n)) {
/ * Pour chaque doublement de l'étape n, les index sont utilisés * /
/ * « I » pris tour à tour en groupes de n, une fois et non. * /
complexe<double> Temp = fa[la];
complexe<double> Temp = W[(la * à) % (n * à)] * fa[la + n];
fa[la] = Temp + Temp;
fa[la + n] = Temp - Temp;
}
}
n * = 2;
à = à / 2;
}
}
vide FFT(complexe<double> * fa, int N, double )
{
transformer(fa, N);
pour(int la = 0; la < N; la++)
fa[la] * = ; // multiplier le vecteur pour le terrain afin d'avoir le transporteur est entré en vigueur
}
int principal()
{
int n;
faire {
cout << « Indique la taille du vecteur, ce qui est une puissance de 2 » << endl;
cin >> n;
} tandis que(!vérifier(n));
double ;
cout << « Entrez la taille de l'étape d'échantillonnage » << endl;
cin >> ;
cout << « Intervalle d'échantillonnage = » <<  << endl;
complexe<double> vEC[MAX];
cout << « Entrez le transporteur d'échantillonnage » << endl;
pour(int la = 0; la < n; la++) {
cout << « Entrez le composant d'index » << la << endl;
cin >> vEC[la];
cout << "Index" <<la<< "=" << vEC[la]  << endl;
}
FFT(vEC, n, );
cout << « Tableau Transformé » << endl;
pour(int j = 0; j < n; j++)
cout << vEC[j] << endl;
retour 0;
}

D'autres algorithmes pour calculer la FFT

Il existe d'autres algorithmes de FFT sur la Cooley-Tukey. N = N1N2 avec N1 et N2 numéros me couvrir l'algorithme peut être utilisé par Good-Thomas PFA (Primes facteur faFT Algorithm), sur la base Restes Chinois Théorème, DFT que pris en compte d'une manière similaire à la Cooley-Tukey. L'algorithme FFT Rader-Brenner est une factorisation similaire au système Cooley-Tukey mais avec des facteurs de purement imaginaires, Twiddle réduisant le nombre de multiplications au prix d'une augmentation de l'addition et de l'instabilité numérique.

Les algorithmes qui subdivisent récursive la TFD dans les petites exploitations autres que DFT comprennent l'algorithme Bruun et QFT. (Les algorithmes de Rader-Brenner et QFT ont été proposées aux dimensions qui sont des puissances de 2, mais est tout. L'algorithme Bruun qui peut être adapté pour les numéros composés peuvent être appliqués à toutes les tailles aussi composé). En particulier, l'algorithme de la FFT est basée sull'interpretare Bruun FFT comme factorisation récursive polynôme zn-1 en polynômes avec des coefficients réels sous la forme zm-1 et z2m+azm+1.

Un autre point de vue polynôme est exploitée par l'algorithme de FFT Winograd, qui factorisé zn-1 polynôme cyclotomique, qui ont souvent des coefficients de 1, 0 ou -1, et nécessitent donc peu (le cas échéant) la multiplication, il peut donc être utilisé pour obtenir FFT avec un minimum de multiplications et est souvent utilisé pour trouver des algorithmes efficaces pour les petits facteurs. En effet Winograd il a montré que la TFD peut être calculée avec seulement O (N) multiplications; Malheureusement, cet objectif est atteint avec un beaucoup plus grand nombre de compléments, un échange plus favorable moderne processeurs équipé de puces dédiées pour les multiplications à virgule flottante. En particulier, l'algorithme Winograd permet également l'utilisation de l'algorithme que celui de PFA et Rader pour FFT avec des dimensions qui sont des nombres premiers.

Un autre algorithme de FFT pour les nombres premiers est due à L. I. Bluestein, et est parfois appelé algorithme gazouiller-z: Riesprime la DFT en tant que convolution, dont la taille peut être amené à une puissance de deux et évalué par la FFT Cooley-Tukey.

algorithmes FFT spécialisés pour des données réelles et / ou symétrique

Dans de nombreuses applications les données d'entrée pour le DFT sont réels pur, auquel cas le résultat satisfait la symétrie

et les algorithmes de FFT ont été développés en conséquence de cette situation[1]. Une approche consiste à réutiliser un algorithme ordinaire et supprimer des composants informatiques redondants, économie d'environ un à deux facteurs d'occupation de la mémoire et le temps pris. Vous pouvez exprimer transformée de Fourier discrète un n-uplet avec un nombre égal d'éléments, tout aussi vrai que la transformée discrète complexe de la moitié de la taille d'origine dont les parties réelle et imaginaire sont les éléments pairs et impairs des éléments d'origine, suivi par O (n) d'opérations de post-traitement .

On pensait autrefois que les n-uplets de biens pour le calcul de la TFD pourraient être calculées de manière plus efficace avec la Hartley discrète Transform (appelé DHT l'acronyme de iscrete HArtley TRANSFORMER), mais il a été découvert plus tard qu'ils peuvent généralement être identifiés algorithmes FFT spécialisés qui nécessitent moins des opérations dans l'algorithme de DHT correspondant. Même l'algorithme Bruun a été proposé de tirer parti des nombres réels en entrée, mais il n'a jamais été populaire.

Précision et approximations

Tous les algorithmes de FFT présentés afin de calculer exactement le bien DFT (au sens arithmétique, à savoir négliger les erreurs dues à des calculs en virgule flottante). Cependant, ont également été proposé des algorithmes de FFT qui calculent la TFD environ, avec une erreur qui peut être fait arbitrairement petit au prix d'un effort de calcul plus élevé. Ces algorithmes échangent l'erreur d'approximation en faveur d'une plus grande vitesse ou d'autres caractéristiques. Les exemples sont l'algorithme FFT, Edelman et al. (1999), la FFT par Guo et Barrus (1996) basé sur ondelette ou celui de Shentov et al. (1995).

Même les algorithmes FFT « exacte » comportent des erreurs lors de l'utilisation à virgule flottante arithmétique précision finie, mais ces erreurs sont généralement très faibles; la plupart des algorithmes de FFT ont d'excellentes propriétés numériques. L'erreur relative limite supérieure pour l'algorithme de Cooley-Tukey est O (log ε n), contre O (ε n02/03) Par la formule DFT original (Monsieur et Sande, 1966). Ces résultats, cependant, sont très sensibles à la précision des facteurs tripoter utilisé dans la FFT (qui sont alors les valeurs des fonctions trigonométriques), et il est pas rare que les petites implémentations précises de la FFT ont une précision bien pire, par exemple si elles utilisent des tables trigonométriques inexactes de valeurs. Certains d'algorithmes de FFT, comme le Rader-Brenner, sont par nature moins stables.

En arithmétique point fixe, les erreurs de précision accumulées par des algorithmes de FFT sont pires, et de plus en plus comme O (√ n) pour l'algorithme de Cooley-Tukey[2]. En outre, ce degré de précision exige une attention et des facteurs pour minimiser la Mettre à l'échelle perte de précision, et les algorithmes de FFT à virgule fixe nécessitent la renormalisation à chaque étape intermédiaire de décompositions comme dans le Cooley-Tukey.

Pour vérifier l'exactitude d'une implémentation d'un algorithme de FFT, garanties strictes peuvent être obtenues en temps O (n log n) avec une procédure simple qui vérifie la propriété de linéarité, de la réponse impulsionnelle et le temps invariance pour les données d'entrée aléatoire[3].

notes

  1. ^ H.V. Sorensen, D, L Jones, M.T. Heideman et C.S. Burrus. (1987, Juin). Fourier rapide valeur réelle des algorithmes de transformation. IEEE Transactions on Signal Processing, 35 (6), 849-863.
  2. ^ Traitement numérique du signal, A. V. Oppenheim, R. W. Schafer, Prentice Hall, 1975
  3. ^ Funda Ergün, 1995 Contrôle des fonctions linéaires à plusieurs variables. Vaincre le goulot d'étranglement du générateur, Proc Symposium 27 ACM sur la théorie de l'informatique: 407-416.

bibliographie

  • (FR) Gilbert Strang, vaguelettes, en american Scientist, vol. 82, nº 3, mai-Juin 1994, p. 253. Récupéré le 8 Octobre, 2013.
  • (FR) D. F. Elliott, K. R. Rao, 1982 rapide: transforme les algorithmes, analyses, applications. New York: Academic Press.
  • (FR) Funda Ergün, 1995 Proc. 27 ACM Symposium sur la théorie de l'informatique: 407-416.
  • (FR) M. et S. G. Frigo Johnson, 2005 "La conception et la mise en œuvre de fftw3," Compte rendu de l'IEEE 93: 216-231.
  • (FR) Carl Friedrich Gauss, 1866. "Theoria interpolationis Methodo nova tractata," Werke bande 3, 265-327. Göttingen: Königliche Gesellschaft der Wissenschaften.
  • (FR) W. M. Gentleman et G. Sande, 1966 "de Fourier rapide pour le plaisir et transforme le profit," Proc. AFIPS 29: 563-578.
  • (FR) H. Guo et C. S. Burrus, 1996 Proc. SPIE Intl. Soc. Opt. Eng. 2825: 250-259.
  • (FR) H. Guo, G. A. Sitton, C. S. Burrus, 1994 Proc. Conf IEEE. Acoust. Discours et Sig. Traitement (ICASSP) 3: 445-448.
  • (FR) Steve et Heidi Haynal Haynal, "Recherche et Génération familles d'algorithmes FFT" Journal sur Satisfiabilité, Modélisation et calcul Boolean vol. 7, pp. 145-187 (2011).
  • (FR) S. G. Johnson et M. Frigo, 2007. "Une FFT split-radix modifié avec moins d'opérations arithmétiques," IEEE Trans. traitement du signal 55 (1): 111-119.
  • (FR) Lundy et T. J. Van Buskirk, 2007. « Une nouvelle approche de matrice pour TFR réelle et circonvolutions de longueur 2k," informatique 80 (1): 23-45.
  • (FR) Kent, Ray D. et Read, Charles (2002). Analyse acoustique de la parole. ISBN 0-7693-0112-6. Cites Strang, G. (1994) / Mai-Juin). Vaguelettes. American Scientist, 82, 250-255.
  • (FR) James C. Schatzman, 1996 Précision de la transformée de Fourier discrète et transformée de Fourier rapide, SIAM J. Sci. Comput. 17: 1150-1166.

Articles connexes

liens externes

autorités de contrôle GND: (DE4136070-9