Forum: Digitale Signalverarbeitung / DSP / Machine Learning FFT und IFFT reelle- komplexwertiges Signal


von Mely (Gast)


Lesenswert?

Hi Leute,

ich weiß nich mal ob mir einer von euch weiterhelfen kann, wär darüber 
aber furchtbar dankbar.ich verstehe FFT von komplexen Signal und reellen 
Signal noch nicht ganze und  was ist der Unterschied zwischen den beiden 
sowohl in Zeitbereich als auch Frequenzbereich(symmetri von 
Amlitudenspectrum) und was muss man beachten bei IFFt von 
komplexwertiges Signal damit ürsprigliches Signal darstellen kann?

Ich hab bis jetzt schon einiges dazu durchgelesen, aber als kompletter 
noob bekomm ich einfach nichts gebacken. Hab auch schon versucht anhand 
von Beispielen die Programmierung nachzuvollziehen, doch selbst die sind 
mir zu komplex.

Entschuldigt bitte meine laienhafte und unpräzisse Ausdrucksweise, ich 
bin leider nicht vom Fach.

Über jede Hilfe wär ich tausendfach dankbar!

Gruß

Mely

von Martin K. (mkmannheim) Benutzerseite


Lesenswert?

Bei einer komplexen Zahl kannst du einen Wert mit beliebiger Phase 
einspeisen - siehe X * jY = z, während Du ansonsten nur die Bezugsphase 
0 zur FFT hast. Das ist wichtig, wenn es mehrere Phasengänge in dem 
Design gibt, die aufrechterhalten werden müssen. Die FFT selber ist 
immer komplex, weil sie mit SIN/COS rechnet.

von Max G. (l0wside) Benutzerseite


Lesenswert?

Mely schrieb:
> Hi Leute,
>
> ich weiß nich mal ob mir einer von euch weiterhelfen kann, wär darüber
> aber furchtbar dankbar.ich verstehe FFT von komplexen Signal und reellen
> Signal noch nicht ganze und  was ist der Unterschied zwischen den beiden
> sowohl in Zeitbereich als auch Frequenzbereich(symmetri von
> Amlitudenspectrum) und was muss man beachten bei IFFt von
> komplexwertiges Signal damit ürsprigliches Signal darstellen kann?

Ich versuch´s mal ganz einfach (und ggf. nicht 100% korrekt, 
Nachrichtentechniker und Lateiner mögen mir verzeihen):
Die DFT beschreibt das Signal, das Du ihr gibst, als ein Gemisch von 
vielen Sinussen. Die Beschreibung ist vollständig, das heißt, Du kannst 
das ursprüngliche Signal daraus wieder komplett zurückrechnen.

Die DFT vergleicht dazu den Signalausschnitt, die Du ihr gibst, 
nacheinander mit vielen Sinus-Frequenzen zwischen Null und der halben 
Abtastfrequenz.
Für jede dieser Sinus-Frequenzen gibt die DFT an, wie viel von dieser 
Frequenz in diesem Signal enthalten ist. Daraus errechnet sich der 
Betrag für die DFT.
Außerdem muss man für jede dieser Sinus-Frequenzen herausfinden, wann 
der entsprechende Sinus loslaufen muss. Das nennt man Phase. Deswegen 
vergleicht man bei jeder Frequenz nicht nur mit dem Sinus, sondern auch 
mit dem Cosinus. Für jede Frequenz gibt es also zwei Ergebnisse: eines 
für Sinus, eines für Cosinus.
Die kann man jetzt getrennt aufschreiben, das ist aber unpraktisch. 
Deswegen hat ein schlauer Mensch die komplexe Schreibweise erfunden. Das 
geht so:
Das Ergebnis für den Sinus wird mit "i" multipliziert, was für die nicht 
wirklich existierende (und deswegen imaginär genannte) Zahl "Wurzel von 
-1" steht. Für jede Frequenz steht dann also ein Ergebnis "a + i*b" da. 
Elektrotechniker schreiben auch "a + j*b", das bedeutet aber genau das 
gleiche, nämlich "Cosinus-Ergebnis + Wurzel(-1)*Sinus-Ergebnis". Damit 
hat man aus mathematischer Sicht nur einen Wert, der aber trotzdem beide 
Informationen auf einmal enthält.
Weil der µC oder DSP eigentlich keine komplexen Zahlen rechnen kann, 
muss er sich die beiden Werte übrigens getrennt merken.

Die Rücktransformation (also Signal wieder herstellen) geht so:
Das beschriebene Frequenzgemisch wird auf der Basis der Informationen 
wieder zusammengemischt. Dazu wird das "a + i*b" bei jeder Frequenz mit 
"cos(f) - i*sin(f)" multipliziert, f steht dabei für die jeweilige 
Frequenz. Die Ergebnisse werden dann zusammenaddiert, und es kommt genau 
das ursprüngliche Signal wieder raus.
Damit auch wirklich das ursprüngliche Signal wieder rauskommt, muss man 
dafür sorgen, dass nach dieser Rechenoperation nicht irgendwo ein Anteil 
mit "i" übrigbleibt. Von "a*cos(f) - a*i*sin(f) - b*i*cos(f) + b*cos(f)" 
müssen also die mittleren Terme verschwinden.
Dafür sind im Ergebnisvektor der DFT die Werte oberhalb der halben 
Abtastfrequenz zuständig. Sie müssen in die Berechnung des 
ursprünglichen Signals auch noch mit eingebaut werden. Und aus ihnen 
kommt dann beim Zurückrechnen der Beitrag, der die Terme "-a*i*sin(f) - 
b*i*cos(f)" kompensiert und im zurückgerechneten Ergebnis dann zu Null 
werden lässt.

Gruß,

Max

von Finsbury (Gast)


Lesenswert?

Als NTler versuch ich mal die wesentlichen Fragen entwas pragmatischer 
zu beantworten:
1. Es gibt keinen Unterschied, dem Fourier-Integral ist es egal, wie die 
Funktion vorliegt.
2. Liegt ein rein reeller Eingangsvektor vor, wird ein konjugiert 
komplexer Ausgangsvektor erzeugt und umgekehrt und das gilt für beide 
Richtungen.
Die diskretisierten Summen-Varianten DFT und FFT sehen das nicht anders.

Wichtig - ein reller Eingangsvektor (Audiodaten zb.) transformiert in 
den Frequenzbereich ergibt also ein konjugiert komplexes Spektrum um die 
Abtastfrequenz herum (vereinfacht gesagt). Das Spiegelspektrum ist dabei 
kein lästiges Artefakt. Beide Spektren haben prinzipiell dieselbe 
Aussagekraft. Für die Rücktransformation müssen beide Seiten wieder rein 
in die IFFT. Sollte im Frequenzbereich eine Bearbeitung des Spektrums 
erfolgen, dann muss dies auch äquivalent beidseitig im Spiegelspektrum 
erfolgen. Dann klappts auch mit der IFFT

von Herold (Gast)


Lesenswert?

Jetzt wird der geneigte Leser aber fragen, warum man überhaupt die 
Spiegelfrequenzen braucht, wenn sie doch identisch sind? Kann man die 
ifft nicht so designen, dass sie auf die Spiegelfrequenzen zugreift und 
nach der halben Zeit fertig ist mit Rechnen?

Was wäre denn, wenn man andere Frequenzen eingibt? Also unten die aus 
der FFT und die anderen 50% nicht als Spiegelfrequenzen sondern was 
anderes?

Was kommt da raus?

von Paul H. (powl)


Lesenswert?

das würde mich auch mal interessieren ;)

von chris (Gast)


Lesenswert?

>Jetzt wird der geneigte Leser aber fragen, warum man überhaupt die
>Spiegelfrequenzen braucht, wenn sie doch identisch sind?

Sind sie nur für ein reeles Eingangssignal. Bei einem komplexen 
Eingangssignal nicht.

Die FFT ist eine "eineindeutige" Abbildung. Sie sollte daher umkehrbar 
sein. Man steckt eine bestimmte Menge an Daten hinein und sollte die 
gleiche Menge an Daten wieder heraus bekommen.

Seltsam dabei: ein reeles Eingangssignal mit z.B. 128 Werten ergibt 256 
Ausgangswerte ( 128 Ausgangswerte für den Cosinusanteil und 128 
Ausgangswerte für den Sinusanteil ). Es kommen also doppelt so viele 
Werte heraus, wie hinein gesteckt werden.
Da doppelt so viel heraus kommt wie rein gesteckt wird, muss es 
zwangsweise eine Art "Redundanz" geben. Die Redundanz findet sich in den 
Spiegelfrequenzen. Es reicht in diesem Falle aus, nur 64 Ausgangswerte 
des Cosinusanteils und 64 Werte des Sinusanteils zu verwenden.

Nimmt man eine komplexe FFT ( steckt also 128 Cosinusanteile und 128 
Sinusanteile hinein ) kommen genauso viele wieder heraus, nämlich 128 
Ausgangswerte für den Cosinusanteil und 128 Ausgangswerte für den 
Sinusanteil. Die Redundanz und die Spielgefrequenzen verschwinden.
( passende Eingangsdaten für mein Beispiel vorausgesetzt )

von Andreas B. (Firma: AR Bayer DSP Systeme) (dspbayer)


Lesenswert?

Bei einem reellen, also z.B. einem einfachen gemessenen Signal x[n) 
werden N Samples (Abtastwerte) an die im allgemeinen komplexe FFT als 
Input übergeben. Dabei ist der Imaginärteil jedes Samples also gleich 
Null.

Es werden demnach zwei Vektoren [x(0), x(1), ... x(N-1)], die Realteile, 
und [y(0), y(1), ... y(N-1)], die Imaginärteile, übergeben. Oft wird die 
erste Stufe der FFT vereinfacht, eben weil alle y(n) = Null sind.
Das allgemein gültige Ergebnis liefert N komplexe Spektralwerte X(n), 
die im Fall von reellen Signalen folgende Symmetrie haben:

X(0) ist immer reell = DC-Anteil im Signalfenster
X(1) = X(N-1)
X(2) = X(N-2)
X(3) = X(N-3)
.
.
.
X(N/2-1) = X(N/2+1)
X(N/2) ist immer reell

Demnach gibt es N/2-1 komplexe X(n) und zwei reelle X(n), also genau N/2 
nicht redundante Spektralwerte.

Bei der Berechnung der IFFT darf man nicht vergessen X(N/2) korrekt 
einzusetzen, sonst ist das zurück gewonnene Signal fehlerhaft. Es reicht 
daher nicht nur die ersten N/2 Spektralwerte abzuspeichern, wenn man 
mittels IFFT weiterrechnen will, z.B. bei der Korrelation.

Für die Spektralanalyse wird i.d.R. eine Fensterfunktion angewandt, die 
das Spektrum beeinflusst. Die Multiplikation von [s(n)] mit dem Fenster 
[w(n)] (n=0 ... N-1) entspricht einer Faltung im Frequenzbereich. Das 
Signal ist demnach nur bedingt durch eine IFFT wieder herzustellen.

Bitte auch beachten, dass es sich bei der FFT nicht um ein Spektrum des 
anliegenden Zeitsignals s(t) handelt, sondern um eine spektrale 
Schätzung des N-mal abgetasteten Signals im betrachteten Zeitfenster. 
Das rührt daher, dass das Signal [s(n*T)] mathematisch unendlich oft 
wiederholt angenommen wird. Dabei ist T die inverse Abtastrate. Nur so 
entsteht ein Linienspektrum wie es von der FFT berechnet wird. Dieses 
Linienspektrum wird ebenfalls mathematisch unendlich of wiederholt.

Noch etwas: Eine FFT ist dasselbe wie eine DFT für 2^k Werte (für k>1). 
Die FFT ist deshalb interessant, weil sie sich algorithmisch schneller 
berechnen lässt.

Ich finde die Thematik wird hier ganz gut dargestellt:
https://home.zhaw.ch/~rumc/dsv1/unterlagen/dsv1kap3dftfftfolien.pdf

von Paul H. (powl)


Angehängte Dateien:

Lesenswert?

Ich bin jetzt noch ein wenig verwirrter als vorher. Angenommen ich habe 
eine 1024 Punkt-FFT eines abgetasteten Signals. Ich möchte die Messwerte 
FFT-Transformieren, einige Frequenzen ausblenden und das ganze wieder 
iFFT-Transformieren und wieder ausgeben.

So.
Ich habe also N = 1024 reelle Eingangswerte. Meine Abtastfrequenz 
beträgt 40kHz. Damit kann ich also Laut Nyquist-Shannon-Theorem 
Frequenzen bis ca. 20kHz erfassen. Alles darüber wird in den 
Frequenzbereich darunter "gespiegelt". In meinem Audiosignal kommen 
allerdings keine Frequenzen oberhalb von 20kHz vor.

Wenn ich nun die FFT mache, wie sehen Re und Im aus? Also klar, ich 
bekomme 1024 komplexe Ausgangswerte. Im Anhang hab ich nen Bild vom 
Wikipedia-FFT Artikel für reelle Eingangswerte.

Welche Frequenz habe ich bei der Symmetrie-Achse? 20kHz oder 40kHz (und 
folglich ganz rechts im Diagramm 40kHz oder 80kHz)

Und was muss ich alles zu 0 setzen wenn ich bestimmte Frequenzen 
rausfiltern möchte? Was muss ich alles 0 setzen wenn ich alle Frequenzen 
unter- ODER oberhalb einer vorgebenen Frequenz fg rausfiltern möchte? 
Müssen die entsprechenden auszublendenden Frequenzbereiche um die 
Symmetrieachse herum symmetrisch 0 gesetzt werden oder reicht es, diese 
einseitig 0 zu setzen?

Genügt es theoretisch die Realteile 0 zu setzen oder müssen die 
entsprechenden Imaginärteile auch 0 gesetzt werden?

bin grade etwas verwirrt. Bitte um Hilfe.
lg Paul

von Andreas B. (Firma: AR Bayer DSP Systeme) (dspbayer)


Lesenswert?

Dich zu verwirren, war nicht meine Absicht. Das Thema ist nicht ganz 
trivial. Außerdem hatte ich einen Fehler gemacht, denn bei N/2 (512 bei 
1024er-FFT) findet ein Vorzeichenwechsel im Imaginärteil statt, wie man 
aus der Grafik von dir erkennen kann. X(N-i) ist also gleich X(i)* (also 
konjugiert komplex).

Zu deiner Frage: Die Symmetrieachse ist bei N/2, hier also 20kHz bei 
fs=40kHz (da, wo die gepunkteten Pfeile in der Grafik hinzeigen). Die 
FFT ergibt den kompletten komplexen Wertesatz von 0 bis N-1, also 1024 
komplexe Werte.

Was man nicht sieht, ist, dass die FFT-Daten unendlich oft wiederholt 
werden. Deshalb kann man nicht einfach ein komplexes Wertepaar 
ausblenden, um eine Frequenz los zu werden. Das funktioniert nur wenn 
ausschließlich ganzzahlige Vielfache der Grundfrequenz im ursprünglichen 
Signal enthalten waren.

Beispiel:
Bei fs=40,96kHz (nicht 40kHz) tastest du ein Sinussignal der Frequenz 
60Hz ab. Es passen dann genau 1,5 Perioden in das Fenster von 1024 
Abtastwerten (25msec).

Wie zuvor erwähnt, muss man sich das reale Signal als unendlich oft 
wiederholt vorstellen, was bei 1,5 Perioden natürlich an den Grenzen 
nicht zusammen passt. Die FFT stellt aber das Spektrum genau dieses 
unendlich wiederholten, Signals mit Unstetigkeiten dar, was beleibe kein 
Sinus mehr ist. Passen würde es nur für 40Hz, 80Hz, 120Hz usw. also 
Vielfache von 40,96kHz/1024.

Ich weiß, dass das dein Problem nicht löst, aber du weißt wenigstens, 
warum das Ergebnis anders aussieht als erwartet, wenn du einfach ein 
Wertepaar (i, N-i) aus der FFT zu Null setzt und dann in eine IFFT 
packst.

Deshalb nimmt man zum Filtern der Einfachheit halber i.d.R. 
Digital-Filter (IIR oder FIR). Ich kann die Lektüre U.Zölzer, Digitale 
Audiosignalverarbeitung wärmstens empfehlen (ISBN-10: 351926180). Es ist 
kein Kochbuch, aber beleuchtet genau das, was ich hier nicht weiter 
ausführen kann.

von Paul H. (powl)


Lesenswert?

Hm, stimmt.. danke schonmal hierfür!
Ich bin jedoch gerade dabei, eine Studienarbeit über dieses Thema zu 
schreiben und eine FFT + Verarbeitung + iFFT in einen digitalen 
Signalprozessor zu implementieren.

Mein Dozent gab mir die Idee, dass man ja ganze Frequenzbereiche einfach 
ausblenden kann, indem man einfach ab einer gewissen Frequenz die 
entsprechenden Frequenzen zu Null setzt.

Ist das nun ein völlig nutzloses Unterfangen? (und wenn schon, ich muss 
es so implementieren... hehe) Oder krieg ich dennoch ein einigermaßen 
passables Ergebnis mit einigen Fehlern.

Entsteht dadurch dann zwangsläufig bzw. höchstwahrscheinlich eine 
Unstetigkeit an der Schnittstelle eines abgetasteten und wieder 
ausgegebenen Wertepaketes zum nächsten?

Wenn die Symmetrieachse bei der halben Abtastfrequenz liegt, wie ist 
denn dann das Ergebnis der FFT überhaupt zu interpretieren? Soll das 
heißen meine 1024-Punkt FFT liefert mir tatsächlich nur 512 verschiedene 
Frequenzen, da die Frequenzen von 20-40kHz ja nur das Spiegelbild der 
Frequenzne von 0-20kHz darstellen, was ja aber offenbar "falsch" ist, da 
in meinem Eingangssignal ab 20kHz tatsächlich überhaupt keine Frequenzen 
mehr vorhanden sind. Muss ich also das Schaubild der Spektralverteilung 
meines Eingangssignals quasi so sehen, dass von links bis zur 
Symmetrieachse die Frequenzen von 0 bis fs/2 aufgetragen sind und rechts 
von der Symmetrieachse die Frequenzen von fs/2 bis 0?

D.h. wenn ich bestimme Frequenzbereiche, sagen wir alles unterhalb 10kHz 
ausblenden möchte, muss ich alles von 0 bis N/4 und alles von 3N/4 bis N 
0-setzen? Oder einfach nur alles. Von 0 bis N/4?

Was mach ich mit den Im-Werten? Auch 0 setzen? Oder einfach so lassen, 
wie sie sind, weils eh egal ist?

von chris (Gast)


Lesenswert?

Du solltest nicht mit dem DSP beginnen. In der professionellen 
Entwicklung simuliert man die Algorithmen zuerst in Matlab ( falls Du 
das nicht hast, nimm Octave ).
Dort kannst Du sehr schnell erkennen, welche Ergebnisse Dein 
Algortithmus liefert und Du kannst ein wenig "spielen".

Was die FFT anbelangt: Eine harmonische Schwingung ( sinusförmige 
Schwingung ) kann als Überlagerung von einer Sinus und Cosinus-Schwinung 
betrachtet werden. Der Realteil der FFT entspricht dabei dem 
Cosinus-Anteil und der Immaginärteil dem Sinus-Anteil.

Wenn Du nur einen Anteil "Null" setzt, dann werden nur Schwinugnen mit 
einer bestimmten Phase ( Verschiebung ) ausgefiltert.

von Paul H. (powl)


Lesenswert?

Danke schonmal, die Antworten hier bringen mich extrem weiter!

Zusätzlich zu dieser noch ungeklärten Frage:
> Wenn die Symmetrieachse bei der halben Abtastfrequenz liegt, wie ist
> denn dann das Ergebnis der FFT überhaupt zu interpretieren? Soll das
> heißen meine 1024-Punkt FFT liefert mir tatsächlich nur 512 verschiedene > 
"brauchbare" Frequenzen, da die Frequenzen von 20-40kHz ja nur das
> Spiegelbild der
> Frequenzen von 0-20kHz darstellen, was ja aber offenbar "falsch" ist, da
> in meinem Eingangssignal ab 20kHz tatsächlich überhaupt keine Frequenzen
> mehr vorhanden sind. Muss ich also das Schaubild der Spektralverteilung
> meines Eingangssignals quasi so sehen, dass von links bis zur
> Symmetrieachse die Frequenzen von 0 bis fs/2 aufgetragen sind und rechts
> von der Symmetrieachse die Frequenzen von fs/2 bis 0?

> D.h. wenn ich bestimme Frequenzbereiche, sagen wir alles unterhalb 10kHz
> ausblenden möchte, muss ich alles von 0 bis N/4 und alles von 3N/4 bis N
> 0-setzen? Oder einfach nur alles. Von 0 bis N/4?

habe ich nun noch folgende Verständnisfrage.
Ich habe nun beispielsweise 40,96kHz Samplingfrequenz.
D.h. in einer Sekunde taste ich 40960 Punkte ab. Eine 1024p-FFT liefert 
mir also Frequenzen von 0Hz..4Hz..8Hz...bis 39996Hz.
Speicherstelle:         [0]  [1]  [2] ....  [1023]
richtig?

1024p gehen in die 40960p genau 40 mal ein. Wenn ich nun einen 4Hz Sinus 
da reinfüttere sind das 4 Sinus-Perioden in 1Sekunde, also 4 
Sinus-Perioden in den 40960p. Eine Sinus-Periode würde 4096p benötigen. 
Ich habe allerdings nur 1024p, also eine viertel Periode zur Verfügung. 
Macht das der FFT was oder arbeitet die trotzdem völlig korrekt?

lg Paul

von Andreas B. (Firma: AR Bayer DSP Systeme) (dspbayer)


Lesenswert?

Fast :-)
Der Abstand der Frequenz-"Bins", also der aufeinander folgenden Werte in 
der FFT ist 40Hz, also 40960/1024. Der erste Wert ist für 0Hz (DC), der 
zweite für 40Hz, der letzte Wert X(N-1) ist demnach der für 
(40960-40)Hz.
Und ja, es werden genauso viele unabhängige Daten erzeugt, wie an den 
Algorithmus übergeben wurden, nämlich 1024. Beim Signal waren 1024 Werte 
reell, bei Spektrum von einem reellen Signal sind 511 FFT-Werte komplex 
und zwei reell (letztere bei n=0 und n=N/2, siehe Beitrag weiter oben).
Am besten, du lässt mal eine FFT auf einen sauberen Sinus oder Cosinus 
mit 80Hz (zwei Perioden im Fenster) oder 800Hz (20 Perioden im Fenster) 
rechnen. Du siehst dann genau, welche Werte signifikant von Null 
verschieden sind. Wenn die FFT richtig implementiert ist, müsste an 
genau zwei Stellen jeweils die halbe Amplitude zu sehen sein, für 
Cosinus im zweimal Realteil, für den Sinus zweimal im Imaginärteil.
Dabei bitte erst einmal keine Fensterfunktion benutzen!
Zur Anschauung der Problematik mit den Unstetigkeiten, kannst du dann 
spaßeshalber auch mal ein Signal mit z.B. 4020Hz versuchen (100,5 
Perioden im Abtastfenster).

Viel Spaß beim Erkenntnisgewinn :-)

von chris (Gast)


Lesenswert?

Und nach wie vor: nimm Matlab.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.