In Teil 3 haben wir gesehen, dass wir ein periodisches Signal s mit Periodendauer T als Summe rotierender Zeiger
schreiben können (zumindest wenn s »schön« ist). Dabei ist die Grundfrequenz und die Grundkreisfrequenz
mit
.
Wir haben auch gesehen, dass wir die Fourier-Koeffizienten über die Mittelwerte
erhalten. Dabei müssen wir über eine ganze Periode integrieren, egal wo wir anfangen: 0 bis T, bis
,
bis
, …
Wenn wir den Verlauf des Signals s tatsächlich als mathematischen Funktionsterm kennen, sind diese Integrale prinzipiell berechenbar – auch wenn es manchmal kompliziert werden kann. Aber was, wenn wir den Funktionsterm des Signals nicht kennen, z.B. weil wir es gemessen haben? – In beiden Fällen können wir die Integrale zumindest näherungsweise numerisch berechnen.
Periodendauer des Signals bekannt
Zunächst wollen wir annehmen, dass wir zumindest die Periodendauer T des Signals tatsächlich kennen. Dann messen wir das Signal N-mal innerhalb der Periodendauer, sprich wir kennen seine Werte zu den Zeiten
für
(s. Abb. 1). Man beachte, dass der Wert am Ende der Periode bei nicht dabei ist. Wenn N klein ist, kann das den Mittelwert beeinflussen.
Der Kehrwert des Messintervalls ist die Abtastrate bzw. Sampling-Frequenz
.

Hintransformation
Mit den N gemessenen Signalwerten versuchen wir jetzt, das Integral für die Fourier-Koeffizienten
näherungsweise zu berechnen, indem wir es durch eine Summe ersetzen:
wobei wir und
benutzt haben. Je größer die Zahl der Messwerte
ist, desto besser ist die Näherung; Integrale sind ja der Grenzwerte so einer Summe für
.
Für die Fourier-Reihe gab es unendlich viele Fourier-Koeffizienten – auch wenn fast alle gleich 0 sein konnten. Wie sieht es hier aus? Berechnen wir z.B.
Der Faktor ist aber gleich 1, weil
ist; wir drehen unseren Zeiger ja nur n-mal im Kreis, was seine Richtung nicht ändert. Daher gilt
.
Anstatt unendlich vieler Fourier-Koeffizienten haben wir jetzt nur noch N verschiedene Koeffizienten für N Messwerte .
Rücktransformation
Wie können wir aus den wieder unsere Messwerte
erhalten? Wir können nicht so einfach in die Formel für
einsetzen, weil dort unendlich viele Koeffizienten benötigt werden, und wir haben nur noch N Stück.
Die N-te Einheitswurzel wollen wir
(»zeta-N«) nennen. Dann ist
, und wir können unsere Formel für
schreiben als:
,
weil wir ja von bis
summieren. Von dieser Gleichung haben wir insgesamt N Stück, nämlich von
bis
. Multiplizieren wir alle diese Gleichungen mit
, erhalten wir
Davon haben wir wieder N Stück. Und die addieren wir jetzt alle von bis
:
Das sieht furchteinflößend aus, hat aber eine gewisse Struktur. Spannend ist, was jeweils in den großen runden Klammern passiert.
Dazu müssen wir uns wieder mit den Einheitswurzeln beschäftigen. Das sind komplexe Zahlen, die alle die Länge 1 haben; und wenn man sie zur N-ten Potenz nimmt, kommt genau 1 heraus. Für
wären es die beiden Einheitswurzeln
und
, weil
und
sind.
Schauen wir sie uns für in Abb. 2(links) an. Die Einheitswurzeln sind Pfeile, die alle denselben Winkel zueinander haben, in diesem Fall
. Wenn wir sie alle addieren, würde sich ein geschlossenes Polygon ergeben, und die Summe wäre gleich 0.

In den Klammern oben stehen aber leider nicht direkt die Einheitswurzeln, sondern sie werden alle mit derselben ganzen Zahl im Exponenten multipliziert. Wenn diese Zahl z.B. 2 ist, erhalten wir die Pfeile in Abb. 2(rechts). Das sind aber exakt dieselben Pfeile, nur anders nummeriert. D.h., auch so eine Summe muss gleich 0 sein.
Die vielen Klammern oben sind also alle gleich 0, mit einer Ausnahme: die Zeile, in der steht. Dort steht im Exponenten nämlich
, es werden also nur N Einser addiert. Letztlich reduziert sich dieser komplizierte Ausdruck also auf
,
wo wir das N einfach kürzen können.
Dieses Argument ist ähnlich zu dem, das wir zur Berechnung der Fourier-Koeffizienten in Teil 3 verwendet haben. Es ist etwas komplizierter, weil die Zeiger hier jetzt nicht kontinuierlich rotieren, sondern wir nur »Schnappschüsse« zu den Zeiten haben.
Diskrete Fourier-Transformation (DFT)
Für haben wir also das Transformations-Paar
und
mit dem Zeitintervall und dem Frequenzintervall
.
Diese beiden Formeln gelten übrigens unabhängig davon, ob wir unsere Zahlen aus einer Messung oder sonst wie erhalten haben. Ich nehme N (komplexe) Zahlen, wende eine der beiden Formeln an und erhalte die anderen N Zahlen – und kann es auch wieder rückgängig machen.
Die komplexen Amplituden – die ich lieber mag – bekommen wir wieder mit
Abtasttheorem
Nehmen wir als Beispiel das Signal s mit
,
wie es in Abb. 1 gezeigt ist. Die Periodendauer soll sein. Die Grundfrequenz ist daher gleich
, der Oberton hat die Frequenz
. Der Mittelwert beträgt -1 und die Amplituden von Grund- und Oberton sind 3 bzw. 2. Die entsprechenden Phasen sind
bzw.
.
Die Berechnung der DFT überlassen wir dem Computer. MATLAB ist eine proprietäre Standardsoftware für solche Rechnungen. Der folgende Code wird aber auch vom freien Octave verstanden. Der fft
-Befehl berechnet die Diskrete Fourier-Transformation mit dem Fast Fourier Transform-Algorithmus; dieser ist besonders schnell, wenn die Zahl der Messwerte (Samples) eine Zweierpotenz ist.
% Periodendauer (in s) T = 2.0; % Anzahl der Samples % FFT ist am effizientesten mit 2er-Potenzen N = 2^4; % Abtastzeiten (in s) tn = (0:(N - 1))*T/N; % das Signal sn = -1 + 3*sin(2*pi/T*tn + pi) + ... 2*sin(5*2*pi/T*tn - pi/2); % die Frequenzen der Fourier-Koeffizienten (in Hz) fk = (0:(N - 1))/T; % Fourier-Koeffizienten berechnen Sk = fft(sn)/N; % komplexe Amplituden Ak = 2i*Sk; Ak(1) = Ak(1)/2; % MATLAB beginnt bei 1 zu zählen plot(fk, abs(Ak), 'o') xlabel('Frequenz in Hz') ylabel('Amplitude')
Das Ergebnis ist das Amplitudenspektrum in Abb. 3. Es beginnt vielversprechend: Der Mittelwert hat Amplitude 1, der Grundton bei 0.5 Hz hat Amplitude 3 und der Oberton bei 2.5 Hz hat Amplitude 2, so wie es sein soll.

Aber was sollen die Amplituden bei 5.5 Hz und 7.5 Hz? Wenn wir den Gleichanteil bei 0 Hz ignorieren, scheint das Spektrum symmetrisch um 4 Hz herum zu sein. Warum ist das so?
Es gilt:
Weil die reelle Zahlen sind, ändert sich für
verglichen mit
nur das Vorzeichen des Imaginärteils. Für reelle Signale s gilt daher
.
Die Beträge einer komplexen Zahl und ihrer konjugiert komplexen sind gleich, daher ist das Amplitudenspektrum symmetrisch.
D.h., ab erhalten wir keine neue Information mehr; also ab
. Die Frequenz, bei der das passiert, ist die Nyquist-Frequenz
.
(Falls N keine gerade Zahl ist, müssten wir immer nehmen, die größte ganze Zahl, die nicht größer als
ist.)
Im Beispiel oben ist die Sampling-Frequenz ; die Nyquist-Frequenz, um die herum das Spektrum symmetrisch ist, beträgt
. Eigentlich bräuchte man das Amplitudenspektrum nur bis zur Nyquist-Frequenz zu zeichnen.
Weil ist, lautet das Abtasttheorem:
Die Sampling-Frequenz muss mindestens doppelt so groß sein wie die größte im Signal vorkommende Frequenz.
Das Problem ist, dass man das bei vielen Signalen nicht erfüllen kann. Wenn wir z.B. die Sägezahnschwingung aus Teil 2 nehmen, dann nehmen die Amplituden indirekt proportional mit der Frequenz ab, werden also nie exakt gleich 0. Es gibt daher oft keine größte Frequenz des Signals.
Aliasing
Was passiert, wenn unsere Abtastrate zu klein ist (Undersampling); wenn unser Signal also Frequenzen über beinhaltet? Lassen wir die Abtastrate wie oben bei
, aber addieren zu unserem Signal einen Sinus mit Frequenz 7 Hz:
.
% das Signal sn = -1 + 3*sin(2*pi/T*tn + pi) + ... 2*sin(5*2*pi/T*tn - pi/2) + 4*sin(14*2*pi/T*tn);
Das entsprechende Amplitudenspektrum zeigt Abb. 4. Tatsächlich haben wir die richtige Amplitude bei 7 Hz, aber es taucht dieselbe Amplitude fälschlicherweise auch bei 1 Hz auf.

Der Grund ist wieder, dass ist. Dadurch werden nicht nur die Amplituden kleiner Frequenzen »nach oben« gespiegelt, sondern auch umgekehrt. Diesen Effekt nennt man Aliasing.
Wie es anschaulich zu dieser Rückfaltung von Amplituden kommen kann, zeigt Abb. 5. Die grüne Kurve ist unser zusätzliches 7 Hz-Signal und die blaue Kurve ist das entsprechende 1 Hz-Signal mit einer Phasenverschiebung von (komplex konjugieren bedeutet, das Vorzeichen des Imaginärteils zu ändern, und
!).

Die roten Punkte sind unsere Messwerte. Wie man sieht, können wir aufgrund dieser Messwerte nicht zwischen den beiden Kurven unterscheiden. Hätten wir mehr Punkte gemessen, z.B. doppelt so viele, könnten wir das sehr wohl!
Sollte die tiefere Frequenz von Haus aus eine Amplitude größer 0 haben, müsste man diese Amplitude zu der nach unten gefalteten addieren (unter Berücksichtigung der relativen Phasen von und
).
Ergänzung 2018-08-14: Wenn Frequenzen jenseits der Sampling-Frequenz im Signal vorhanden sind, bekommt man sogar mehrere Kopien. Z.B., wenn wir zu unserem Ausgangssignal eine Anteil mit 11 Hz addieren:
.
% das Signal sn = -1 + 3*sin(2*pi/T*tn + pi) + ... 2*sin(5*2*pi/T*tn - pi/2) + 4*sin(22*2*pi/T*tn);
Der Fourier-Index dafür ist . Das entsprechende Amplitudenspektrum zeigt Abb. 4-b. Die 11 Hz kommen in dem Spektrum prinzipiell nicht vor. Aber:
, d.h.
und
,
weil und
sind. Daher sehen wir das 11 Hz-Signal fälschlicherweise bei
und bei
.

Schauen wir uns noch die Sägezahnfunktion aus Abb. 6 in Teil 2 an. Dazu müssen wir nur die Berechnung der Messwerte durch
% das Signal sn = pi/2 - pi/2*tn; % Sägezahn
ersetzen.
Abb. 6 vergleicht die Amplitudenspektren für verschiedene Anzahlen von Messwerten. Für N = 16 gibt es durch das Aliasing einige Abweichungen vom erwarteten Verhalten. Der Gleichrichtwert ist nicht gleich 0, weil der letzte Punkt am Ende des Signals fehlt – der wäre bei und das gehört nicht mehr zu unseren Messwerten. Für N = 1024 ist das Aliasing stark reduziert; wir bekommen fast die exakten Werte heraus. Im unteren Spektrum könnten wir natürlich weiter als bis 4 Hz gehen, nicht aber im oberen.

Phasenspektrum
Gehen wir wieder zum Signal s aus Abb. 1 zurück, dessen Amplitudenspektrum in Abb. 2 gezeigt wurde. Um das Phasenspektrum zu berechnen müssen wir ab der Berechnung der komplexen Amplituden den folgenden Code einfügen:
% komplexe Amplituden Ak = 2i*Sk; Ak(1) = Ak(1)/2; % MATLAB beginnt bei 1 zu zählen % Absolutwerte der komplexen Amplituden absAk = abs(Ak); % Phasen der komplexen Amplituden phik = angle(Ak)/pi; % Phasen als Vielfache von pi subplot(2,1,1); plot(fk, absAk, 'o') ylabel('Amplitude') subplot(2,1,2); plot(fk, phik, '+') xlabel('Frequenz in Hz') ylabel('Phase / pi')
Dieser Code zeichnet Amplituden- und Phasenspektrum übereinander. In Abb. 7 zeige ich jetzt nur das Phasenspektrum. Und das sieht schlimm aus.

Der Gleichrichtwert bei 0 Hz hat die Phase , weil der Mittelwert negativ ist. Passt! Die Grundschwingung bei 0.5 Hz hat die Phase
und die Oberschwingung bei 2.5 Hz hat die Phase
. Auch die beiden passen. Alle anderen Phasen sollten aber 0 sein! Stattdessen sehen wir irgendwas.
Warum ist das so? Obwohl Abb. 2 die Amplituden bei diesen Frequenzen als 0 zeigt, sind sie nicht wirklich exakt 0. Die komplexe Amplitude bei 1 Hz ist z.B.
,
und ihre berechnete Phase ist . Bei einer Amplitude, deren Betrag praktisch 0 ist, ist das allerdings nur ein numerisches Artefakt.
Die Lösung besteht darin, den größten Absolutwert der Amplituden zu suchen (außer dem Mittelwert, der kann irgendwas sein). Für jede Amplitude, deren Betrag viel kleiner als dieses Maximum ist, setzen wir die Phase manuell auf 0. Das erledigt der folgende Code:
% Absolutwerte der komplexen Amplituden absAk = abs(Ak); % maximaler Betrag der komplexen Amplituden % Mittelwert spielt nicht mit maxAbsAk = max(absAk(2:end)); % Phasen der komplexen Amplituden phik = angle(Ak)/pi; % Phasen als Vielfache von pi phik(absAk < maxAbsAk/1000) = 0;
Für jede Amplitude, die 1000-mal kleiner als das Maximum ist, wird die Phase auf 0 gesetzt. Welchen genauen Faktor man nimmt, hängt von der Anwendung ab. Das korrigierte Phasenspektrum zeigt die Abb. 8.

Periodendauer des Signals unbekannt
Messtechnisch ist natürlich der Fall interessanter, dass wir die Periodendauer des Signals nicht im Vorhinein kennen. Nachdem der Beitrag aber schon so lang geworden ist, verschiebe ich diese Diskussion auf den nächsten Teil 6b.