FFT (Fast Fourier Transformation)
Die FFT (englisch: Fast Fourier Transformation) oder auch schnelle Fourier Transformation verringert den Rechenaufwand der diskreten Fourier Transformation. Dieses Vorgehen erklären wir dir anhand des Algorithmus von Cooley und Tukey zur Berechnung der DFT. Des Weiteren Vergleichen wir die Komplexität dieses Algorithmus zur Komplexität des herkömmlichen Verfahrens und zeigen dies anhand eines konkreten Beispiels.
Wenn du dir allerdings Zeit sparen willst und das Wichtigste zum Thema FFT in unter 5 Minuten erklärt haben möchtest, dann ist unser Video hierzu genau das Richtige für dich. Schau dir zum besseren Verständnis auch den Artikel zur Fourier Transformation an.
Inhaltsübersicht
Komplexität der DFT
Die FFT (Fast Fourier Transformation) ist ein Algorithmus zur Berechnung der DFT (Diskreten Fourier Transformation) . Als Teile-und-herrsche-Verfahren reduziert die FFT die Zahl der Rechenoperationen im Vergleich zur herkömmlichen Berechnung der DFT enorm, weshalb sie zu Deutsch auch als Schnelle Fourier Transformation bezeichnet wird.
Diskrete Fourier Transformation (DFT)
Die Koeffizienten der Diskreten Fourier Transformierten dieses Vektors a berechnen sich nach folgender Vorschrift:
Diese Gleichung lässt sich auch in Matrix-Schreibweise formulieren. Zur Vereinfachung soll hierbei die Abkürzung für die N-te Einheitswurzel eingeführt werden. Es ergibt sich folgende Gleichung:
Die Matrix
der Gleichung wird als Fourier-Matrix bezeichnet.
Die Inverse Diskrete Fourier Transformierte berechnet sich wie folgt:
Für den Vorfaktor der DFT gibt es unterschiedliche Konventionen. Manchmal tritt er auch in der Inversen DFT statt in der DFT auf.
Komplexität
Soll für ein gemessenes Signal eine Spektralanalyse von einem Computer durchgeführt werden, so muss dieser die Diskrete Fourier Transformation durchführen. Hierbei ist von großer Bedeutung, wie viele Rechenoperationen der Computer dazu ausführen muss. Führt der Computer die Berechnung mittels herkömmlicher Matrixmultiplikation durch, so benötigt er hierfür Rechenoperationen. Für die Berechnung einer Komponente fallen nämlich N Multiplikationen und N-1 Additionen an und dies muss dann noch mit der Anzahl N der Komponenten von multipliziert werden. Die Rechenoperationen entsprechen somit einer Komplexität von
Das bedeutet, dass der Rechenaufwand zur herkömmlichen Berechnung der DFT schnell ansteigt, wenn die Anzahl N an Messwerten des Signals erhöht wird.
FFT Erklärung
Die FFT – einfach erklärt – stellt eine Berechnungsmethode der DFT dar, mit welcher der Rechenaufwand reduziert wird. Dies ist möglich, da in der Fourier-Matrix nur die N-te Einheitswurzel in verschiedenen Potenzen auftritt, welche folgende Eigenschaften besitzt:
Dadurch lässt sich die Struktur der Fourier-Matrix vereinfachen, falls die Anzahl N der Messwerte eine Zweierpotenz ist, und letztendlich lässt sich die Zahl der Rechenoperationen dadurch reduzieren.
FFT Algorithmus von Cooley und Tukey
Die FFT ist ein Algorithmus, der das Verfahren hierzu beschreibt. Dieser Algorithmus wurde zwar bereits von Carl Friedrich Gauß entworfen, wird heute aber nach James Cooley und John W. Tukey benannt, welche diesen im Jahr 1965 veröffentlichten. Wie bereits erwähnt macht sich die FFT die Struktur der Fourier-Matrix zunutze, welche im Folgenden analysiert werden soll.
Struktur der Fourier-Matrix
Als Voraussetzung des Algorithmus von Cooley und Tukey, muss die Anzahl der Messwerte N einer Zweierpotenz entsprechen:
Um die nun folgenden Überlegungen zur FFT besser veranschaulichen zu können, wird das Beispiel gewählt.
In der ursprünglichen Form besitzt die Fourier-Matrix dann folgende Struktur:
Diejenigen Einträge, die gleich 1 sind, können durch ersetzt werden und es ergibt sich:
Wird in den Zeilen 3,5 und 7 der rechten Hälfte die Tatsache ausgenutzt, so ergibt sich:
Somit wiederholen sich schon einmal die Zeilen 1,3,5 und 7 immer nach 4 Einträgen. Nun kann in den Zeilen 2,4,6 und 8 zunächst mithilfe der Identität geschickt vereinfacht werden und anschließend die Tatsache ausgenutzt werden:
Nun lässt sich erkennen, dass in den Zeilen 1,3,5 und 7 die Einträge sich nach der Hälfte wiederholen und sie sich in den Zeilen 2,4,6 und 8 ebenfalls nach der Hälfte allerdings mit negativem Vorzeichen wiederholen. Des Weiteren entspricht jede zweite Zeile der darüberliegenden Zeile, wenn spaltenweise immer derselbe Vorfaktor eingefügt wird. Aufgrund dieser Eigenschaft der Fourier-Matrix Z kann die eine Vektormultiplikation mit jener Matrix aufgeteilt werden in 2 Multiplikationen mit 2 Matrizen.
Da sich nämlich die Zeilen 1,3,5 und 7 wiederholen, werden für die eine Vektormultiplikation jeweils die Einträge und a_1a_5, und sowie und des Vektors a als Summe zusammengefasst. Für die andere Multiplikation werden sie als Differenz zusammengefasst, da sich die Einträge in den Zeilen 2,4,6 und 8 mit negativem Vorzeichen wiederholen:
Hierbei taucht in der zweiten Matrix noch der Vorfaktor in jeder Spalte auf. Dieser lässt sich in den Vektor ziehen und so ergibt sich dieselbe Matrix wie bei der ersten Multiplikation:
Teile-und-herrsche-Verfahren
Durch die Struktur der Fourier-Matrix lässt sich die für die DFT durchzuführende Vektormultiplikation mit einer -Matrix in zwei Multiplikationen mit -Matrizen aufteilen. Diese beiden Matrizen sind sogar identisch und besitzen jeweils nur ein Viertel an Einträgen der ursprünglichen Fourier-Matrix. Der wichtigste Vorteil ist allerdings, dass diese beiden Matrizen wieder die Form einer Fourier-Matrix besitzen. In dem gezeigten Beispiel entspricht nämlich der vierten Einheitswurzel und es ergibt sich dadurch eine Fourier-Matrix der Größe :
Das bedeutet, dass dieses Verfahren rekursiv so lange fortgesetzt werden kann, bis sich zum Schluss -Matrizen ergeben. Ein solches Verfahren wird in der Informatik als Teile-und-herrsche Verfahren bezeichnet. Wie die FFT konkret durchgeführt werden kann, wird im Folgenden gezeigt.
FFT einfach erklärt
Soll die FFT für einen Vektor – wobei N einer Zweierpotenz entspricht – durchgeführt werden, so können die Einträge des Vektors in einer Spalte angeordnet werden. Diese Spalte kann gedanklich in eine obere und eine unter Hälfte unterteilt werden. Aus diesen beiden Hälften werden die Einträge für die nächste Spalte auf zwei Arten berechnet:
- Aus gleichrangigen Einträgen der beiden Hälften wird die Summe gebildet
- Aus gleichrangigen Einträgen der beiden Hälften wird die Differenz gebildet, welche mit multipliziert wird. Hierbei bezeichnet k den Rang der Einträge, beginnend bei und l bezeichnet die Nummer der aktuellen Spalte, beginnend bei
Die Ergebnisse des ersten Schrittes werden in der oberen Hälfte der nächsten Spalte notiert, die Ergebnisse des zweiten Schrittes entsprechend in der unteren Hälfte. Für die beiden Hälften der neu berechneten Spalte wird das Verfahren erneut angewandt. Dies wird bis zu derjenigen Spalte l durchgeführt, für die gilt. Die Werte in dieser Spalte sind dann bereits die Einträge der Diskreten Fourier Transformierten. Die FFT soll am Beispiel für einmal durchgeführt werden.
Dazu wird der Vektor betrachtet, welcher in einer Spalte angeordnet und in eine obere und untere Hälfte unterteilt wird.
Nun werden die Berechnungen durchgeführt, in die nächste Spalte eingetragen und die beiden Hälften der Zweiten Spalte wiederum in zwei Hälften unterteilt.
Für diese beiden Hälften wird nun jeweils das gleiche Verfahren wieder durchgeführt und so fortgefahren:
Die Einträge der letzten Spalte sind also die Einträge der Diskreten Fourier Transformierten, müssen aber noch in die richtige Reihenfolge gebracht werden. Das erfolgt mit einem sogenannten Bit-Umkehrverfahren. Dazu wird die aktuelle Position als Binärzahl notiert und durch Umkehren der Reihenfolge der Ziffern in der Binärschreibweise ergibt sich die neue Position als Binärzahl. Für das Beispiel folgt damit:
Aktuelle Position | Neue Position | ||
---|---|---|---|
dezimal | binär | binär | dezimal |
0 | 000 | 000 | 0 |
1 | 001 | 100 | 4 |
2 | 010 | 010 | 2 |
3 | 011 | 110 | 6 |
4 | 100 | 001 | 1 |
5 | 101 | 101 | 5 |
6 | 110 | 011 | 3 |
7 | 111 | 111 | 7 |
Häufig wird das Vorgehen der FFT in einem sogenannten Butterfly-Graphen, also einem Schmetterlings-Graphen, dargestellt:
In dieser Darstellung der FFT laufen zwei durch einen Kreis symbolisierten Werte an einem Rechteck zusammen, welches die Verknüpfung dieser Werte angibt. Aus dieser Verknüpfung ergibt sich dann der neue Wert, welcher wieder durch einen Kreis symbolisiert wird, zu dem ein Strich vom Verknüpfungsrechteck läuft. Im letzten Schritt wird die Umsortierung der Werte an die richtige Position dargestellt.
Komplexität der FFT (Fast Fourier Transformation)
Bei den vorangegangenen Ausführungen wurde der Vorfaktor vor der DFT außer Acht gelassen. Dies wird bei den folgenden Überlegungen zur Komplexität der FFT wieder so gehandhabt.
Ebenso werden die Operationen vernachlässigt, die am Ende zum Umsortieren der Einträge nötig sind.
Um die restlichen Rechenoperationen der FFT richtig zu zählen, wird zunächst der Rechenaufwand bestimmt, der nötig ist, um eine neue Spalte zu berechnen. Dazu wird für die Hälfte der neuen Einträge eine Summe gebildet und für die andere Hälfte eine Differenz gebildet sowie ein Produkt berechnet. Das bedeutet, dass zur Berechnung einer neuen Spalte Operationen benötigt werden. Letztlich muss also nur noch geklärt werden, wie viele Spalten für die vollständige FFT denn berechnet werden müssen. Wie oben bereits erwähnt wird das Verfahren bis zur Spalte l mit durchgeführt. Das bedeutet die Anzahl l der zu berechnenden Spalten entspricht . Somit beläuft sich der Rechenaufwand der FFT unter Nichtberücksichtigung der Umsortierung auf Rechenoperationen, was einer Komplexität von
entspricht. Durch den Vergleich mit der Komplexität der herkömmlichen Berechnung einer DFT wird der Vorteil der FFT ihr gegenüber deutlich.
Inverse FFT
Da die Inverse Diskrete Fourier Transformierte ähnlich definiert ist wie die Diskrete Fourier Transformierte, ist auf sie der Algorithmus der FFT ebenso anwendbar. Hier muss allerdings je nach Konvention der richtige Vorfaktor berücksichtigt werden und statt mit der Einheitswurzel mit ihrer Inversen gearbeitet werden.
Implementierung der FFT (Fast Fourier Transformation)
Im Folgenden wird anhand eines Pseudocodes gezeigt, wie die FFT implementiert werden kann.
1 Algorithm FFT(a)
input: Vektor (N eine Zweierpotenz)
output: Lösungsvektor (DFT des Inputs)
2 if a.length = 1 then
3 return a;
4 else
5 N:=a.length;
6 c:=1;
7 ;
8 ;
9 ;
10 ;
11 for k:=0 to N/2 – 1 do
12 ;
13 ;
14 ;
15 return b;