Schnelle Fourier-Transformation

Algorithmus zu Berechnung der diskreten Fourier-Transformation; Zerlegung eines zeitdiskreten Signals in seine Frequenzanteile
(Weitergeleitet von Schnelle Fouriertransformation)

Die schnelle Fourier-Transformation (englisch fast Fourier transform, daher meist FFT abgekürzt) ist ein Algorithmus zur effizienten Berechnung der diskreten Fourier-Transformation (DFT). Mit ihr kann ein zeitdiskretes Signal in seine Frequenzanteile zerlegt und dadurch analysiert werden.

Zeit-basierte Darstellung (oben) und Frequenz-basierte Darstellung (unten) desselben Signals, wobei die untere Darstellung aus der oberen durch Fouriertransformation gewonnen werden kann

Analog gibt es für die diskrete inverse Fourier-Transformation die inverse schnelle Fourier-Transformation (IFFT). Es kommen bei der IFFT die gleichen Algorithmen, aber mit konjugierten Koeffizienten zur Anwendung.

Die FFT hat zahlreiche Anwendungen im Bereich der Ingenieurwissenschaften, der Naturwissenschaften und der angewandten Mathematik. Außerdem kommt sie in Mobilfunktechnologien wie UMTS und LTE und bei der drahtlosen Datenübertragung zum Einsatz, etwa in der WLAN-Funknetztechnik.

Die FFT gehört zu den Teile-und-herrsche-Verfahren, sodass – im Gegensatz zur direkten Berechnung – zuvor berechnete Zwischenergebnisse wiederverwendet und dadurch arithmetische Rechenoperationen eingespart werden können.

Historisch wurde die erste Form des Algorithmus 1805 von Carl Friedrich Gauß entdeckt und zur Berechnung der Flugbahnen der Asteroiden (2) Pallas und (3) Juno verwendet. Zum ersten Mal publiziert wurde eine Variante des Algorithmus von Carl Runge im Jahre 1903 und 1905. Es folgten weitere Adaptionen, beispielsweise von Irving John Good um 1960. Das heute bekannteste Verfahren der Fouriertransformation wird James Cooley und John W. Tukey zugeschrieben, die es auf der Suche nach einem Algorithmus, um Kernwaffentests in seismografischen Daten schnell und effizient aufzuspüren, entdeckten und 1965 veröffentlichten.[1][2] Nach Cooley und Tukey hat es darüber hinaus zahlreiche weitere Verbesserungsvorschläge und Variationen gegeben, so etwa von Georg Bruun, C. M. Rader und Leo I. Bluestein.

Informelle Beschreibung des Algorithmus (Cooley und Tukey)

Bearbeiten

Der Algorithmus von Cooley und Tukey ist ein klassisches Teile-und-herrsche-Verfahren. Voraussetzung für seine Anwendung ist, dass die Anzahl der Stützstellen bzw. Abtastpunkte eine Zweierpotenz ist.

Der Algorithmus basiert auf der Beobachtung, dass die Berechnung einer DFT der Größe 2n in zwei Berechnungen einer DFT der Größe n zerlegbar ist (über den Vektor mit den Einträgen der geraden bzw. der ungeraden Indizes), wobei die beiden Teilergebnisse nach der Transformation wieder zu einer Fouriertransformation der Größe 2n zusammenzufassen sind.

Da die Berechnung einer DFT der halben Länge nur ein Viertel der komplexen Multiplikationen und Additionen der originalen DFT benötigt, und je nach Länge des Ausgangsvektors diese Vorschrift mehrfach hintereinander anwendbar ist, erlaubt die rekursive Anwendung dieser Grundidee schließlich eine Berechnung in   Zeit; zur Einsparung von trigonometrischen Rechenoperationen können bei der FFT zusätzlich die Eigenschaften der Einheitswurzeln aus der Fouriermatrix ausgenutzt werden.

Algorithmus von Cooley und Tukey

Bearbeiten

Die diskrete Fouriertransformation (DFT) eines Vektors   der Dimension   lautet

 .

Die Einträge mit geraden Indizes werden notiert als

 

und deren DFT der Dimension   als  .

Entsprechend seien die Einträge mit ungeraden Indizes notiert als

 

mit DFT  .

Dann folgt

 

Mit der Berechnung von   und   ( ) ist sowohl   als auch   bestimmt. Der Rechenaufwand hat sich durch diese Zerlegung also praktisch halbiert.

Mathematische Beschreibung (allgemeiner Fall)

Bearbeiten

In der Mathematik wird die schnelle diskrete Fouriertransformation in einem wesentlich allgemeineren Kontext behandelt:

Sei   ein kommutativer unitärer Ring. In   sei die Zahl   eine Einheit (d. h. invertierbar); ferner sei   eine  -te Einheitswurzel mit  . Zum Beispiel ist im Restklassenring

  mit  ,  , d ungerade (das ist gleichbedeutend mit der Forderung „teilerfremd zu  “),

das Element   eine solche Einheitswurzel, die entsprechende FFT wird im Schönhage-Strassen-Algorithmus verwendet.

Dann lässt sich im Modul   zu   die diskrete Fouriertransformierte   mit

 

wie folgt optimiert berechnen:

Zunächst stellen wir die Indizes   und   wie folgt dyadisch dar:

 .

Damit haben wir folgende Rekursion:

 ,
 .

Wegen

 

erhalten wir hieraus die diskrete Fouriertransformierte  .

Eigenschaften

Bearbeiten

Diese klassische Variante der FFT nach Cooley und Tukey ist im Gegensatz zur DFT nur durchführbar, wenn die Länge des Eingangsvektors einer Zweierpotenz entspricht. Die Anzahl der Abtastpunkte kann also beispielsweise 4, 8, 16, 32 usw. betragen. Man spricht hier von einer Radix-2-FFT. Andere Längen sind mit den unten angeführten alternativen Algorithmen möglich.

Aus obiger Rekursion ergibt sich folgende Rekursionsgleichung für die Laufzeit der FFT:

 

Hierbei beschreibt der Term   den Aufwand, um die Ergebnisse mit einer Potenz der Einheitswurzel zu multiplizieren und die Ergebnisse zu addieren. Es werden N Paare von Zahlen addiert und N/2 Zahlen mit Einheitswurzeln multipliziert. Insgesamt ist f(N) also linear beschränkt:

 

Mit dem Master-Theorem ergibt sich eine Laufzeit von:

 

Die Struktur des Datenflusses kann durch einen Schmetterlingsgraphen beschrieben werden, der die Reihenfolge der Berechnung festlegt.

Die Aussage hinsichtlich der Höhe der Amplitude eines Signalanteils und dessen Frequenz unterliegt einer Unschärfe: Je enger man die Frequenzbetrachtung fasst, desto weniger ist der Wert der FFT für diese Frequenz genau. Eine Präzisierung ist nur mittels Ausdehnung der FFT mit mehr Stützstellen möglich. Eine Interpretation der Amplituden für Zwischenfrequenzen ist mittels Umrechnungen möglich.[3]

Implementierung als rekursiver Algorithmus

Bearbeiten

Die direkte Implementierung der FFT in Pseudocode nach obiger Vorschrift besitzt die Form eines rekursiven Algorithmus:

  • Das Feld mit den Eingangswerten wird einer Funktion als Parameter übergeben, die es in zwei halb so lange Felder (eins mit den Werten mit geradem und eins mit den Werten mit ungeradem Index) aufteilt.
  • Diese beiden Felder werden nun an neue Instanzen dieser Funktion übergeben.
  • Am Ende gibt jede Funktion die FFT des ihr als Parameter übergebenen Feldes zurück. Diese beiden FFTs werden nun, bevor eine Instanz der Funktion beendet wird, nach der oben abgebildeten Formel zu einer einzigen FFT kombiniert und das Ergebnis wird an den Aufrufer zurückgegeben.

Dies wird nun fortgeführt, bis das Argument eines Aufrufs der Funktion nur noch aus einem einzigen Element besteht (Rekursionsabbruch): Die FFT eines einzelnen Wertes ist (er besitzt sich selbst als Gleichanteil und keine weiteren Frequenzen) er selbst. Die Funktion, die nur noch einen einzigen Wert als Parameter erhält, kann also ganz ohne Rechnung die FFT dieses Wertes zurückliefern; die Funktion, die sie aufgerufen hat, kombiniert die beiden jeweils einen Punkt langen FFTs, die sie zurückerhält, die Funktion, die diese wiederum aufgerufen hat, die beiden 2-Punkte-FFTs, und so weiter.

 

 
 
 
 
 
 
 
 

Der Geschwindigkeitsvorteil der FFT gegenüber der DFT kann anhand dieses Algorithmus gut abgeschätzt werden:

  • Um die FFT eines   Elemente langen Vektors zu berechnen, sind bei Verwendung dieses Algorithmus   Rekursionsebenen nötig. Dabei verdoppelt sich in jeder Ebene die Anzahl der zu berechnenden Vektoren, während sich deren Länge jeweils halbiert, so dass am Ende in jeder bis auf die letzte Rekursionsebene genau   komplexe Multiplikationen und Additionen notwendig sind. Die Gesamtzahl der Additionen und Multiplikationen beträgt also  .
  • Im Gegensatz benötigt die DFT für denselben Eingangsvektor   komplexe Multiplikationen und Additionen.

Implementierung als nichtrekursiver Algorithmus

Bearbeiten

Die Implementierung eines rekursiven Algorithmus ist im Regelfall vom Ressourcenverbrauch her nicht ideal, da die vielen dabei notwendigen Funktionsaufrufe Rechenzeit und Speicher für das Merken der Rücksprungadressen benötigen. In der Praxis wird daher meist ein nichtrekursiver Algorithmus verwendet, der gegenüber der hier abgebildeten, auf einfaches Verständnis optimierten Form je nach Anwendung noch optimiert werden kann:

  • Wenn im obigen Algorithmus zuerst die beiden Hälften des Feldes miteinander vertauscht werden, und dann die beiden Hälften dieser Hälften usw., dann ist das Ergebnis am Ende dasselbe, als würden alle Elemente des Feldes von 0 aufsteigend nummeriert werden und anschließend die Reihenfolge der Bits der Nummern der Felder umgekehrt.
  • Nachdem die Eingangswerte solchermaßen umsortiert sind, bleibt nur noch die Aufgabe, die einzelnen kurzen FFTs von der letzten Rekursionsebene nach außen zu längeren FFTs zu kombinieren, z. B. in Form dreier ineinandergeschachtelter Schleifen:
    • Die äußerste Schleife zählt die Rekursionsebene   durch (von 0 bis N − 1).
    • Die nächste Schleife zählt die   FFT-Abschnitte durch, in der die FFT in dieser Rekursionsebene noch aufgeteilt ist. Der Zähler dieser Schleife wird im Folgenden als   bezeichnet.
    • Die innerste Schleife zählt das Element innerhalb eines FFT-Abschnittes (im Folgenden   genannt) durch (von 0 bis  )
    • In der innersten dieser Schleifen werden nun immer die beiden Samples mit den folgenden beiden Indizes:
 
 
über einen Schmetterlingsgraphen kombiniert:
 

Alternative Formen der FFT

Bearbeiten

Neben dem oben dargestellten FFT-Algorithmus von Cooley und Tukey, auch Radix-2-Algorithmus genannt, existieren noch eine Reihe weiterer Algorithmen zur schnellen Fourier-Transformation. Die Varianten unterscheiden sich darin, wie bestimmte Teile des „naiven“ Algorithmus so umgeformt werden, dass weniger (Hochpräzisions-)Multiplikationen notwendig sind. Dabei gilt meist, dass die Reduktion in der Anzahl der Multiplikationen eine erhöhte Anzahl von Additionen sowie von gleichzeitig im Speicher zu haltenden Zwischenergebnissen hervorruft.

Im Folgenden sind übersichtsartig einige weitere Algorithmen dargestellt. Details und genaue mathematische Beschreibungen samt Herleitungen finden sich in der unten angegebenen Literatur.

Radix-4-Algorithmus

Bearbeiten

Der Radix-4-Algorithmus, und analog dazu der Radix-8-Algorithmus oder allgemein Radix-2N-Algorithmus, ist eine Weiterentwicklung des obigen Radix-2-Algorithmus. Der Hauptunterschied besteht darin, dass die Anzahl der zu verarbeitenden Datenpunkte 4, 8 bzw. 2N beträgt. Die Verarbeitungstruktur bleibt dabei gleich, nur dass in dem Schmetterlingsgraphen pro Element statt zweier Datenpfade vier bzw. acht und allgemein 2N Datenpfade miteinander verknüpft werden müssen. Der Vorteil besteht in einem weiter reduzierten Rechenaufwand und damit Geschwindigkeitsvorteil. So sind, verglichen mit dem obigen Algorithmus von Cooley und Tukey, bei dem Radix-4-Algorithmus ca. 25 % weniger Multiplikationen notwendig. Bei dem Radix-8-Algorithmus reduziert sich die Anzahl der Multiplikationen um ca. 40 %.

Nachteil dieser Verfahren ist die gröbere Struktur und ein aufwendigerer Programmcode. So lassen sich mit Radix-4-Algorithmus nur Blöcke der Längen 4, 16, 64, 256, 1024, 4096, … verarbeiten. Bei dem Radix-8-Algorithmus sind die Einschränkungen analog zu sehen.

Winograd-Algorithmus

Bearbeiten

Bei diesem Algorithmus ist nur eine bestimmte, endliche Anzahl von Stützstellen der Anzahl   möglich, nämlich:

 

wobei alle Kombinationen von   zulässig sind, bei denen die verwendeten   teilerfremd sind. Dadurch ist nur eine maximale Blocklänge von 5040 möglich. Die möglichen Werte für   liegen aber in dem Bereich bis 5040 dichter auf der Zahlengeraden als die Zweierpotenzen. Es ist damit eine bessere Feinabstimmung der Blocklänge möglich. Aufgebaut wird der Algorithmus aus Basisblöcken der DFT, deren Längen mit   korrespondieren. Bei diesem Verfahren wird zwar die Anzahl der Multiplikationen gegenüber dem Radix-2-Algorithmus reduziert, gleichzeitig steigt aber die Anzahl der notwendigen Additionen. Außerdem ist am Eingang und Ausgang jeder DFT eine aufwendige Permutation der Daten notwendig, die nach den Regeln des Chinesischen Restsatzes gebildet wird.

Diese Art der schnellen Fourier-Transformation besitzt in praktischen Implementierungen dann Vorteile gegenüber der Radix-2-Methode, wenn der für die FFT verwendete Mikrocontroller keine eigene Multipliziereinheit besitzt und für die Multiplikationen sehr viel Rechenzeit aufgewendet werden muss. In heutigen Prozessoren mit eigenen Multipliziereinheiten hat dieser Algorithmus keine wesentliche Bedeutung mehr.

Primfaktor-Algorithmus

Bearbeiten

Dieser FFT-Algorithmus basiert auf ähnlichen Ideen wie der Winograd-Algorithmus, allerdings ist die Struktur einfacher und damit der Aufwand an Multiplikationen höher als beim Winograd-Algorithmus. Der wesentliche Vorteil bei der Implementierung liegt in der effizienten Ausnutzung des zur Verfügung stehenden Speichers durch optimale Anpassung der Blocklänge. Wenn in einer bestimmten Anwendung zwar eine schnelle Multipliziereinheit verfügbar ist und gleichzeitig der Speicher knapp, kann dieser Algorithmus optimal sein. Die Ausführungszeit ist bei ähnlicher Blocklänge mit der des Algorithmus von Cooley und Tukey vergleichbar.

Goertzel-Algorithmus

Bearbeiten

Der Goertzel-Algorithmus stellt eine besondere Form zur effizienten Berechnung einzelner Spektralkomponenten dar und ist bei der Berechnung von nur einigen wenigen Spektralanteilen (englisch Bins) effizienter als alle blockbasierenden FFT-Algorithmen, welche immer das komplette diskrete Spektrum berechnen.

Chirp-z-Transformation

Bearbeiten

Bluestein-FFT-Algorithmus für Datenmengen beliebiger Größe (einschließlich Primzahlen).

Die inverse FFT

Bearbeiten

Die Inverse der diskreten Fourier-Transformation (DFT) stimmt bis auf den Normierungsfaktor und ein Vorzeichen mit der DFT überein. Da die schnelle Fourier-Transformation ein Algorithmus zur Berechnung der DFT ist, gilt dies dann natürlich auch für die IFFT.

Anwendungen

Bearbeiten

Computeralgebra

Bearbeiten
 
Schnelle Polynommultiplikation in subquadratischer Laufzeit

Klassische Anwendungen der schnellen Fourier-Transformation finden sich beispielsweise in der Computeralgebra im Zusammenhang der Implementierung schneller Polynome-verarbeitender Algorithmen. Wie im Schaubild rechts illustriert, lässt sich etwa eine schnelle Multiplikation zweier Polynome   und   zu   in subquadratischer Laufzeit realisieren. Dabei werden zunächst die zu den beiden Polynomen   und   korrespondierenden Koeffizientenfolgen durch schnelle Fourier-Transformation in Laufzeit   transformiert, sodass sich die zum Polynom   korrespondierende fouriertransformierte Koeffizientenfolgen durch komponentenweise Multiplikation in Laufzeit   ergibt. Diese wird schlussendlich durch schnelle inverse Fourier-Transformation in Laufzeit   rücktransformiert. Die Gesamtlaufzeit liegt in   und ist damit asymptotisch effizienter im Vergleich zur klassischen Polynommultiplikation mit Laufzeit  .

Weitere Anwendungsgebiete

Bearbeiten

Die weiteren Anwendungsgebiete der FFT sind so vielseitig, dass hier nur eine Auswahl wiedergegeben werden kann:

  • Finanzmathematik
  • Signalanalyse
    • Akustik (Audiomessungen). Eine relativ triviale Anwendung sind viele Gitarrenstimmgeräte oder ähnliche Programme, die von der hohen Geschwindigkeit der FFT profitieren.
    • Berechnung von Spektrogrammen (Diagramme mit der Darstellung der Amplituden von den jeweiligen Frequenzanteilen)
    • Rekonstruktion des Bildes beim MRT oder der Analyse von Kristallstrukturen mittels Röntgenstrahlen, bei denen jeweils die Fouriertransformierte des gewünschten Bildes, bzw. das Quadrat dieser Fouriertransformierten entsteht.
  • Messtechnik / allgemein
    • Digitale Netzwerkanalysatoren, die das Verhalten einer Schaltung, eines Bauelementes oder einer Leitung auf einer Leiterbahn bei Betrieb mit beliebigen Frequenzgemischen zu ermitteln versuchen.
  • Digitale Signalverarbeitung
    • Synthese von Audiosignalen aus einzelnen Frequenzen über die inverse FFT
    • Zur Reduzierung des Berechnungsaufwandes bei der zirkularen Faltung im Zeitbereich von FIR-Filtern und Ersatz durch die schnelle Fouriertransformation und einfache Multiplikationen im Frequenzbereich (siehe auch Schnelle Faltung). Die Schnelle Faltung bietet z. B. die Möglichkeit, beliebige Audio- oder ähnliche Signale mit wenig Rechenaufwand durch auch sehr komplexe Filter (Equalizer etc.) zu transportieren.
    • Kompressionsalgorithmen verwenden oft die FFT. Beispielsweise verwenden das MP3-Format für Audiodaten sowie die JPEG Kompression für Bilder die mit der FFT verwandte diskrete Kosinustransformation[4]. Die FFT von Bildern oder Tönen ergibt oft nur relativ wenige Frequenzanteile mit hohen Amplituden. Dies ist von Vorteil, wenn ein Verfahren zur Speicherung der Ergebnisse verwendet wird, das für die Darstellung niedriger Zahlen weniger Bits benötigt, wie z. B. die Huffman-Kodierung. In anderen Fällen wird ausgenutzt, dass einige der Frequenzen aufgrund von Maskierungseffekten weggelassen werden können, ohne das Ergebnis stark zu beeinträchtigen, so dass der Datenstrom reduziert werden kann.
  • Telekommunikation
    • Längstwellenempfang mit dem PC
    • Breitbanddatenübertragung per OFDM, die Grundlage für ADSL und WLAN (Internet), die verschiedenen DVB-Übertragungsstandards für digitales Fernsehen z. B. über Antenne, Kabel und TV-Satellit, DRM, DAB (Radio) und LTE (Mobilfunk der 4. Generation) ist. Hier wird die hohe Geschwindigkeit der Datenübertragung dadurch erreicht, dass viele relativ langsame Datenübertragungen auf vielen Trägerfrequenzen gleichzeitig betrieben werden. Das komplexe Signal, das durch Überlagerung der einzelnen Signale entsteht, wird dann von der Gegenstelle mittels der FFT wieder in einzelne Signalträger zerlegt.

Literatur

Bearbeiten

Zeitschriftenartikel

Bearbeiten
  • James W. Cooley, John W. Tukey: An algorithm for the machine calculation of complex Fourier series. In: Math. Comput. 19, 1965, S. 297–301.
  • C. M. Rader: Discrete Fourier transforms when the number of data samples is prime. In: Proc. IEEE. 56, 1968, S. 1107–1108.
  • Leo I. Bluestein: A linear filtering approach to the computation of the discrete Fourier transform. In: Northeast Electronics Research and Engineering Meeting Record. 10, 1968, S. 218–219.
  • Georg Bruun: z-Transform DFT filters and FFTs. In: IEEE Trans. on Acoustics, Speech and Signal Processing (ASSP). 26, Nr. 1, 1978, S. 56–63.
  • M. T. Heideman, D. H. Johnson, C. S. Burrus: Gauss and the History of the Fast Fourier Transform. In: Arch. Hist. Sc. 34, Nr. 3, 1985.
  • Alan V. Oppenheim, Ronald W. Schafer: Zeitdiskrete Signalverarbeitung. 3. Auflage. R. Oldenbourg Verlag, München/Wien 1999, ISBN 3-486-24145-1.
  • E. Oran Brigham: FFT. Schnelle Fourier-Transformation. R. Oldenbourg Verlag, München/Wien 1995, ISBN 3-486-23177-4.
  • Steven W. Smith: The Scientist and Engineer’s Guide to Digital Signal Processing. 1. Auflage. Elsevier Ltd, Oxford, 2002, ISBN 0-7506-7444-X, Kap. 18 (englisch, dspguide.com).
Bearbeiten
  • Hans Werner Lang (1997): Schnelle Fouriertransformation (FFT) – Beschreibung der Fourier-Transformation und Einheitswurzeln, auf der Seite der Hochschule Flensburg (deutsch)
  • Bedeutung der FFT-Analyse in der Audiotechnik – (Beispiel-Grafik: Rechtecksignal) (deutsch)
  • Fast Fourier Transform (FFT) – Einführung in die FFT für Nichtstudierte, z. B. Auszubildende (deutsch)
  • FFTW – Programmbibliothek (in C) zur Berechnung der DFT (englisch)
  • Paul Bourke (1993): D F T (Discrete Fourier Transform) – F F T (Fast Fourier Transform) (schöner FFT-Code in C, in 1D und 2D) (englisch)
  • Kevin McGee: An introduction to signal processing and fast fourier transform (FFT). Archiviert vom Original (nicht mehr online verfügbar) am 7. Juli 2019; abgerufen am 27. April 2010 (englisch).

Einzelnachweise

Bearbeiten
  1. Ein Algorithmus für den Weltfrieden
  2. The re-discovery of the fast Fourier transform algorithm
  3. Zhongdong Liu; Jörg Himmel; Karl Walter Bonfig: Improved processing of harmonics and interharmonics by time-domain averaging. In: IEEE-Paper. https://ieeexplore.ieee.org, 3. Oktober 2005, abgerufen am 1. Mai 2024 (englisch, DOI:10.1109/TPWRD.2005.855477).
  4. JPEG (Transform Compression). Abgerufen am 27. Juli 2021.