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 :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.