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
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.
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
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
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?
>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 )
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
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
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.
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?
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.
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
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 :-)