Digitale Signal-Verarbeitung 1 Kapitel 3: DFT und FFT Inhaltsverzeichnis 3.1. EINLEITUNG ................................................................................................................................................ 2 3.2. DISKRETE FOURIERTRANSFORMATION (DFT)................................................................................ 2 3.3. EIGENSCHAFTEN DER DFT ..................................................................................................................... 3 3.4. VERWANDTSCHAFT DER DFT MIT DER FOURIERREIHE ............................................................. 5 3.5. FILTERFUNKTION DER DFT (FAKULTATIV) ..................................................................................... 6 3.6. LEAKAGE UND WINDOWING (FAKULTATIV) ................................................................................... 7 3.7. SCHNELLE FOURIERTRANSFORMATION (FFT) ............................................................................. 10 3.8. FFT VON REELLWERTIGEN SIGNALEN ............................................................................................ 11 3.9. ECHTZEIT-SIGNALVERARBEITUNG MIT DER FFT (FAKULTATIV) ......................................... 14 Literatur- bzw. Quellenverzeichnis [1] M. Meier: „Signalverarbeitung“, ISBN 3-528-16955-9, Vieweg Verlag, Oktober 2000. [2] A.V. Oppenheim, R.W. Schafer, J. R. Buck: „Zeitdiskrete Signalverarbeitung“, 2., überarbeitete Auflage, ISBN 3-8273-7077-9, Pearson Studium, 2004. [3] W.H. Press, S.A. Teukolsky, W.T. Vetterling, B.P. Flannery, „Numerical Recipes in C”, ISBN 0-521-43108-5, Cambridge University Press 1992. Download (einzelne Kapitel als PDF, kostenlos): http://www.library.cornell.edu/nr/bookcpdf.html 75880278 / 14.05.16 Seite 1 / 15 Rumc&Hhrt@ZSN@SoE@ZHAW 3.1. Einleitung Das Fourierspektrum X(f) eines abgetasteten Signals x[n] = x(nTs) ist periodisch und kann auch in Funktion der Abtastwerte x[n] ausgedrückt werden (siehe Kapitel 2) X (f ) x [n ] e j n 2 f Ts . (3.1) n In diesem Kapitel wird zuerst gezeigt, dass die diskrete Fouriertransformation (DFT) eine Näherung des Fourierspektrums X(f) in Gleichung (3.1) darstellt. Danach werden die Eigenschaften der DFT analysiert und die Verwandtschaft mit der komplexen Fourierreihe aufgezeigt. Ausgehend von der DFT wird dann die Fast Fourier Transformation (FFT) vorgestellt. Die FFT ist einer der wichtigsten Algorithmen der DSV. 3.2. Diskrete Fouriertransformation (DFT) Ein Problem bei der praktischen Bestimmung des Fourierspektrums in (3.1) ist das Aufsummieren über unendlich viele Terme. Bei der DFT berücksichtigt man nur noch die N Abtastwerte x[0], ..., x[N-1] in einem Zeitfenster bzw. window der Länge TDFT=NTs, d.h. N-1 X(f ) x[n] e jn 2 f Ts . (3.2) n=0 N bezeichnet man als Blocklänge. Die Näherung in (3.2) ist natürlich umso besser, je kleiner die vernachlässigten Abtastwerte sind. Aus N Abtastwerten können maximal N Frequenzwerte bestimmt werden. Bei der DFT bestimmt man deshalb nur die N äquidistanten Abtastwerte m·fs/N, m=0, ..., N-1, des FourierSpektrums X(f) im Intervall [0,fs]. Wenn man in Gleichung (3.2) die kontinuierliche Variable f durch die diskrete Variable m·fs/N, m=0, ..., N-1, ersetzt, erhält man die DFT N-1 X[m] x[n] e j 2 mn N m 0, 1, ..., N 1 (3.3) n=0 Man kann zeigen, dass der folgende Ausdruck die inverse DFT bzw. die IDFT darstellt: x[n] 75880278 / 14.05.16 2 j mn 1 N-1 X[m] e N N m=0 n 0, 1, ..., N 1 Seite 2 / 15 (3.4) Rumc&Hhrt@ZSN@SoE@ZHAW 3.3. Eigenschaften der DFT Aus N Abtastwerten x[n] in einem Zeitfenster der Länge TDFT = N·Ts berechnet die DFT N komplexe Spektralwerte im Frequenzbereich 0 ... fs·(N-1)/N . Die Frequenzauflösung ist umgekehrt proportional zur Länge des Zeitfensters TDFT = N·Ts Δf = fs / N = 1 / (N·Ts) = 1/TDFT, (3.5) Wenn man die Gleichungen (3.1) und (3.3) vergleicht sieht man, dass das DFT-Spektrum mit dem Fourier-Spektrum übereinstimmt bei den N äquidistanten Spektralwerten f[m] = m·fs/N, 0≤m<N welche berechnet wurden aus der Zeitfenster-Sequenz xN[n]={x[0], ..., x[N-1]} (3.6) Beispiel In Abbildung 3.1 ist die Zeitfenster-Sequenz x[n] dargestellt, die man erhält, wenn man die Stossantwort eines analogen RC-Tiefpass-Filters 1. Ordnung mit der Zeitkonstante t0=RC=10s mit der Abtastfrequenz fs=1 Hz im Zeitfenster 0...TDFT=NTs=32s abtastet. Ebenfalls in Abbildung 3.1 ist das normierte 32-Punkt DFT-Betragsspektrum mit der Frequenzauflösung Δf=1/TDFT=1/32 Hz im Frequenzbereich [0,fs] dargestellt. (Mit reellen Werten x[n] ist die zweite Hälfte des DFT-Spektrums konjugiert komplex symmetrisch.) RC = 10s δ(t) R C x[0] ,..., x[31] xa(t) fs = 1 Hz N=32 Punkt DFT Zeitbereich xa(t)=(1/t0)·e-t/to t0=RC=10s Ts = 1 s Frequenzbereich TDFT = 32 s IXa(f)I = I1/(1+j2πf·t0)I fs = 1 Hz Δf = 1/TDFT = 1/32 Hz Abbildung 3.1: Normiertes 32-Punkt-DFT-Betragsspektrum. 75880278 / 14.05.16 Seite 3 / 15 Rumc&Hhrt@ZSN@SoE@ZHAW Das DFT-Spektrum in der 1. Nyquistzone [0,fs/2] stimmt gut mit dem Amplitudengang des analogen RC-Tiefpass-Filters 1. Ordnung überein, weil beim Abtasten nur wenig Aliasing entsteht. Das DFT-Spektrum in Gleichung (3.3) ist diskret und periodisch. Ein periodisches Spektrum hat zur Folge, dass das Zeitsignal diskret, d.h. abgetastet, ist. Weiter hat ein diskretes Spektrum zur Folge, dass das Zeitsignal periodisch ist! Mit der DFT bestimmt man also das Spektrum der periodisch fortgesetzten Zeitfenster-Sequenz, d.h. xNp[n] = ..., {xN[n+N]}, {xN[n]}, {xN[n-N]}, {xN[n-2N]}, ... X[n]/N (3.7) wobei n=0,..., N-1 und die Zeitfenster-Sequenz xN(n) in Gleichung (3.6) gegeben ist und aus N Abtastwerten einer Periode besteht. In Abbildung 3.2 ist ein Beispiel einer periodisch fortgesetzten Zeitfenster-Sequenz xNp[n] dargestellt. Abbildung 3.2: Periodisch fortgesetzte Zeitfenster-Sequenz xNp[n], N=32. Die Definition der DFT in Gleichung (3.3) hat den „Nachteil“, dass die Spektralwerte mit zunehmendem N immer grösser werden. Diesen Sachverhalt erkennt man am einfachsten, wenn man die DC-Komponente X[0] für die DC-Folge xN[n]=1,..., 1, 0 ≤ n < N, betrachtet. Es bleibt dem Anwender überlassen, die entsprechende Normierung vorzunehmen. Normalerweise teilt man die Spektralwerte X[m] durch N, siehe Gleichung (3.7). Die wichtigsten Eigenschaften der DFT: Zeitbereich Entsprechung Frequenzbereich N (reelle) Abtastwerte x[n] N komplexe Spektralwerte ○● Zeit-Abstand der Abtastwerte Spektrum wiederholt sich nach fs ○● Ts = 1/fs 1/Ts = fs (=> Spiegelspektren) Zeitfenster (= Messdauer) Frequenzauflösung ○● TDFT = N·Ts Δf = 1/( N·Ts) = fs/N = 1/ TDFT 75880278 / 14.05.16 Seite 4 / 15 Rumc&Hhrt@ZSN@SoE@ZHAW 3.4. Verwandtschaft der DFT mit der Fourierreihe Jede periodische Funktion xp(t) = xp(t-nT) kann als Fourierreihe dargestellt werden. Die komplexen Fourierkoeffizienten cn stellen dabei die Spektrallinien bei den Vielfachen der Grundfrequenz 1/T dar. Tastet man die periodische Funktion xp(t) mit N Werten pro Periode T ab, d.h. Ts=T/N bzw. fs=N/T, so erhält man das diskrete Signal xNp[n], dessen Spektrum aus dem Originalspektrum cn und Kopien bei Vielfachen der Abtastfrequenz fs besteht. Wenn beim Abtasten kein Aliasing entsteht, können die Spektrallinien cn gemäss Gleichung (3.7) mit der DFT berechnet werden, d.h. cn = X[n]/N, n=0,...,N/2. (3.8) Beispiel Abbildung 3.3 stellt N=8 Abtastwerte x[n] einer Periode T0 des cos-Signals x(t) = cos(2πf0t), f0 = 1/T0, und das zugehörige, normierte DFT-Spektrum X[n]/N dar. Das periodische Signal x(t) kann mit Hilfe der Eulerformel wie folgt als (komplexe) Fourierreihe dargestellt werden: x(t) = 0.5·e2πfot +0.5·e-2πfot. Alle Fourierkoeffizienten cn sind Null, ausser c1=c-1=0.5. Aus Abbildung 3.3 ist ersichtlich, dass die normierten 8-Punkt DFT-Werte mit den Fourierkoeffizienten cn, n = -3,...,3, übereinstimmen. Zeitbereich: N = 8 Abtastwerte x[n] einer Periode eines cos-Signals Zeit / T0 Frequenzbereich: N = 8 Spektralwerte X[n]/N im Bereich [0,fs=N·f0] c[1] c[-1] c[2] c[0] c[3] c[-3] c[-2] Frequenz / f0 f0 fs=8f0 Abbildung 3.3: Verwandtschaft normierte DFT mit komplexer Fourierreihe. 75880278 / 14.05.16 Seite 5 / 15 Rumc&Hhrt@ZSN@SoE@ZHAW 3.5. Filterfunktion der DFT (fakultativ) Die Berechnung der einzelnen DFT-Werte X[m] in Gleichung (3.3) entspricht einer Filterung. In Abbildung 3.4 ist der normierte Betrag IX(5)I/N einer 40-Punkt-DFT eines mit fs=8 kHz abgetasteten Cosinus-Signals x[n]=cos(2πf0·nTs), n=0,..., 39, dargestellt, wenn f0 variiert wird. Die Frequenzauflösung Δf=fs/N=8000/40 Hz=200 Hz. Der DFT-Wert X(5) entspricht der Spektralkomponente bei 5·Δf = 1 kHz. Für ein Cosinus-Signal der Frequenz f0 = 1000 Hz resultiert wie erwartet IX(5)I/N = 0.5. Solange die Frequenz f0 des Cosinus-Signals innerhalb des ∆f=200 Hz breiten Behälters (engl. bin) um f0 liegt, gilt IX(5)I/N ≈ 0.5. Liegt die Frequenz f0 des Cosinus-Signals aber ausserhalb des ∆f=200 Hz breiten Behälters um f0, spricht die 1 kHz Spektralkomponente „kaum“ mehr an, d.h. IX(5)I/N << 0.5. Bei den (anderen) Vielfachen der Frequenzauflösung ∆f gilt sogar IX(5)I/N=0. Dort sprechen die anderen DFT-Spektralfilter an. x[n] x(t) = cos(2πf0t) N=40 Punkt DFT X[5]/N fs=8 kHz Abbildung 3.4: Filterfunktion der DFT. 75880278 / 14.05.16 Seite 6 / 15 Rumc&Hhrt@ZSN@SoE@ZHAW 3.6. Leakage und Windowing (fakultativ) Mit der DFT wird das Spektrum der periodisch fortgesetzten Zeitfenster-Sequenz xNp[n] berechnet, siehe Gleichung (3.7). Wenn man die Fensterlänge unpassend wählt, kann es auf Grund der periodischen Fortsetzung zu Sprungstellen kommen, die im ursprünglichen Signal nicht enthalten waren. Das resultierende Spektrum weist dann zusätzliche, auslaufende Spektrallinien auf. Dieser Effekt wird leakage (Auslaufen) genannt. Der leakage-Effekt kann vermindert werden, wenn die Zeitfenster-Sequenz xN[n] mit einem auslaufenden Fenster (Window) gewichtet wird. Dieses sogenannte Windowing werden wir beim Digitalfilterentwurf noch genauer kennen lernen. Beispiel In Abbildung 3.5 oben ist das Zeitfenster so gewählt worden, dass genau 5 Perioden eines 50 Hz-Sinus darin Platz haben. Bei der periodischen Fortsetzung entstehen keine Sprungstellen. Das Betragsspektrum weist nur 1 Frequenzkomponente auf, nämlich bei 50 Hz. In Abbildung 3.5 Mitte ist das Zeitfenster so gewählt worden, dass 4.75 Perioden eines 50 Hz-Sinus darin Platz haben. Bei der periodischen Fortsetzung entstehen Sprungstellen. Das Betragsspektrum weist neben der Frequenzkomponente bei 50 Hz noch weitere, auslaufende Frequenzkomponenten in der Nähe von 50 Hz auf (Leakage). In Abbildung 3.5 unten ist das Zeitfenster wieder so gewählt worden, dass 4.75 Perioden eines 50 Hz-Sinus darin Platz haben. Die Zeitfenster-Sequenz xN[n] ist in diesem Fall aber mit einem Hanning-Fenster der Länge N gewichtet worden. Im Betragsspektrum ist der Leakage-Effekt immer noch erkennbar, aber deutlich kleiner als in der Mitte rechts. Abbildung 3.5: Leakage-Effekt bei der FFT, Betragsspektrum in dB, [1]. 75880278 / 14.05.16 Seite 7 / 15 Rumc&Hhrt@ZSN@SoE@ZHAW Die folgenden Abbildungen zeigen vier typische Fensterfunktionen (Windows), das gewichtete Zeitsignal (gemessenes Zeitsignal Fensterfunktion) und das resultierende Frequenzspektrum. in dB Frequenz-Spektrum Sample-Nummer gewichtetes Zeitsignal 1 0 -1 -0.05 0 0.05 Zeit in s Kaiser-Fenster mit Beta = 2 1 0.5 0 0 50 Sample-Nummer gewichtetes Zeitsignal 1 0 -1 -0.05 0 0.05 Zeit in s Kaiser-Fenster mit Beta = 7 1 0.5 0 0 50 Sample-Nummer gewichtetes Zeitsignal 1 0 -1 -0.05 0 0.05 Zeit in s 1 0.5 0 0 50 50 0 0.05 0 500 Frequenz in Hz Frequenz-Spektrum in dB 0 Zeit in s 50 0 0 500 Frequenz in Hz Frequenz-Spektrum in dB Hamming-Fenster Zeitsignal 50 0 0 500 Frequenz in Hz Frequenz-Spektrum in dB Rechteck-Fenster = ohne Gewichtung 1 1 0.5 0 0 -1 0 50 -0.05 Sample-Nummer 50 0 0 500 Frequenz in Hz Abbildung 3.6: Windowing mit f0 = 68Hz-Sinussignal mit fs = 1000Hz und N = 50 Fensterlänge ist kein ganzzahliges Vielfaches der Periodenlänge => Sprungstelle In der Abbildung 3.6 ist die Sprungstelle infolge periodischer Widerholung des Signalausschnitts bei der Zeit 0 gut ersichtlich. Die periodische Wiederholung ist nicht eine physikalisch reale Wiederholung, sondern sie entsteht durch den DFT-Algorithmus, weil nur endlich lange gemessen wurde. Vom realen Signal steht somit nur ein Ausschnitt mit N Messwerten für die Berechnung des FrequenzSpektrums zur Verfügung. Aus N äquidistanten Messwerten im Zeitbereich können N äquidistante Frequenzlinien berechnet werden. Der Abstand der Frequenzlinien (= Frequenzauflösung) beträgt somit fs/N. Liegt die Signal-Frequenz nicht genau auf einer dieser Frequenzlinien, so sprechen die benachbarten Frequenzlinien an. Bezogen auf Abbildung 3.6: f = fs/N = 1000Hz/50 = 20Hz f0 = 68Hz liegt also zwischen den Linien 60Hz und 80Hz. Die 60Hz-Linie spricht am stärksten an, weil sie am nächsten liegt. Gewichten des Zeitsignals (Windowing) mit einem Fenster kann die Sprungstelle verkleinern oder sogar ganz eliminieren. Aus der Abbildung 3.6 sieht man, dass durch Windowing das Signal „verschwimmt“ und die Frequenz weniger genau erfassbar wird. Leakage wird durch Gewichtung mit einem Window erheblich reduziert. Es muss immer ein Kompromiss gefunden werden zwischen Messgenauigkeit bei der Signal-Leistung (Amplitude) und der Frequenz-Selektivität. Frequenz möglichst genau messen => kein Fenster Signalleistung möglichst genau messen => mit Fenster 75880278 / 14.05.16 Seite 8 / 15 Rumc&Hhrt@ZSN@SoE@ZHAW in dB Frequenz-Spektrum Sample-Nummer gewichtetes Zeitsignal 1 0 -1 -0.05 0 0.05 Zeit in s Kaiser-Fenster mit Beta = 2 1 0.5 0 0 50 Sample-Nummer gewichtetes Zeitsignal 1 0 -1 -0.05 0 0.05 Zeit in s Kaiser-Fenster mit Beta = 7 1 0.5 0 0 50 Sample-Nummer gewichtetes Zeitsignal 1 0 -1 -0.05 0 0.05 Zeit in s 1 0.5 0 0 50 50 0 0.05 0 500 Frequenz in Hz Frequenz-Spektrum in dB 0 Zeit in s 50 0 0 500 Frequenz in Hz Frequenz-Spektrum in dB Hamming-Fenster Zeitsignal 50 0 0 500 Frequenz in Hz Frequenz-Spektrum in dB Rechteck-Fenster = ohne Gewichtung 1 1 0.5 0 0 -1 0 50 -0.05 Sample-Nummer 50 0 0 500 Frequenz in Hz Abbildung 3.7: Windowing mit einem 80Hz-Sinussignal mit fs = 1000Hz und N = 50 Fensterlänge ist ein ganzzahliges Vielfaches der Periodenlänge => keine Sprungstelle Abbildung 3.7 zeigt den Fall, dass die Frequenz des zu messenden Signals genau auf einer Frequenzlinie liegt. In diesem Fall gibt es keine Sprungstelle im periodisch fortgesetzten Signal. Beim Rechteck-Fenster spricht genau diese eine Frequenzlinie an. Durch das Gewichten mit einem Fenster wird das Zeitsignal etwas verfälscht, was sich in einem „breiteren“ Spektrum bemerkbar macht. Leakage lässt sich ganz vermeiden, wenn die Fensterlänge für die FFT ein Vielfaches der Periodendauer des Signals beträgt. Auf Windowing kann verzichtet werden. Windowing ist hier sogar nachteilig! Die Abbildungen 3.6 und 3.7 wurden mit dem Matlab-Skript dsv1kap3_dftfft_windowing.m erstellt. Für den Fensterentwurf unter Matlab steht das Kommando wintool zur Verfügung. Mit help window resp. doc window können Erklärungen und Listen mit den verfügbaren Fenstern angezeigt werden. Mathematisch entspricht der Multiplikation im Zeitbereich eine Faltung im Frequenzbereich (siehe Kapitel 2.9.3 Fouriertransformation): x(t)w(t) ○-● X(f)W(f) Damit kann Leakage mathematisch und numerisch korrekt gerechnet werden. Sie ist auch eine andere (präzisere) Sichtweise auf die oben gegebene intuitive Erklärung für das Leakage. 75880278 / 14.05.16 Seite 9 / 15 Rumc&Hhrt@ZSN@SoE@ZHAW 3.7. Schnelle Fouriertransformation (FFT) Die Verarbeitungszeit für einen Algorithmus hängt wesentlich von der Anzahl Multiplikationen ab, die ein Rechner ausführen muss. Der Aufwand zur Berechnung der N Spektralwerte beträgt mit der DFT ca. N2 komplexe Multiplikationen, siehe Gleichung (3.3). Cooley und Tukey haben 1965 die Fast Fourier Transformation entwickelt. Mit dem FFTAlgorithmus lassen sich die N DFT-Werte mit einem Aufwand von ca. N·log2(N) komplexen Multiplikationen berechnen, was einer enormen Reduktion des Aufwands entspricht. Für eine Blocklänge von N=1024 zum Beispiel müssten mit der DFT ca. 1 Million Multiplikationen berechnet werden, während mit der FFT nur ca. 10’000 Multiplikationen anfallen. Es gibt allerdings Anwendungen (z.B. Detektion DTMF-Wählton), in denen nur wenige Spektralwerte interessieren. In diesen Anwendungen kann es durchaus vorteilhaft sein, mit der DFT die wenigen Spektralwerte direkt und nicht mit der FFT alle möglichen DFT-Werte zu berechnen. Mit dem Görtzel-Algorithmus [2] ist es z.B. möglich, einzelne DFT-Werte X[m0] mit IIR-Filtern 1. bzw. 2. Ordnung rekursiv zu berechnen. Die Grundidee bei der FFT besteht darin, eine N-Punkt DFT in zwei N/2-Punkt DFTs aufzuteilen, eine über die geraden und eine über die ungeraden Abtastwerte. Im Folgenden nehmen wir der Einfachheit wegen an, dass N eine Zweierpotenz ist. Wenn man in der Definition (3.3) der DFT eine Aufteilung für die geraden und die ungeraden Abtastwerte x[2n] und x[2n+1] vornimmt, erhält man X[m] N/2-1 N/2-1 n=0 n=0 x[2n] WNm2n x[2n+1] W m(2n 1) N m 0, 1, ..., N 1 , (3.9) wobei der Term W N=e-j2π/N weight oder twiddle factor genannt wird und nur eine Funktion von N ist. W N weist die Symmetrie W N2mn=W N/2mn auf. Der Ausdruck (3.9) kann deshalb wie folgt vereinfacht werden, X[m] N/2-1 x[2n] W mn N/2 n=0 N/2-1 WNm x[2n+1] WNmn/ 2 m 0, 1, ..., N 1 . (3.10) n=0 Die beiden Summen oben stellen N/2-Punkt DFTs dar. Für die Berechnung von (3.10) sind jetzt aber nur noch 2·(N/2)2+N komplexe Multiplikationen erforderlich, statt N2 für die DFT in der ursprünglichen Form. Diese Reduktion ist für grosse N (z.B. N=1024) bereits beträchtlich. Die beiden kurzen DFTs im Ausdruck (3.10) können nun sukzessive in DFTs halber Länge unterteilt werden, bis letztlich nur noch 2-Punkt-DFTs zu berechnen sind. Man bezeichnet FFT-Algorithmen, die die Eingangsfolge x[n] wie oben beschrieben in immer kürzere Teilfolgen unterteilen, decimation-in-time FFT-Algorithmen. Umgekehrt gibt es auch decimation-in-frequency Algorithmen, die die Ausgangsfolge X[n] in immer kürzere Teilfolgen unterteilen. In Abbildung 3. ist das Signalflussdiagramm zur Berechnung des FFT-Algorithmus für N=4 gemäss Gleichung (3.10) dargestellt. Die Addition ist mit zusammenlaufenden Pfaden dargestellt. Die Multiplikation mit 1 ist nicht speziell gekennzeichnet. 75880278 / 14.05.16 Seite 10 / 15 Rumc&Hhrt@ZSN@SoE@ZHAW X[0] = (x[0]+x[2]) + (-j)0·(x[1]+x[3]) x[0] 00 => 00 x[2] -1 10 => 01 x[1] X[1] = (x[0]-x[2]) + (-j)1·(x[1]-x[3]) -j -1 01 => 10 x[3] -1 11 => 11 j X[2] = (x[0]+x[2]) + (-j)2·(x[1]+x[3]) X[3] = (x[0]-x[2]) + (-j)3·(x[1]-x[3]) Abbildung 3.8: Signalflussdiagramm der 4-Punkt FFT mit Bitumkehr am Eingang. Das Spektrum kann in log2(N) unabhängigen Teilschritten mit Hilfe von je N/2 sogenannten butterflys berechnet werden. Es ist nur 1 Vektor mit N komplexen Speicherwerten erforderlich (in-place computation)! Die Eingangswerte sind seltsam sortiert und müssen umsortiert werden, was ein Bestandteil des Algorithmus ist. Die korrekte Reihenfolge erhält man, wenn man den Zeitindex n von x[n] binär darstellt und für die Speicherung rückwärts liest (bit-reversed-Adressierung bzw. Bitumkehr, siehe Abbildung 3.8). Der FFT-Algorithmus ist so wichtig in der digitalen Signalverarbeitung, dass die meisten Numerikprogramme und DSP-Entwicklungsumgebungen FFT-Library-Routinen bereitstellen. In der Matlab Signal Processing Toolbox z.B. gibt es die Funktionen fft()und ifft(). In [3] gibt es gut dokumentierte C-Beispielprogramme für den Fall, dass keine Routinen zur Verfügung stehen. 3.8. FFT von reellwertigen Signalen Eine N-Punkt FFT transformiert N komplexe Zeitwerte in N komplexe Spektralwerte. In der Praxis sind die meisten Zeitsignale x[n] aber reellwertig, denn sie repräsentieren zum Beispiel einen Spannungsverlauf in Funktion der Zeit. Selbstverständlich ist es möglich, mit einer N-Punkt FFT aus N reellen Zeitwerten N komplexe Spektralwerte zu berechnen. Dazu muss man im Speicher einfach die Imaginärteile der N Speicherwerte mit Null initialisieren, siehe Abbildung 3.9. reellwertiges Zeitsignal komplexes Spektrum Re{x[0]} = x[0] Im{x[0]} = 0 Re{x[1]} = x[1] Im{x[1]} = 0 : Re{x[N-1]} = x[N-1] Im{x[N-1]} = 0 Re{X[0]} Im{X[0]} Re{X[1]} Im{X[1]} : Re{X[N-1]} Im{X[N-1]} N-Punkt FFT Abbildung 3.9: N-Punkt FFT eines Zeitsignals x[n] mit N reellen Abtastwerten. 75880278 / 14.05.16 Seite 11 / 15 Rumc&Hhrt@ZSN@SoE@ZHAW Dank der in-place Berechnung ist im Speicher nur 1 Vektor mit N komplexen Werten erforderlich. Der Vektor x mit den Zeitwerten wird im Laufe der Berechungen durch den Vektor X mit den Spektralwerten überschrieben. Man kann aber vermuten, dass man effizienter arbeiten kann. Tatsächlich gibt es 2 Verbesserungsmöglichkeiten: Eine Verbesserungsmöglichkeit besteht darin, mit einer einzigen N-Punkt FFT gleichzeitig zwei N-Punkt Spektren von zwei verschiedenen, reellwertigen Zeitsignalen (z.B. linker und rechter Stereokanal) zu berechnen. Eine andere Verbesserungsmöglichkeit besteht darin, mit einer kurzen N/2-Punkt FFT ein grosses N-Punkt Spektrum eines reellwertigen Zeitsignals zu berechnen und so Rechenzeit und Speicherplatz zu sparen. N-Punkt FFT von 2 reellwertigen Zeitsignalen mit je N Abtastwerten Wir betrachten zuerst die gleichzeitige Berechnung von zwei N-Punkt Spektren X1[m] und X2[m] mit Hilfe einer einzigen N-Punkt FFT, siehe Abbildung 3.10. x1[0] X1[0] x1[1] Re{y[0]} : Im{y[0]} x1[N-1] x1[0] x2[0] N-Punkt FFT x1[1] Packing x2[0] X1[1] Re{Y[0]} Im{Y[0]} : Re{Y[1]} X1[N-1] Splitting x2[1] Im{Y[1]} : : X2[0] x2[1] Re{y[N-1]} x1[N-1] Re{Y[N-1]} X2[1] : Im{y[N-1]} x2[N-1] Im{Y[N-1]} : Zeitbereich Frequenzbereich X2[N-1] x2[N-1] Abbildung 3.10: Berechnung von zwei N-Punkt Spektren mit einer einzigen N-Punkt FFT. Im 1. Schritt bildet man aus den beiden verschiedenen, reellwertigen Zeitsignalen x1[n] und x2[n] der Länge N einen komplexen Inputvektor y[n] = x1[n] + j·x2[n], n=0,...,N-1, (3.11) für die FFT, indem man die geraden Speicherzellen im FFT-Buffer mit x1[n], n=0,...,N-1, und die ungeraden Speicherzellen mit x2[n], n=0,...,N-1, füllt, siehe Abbildung 3.10. Im 2. Schritt berechnet man mit Hilfe der FFT aus den N komplexen Werten y[n], n=0,...,N-1, die N komplexen Spektralwerte Y[m], m=0,...,N-1. Wegen der Linearität der DFT gilt: Y[m] = X1[m] + j·X2[m] (3.12) Die gewünschten Spektren X1[m] und X2[m] sind komplex und können deshalb nicht einfach durch Bildung des Realteils und des Imaginärteils in Gleichung (3.12) bestimmt werden, wie man vielleicht auf den ersten Blick vermuten mag. 75880278 / 14.05.16 Seite 12 / 15 Rumc&Hhrt@ZSN@SoE@ZHAW Um die beiden gewünschten Spektren X1[m] und X2[m] aus dem FFT-Spektrum Y[m] heraus zu trennen, werden im 3. Schritt deshalb die folgenden Summen gebildet (Y[m] + Y*[N-m])/2 = (X1[m] + j·X2[m] + X1*[N-m] - j·X2*[N-m])/2 (3.13) (Y[m] - Y*[N-m])/2j = (X1[m] + j·X2[m] - X1*[N-m] + j·X2*[N-m])/2j wobei m=0,...,N-1. In Gleichung (3.13) stellt z* den konjugiert komplexen Wert von z dar. Ausserdem ist in der Umformung Gleichung (3.12) sowie die Identität (z1+z2)* = z1*+z2* verwendet worden. Für das N-Punkt FFT-Spektrum eines reellwertigen Zeitsignals x[n] gilt aber die Symmetrie X*[N-m] = X[m] (3.14) wobei m = 0,..., N-1. Durch Einsetzen von (3.14) in (3.13) erhält man die gewünschte Spektrumstrennung X1[m] = (Y[m] + Y*[N-m]) / 2 (3.15) X2[m] = (Y[m] - Y*[N-m]) / 2j, wobei m=0,...,N-1. Wegen der Symmetrie Y*[N]=Y[0] gilt für die DC-Werte insbesondere X1[0] = Re{Y[0]} und X2[0] = Im{Y[0]}. N/2-Punkt FFT eines reellwertigen Zeitsignals mit N Abtastwerten Wir betrachten nun die Berechnung eines N-Punkt Spektrums eines reellwertigen Zeitsignals x[n] mit Hilfe einer (kurzen) N/2-Punkt FFT, siehe Abbildung 3.11. x[0]=xe[0] y[0] x[1]=xo[0] x[2]=xe[1] y[1] y[N/2-1] Re{Y[0]} N/2-Punkt FFT Im{Y[0]} Re{Y[1]} X[0] Zusammenfügen X[1] X[2] x[3]=xo[1] Im{Y[1]} X[3] : : : x[N-2] =xe[N/2-1] Re{Y[N/2-1]} X[N-2] x[N-1]=xo[N/2-1] Im{Y[N/2-1]} X[N-1] Zeitbereich Frequenzbereich Abbildung 3.11: Berechnung eines N-Punkt Spektrums mit einer N/2-Punkt FFT. Zuerst bildet man aus dem reellwertigen Zeitsignal x[n] der Länge N einen Eingangsvektor für die FFT mit N/2 komplexen Werten y[n] = x[2n] + j·x[2n+1] = xe[n] + j·xo[n], n=0,...,N/2-1, (3.16) indem man die geraden Speicherzellen im FFT-Buffer mit den geraden bzw. even-Werten xe[n], n=0,...,N/2-1, und die ungeraden Speicherzellen mit den ungeraden bzw. odd-Werten xo[n], n=0,...,N/2-1, füllt, siehe Abbildung 3.11. 75880278 / 14.05.16 Seite 13 / 15 Rumc&Hhrt@ZSN@SoE@ZHAW Dann berechnet man die N/2-Punkt FFT und erhält N/2 komplexe Spektralwerte Y[m] = Xe[m] + j∙Xo[m], m=0,...,N/2-1. (3.17) Das Spektrum Y[m] setzt sich aus dem even-Spektrum Xe[m] und dem odd-Spektrum Xo[m] zusammen. Gemäss Gleichung (3.10) kann das N-Punkt Spektrum X[m] aber aus den zwei N/2-Punkt-Spektren Xe[m] und Xo[m] wie folgt zusammengesetzt werden, X[m] = Xe[m] + ej2πm/N ∙Xo[m], m=0,...,N/2-1. (3.18) Verwendet man jetzt wieder die Symmetrie (3.14), kann man analog zur Herleitung oben zeigen, dass man das gewünschte Spektrum X[m] wie folgt bestimmen kann (siehe [2], [3]): X[m] = 0.5∙(Y[m] + Y*[N-m]) - 0.5∙j∙(Y[m] - Y*[N-m])∙ej2πm/N (3.19) wobei m=0,...,N-1. In der Praxis nennt man die oben beschriebenen Verfahren manchmal etwas unpräzis „komplexe FFT“ und „reelle FFT“. In [3] gibt es gut dokumentierte C-Beispielprogramme für den Fall, dass keine Routinen für die „reelle FFT“ zur Verfügung stehen. 3.9. Echtzeit-Signalverarbeitung mit der FFT (fakultativ) Die Ausgangsfolge eines Digitalfilters kann mit Hilfe der diskreten Faltung direkt im Zeitbereich bestimmt werden. Alternativ kann die Ausgangsfolge aber auch mit Hilfe der FFT und der IFFT indirekt via Frequenzbereich bestimmt werden, siehe Abbildung 3.12. Je nach Aufgabe kann sich der „Umweg“ über den Frequenzbereich dank der Effizienz der FFT/IFFT sogar aufwandmässig lohnen. x[n] FFT X[m] Y[m] IFFT y[n] H[m] = FFT{ h[n] } Abbildung 3.12: Bestimmung der Ausgangsfolge eines Digitalfilters via Frequenzbereich. Bei der in Abbildung 3.12 dargestellten Alternative gibt es aber eine Schwierigkeit. Die Multiplikation der DFT-Spektren im Frequenzbereich entspricht der zyklischen Faltung der entsprechenden Zahlenfolgen im Zeitbereich, d.h. N 1 y[n] x[n] h[n] h[m] x[( n m) mod N ] (3.20) m 0 Die DFT „betrachtet“ nämlich die Signale x[n] und y[n] als periodisch. Für die Echtzeit-Verarbeitung braucht es aber die lineare Faltung ohne die Modulo-Operation im Ausdruck (3.20). Deshalb bedient man sich eines Tricks. Die zyklische Faltung stimmt mit der linearen Faltung überein, wenn die Folgen x[n] und h[n] entsprechend mit Nullen ergänzt werden. 75880278 / 14.05.16 Seite 14 / 15 Rumc&Hhrt@ZSN@SoE@ZHAW In Abbildung 3.13 ist die FFT-Echtzeit-Verarbeitung mit der overlap-add-Methode dargestellt. Die Eingangsfolge x[n] wird in Segmente xM[n] mit M Abtastwerten unterteilt. Jedes Segment wird mit L-M Nullen ergänzt und einer L-Punkt-FFT unterzogen. Das resultierende Spektrum werde mit XL[m] bezeichnet. Die Filter-Stossantwort h[n] der Länge N+1 wird mit L-N-1 Nullen ergänzt und auch einer L-Punkt-FFT unterzogen. Die Bestimmung des diskreten Frequenzgangs HL[m] muss nur einmal gemacht werden. Die Spektren XL[m] der verlängerten Segmente werden je mit dem diskreten Frequenzgang HL[m] multipliziert. Dieser Multiplikation im Frequenzbereich entspricht die zyklische Faltung im Zeitbereich. Letztere ist aber Dank der Nullen-Ergänzung identisch mit der linearen Faltung, solange L > M+N. Mit Hilfe der IFFT werden die gefilterten Segmente yL[n] bestimmt. Sie haben die Länge L>M und überlappen sich. Die Ausgangsfolge y[n] kann bestimmt werden, indem man die gefilterten Segmente yL[n] überlappend addiert (Superposition bei einem linearen System). In der Matlab Signal Processing Toolbox gibt es die Funktion fftfilt(), die auf der overlap-add-Methode basiert. Es exisitiert noch ein anderes Segmentierverfahren (overlapsave). Segmente mit M Abtastwerten x[n] M xN[n] M h[n] N+1 M M L-M Nullen L-N-1 Nullen M L > M+N L-Punkt-FFT => Multiplikation XL[m]·HL[m] => L-Punkt-IFFT yL[n] L L L overlap! y[n] Abbildung 3.13: 75880278 / 14.05.16 M M M M FFT-Echtzeitsignalverarbeitung mit der overlap-add-Methode. Seite 15 / 15 Rumc&Hhrt@ZSN@SoE@ZHAW