Signaldarstellung/Fast-Fouriertransformation (FFT): Unterschied zwischen den Versionen

Aus LNTwww
Wechseln zu:Navigation, Suche
 
(37 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt)
Zeile 7: Zeile 7:
  
 
==Rechenaufwand von DFT bzw. IDFT==   
 
==Rechenaufwand von DFT bzw. IDFT==   
+
<br>
Ein Nachteil der direkten Berechnung der (im Allgemeinen komplexen) DFT–Zahlenfolgen
+
Ein Nachteil der direkten Berechnung der&nbsp; (im Allgemeinen komplexen)&nbsp; DFT–Zahlenfolgen
  
$$<D(\mu)> \hspace{0.2cm}\bullet\!\!-\!\!\!-(N)\!-\!\!\!-\!\!\hspace{0.05cm}\circ\, \hspace{0.2cm} <d(\nu)>$$
+
:$$\langle \hspace{0.1cm}D(\mu)\hspace{0.1cm}\rangle  \hspace{0.2cm}\bullet\!\!-\!\!\!-(N)\!-\!\!\!-\!\!\hspace{0.05cm}\circ\, \hspace{0.2cm} \langle \hspace{0.1cm}d(\nu)\hspace{0.1cm} \rangle$$
 
   
 
   
gemäß den in Kapitel 5.2 angegebenen Gleichungen ist der große Rechenaufwand. Zum Beispiel kann dieser Aufwand für die Diskrete Fouriertransformation (DFT)
+
gemäß den in Kapitel&nbsp; [[Signaldarstellung/Diskrete_Fouriertransformation_(DFT)|Diskrete Fouriertransformation]]&nbsp;  angegebenen Gleichungen ist der große Rechenaufwand.&nbsp;  Wir betrachten als Beispiel die&nbsp; $\rm  DFT$, also die Berechnung der Spektralkoeffizienten&nbsp; $D(\mu)$&nbsp; aus den Zeitkoeffizienten&nbsp; $d(\nu)$:
 
   
 
   
$$\begin{align*}N \cdot D(\mu) & =  \sum_{\nu = 0 }^{N-1}
+
:$$N \cdot D(\mu) =  \sum_{\nu = 0 }^{N-1}
 
  d(\nu) \cdot  {w}^{\hspace{0.03cm}\nu \hspace{0.03cm} \cdot \hspace{0.05cm}\mu}
 
  d(\nu) \cdot  {w}^{\hspace{0.03cm}\nu \hspace{0.03cm} \cdot \hspace{0.05cm}\mu}
  =\\ & =  
+
  =  
   d(0) \cdot w^{\hspace{0.03cm}0} + d(1) \cdot w^{\hspace{0.03cm}\mu}+ d(2) \cdot w^{\hspace{0.03cm}2\mu}+ ... + d(N-1) \cdot w^{\hspace{0.03cm}(N-1)\cdot \mu}\end{align*}$$
+
   d(0) \cdot w^{\hspace{0.03cm}0} + d(1) \cdot w^{\hspace{0.03cm}\mu}+ d(2) \cdot w^{\hspace{0.03cm}2\mu}+\hspace{0.05cm}\text{ ...} \hspace{0.05cm}+ d(N-1) \cdot w^{\hspace{0.03cm}(N-1)\cdot \mu}.$$
  
wie folgt abgeschätzt werden:
+
Der hierfür erforderliche Rechenaufwand soll abgeschätzt werden, wobei wir davon ausgehen, dass die Potenzen des komplexen Drehfaktors&nbsp; $w = {\rm e}^{-{\rm j} \hspace{0.05cm}\cdot \hspace{0.05cm}2 \pi/N}$&nbsp; bereits in Real– und Imaginärteilform in einer Lookup–Tabelle vorliegen.&nbsp;
*Wir gehen davon aus, dass die Potenzen des komplexen Drehfaktors $w$ = exp(–j2 $\pi/N$) bereits in Real– und Imaginärteilform in einer Lookup–Tabelle vorliegen.
+
 
*Zur Berechnung eines einzelnen Koeffizienten benötigt man dann $N$–1 komplexe Multiplikationen und ebenso viele komplexe Additionen.
+
Zur Berechnung eines einzelnen Koeffizienten benötigt man dann&nbsp; $N-1$&nbsp; komplexe Multiplikationen und ebenso viele komplexe Additionen, wobei zu beachten ist:
 
*Jede komplexe Addition erfordert zwei reelle Additionen:
 
*Jede komplexe Addition erfordert zwei reelle Additionen:
$(R_1 + {\rm j} \cdot I_1) + (R_2 + {\rm j} \cdot I_2) = (R_1 +
+
:$$(R_1 + {\rm j} \cdot I_1) + (R_2 + {\rm j} \cdot I_2) = (R_1 +
R_2) + {\rm j} \cdot (I_1 + I_2)\hspace{0.05cm}.$  
+
R_2) + {\rm j} \cdot (I_1 + I_2)\hspace{0.05cm}.$$  
 
*Jede komplexe Multiplikation erfordert vier reelle Multiplikationen und zwei reelle Additionen (eine Subtraktion wird wie eine Addition behandelt):
 
*Jede komplexe Multiplikation erfordert vier reelle Multiplikationen und zwei reelle Additionen (eine Subtraktion wird wie eine Addition behandelt):
$$(R_1 + {\rm j} \cdot I_1)  (R_2 + {\rm j} \cdot I_2) = (R_1 \cdot
+
:$$(R_1 + {\rm j} \cdot I_1)  (R_2 + {\rm j} \cdot I_2) = (R_1 \cdot
 
R_2 - I_1 \cdot I_2) + {\rm j} \cdot (R_1 \cdot I_2 + R_2 \cdot
 
R_2 - I_1 \cdot I_2) + {\rm j} \cdot (R_1 \cdot I_2 + R_2 \cdot
 
I_1)\hspace{0.05cm}.$$  
 
I_1)\hspace{0.05cm}.$$  
*Somit sind zur Berechnung aller N Koeffizienten insgesamt die folgende Anzahl M reeller Multiplikationen und die Anzahl A reeller Additionen erforderlich:
+
*Somit sind zur Berechnung aller&nbsp; $N$&nbsp; Koeffizienten insgesamt die folgende Anzahl&nbsp; $M$&nbsp; reeller Multiplikationen und die Anzahl&nbsp; $A$&nbsp; reeller Additionen erforderlich:
$$M = 4 \cdot N \cdot (N-1), \hspace{0.2cm}A = 2 \cdot N \cdot
+
:$$M = 4 \cdot N \cdot (N-1),$$
 +
:$$A = 2 \cdot N \cdot
 
(N-1)+2 \cdot N \cdot (N-1)=M \hspace{0.05cm}.$$  
 
(N-1)+2 \cdot N \cdot (N-1)=M \hspace{0.05cm}.$$  
*In heutigen Rechnern benötigen Multiplikationen und Additionen/Subtraktionen etwa die gleiche Rechenzeit. Es genügt, die Gesamtzahl $O = M + A$ aller Operationen zu betrachten:
+
*In heutigen Rechnern benötigen Multiplikationen und Additionen/Subtraktionen etwa die gleiche Rechenzeit.&nbsp; Es genügt, die Gesamtzahl&nbsp; $\mathcal{O} = M + A$&nbsp; aller Operationen zu betrachten:
$$O = 8 \cdot N \cdot (N-1) \approx 8 \cdot N^2\hspace{0.05cm}.$$  
+
:$$\mathcal{O} = 8 \cdot N \cdot (N-1) \approx 8 \cdot N^2\hspace{0.05cm}.$$  
*Daraus folgt: Man benötigt bereits für eine DFT (oder eine IDFT) mit $N$ = 1000 knapp acht Millionen Rechenoperationen. Für $N$ = 16 sind noch 1920 Rechenoperationen erforderlich.
 
  
 +
{{BlaueBox|TEXT=
 +
$\text{Fazit:}$&nbsp;
 +
*Man benötigt bereits für eine&nbsp; Diskrete Fouriertransformation&nbsp; $\rm (DFT)$&nbsp; mit&nbsp; $N = 1000$&nbsp;  knapp acht Millionen Rechenoperationen. Gleiches gilt für eine&nbsp; $\rm IDFT$.
 +
*Mit&nbsp; $N =16 $&nbsp; sind immerhin noch &nbsp;$1920$&nbsp; Rechenoperationen erforderlich.}}
  
Ist der Parameter $N$ eine Potenz zur Basis 2, so können rechenzeitgünstigere Algorithmen angewendet werden. Die Vielzahl solcher aus der Literatur bekannten Verfahren werden unter dem Sammelbegriff '''Fast–Fouriertransformation''' – abgekürzt FFT – zusammengefasst. Alle diese Methoden basieren auf dem Überlagerungssatz der DFT.
+
 
 +
Ist der Parameter&nbsp; $N$&nbsp; eine Potenz zur Basis&nbsp; $2$, so können rechenzeitgünstigere Algorithmen angewendet werden. Die Vielzahl solcher aus der Literatur bekannten Verfahren werden unter dem Begriff&nbsp; $\text{Fast–Fouriertransformation}$&nbsp; – abgekürzt&nbsp; $\text{FFT}$&nbsp; – zusammengefasst.&nbsp; Alle diese Methoden basieren auf dem Überlagerungssatz der DFT.
 
   
 
   
 
==Überlagerungssatz der DFT==   
 
==Überlagerungssatz der DFT==   
 +
<br>
 +
Die Grafik verdeutlicht den so genannten Überlagerungssatz der DFT am Beispiel&nbsp; $N = 16$.&nbsp; Dargestellt ist hier der Übergang vom Zeit&ndash; in den Spektralbereich, also die Berechnung der Spektralbereichskoeffizienten aus den Zeitbereichskoeffizienten: &nbsp;    $\langle \hspace{0.1cm}D(\mu)\hspace{0.1cm}\rangle  \hspace{0.2cm}\bullet\!\!-\!\!\!-(N)\!-\!\!\!-\!\!\hspace{0.05cm}\circ\, \hspace{0.2cm} \langle \hspace{0.1cm} d(\nu) \hspace{0.1cm}\rangle.$
  
Die Grafik verdeutlicht den so genannten Überlagerungssatz der DFT am Beispiel $N$ = 16.
+
[[Datei:P_ID1170__Sig_T_5_5_S2_v2.png|right|frame|Überlagerungssatz der DFT]]
 
 
[[Datei:P_ID1170__Sig_T_5_5_S2_v2.png|250px|right|Überlagerungssatz der DFT]]
 
  
 
Der dadurch beschriebene Algorithmus ist durch folgende Schritte gekennzeichnet:
 
Der dadurch beschriebene Algorithmus ist durch folgende Schritte gekennzeichnet:
*Die Folge  $\langle d(ν)\rangle$ der Länge $N$ wird in zwei Teilfolgen $\langle d_1(ν)\rangle$ und $\langle d_2(ν)\rangle$ jeweils halber Länge separiert (gelb bzw. grün hinterlegt). Mit 0 ≤ $ν$ < $N$/2 erhält man die Folgenelemente
+
*Die Folge&nbsp; $\langle \hspace{0.1cm}d(\nu)\hspace{0.1cm}\rangle$&nbsp; der Länge&nbsp; $N$&nbsp; wird in zwei Teilfolgen&nbsp; $\langle \hspace{0.1cm}d_1(\nu)\hspace{0.1cm}\rangle$&nbsp; und&nbsp; $\langle \hspace{0.1cm} d_2(\nu)\hspace{0.1cm}\rangle$&nbsp; jeweils halber Länge separiert (in der Garafik gelb bzw. grün hinterlegt).&nbsp; Mit&nbsp; $0 \le \nu \lt N/2$&nbsp; erhält man so die Folgenelemente
$$d_1(\nu) = d(2\nu), \hspace{0.2cm}d_2(\nu) = d(2\nu+1)
+
:$$d_1(\nu) = d(2\nu), $$
 +
:$$d_2(\nu) = d(2\nu+1)
 
\hspace{0.05cm}.$$
 
\hspace{0.05cm}.$$
*Die Ausgangsfolgen $\langle D_1(\mu )\rangle$ und $\langle D_2(\mu )\rangle$ der beiden Teilblöcke ergeben sich daraus jeweils durch eine eigene DFT, aber nun nur noch mit halber Länge $N$/2 = 8:
+
*Die Ausgangsfolgen&nbsp; $\langle \hspace{0.1cm}D_1(\mu )\hspace{0.1cm}\rangle$&nbsp; und&nbsp; $\langle \hspace{0.1cm}D_2(\mu )\hspace{0.1cm}\rangle$&nbsp; der beiden Teilblöcke ergeben sich daraus jeweils durch eine eigene DFT, aber nun nur noch mit halber Länge&nbsp; $N/2 = 8$:
$$\langle D_1(\mu) \rangle  \hspace{0.2cm}\bullet\!\!-\!\!\!-(N/2)\!-\!\!\!-\!\!\hspace{0.05cm}\circ\, \hspace{0.2cm} \langle d_1(\nu) \rangle , \hspace{0.2cm}
+
:$$\langle \hspace{0.1cm}D_1(\mu) \hspace{0.1cm}\rangle  \hspace{0.2cm}\bullet\!\!-\!\!\!-(N/2)\!-\!\!\!-\!\!\hspace{0.05cm}\circ\, \hspace{0.2cm} \langle \hspace{0.1cm}d_1(\nu) \hspace{0.1cm}\rangle , $$
\langle D_2(\mu) \rangle \hspace{0.2cm}\bullet\!\!-\!\!\!-(N/2)\!-\!\!\!-\!\!\hspace{0.05cm}\circ\, \hspace{0.2cm} \langle d_2(\nu) \rangle \hspace{0.05cm}.$$  
+
:$$ \langle \hspace{0.1cm}D_2(\mu)\hspace{0.1cm} \rangle \hspace{0.2cm}\bullet\!\!-\!\!\!-(N/2)\!-\!\!\!-\!\!\hspace{0.05cm}\circ\, \hspace{0.2cm} \langle \hspace{0.1cm}d_2(\nu) \hspace{0.1cm}\rangle \hspace{0.05cm}.$$  
*Die Ausgangswerte $\langle D_2(\mu )\rangle$ der unteren (grünen) DFT (mit 0 ≤ $\mu$ < $N$/2) werden danach im rot umrandeten Block durch komplexe Drehfaktoren hinsichtlich Phasenlage verändert:
+
*Die Ausgangswerte&nbsp; $\langle \hspace{0.1cm} D_2(\mu )\hspace{0.1cm}\rangle$&nbsp; der unteren, grünen DFT $($mit&nbsp; $0 \le \mu \lt N/2)$&nbsp; werden danach im rot umrandeten Block durch komplexe Drehfaktoren hinsichtlich der Phasenlage verändert:
$$D_2(\mu) \hspace{0.3cm} \Rightarrow \hspace{0.3cm}D_2(\mu) \cdot w^{\hspace{0.04cm}\mu}, \hspace{0.2cm}{\rm wobei}\hspace{0.1cm}w =
+
:$$D_2(\mu) \hspace{0.3cm} \Rightarrow \hspace{0.3cm}D_2(\mu) \cdot w^{\hspace{0.04cm}\mu}, \hspace{0.2cm}{\rm wobei}\hspace{0.1cm}w =
 
  {\rm e}^{-{\rm j} \hspace{0.05cm}\cdot \hspace{0.05cm}2 \pi/N} \hspace{0.05cm}.$$  
 
  {\rm e}^{-{\rm j} \hspace{0.05cm}\cdot \hspace{0.05cm}2 \pi/N} \hspace{0.05cm}.$$  
*Jeder einzelne '''Butterfly''' im blau umrandeten Block liefert durch Addition bzw. Subtraktion zwei Elemente der gesuchten Ausgangsfolge. Mit 0 ≤ $\mu$ < $N$/2 gilt dabei:
+
*Jeder einzelne&nbsp; $\text{Butterfly}$&nbsp; im blau umrandeten Block (in der Grafikmitte) liefert durch Addition bzw. Subtraktion zwei Elemente der gesuchten Ausgangsfolge.&nbsp; Mit&nbsp; $0 \le \mu \lt N/2$&nbsp; gilt dabei:
$$\begin{align*}D(\mu) & =  {1}/{2}\cdot \left[D_1(\mu) + D_2(\mu) \cdot w^{\hspace{0.04cm}\mu}\right],\\
+
:$$D(\mu) =  {1}/{2}\cdot \big[D_1(\mu) + D_2(\mu) \cdot w^{\hspace{0.04cm}\mu}\big],$$
D(\mu +{N}/{2}) & =  {1}/{2}\cdot \left[D_1(\mu) - D_2(\mu) \cdot w^{\hspace{0.04cm}\mu}\right]\hspace{0.05cm}.\end{align*}$$  
+
:$$D(\mu +{N}/{2}) =  {1}/{2}\cdot \big[D_1(\mu) - D_2(\mu) \cdot w^{\hspace{0.04cm}\mu}\big]\hspace{0.05cm}.$$  
Durch diese erste Anwendung des Überlagerungssatzes halbiert sich in etwa der Rechenaufwand.
 
  
{{Beispiel}}
+
'''Durch&nbsp; diese erste Anwendung des Überlagerungssatzes halbiert sich somit in etwa der Rechenaufwand'''.
Die DFT–Koeffizienten $d(ν)$ zur Beschreibung des Zeitverlaufs seien entsprechend der Zeile 2 der folgenden Tabelle „dreieckförmig” belegt. Beachten Sie hierbei die periodische Fortsetzung der DFT, so dass der lineare Anstieg für $t$ < 0 durch die Koeffizienten $d$(9) ... $d$(15) ausgedrückt wird.
 
Durch Anwendung des DFT–Algorithmus mit $N$ = 16 erhält man die in der ebenfalls blau hinterlegten Zeile 3 angegebenen Spektralkoeffizienten $D(\mu )$, die bei Vernachlässigung des Aliasingfehlers gleich $D(\mu ) = 4 \cdot \text{si}^2(\pi \cdot \mu/2)$ wären. Man erkennt, dass sich der Aliasingfehler nur auf die ungeradzahligen Koeffizienten auswirkt (schraffierte Felder). Beispielsweise müsste $D$(1) = 16/ $\pi^2 \approx$ 1.621 $\neq$ 1.642 sein.
 
  
[[Datei:P_ID1171__Sig_T_5_5_S2b_v3.png|250px|right|Beispiel 1 zum Überlagerungssatz der DFT]]
+
{{GraueBox|TEXT= 
 +
$\text{Beispiel 1:}$&nbsp;
 +
Die DFT–Koeffizienten&nbsp; $d(\nu)$&nbsp; zur Beschreibung des Zeitverlaufs seien entsprechend der&nbsp; '''Zeile 2'''&nbsp; der folgenden Tabelle „dreieckförmig” belegt. Beachten Sie hierbei die periodische Fortsetzung der DFT, so dass der lineare Anstieg für&nbsp; $t \lt 0$&nbsp; durch die Koeffizienten&nbsp; $d(8), \hspace{0.05cm}\text{ ...} \hspace{0.05cm}, d(15)$&nbsp; ausgedrückt wird.
  
Spaltet man die Gesamtfolge $\langle d(ν)\rangle$ in zwei Teilfolgen $\langle d_1'(ν)\rangle$ und $\langle d_2'(ν)\rangle$ auf, und zwar derart, dass die erste (gelb hinterlegte) Teilfolge nur geradzahlige Koeffizienten ($ν$ = 0, 2, ... , $N$–2) und die zweite (grün hinterlegt) nur ungeradzahlige Koeffizienten ($ν$ = 1, 3, ... , $N$–1) beinhalten und alle anderen zu 0 gesetzt sind, so erhält man die zugehörigen Folgen im Spektralbereich:
+
Durch Anwendung des DFT–Algorithmus mit&nbsp; $N = 16$&nbsp; erhält man die in der&nbsp; '''Zeile 3'''&nbsp; angegebenen Spektralkoeffizienten&nbsp; $D(\mu )$, die bei Vernachlässigung des Aliasingfehlers gleich&nbsp; $D(\mu ) = 4 \cdot \text{si}^2(\pi \cdot \mu/2)$&nbsp; wären.&nbsp; Man erkennt, dass sich der Aliasingfehler nur auf die ungeradzahligen Koeffizienten auswirkt (schraffierte Felder).&nbsp; Beispielsweise müsste&nbsp; $D(1) = 16/ \pi^2 \approx 1.621\neq 1.642$&nbsp; sein.
 +
 
 +
[[Datei:Sig_T_5_5_S2b_Version2.png|right|frame|Ergebnistabelle zum &nbsp;$\text{Beispiel 1}$&nbsp; zum Überlagerungssatz der DFT]]
 +
 
 +
Spaltet man die Gesamtfolge&nbsp; $\langle \hspace{0.1cm}d(\nu)\hspace{0.1cm}\rangle$&nbsp; in zwei Teilfolgen&nbsp; $\langle \hspace{0.1cm}{d_1}'(\nu)\hspace{0.1cm}\rangle$&nbsp; und&nbsp; $\langle \hspace{0.1cm} {d_2}'(\nu)\hspace{0.1cm}\rangle$&nbsp; auf, und zwar derart, dass die erste (gelb hinterlegte) Teilfolge nur geradzahlige Koeffizienten&nbsp; $(\nu = 0,\ 2, \hspace{0.03cm}\text{ ...} \hspace{0.1cm},\ N–2)$&nbsp; und die zweite (grün hinterlegt) nur ungeradzahlige Koeffizienten&nbsp; $(\nu = 1,\ 3,\ \hspace{0.03cm}\text{ ...} \hspace{0.1cm} ,\ N–1)$&nbsp; beinhalten und alle anderen zu Null gesetzt sind, so erhält man die zugehörigen Folgen im Spektralbereich:
 
   
 
   
$$ \langle {D_1}'(\mu) \rangle  \hspace{0.2cm}\bullet\!\!-\!\!\!-(N)\!-\!\!\!-\!\!\hspace{0.05cm}\circ\, \hspace{0.2cm} \langle {d_1}'(\nu) \rangle , \hspace{0.2cm}
+
:$$ \langle \hspace{0.1cm}{D_1}'(\mu)\hspace{0.1cm} \rangle  \hspace{0.2cm}\bullet\!\!-\!\!\!-(N)\!-\!\!\!-\!\!\hspace{0.05cm}\circ\, \hspace{0.2cm} \langle \hspace{0.1cm} {d_1}'(\nu) \hspace{0.1cm}\rangle , $$
\langle {D_2}'(\mu) \rangle \hspace{0.2cm}\bullet\!\!-\!\!\!-(N)\!-\!\!\!-\!\!\hspace{0.05cm}\circ\, \hspace{0.2cm} \langle {d_2}'(\nu) \rangle \hspace{0.05cm}.$$
+
:$$ \langle \hspace{0.1cm}{D_2}'(\mu) \hspace{0.1cm}\rangle \hspace{0.2cm}\bullet\!\!-\!\!\!-(N)\!-\!\!\!-\!\!\hspace{0.05cm}\circ\, \hspace{0.2cm} \langle\hspace{0.1cm} {d_2}'(\nu) \rangle \hspace{0.1cm}\hspace{0.05cm}.$$
  
In den gelb bzw. grün hinterlegten Zeilen 4 ... 7 erkennt man:
+
In den gelb bzw. grün hinterlegten Zeilen&nbsp; $4\hspace{0.05cm}\text{ ...} \hspace{0.05cm}7$&nbsp; erkennt man:
*Wegen $d(ν) = d_1'(ν) + d_2'(ν)$ gilt auch $D(\mu ) = D_1'(\mu ) + D_2'(\mu )$. Dies lässt sich zum Beispiel mit dem Additionstheorem linearer Systeme begründen.
+
*Wegen&nbsp; $d(\nu) = {d_1}'(\nu) + {d_2}'(\nu)$&nbsp; gilt auch:&nbsp;
*Die Periode der Folge $\langle D_1'(\mu )\rangle$ beträgt aufgrund des Nullsetzens eines jeden zweiten Zeitkoeffizienten nun $N$/2 im Gegensatz zur Periode $N$ der Ursprungsfolge $\langle D(\mu )\rangle$:
+
:$$D(\mu ) = {D_1}'(\mu ) + {D_2}'(\mu ).$$
$${D_1}'(\mu + {N}/{2}) ={D_1}'(\mu)\hspace{0.05cm}.$$  
+
:Dies lässt sich zum Beispiel mit dem&nbsp; [[Signaldarstellung/Gesetzmäßigkeiten_der_Fouriertransformation#Multiplikation_mit_Faktor_-_Additionssatz|Additionstheorem linearer Systeme]]&nbsp; begründen.
* $\langle D_2'(\mu )\rangle$ beinhaltet zusätzlich einen Phasenfaktor (Verschiebung um einen Abtastwert), der einen Vorzeichenwechsel zweier um $N$/2 auseinanderliegender Koeffizienten bewirkt:
+
*Die Periode der Folge&nbsp; $\langle \hspace{0.1cm}{D_1}'(\mu )\hspace{0.1cm}\rangle$&nbsp; ist aufgrund des Nullsetzens eines jeden zweiten Zeitkoeffizienten nun&nbsp; $N/2$&nbsp; im Gegensatz zur Periode&nbsp; $N$&nbsp; der Folge&nbsp; $\langle \hspace{0.1cm} D(\mu )\hspace{0.1cm}\rangle$:
$${D_2}'(\mu + {N}/{2}) =-{D_2}'(\mu)\hspace{0.05cm}.$$  
+
:$${D_1}'(\mu + {N}/{2}) ={D_1}'(\mu)\hspace{0.05cm}.$$  
*Die Berechnung von $\langle D_1'(\mu )\rangle$ und $\langle D_2'(\mu )\rangle$ ist aber jeweils ebenso aufwändig wie die Bestimmung von $\langle D(\mu )\rangle$ , da $\langle d_1'(ν)\rangle$ und $\langle d_2'(ν)\rangle$ ebenfalls aus $N$ Elementen bestehen, auch wenn einige 0 sind.                        
+
*Die Folge&nbsp;  $\langle \hspace{0.1cm} {D_2}'(\mu )\hspace{0.1cm}\rangle$&nbsp; beinhaltet zusätzlich einen Phasenfaktor&nbsp; (aufgrund der Verschiebung um einen Abtastwert), der einen Vorzeichenwechsel zweier um&nbsp; $N/2$&nbsp; auseinanderliegender Koeffizienten bewirkt:
 +
:$${D_2}'(\mu + {N}/{2}) = - {D_2}'(\mu)\hspace{0.05cm}.$$  
 +
*Die Berechnung von&nbsp; $\langle \hspace{0.1cm}{D_1}'(\mu )\hspace{0.1cm}\rangle$&nbsp; und&nbsp; $\langle \hspace{0.1cm} {D_2}'(\mu )\hspace{0.1cm}\rangle$&nbsp; ist allerdings ebenso aufwändig wie die Bestimmung von&nbsp; $\langle \hspace{0.1cm}D(\mu )\hspace{0.1cm}\rangle$, da&nbsp; $\langle \hspace{0.1cm}{d_1}'(\nu)\hspace{0.1cm}\rangle$&nbsp; und&nbsp; $\langle \hspace{0.1cm}{d_2}'(\nu)\hspace{0.1cm}\rangle$&nbsp; ebenfalls aus&nbsp; $N$&nbsp; Elementen bestehen, auch wenn die Hälfte davon Nullen sind.}}
  
  
Verzichtet man auf die Koeffizienten $d_1'(ν)$ = 0 mit ungeraden sowie auf $d_2'(ν)$ = 0 mit geraden Indizes, so kommt man zu den Teilfolgen $\langle d_1(ν)\rangle$ und $\langle d_2(ν)\rangle$  ⇒ Zeilen 9 und 11. Man erkennt:
+
{{GraueBox|TEXT=   
*Die beiden Zeitfolgen 〈d1(ν)〉 und 〈d2(ν)〉 weisen damit ebenso wie die dazugehörigen Spektralfolgen 〈D1(μ)〉 und 〈D2(μ)〉 nur noch die Dimension N/2 auf.
+
$\text{Beispiel 2:}$&nbsp;
*Ein Vergleich der Zeilen 5, 7, 10 und 12 zeigt für 0 ≤ $\mu$ < $N$/2 folgenden Zusammenhang:
+
Zur Fortsetzung des ersten Beispiels wird nun die bisherige Tabelle um die Zeilen &nbsp;$8$&nbsp; bis &nbsp;$12$&nbsp; erweitert.
$${D_1}'(\mu) = {1}/{2}\cdot {D_1}(\mu),\hspace{0.35cm}
+
                     
{D_2}'(\mu) = {1}/{2}\cdot {D_2}(\mu)\cdot w^{\hspace{0.04cm}\mu}\hspace{0.05cm}.$$  
+
[[Datei:Sig_T_5_5_S2c_Version2.png|right|frame|Ergebnistabelle zum &nbsp;$\text{Beispiel 2}$&nbsp; zum Überlagerungssatz der DFT]]
*Entsprechend erhält man für $N$/2 ≤ $\mu$ < $N$:
 
$$\begin{align*}{D_1}'(\mu) \hspace{-0.2cm} & =  \hspace{-0.2cm}{1}/{2}\cdot {D_1}(\mu-{N}/{2}),\\
 
{D_2}'(\mu) \hspace{-0.2cm}& \hspace{-0.2cm}{1}/{2}\cdot {D_2}(\mu-{N}/{2})\cdot w^{\hspace{0.04cm}\mu}
 
=-{1}/{2}\cdot {D_2}(\mu-{N}/{2})\cdot w^{\hspace{0.04cm}\mu- N/2}\hspace{0.05cm}.\end{align*}$$
 
*Zum Beispiel erhält man mit $N$ = 16  ⇒  $w$ = exp(–j $\cdot \pi$/8) für die Indizes $\mu$ = 1 bzw. $\mu$ = 9:
 
$${D_1}'(1)  =  {1.708}/{2} = 0.854,\hspace{0.2cm}
 
{D_2}'(1) ={1}/{2}\cdot (1.456 + {\rm j} 0.603) \cdot {\rm e}^{-{\rm j} \hspace{0.05cm}\cdot \hspace{0.05cm}
 
\pi/8} = 0.788\\
 
  \Rightarrow  D(1) = {D_1}'(1)+ {D_2}'(1)= 1.642 \hspace{0.05cm}.$$  
 
  
$${D_9}'(1)  =  {1.708}/{2} = 0.854,\hspace{0.15cm}
+
Verzichtet man auf die Koeffizienten&nbsp; ${d_1}'(\nu) = 0$&nbsp; mit ungeraden sowie auf&nbsp; ${d_2}'(\nu)  = 0$&nbsp; mit geraden Indizes, so kommt man zu den Teilfolgen&nbsp; $\langle \hspace{0.1cm}d_1(\nu)\hspace{0.1cm}\rangle$&nbsp; und&nbsp; $\langle \hspace{0.1cm}d_2(\nu)\hspace{0.1cm}\rangle$&nbsp;  entsprechend den Zeilen &nbsp;$9$&nbsp; und &nbsp;$11$&nbsp;. Man erkennt:
  {D_2}'(9) =-{1}/{2}\cdot (1.456 + {\rm j} 0.603) \cdot {\rm e}^{-{\rm j} \hspace{0.05cm}\cdot \hspace{0.05cm}
+
*Die Zeitfolgen&nbsp; $\langle \hspace{0.1cm}{d_1}(\nu )\hspace{0.1cm}\rangle$&nbsp; und&nbsp; $\langle \hspace{0.1cm}{d_2}(\nu )\hspace{0.1cm}\rangle$&nbsp;  weisen ebenso wie die dazugehörigen Spektralfolgen&nbsp; $\langle \hspace{0.1cm}{D_1}(\mu )\hspace{0.1cm}\rangle$&nbsp; und&nbsp; $\langle \hspace{0.1cm}{D_2}(\mu )\hspace{0.1cm}\rangle$&nbsp; nur noch die Dimension $N/2$ auf.
  \pi/8} = -0.788\\
+
*Ein Vergleich der Zeilen&nbsp; $5$,&nbsp; $7$,&nbsp; $10$&nbsp; und&nbsp; $12$&nbsp; zeigt für&nbsp; $0 \le \mu \lt  N/2$&nbsp; folgenden Zusammenhang:
  \Rightarrow D(9) = {D_1}'(9)+ {D_2}'(9)= 0.066 \hspace{0.05cm}.$$
+
:$${D_1}'(\mu) = {1}/{2}\cdot {D_1}(\mu)\hspace{0.05cm},$$
 +
:$$ {D_2}'(\mu) = {1}/{2}\cdot {D_2}(\mu)\cdot w^{\hspace{0.04cm}\mu}\hspace{0.05cm}.$$
 +
*Entsprechend ergibt sich für&nbsp; $N/2  \le \mu \lt  N$:
 +
:$${D_1}'(\mu)  =  {1}/{2}\cdot {D_1}(\mu - {N}/{2})\hspace{0.05cm},$$
 +
:$$ {D_2}'(\mu) = {1}/{2}\cdot {D_2}(\mu {-} {N}/{2})\cdot w^{\hspace{0.04cm}\mu}$$
 +
:$$ \Rightarrow \hspace{0.3cm}{D_2}'(\mu) = { - } {1}/{2}\cdot {D_2}(\mu-N/2)\cdot w^{\hspace{0.04cm}\mu {-} N/2}\hspace{0.05cm}.
 +
$$
  
[[Datei:P_ID1172__Sig_T_5_5_S2c_v1.png|250px|right|Beispiel 2 zum Überlagerungssatz der DFT]]
+
*Zum Beispiel erhält man mit&nbsp; $N = 16$  &nbsp; ⇒  &nbsp;  $w = {\rm e}^{ – {\rm j}\hspace{0.04cm} \cdot \hspace{0.04cm}\pi/8}$&nbsp; für die Indizes&nbsp; $\mu = 1$&nbsp;  bzw.&nbsp; $\mu = 9$:&nbsp;
 
+
:$${D_1}'(1)  =  {1.708}/{2} = 0.854,\hspace{0.8cm}
{{end}}
+
{D_2}'(1) ={1}/{2}\cdot (1.456 + {\rm j} 0.603) \cdot {\rm e}^{ - {\rm j} \hspace{0.05cm}\cdot \hspace{0.05cm}
 +
\pi/8} = 0.788$$
 +
:$$\Rightarrow  D(1) = {D_1}'(1)+ {D_2}'(1)= 1.642 \hspace{0.05cm}.$$
 +
:$${D_9}'(1)  =  {1.708}/{2} = 0.854,\hspace{0.8cm}
 +
{D_2}'(9) = - {1}/{2}\cdot (1.456 + {\rm j} 0.603) \cdot {\rm e}^{ - {\rm j} \hspace{0.05cm}\cdot \hspace{0.05cm}
 +
\pi/8} = - 0.788$$
 +
:$$\Rightarrow  D(9) = {D_1}'(9)+ {D_2}'(9)= 0.066 \hspace{0.05cm}.$$}}
 
   
 
   
  
Durch diese erste Anwendung des Überlagerungssatzes halbiert sich nahezu der Rechenaufwand. Statt $\mathcal{O}$ = 1920 benötigt man nur $\mathcal{O}$ = 2 · 448 + 8 · (4+2) + 16 · 2 = 976 reelle Operationen. Der erste Summand berücksichtigt die beiden DFT–Berechnungen mit $N$/2 = 8, der Rest die acht komplexen Multiplikationen und die 16 komplexen Additionen bzw. Subtraktionen.
+
{{BlaueBox|TEXT=
 +
$\text{Fazit:}$&nbsp; 
 +
*Durch diese erste Anwendung des Überlagerungssatzes halbiert sich nahezu der Rechenaufwand.  
 +
*Statt&nbsp; $\mathcal{O}= 1920$&nbsp;  benötigt man nur noch &nbsp;$\mathcal{O} = 2 · 448 + 8 \cdot (4+2) + 16 \cdot 2 = 976$&nbsp; reelle Operationen.  
 +
*Der erste Summand berücksichtigt die beiden DFT–Berechnungen mit&nbsp; $N/2 = 8$.
 +
*Der Rest wird für die acht komplexen Multiplikationen und die&nbsp; $16$&nbsp; komplexen Additionen bzw. Subtraktionen benötigt.}}
  
 
==Radix-2-Algorithmus nach Cooley und Tukey==   
 
==Radix-2-Algorithmus nach Cooley und Tukey==   
+
<br>
Ebenso wie andere FFT–Algorithmen baut das hier vorgestellte Verfahren von Cooley und Tukey auf dem Überlagerungssatz der DFT auf. Es funktioniert nur dann, wenn die Stützstellenzahl $N$ eine Zweierpotenz ist. Das folgende Bild verdeutlicht den Algorithmus – siehe auch [CT65] – für das Beispiel $N$ = 8, wobei die Transformation vom Zeit– in den Frequenzbereich dargestellt ist.
+
Ebenso wie andere FFT–Algorithmen baut das hier vorgestellte Verfahren&nbsp; [CT65]<ref name ='CT65'>Cooley, J.W.; Tukey, J.W.:&nbsp; An Algorithm for the Machine Calculation of Complex Fourier Series.&nbsp; <br>In:&nbsp; Mathematics of Computation, Vol. 19, No. 90. (Apr., 1965), pp. 297-301.</ref>&nbsp; von&nbsp; [https://de.wikipedia.org/wiki/James_Cooley James W. Cooley]&nbsp; und&nbsp; [https://en.wikipedia.org/wiki/John_Tukey John W. Tukey]&nbsp; auf dem Überlagerungssatz der DFT auf.&nbsp; Es funktioniert nur dann, wenn die Stützstellenzahl&nbsp; $N$&nbsp; eine Zweierpotenz ist.  
 +
 
 +
Die Grafik verdeutlicht den Algorithmus für&nbsp; $N = 8$, wobei wieder die Transformation vom Zeit– in den Frequenzbereich dargestellt ist.
 +
[[Datei:P_ID1173__Sig_T_5_5_S3a_neu.png|right|frame|frame|Radix-2-Algorithmus (Flussdiagramm)]]
 +
 
 +
*Vor dem eigentlichen FFT-Algorithmus müssen zunächst die Eingangswerte&nbsp; $d(0), \hspace{0.05cm}\text{...} \hspace{0.1cm}, d( N - 1)$&nbsp; im grauen Block &bdquo;Bitumkehroperation&rdquo; umsortiert werden.
 +
*Die Berechnung erfolgt in&nbsp; $\text{log}_2 N = 3$&nbsp; Stufen, wobei in jeder Stufe&nbsp; $N/2 = 4$&nbsp;  gleiche Berechnungen mit verschiedenen&nbsp; $\mu$&ndash;Werten&nbsp; (als Exponent des komplexen Drehfaktors)&nbsp; ausgeführt werden.&nbsp; Eine solche Basisoperation bezeichnet man auch als&nbsp; $\text{Butterfly}$.
 +
*Jeder Butterfly berechnet aus zwei&nbsp;  (im Allgemeinen komplexen)&nbsp;  Eingangsgrößen&nbsp; $A$&nbsp; und&nbsp; $B$&nbsp; die beiden Ausgangsgrößen&nbsp; $A + B \cdot w^{\mu}$&nbsp; sowie&nbsp; $A – B \cdot w^{\mu}$&nbsp; entsprechend der folgenden Skizze.
 +
 
  
[[Datei:P_ID1173__Sig_T_5_5_S3a_neu.png|250px|right|Radix-2-Algorithmus (Flussdiagramm)]]
+
[[Datei:P_ID1174__Sig_T_5_5_S3b_neu.png|center|frame|Butterfly des DFT-Algorithmus]]
  
Vor dem eigentlichen FFT-Algorithmus müssen die Eingangswerte $d$(0), ... , $d$( $N$–1) im grauen Block Bitumkehroperation umsortiert werden. Weiter erkennt man aus obiger Darstellung:
+
{{BlaueBox|TEXT=
*Die Berechnung erfolgt in $\text{log}_2 N$ = 3 Stufen, wobei in jeder Stufe genau $N$/2 = 4 prinzipiell gleiche Berechnungen mit unterschiedlichem $\mu$ (= Exponent des komplexen Drehfaktors) ausgeführt werden. Eine solche Basisoperation bezeichnet man auch als Butterfly.
+
$\text{Fazit:}$&nbsp; 
*Jeder Butterfly berechnet aus zwei (im Allgemeinen komplexen) Eingangsgrößen $A$ und $B$ die beiden Ausgangsgrößen $A + B \cdot w\mu$ sowie $A – B \cdot w\mu$ entsprechend folgender Skizze:
+
Die komplexen Spektralkoeffizienten&nbsp; $D(0), \hspace{0.05cm}\text{...} \hspace{0.1cm}, D( N - 1)$&nbsp; erhält man am Ausgang der letzten Stufe nach Division durch&nbsp; $N$.  
 +
*Wie in der&nbsp; [[Aufgaben:Aufgabe_5.5Z:_Rechenaufwand_für_die_FFT|Aufgabe 5.5Z]]&nbsp; gezeigt wird, ergibt sich gegenüber der DFT eine deutlich kürzere Rechenzeit, zum Beispiel für&nbsp; $N = 1024$&nbsp; um mehr als den Faktor&nbsp; $150$.
  
[[Datei:P_ID1174__Sig_T_5_5_S3b_neu.png|250px|right|Butterfly des DFT-Algorithmus]]
+
*Die inverse DFT zur Berechnung der Zeitkoeffizienten aus den Spektralkoeffizienten geschieht mit dem gleichen Algorithmus und nur geringfügigen Modifikationen.}}
  
*Die komplexen Spektralkoeffizienten $D$(0), ... , $D$( $N$–1) erhält man am Ausgang der letzten Stufe nach Division durch $N$. Wie in Aufgabe Z5.5 gezeigt wird, ergibt sich gegenüber der DFT eine deutlich kürzere Rechenzeit – z.B. für $N$ = 1024 um mehr als den Faktor 150.
 
Die inverse DFT zur Berechnung der Zeitkoeffizienten aus den Spektralkoeffizienten lässt sich mit dem gleichen Algorithmus und nur geringfügigen Modifizierungen bewerkstelligen.
 
  
 +
[[Datei:P_ID1175__Sig_T_5_5_S3c_neu.png|right|frame|Radix-2-Algorithmus (C-Programm)]]
 +
{{GraueBox|TEXT=
 +
$\text{Beispiel 3:}$&nbsp; 
 +
Abschließend wird das C–Programm&nbsp; $\text{fft(N, Re, Im)}$&nbsp; gemäß dem oben beschriebenen Radix–2–Algorithmus angegeben:
  
Nachfolgend sehen Sie das C–Programm '''fft(N, Re, Im)''' gemäß dem oben beschriebenen Radix–2–Algorithmus:
+
*Beim Aufruf beinhalten die beiden Float–Arrays „Re” und „Im” die jeweils&nbsp; $N$&nbsp; Real– und Imaginärteile der komplexen Zeitkoeffizienten&nbsp; $d(0)$, ... , $d( N - 1)$.
 +
*In den gleichen Feldern „Re” und „Im” werden am Programmende die komplexen Koeffizienten&nbsp; $D(0)$, ... , $D( N - 1)$&nbsp; an das aufrufende Programm zurückgegeben.
 +
*Aufgrund der „In–Place”–Programmierung reichen für diesen Algorithmus&nbsp; $N$&nbsp; komplexe Speicherplätze aus, allerdings nur, wenn zu Beginn die Eingangswerte umsortiert werden.
 +
*Dies geschieht durch das Programm „bitumkehr”, wobei die Inhalte von&nbsp; ${\rm Re}( \nu)$&nbsp; und&nbsp; ${\rm Im}( \nu)$&nbsp; in die Elemente&nbsp; ${\rm Re}( \kappa)$&nbsp; und&nbsp; ${\rm Im}( \kappa)$&nbsp; eingetragen werden.&nbsp; Das&nbsp; $\text{Beispiel 4}$&nbsp; verdeutlicht die Vorgehensweise.
  
[[Datei:P_ID1175__Sig_T_5_5_S3c_neu.png|250px|right|Radix-2-Algorithmus (C-Programm)]]
 
  
*Beim Aufruf beinhalten die beiden Float–Arrays „Re” und „Im” die jeweils $N$ Real– und Imaginärteile der komplexen Zeitkoeffizienten $d$(0), ... , $d$( $N$ – 1).
 
*In den gleichen Feldern „Re” und „Im” werden die N komplexen Spektralkoeffizienten $D$(0), ... , $D$( $N$–1) am Programmende an das aufrufende Programm zurückgegeben.
 
*Aufgrund dieser „In–Place”–Programmierung reichen für diesen Algorithmus $N$ komplexe Speicherplätze aus, allerdings nur, wenn zu Beginn die Eingangswerte umsortiert werden.
 
*Dies geschieht durch das Programm „bitumkehr”, wobei die Inhalte von Re( $\nu$) und Im( $\nu$) in die Elemente Re( $\kappa$) und Im( $\kappa$) eingetragen werden. Die folgende Tabelle gilt für $N$ = 8.
 
  
[[Datei:P_ID1176__Sig_T_5_5_S3d_neu.png|250px|right|Radix-2-Algorithmus (Bitumkehroperation)]]
+
$\text{Beispiel 4:  Bitumkehroperation}$&nbsp;
 +
[[Datei:P_ID1176__Sig_T_5_5_S3d_neu.png|center|frame|Radix-2-Algorithmus $($Bitumkehroperation für&nbsp; $N = 8)$]]
  
Schreibt man den Index $\nu$ als Dualzahl und stellt die $\text{log}_2 N$ Bits in umgekehrter Reihenfolge dar, so ergibt sich der neue Index $\kappa$. Beispielsweise wird so aus $\nu$ = 3 der neue Index $\kappa$ = 6.
+
*Der neue Index&nbsp; $\kappa$&nbsp; ergibt sich, wenn man den Index&nbsp; $\nu$&nbsp; als Dualzahl schreibt und anschließend die&nbsp; $\text{log}_2 \hspace{0.05cm} N$&nbsp; Bit in umgekehrter Reihenfolge darstellt.
 +
*Zum Beispiel wird aus&nbsp; $\nu = 3$&nbsp; der neue Index&nbsp; $\kappa = 6$.}}
  
  
==Aufgaben zu Kapitel 5.5== 
+
==Aufgaben zum Kapitel== 
 +
<br>
 +
[[Aufgaben:Aufgabe_5.5:_Fast-Fouriertransformation|Aufgabe 5.5: Fast-Fouriertransformation]]
  
 +
[[Aufgaben:Aufgabe_5.5Z:_Rechenaufwand_für_die_FFT|Aufgabe 5.5Z: Rechenaufwand für die FFT]]
  
 +
==Quellenverzeichnis==
  
  

Aktuelle Version vom 21. Mai 2021, 17:12 Uhr

Rechenaufwand von DFT bzw. IDFT


Ein Nachteil der direkten Berechnung der  (im Allgemeinen komplexen)  DFT–Zahlenfolgen

$$\langle \hspace{0.1cm}D(\mu)\hspace{0.1cm}\rangle \hspace{0.2cm}\bullet\!\!-\!\!\!-(N)\!-\!\!\!-\!\!\hspace{0.05cm}\circ\, \hspace{0.2cm} \langle \hspace{0.1cm}d(\nu)\hspace{0.1cm} \rangle$$

gemäß den in Kapitel  Diskrete Fouriertransformation  angegebenen Gleichungen ist der große Rechenaufwand.  Wir betrachten als Beispiel die  $\rm DFT$, also die Berechnung der Spektralkoeffizienten  $D(\mu)$  aus den Zeitkoeffizienten  $d(\nu)$:

$$N \cdot D(\mu) = \sum_{\nu = 0 }^{N-1} d(\nu) \cdot {w}^{\hspace{0.03cm}\nu \hspace{0.03cm} \cdot \hspace{0.05cm}\mu} = d(0) \cdot w^{\hspace{0.03cm}0} + d(1) \cdot w^{\hspace{0.03cm}\mu}+ d(2) \cdot w^{\hspace{0.03cm}2\mu}+\hspace{0.05cm}\text{ ...} \hspace{0.05cm}+ d(N-1) \cdot w^{\hspace{0.03cm}(N-1)\cdot \mu}.$$

Der hierfür erforderliche Rechenaufwand soll abgeschätzt werden, wobei wir davon ausgehen, dass die Potenzen des komplexen Drehfaktors  $w = {\rm e}^{-{\rm j} \hspace{0.05cm}\cdot \hspace{0.05cm}2 \pi/N}$  bereits in Real– und Imaginärteilform in einer Lookup–Tabelle vorliegen. 

Zur Berechnung eines einzelnen Koeffizienten benötigt man dann  $N-1$  komplexe Multiplikationen und ebenso viele komplexe Additionen, wobei zu beachten ist:

  • Jede komplexe Addition erfordert zwei reelle Additionen:
$$(R_1 + {\rm j} \cdot I_1) + (R_2 + {\rm j} \cdot I_2) = (R_1 + R_2) + {\rm j} \cdot (I_1 + I_2)\hspace{0.05cm}.$$
  • Jede komplexe Multiplikation erfordert vier reelle Multiplikationen und zwei reelle Additionen (eine Subtraktion wird wie eine Addition behandelt):
$$(R_1 + {\rm j} \cdot I_1) (R_2 + {\rm j} \cdot I_2) = (R_1 \cdot R_2 - I_1 \cdot I_2) + {\rm j} \cdot (R_1 \cdot I_2 + R_2 \cdot I_1)\hspace{0.05cm}.$$
  • Somit sind zur Berechnung aller  $N$  Koeffizienten insgesamt die folgende Anzahl  $M$  reeller Multiplikationen und die Anzahl  $A$  reeller Additionen erforderlich:
$$M = 4 \cdot N \cdot (N-1),$$
$$A = 2 \cdot N \cdot (N-1)+2 \cdot N \cdot (N-1)=M \hspace{0.05cm}.$$
  • In heutigen Rechnern benötigen Multiplikationen und Additionen/Subtraktionen etwa die gleiche Rechenzeit.  Es genügt, die Gesamtzahl  $\mathcal{O} = M + A$  aller Operationen zu betrachten:
$$\mathcal{O} = 8 \cdot N \cdot (N-1) \approx 8 \cdot N^2\hspace{0.05cm}.$$

$\text{Fazit:}$ 

  • Man benötigt bereits für eine  Diskrete Fouriertransformation  $\rm (DFT)$  mit  $N = 1000$  knapp acht Millionen Rechenoperationen. Gleiches gilt für eine  $\rm IDFT$.
  • Mit  $N =16 $  sind immerhin noch  $1920$  Rechenoperationen erforderlich.


Ist der Parameter  $N$  eine Potenz zur Basis  $2$, so können rechenzeitgünstigere Algorithmen angewendet werden. Die Vielzahl solcher aus der Literatur bekannten Verfahren werden unter dem Begriff  $\text{Fast–Fouriertransformation}$  – abgekürzt  $\text{FFT}$  – zusammengefasst.  Alle diese Methoden basieren auf dem Überlagerungssatz der DFT.

Überlagerungssatz der DFT


Die Grafik verdeutlicht den so genannten Überlagerungssatz der DFT am Beispiel  $N = 16$.  Dargestellt ist hier der Übergang vom Zeit– in den Spektralbereich, also die Berechnung der Spektralbereichskoeffizienten aus den Zeitbereichskoeffizienten:   $\langle \hspace{0.1cm}D(\mu)\hspace{0.1cm}\rangle \hspace{0.2cm}\bullet\!\!-\!\!\!-(N)\!-\!\!\!-\!\!\hspace{0.05cm}\circ\, \hspace{0.2cm} \langle \hspace{0.1cm} d(\nu) \hspace{0.1cm}\rangle.$

Überlagerungssatz der DFT

Der dadurch beschriebene Algorithmus ist durch folgende Schritte gekennzeichnet:

  • Die Folge  $\langle \hspace{0.1cm}d(\nu)\hspace{0.1cm}\rangle$  der Länge  $N$  wird in zwei Teilfolgen  $\langle \hspace{0.1cm}d_1(\nu)\hspace{0.1cm}\rangle$  und  $\langle \hspace{0.1cm} d_2(\nu)\hspace{0.1cm}\rangle$  jeweils halber Länge separiert (in der Garafik gelb bzw. grün hinterlegt).  Mit  $0 \le \nu \lt N/2$  erhält man so die Folgenelemente
$$d_1(\nu) = d(2\nu), $$
$$d_2(\nu) = d(2\nu+1) \hspace{0.05cm}.$$
  • Die Ausgangsfolgen  $\langle \hspace{0.1cm}D_1(\mu )\hspace{0.1cm}\rangle$  und  $\langle \hspace{0.1cm}D_2(\mu )\hspace{0.1cm}\rangle$  der beiden Teilblöcke ergeben sich daraus jeweils durch eine eigene DFT, aber nun nur noch mit halber Länge  $N/2 = 8$:
$$\langle \hspace{0.1cm}D_1(\mu) \hspace{0.1cm}\rangle \hspace{0.2cm}\bullet\!\!-\!\!\!-(N/2)\!-\!\!\!-\!\!\hspace{0.05cm}\circ\, \hspace{0.2cm} \langle \hspace{0.1cm}d_1(\nu) \hspace{0.1cm}\rangle , $$
$$ \langle \hspace{0.1cm}D_2(\mu)\hspace{0.1cm} \rangle \hspace{0.2cm}\bullet\!\!-\!\!\!-(N/2)\!-\!\!\!-\!\!\hspace{0.05cm}\circ\, \hspace{0.2cm} \langle \hspace{0.1cm}d_2(\nu) \hspace{0.1cm}\rangle \hspace{0.05cm}.$$
  • Die Ausgangswerte  $\langle \hspace{0.1cm} D_2(\mu )\hspace{0.1cm}\rangle$  der unteren, grünen DFT $($mit  $0 \le \mu \lt N/2)$  werden danach im rot umrandeten Block durch komplexe Drehfaktoren hinsichtlich der Phasenlage verändert:
$$D_2(\mu) \hspace{0.3cm} \Rightarrow \hspace{0.3cm}D_2(\mu) \cdot w^{\hspace{0.04cm}\mu}, \hspace{0.2cm}{\rm wobei}\hspace{0.1cm}w = {\rm e}^{-{\rm j} \hspace{0.05cm}\cdot \hspace{0.05cm}2 \pi/N} \hspace{0.05cm}.$$
  • Jeder einzelne  $\text{Butterfly}$  im blau umrandeten Block (in der Grafikmitte) liefert durch Addition bzw. Subtraktion zwei Elemente der gesuchten Ausgangsfolge.  Mit  $0 \le \mu \lt N/2$  gilt dabei:
$$D(\mu) = {1}/{2}\cdot \big[D_1(\mu) + D_2(\mu) \cdot w^{\hspace{0.04cm}\mu}\big],$$
$$D(\mu +{N}/{2}) = {1}/{2}\cdot \big[D_1(\mu) - D_2(\mu) \cdot w^{\hspace{0.04cm}\mu}\big]\hspace{0.05cm}.$$

Durch  diese erste Anwendung des Überlagerungssatzes halbiert sich somit in etwa der Rechenaufwand.

$\text{Beispiel 1:}$  Die DFT–Koeffizienten  $d(\nu)$  zur Beschreibung des Zeitverlaufs seien entsprechend der  Zeile 2  der folgenden Tabelle „dreieckförmig” belegt. Beachten Sie hierbei die periodische Fortsetzung der DFT, so dass der lineare Anstieg für  $t \lt 0$  durch die Koeffizienten  $d(8), \hspace{0.05cm}\text{ ...} \hspace{0.05cm}, d(15)$  ausgedrückt wird.

Durch Anwendung des DFT–Algorithmus mit  $N = 16$  erhält man die in der  Zeile 3  angegebenen Spektralkoeffizienten  $D(\mu )$, die bei Vernachlässigung des Aliasingfehlers gleich  $D(\mu ) = 4 \cdot \text{si}^2(\pi \cdot \mu/2)$  wären.  Man erkennt, dass sich der Aliasingfehler nur auf die ungeradzahligen Koeffizienten auswirkt (schraffierte Felder).  Beispielsweise müsste  $D(1) = 16/ \pi^2 \approx 1.621\neq 1.642$  sein.

Ergebnistabelle zum  $\text{Beispiel 1}$  zum Überlagerungssatz der DFT

Spaltet man die Gesamtfolge  $\langle \hspace{0.1cm}d(\nu)\hspace{0.1cm}\rangle$  in zwei Teilfolgen  $\langle \hspace{0.1cm}{d_1}'(\nu)\hspace{0.1cm}\rangle$  und  $\langle \hspace{0.1cm} {d_2}'(\nu)\hspace{0.1cm}\rangle$  auf, und zwar derart, dass die erste (gelb hinterlegte) Teilfolge nur geradzahlige Koeffizienten  $(\nu = 0,\ 2, \hspace{0.03cm}\text{ ...} \hspace{0.1cm},\ N–2)$  und die zweite (grün hinterlegt) nur ungeradzahlige Koeffizienten  $(\nu = 1,\ 3,\ \hspace{0.03cm}\text{ ...} \hspace{0.1cm} ,\ N–1)$  beinhalten und alle anderen zu Null gesetzt sind, so erhält man die zugehörigen Folgen im Spektralbereich:

$$ \langle \hspace{0.1cm}{D_1}'(\mu)\hspace{0.1cm} \rangle \hspace{0.2cm}\bullet\!\!-\!\!\!-(N)\!-\!\!\!-\!\!\hspace{0.05cm}\circ\, \hspace{0.2cm} \langle \hspace{0.1cm} {d_1}'(\nu) \hspace{0.1cm}\rangle , $$
$$ \langle \hspace{0.1cm}{D_2}'(\mu) \hspace{0.1cm}\rangle \hspace{0.2cm}\bullet\!\!-\!\!\!-(N)\!-\!\!\!-\!\!\hspace{0.05cm}\circ\, \hspace{0.2cm} \langle\hspace{0.1cm} {d_2}'(\nu) \rangle \hspace{0.1cm}\hspace{0.05cm}.$$

In den gelb bzw. grün hinterlegten Zeilen  $4\hspace{0.05cm}\text{ ...} \hspace{0.05cm}7$  erkennt man:

  • Wegen  $d(\nu) = {d_1}'(\nu) + {d_2}'(\nu)$  gilt auch: 
$$D(\mu ) = {D_1}'(\mu ) + {D_2}'(\mu ).$$
Dies lässt sich zum Beispiel mit dem  Additionstheorem linearer Systeme  begründen.
  • Die Periode der Folge  $\langle \hspace{0.1cm}{D_1}'(\mu )\hspace{0.1cm}\rangle$  ist aufgrund des Nullsetzens eines jeden zweiten Zeitkoeffizienten nun  $N/2$  im Gegensatz zur Periode  $N$  der Folge  $\langle \hspace{0.1cm} D(\mu )\hspace{0.1cm}\rangle$:
$${D_1}'(\mu + {N}/{2}) ={D_1}'(\mu)\hspace{0.05cm}.$$
  • Die Folge  $\langle \hspace{0.1cm} {D_2}'(\mu )\hspace{0.1cm}\rangle$  beinhaltet zusätzlich einen Phasenfaktor  (aufgrund der Verschiebung um einen Abtastwert), der einen Vorzeichenwechsel zweier um  $N/2$  auseinanderliegender Koeffizienten bewirkt:
$${D_2}'(\mu + {N}/{2}) = - {D_2}'(\mu)\hspace{0.05cm}.$$
  • Die Berechnung von  $\langle \hspace{0.1cm}{D_1}'(\mu )\hspace{0.1cm}\rangle$  und  $\langle \hspace{0.1cm} {D_2}'(\mu )\hspace{0.1cm}\rangle$  ist allerdings ebenso aufwändig wie die Bestimmung von  $\langle \hspace{0.1cm}D(\mu )\hspace{0.1cm}\rangle$, da  $\langle \hspace{0.1cm}{d_1}'(\nu)\hspace{0.1cm}\rangle$  und  $\langle \hspace{0.1cm}{d_2}'(\nu)\hspace{0.1cm}\rangle$  ebenfalls aus  $N$  Elementen bestehen, auch wenn die Hälfte davon Nullen sind.


$\text{Beispiel 2:}$  Zur Fortsetzung des ersten Beispiels wird nun die bisherige Tabelle um die Zeilen  $8$  bis  $12$  erweitert.

Ergebnistabelle zum  $\text{Beispiel 2}$  zum Überlagerungssatz der DFT

Verzichtet man auf die Koeffizienten  ${d_1}'(\nu) = 0$  mit ungeraden sowie auf  ${d_2}'(\nu) = 0$  mit geraden Indizes, so kommt man zu den Teilfolgen  $\langle \hspace{0.1cm}d_1(\nu)\hspace{0.1cm}\rangle$  und  $\langle \hspace{0.1cm}d_2(\nu)\hspace{0.1cm}\rangle$  entsprechend den Zeilen  $9$  und  $11$ . Man erkennt:

  • Die Zeitfolgen  $\langle \hspace{0.1cm}{d_1}(\nu )\hspace{0.1cm}\rangle$  und  $\langle \hspace{0.1cm}{d_2}(\nu )\hspace{0.1cm}\rangle$  weisen ebenso wie die dazugehörigen Spektralfolgen  $\langle \hspace{0.1cm}{D_1}(\mu )\hspace{0.1cm}\rangle$  und  $\langle \hspace{0.1cm}{D_2}(\mu )\hspace{0.1cm}\rangle$  nur noch die Dimension $N/2$ auf.
  • Ein Vergleich der Zeilen  $5$,  $7$,  $10$  und  $12$  zeigt für  $0 \le \mu \lt N/2$  folgenden Zusammenhang:
$${D_1}'(\mu) = {1}/{2}\cdot {D_1}(\mu)\hspace{0.05cm},$$
$$ {D_2}'(\mu) = {1}/{2}\cdot {D_2}(\mu)\cdot w^{\hspace{0.04cm}\mu}\hspace{0.05cm}.$$
  • Entsprechend ergibt sich für  $N/2 \le \mu \lt N$:
$${D_1}'(\mu) = {1}/{2}\cdot {D_1}(\mu - {N}/{2})\hspace{0.05cm},$$
$$ {D_2}'(\mu) = {1}/{2}\cdot {D_2}(\mu {-} {N}/{2})\cdot w^{\hspace{0.04cm}\mu}$$
$$ \Rightarrow \hspace{0.3cm}{D_2}'(\mu) = { - } {1}/{2}\cdot {D_2}(\mu-N/2)\cdot w^{\hspace{0.04cm}\mu {-} N/2}\hspace{0.05cm}. $$
  • Zum Beispiel erhält man mit  $N = 16$   ⇒   $w = {\rm e}^{ – {\rm j}\hspace{0.04cm} \cdot \hspace{0.04cm}\pi/8}$  für die Indizes  $\mu = 1$  bzw.  $\mu = 9$: 
$${D_1}'(1) = {1.708}/{2} = 0.854,\hspace{0.8cm} {D_2}'(1) ={1}/{2}\cdot (1.456 + {\rm j} 0.603) \cdot {\rm e}^{ - {\rm j} \hspace{0.05cm}\cdot \hspace{0.05cm} \pi/8} = 0.788$$
$$\Rightarrow D(1) = {D_1}'(1)+ {D_2}'(1)= 1.642 \hspace{0.05cm}.$$
$${D_9}'(1) = {1.708}/{2} = 0.854,\hspace{0.8cm} {D_2}'(9) = - {1}/{2}\cdot (1.456 + {\rm j} 0.603) \cdot {\rm e}^{ - {\rm j} \hspace{0.05cm}\cdot \hspace{0.05cm} \pi/8} = - 0.788$$
$$\Rightarrow D(9) = {D_1}'(9)+ {D_2}'(9)= 0.066 \hspace{0.05cm}.$$


$\text{Fazit:}$ 

  • Durch diese erste Anwendung des Überlagerungssatzes halbiert sich nahezu der Rechenaufwand.
  • Statt  $\mathcal{O}= 1920$  benötigt man nur noch  $\mathcal{O} = 2 · 448 + 8 \cdot (4+2) + 16 \cdot 2 = 976$  reelle Operationen.
  • Der erste Summand berücksichtigt die beiden DFT–Berechnungen mit  $N/2 = 8$.
  • Der Rest wird für die acht komplexen Multiplikationen und die  $16$  komplexen Additionen bzw. Subtraktionen benötigt.

Radix-2-Algorithmus nach Cooley und Tukey


Ebenso wie andere FFT–Algorithmen baut das hier vorgestellte Verfahren  [CT65][1]  von  James W. Cooley  und  John W. Tukey  auf dem Überlagerungssatz der DFT auf.  Es funktioniert nur dann, wenn die Stützstellenzahl  $N$  eine Zweierpotenz ist.

Die Grafik verdeutlicht den Algorithmus für  $N = 8$, wobei wieder die Transformation vom Zeit– in den Frequenzbereich dargestellt ist.

Radix-2-Algorithmus (Flussdiagramm)
  • Vor dem eigentlichen FFT-Algorithmus müssen zunächst die Eingangswerte  $d(0), \hspace{0.05cm}\text{...} \hspace{0.1cm}, d( N - 1)$  im grauen Block „Bitumkehroperation” umsortiert werden.
  • Die Berechnung erfolgt in  $\text{log}_2 N = 3$  Stufen, wobei in jeder Stufe  $N/2 = 4$  gleiche Berechnungen mit verschiedenen  $\mu$–Werten  (als Exponent des komplexen Drehfaktors)  ausgeführt werden.  Eine solche Basisoperation bezeichnet man auch als  $\text{Butterfly}$.
  • Jeder Butterfly berechnet aus zwei  (im Allgemeinen komplexen)  Eingangsgrößen  $A$  und  $B$  die beiden Ausgangsgrößen  $A + B \cdot w^{\mu}$  sowie  $A – B \cdot w^{\mu}$  entsprechend der folgenden Skizze.


Butterfly des DFT-Algorithmus

$\text{Fazit:}$  Die komplexen Spektralkoeffizienten  $D(0), \hspace{0.05cm}\text{...} \hspace{0.1cm}, D( N - 1)$  erhält man am Ausgang der letzten Stufe nach Division durch  $N$.

  • Wie in der  Aufgabe 5.5Z  gezeigt wird, ergibt sich gegenüber der DFT eine deutlich kürzere Rechenzeit, zum Beispiel für  $N = 1024$  um mehr als den Faktor  $150$.
  • Die inverse DFT zur Berechnung der Zeitkoeffizienten aus den Spektralkoeffizienten geschieht mit dem gleichen Algorithmus und nur geringfügigen Modifikationen.


Radix-2-Algorithmus (C-Programm)

$\text{Beispiel 3:}$  Abschließend wird das C–Programm  $\text{fft(N, Re, Im)}$  gemäß dem oben beschriebenen Radix–2–Algorithmus angegeben:

  • Beim Aufruf beinhalten die beiden Float–Arrays „Re” und „Im” die jeweils  $N$  Real– und Imaginärteile der komplexen Zeitkoeffizienten  $d(0)$, ... , $d( N - 1)$.
  • In den gleichen Feldern „Re” und „Im” werden am Programmende die komplexen Koeffizienten  $D(0)$, ... , $D( N - 1)$  an das aufrufende Programm zurückgegeben.
  • Aufgrund der „In–Place”–Programmierung reichen für diesen Algorithmus  $N$  komplexe Speicherplätze aus, allerdings nur, wenn zu Beginn die Eingangswerte umsortiert werden.
  • Dies geschieht durch das Programm „bitumkehr”, wobei die Inhalte von  ${\rm Re}( \nu)$  und  ${\rm Im}( \nu)$  in die Elemente  ${\rm Re}( \kappa)$  und  ${\rm Im}( \kappa)$  eingetragen werden.  Das  $\text{Beispiel 4}$  verdeutlicht die Vorgehensweise.


$\text{Beispiel 4: Bitumkehroperation}$ 

Radix-2-Algorithmus $($Bitumkehroperation für  $N = 8)$
  • Der neue Index  $\kappa$  ergibt sich, wenn man den Index  $\nu$  als Dualzahl schreibt und anschließend die  $\text{log}_2 \hspace{0.05cm} N$  Bit in umgekehrter Reihenfolge darstellt.
  • Zum Beispiel wird aus  $\nu = 3$  der neue Index  $\kappa = 6$.


Aufgaben zum Kapitel


Aufgabe 5.5: Fast-Fouriertransformation

Aufgabe 5.5Z: Rechenaufwand für die FFT

Quellenverzeichnis

  1. Cooley, J.W.; Tukey, J.W.:  An Algorithm for the Machine Calculation of Complex Fourier Series. 
    In:  Mathematics of Computation, Vol. 19, No. 90. (Apr., 1965), pp. 297-301.