![]() |
Re: Problem bei FFT
Zitat:
Aber sagt mal, bin ich blind oder ist da nicht nen Fehler im Algo drin?
Delphi-Quellcode:
Aber n wird nirgens gesetzt.
function GetFrequency(Data: array of Single; SampleRate, SampleIndex,
Samples: Integer): Integer; var I, [color=#ff007f]n[/color], max: Integer; a: array of Single; begin max:=0; if length(Data)-SampleIndex<Samples then raise EAccessViolation.Create('Sound index or length out of bounds.'); setlength(a, Samples); for I:=0 to Samples-1 do a[I]:=Data[SampleIndex+I]; dft(a); for I:=0 to ([color=#ff007f]n[/color] shr 1)-1 do if a[I]>a[max] then begin max:=I; end; Result:=trunc(SampleRate/Samples*max); end; |
Re: Problem bei FFT
Das ist jetzt mal ne gute Frage... Könnte ein C&P-Fehler sein, der Original-Source ist noch etwas komplexer, da ich für meine Anwendung noch mehr brauche, da hab ich diesen Beispielcode rauskopiert.
Ersetze n einfach durch Samples und hau es aus der Variablendeklaration raus. Achja, und, die Achsen in der Gaußschen Ebene markiert man mit Re und Im, nach den Funktionen Re(z) und Im(z). Und die Amplitude ist nicht der Betrag, wie kommst du darauf? Der Betrag eines Elements I des Ergebnisvektors entspricht dem Anteil der Frequenz 2*I*SampleRate/Samples. |
Re: Problem bei FFT
Ich meine den Pythagoras ;).
Gibts eigentlich eine einfache Variante um aus dem Ergebnis einer DFT wieder den Ursprung herzustellen (z.B. mit gefilterten Frequenzen)? Denn soweit ich mich entsinne, gibt es ja noch eine inverse FFT. |
Re: Problem bei FFT
Ein komplese Zahl kannst du darstellen als:
Code:
Bei der FFT interessiert dich nicht Real- oder Imaginärteil sondern Betrag und Phase
x + y * i | mit x=Realteil und y=Imaginärteil
r * e ^(i * phi) | mit r=Betrag und phi=Phase r* (cos(phi) + i * sin(phi)) | -"- Und wie du es rückwärts rechnest, habe ich schon oben beschrieben. Du musst dir anscheinend mal über die Bedeutung der Fourierttransformation klar werden. Denn was man allgemein als Rücktransformation nennt, ist eigentlich der Ausgangspunkt. Die Ausgangslage ist ja, dass man jedes Signal aus unendlich vielen Sinussignalen unterschiedlicher Frequenz zusammensetzen kann. Zitat:
|
Re: Problem bei FFT
Mir ist die Fourier-Transformation eugentlich nur Fourier-Analyse, also zur Bestimmung des Frequenzspektrum bekannt. Von daher habe ich an der Stelle ein Problem, den Ursprung wiederherzustellen, denn man weiß ja nicht, wann eine Frequenz vorkam, und wie rum.
Wenn man z.B. eine beliebige Musikdatei analysiert erhält man ja ein Spektrum. Aber wie willst du aus diesem Spektrum wieder den Ursprung herstellen? Denn wann welche Frequenz auftritt, wird ja imho nicht gespeichert. Das nächste Problem, welches ich dabei habe: Nehmen wir mal an, man hat eine ganze Datei lang nur eine einfache Sinusschwingung. Kann man anhand der ermittelten Frequenz im nachhinein noch sagen, ob die Kurve zuerst ins negative ging oder zuerst ins positive? |
Re: Problem bei FFT
Dafür ist die Phase doch gerade da. Und es muss keine zeitlichen Informationen geben, da sich die klanglichen Unterschiede über die Zeit durch die Überlagerung der Sinuswellen ergeben.
|
Re: Problem bei FFT
Ich glaube, ich habe gerade nen Denkfehler :cry: .
Wenn ich z.B. eine Datei habe, in der die ganze Zeit 60Hz schwingen. Und am Anfang und am Ende, aber nicht in der Mitte, werden noch 45 Hz überlagert. Woher bekomme ich dann die Informationen über die beiden 45 Hz-Startpositionen? Und wenn die die erste mit 45° anfängt und die zweite mit 290°, wo kann ich die verschiedenen Phasen ablesen? (Ich steh gerade wahrscheinlich aufm Schlauch ;) ) |
Re: Problem bei FFT
Liste der Anhänge anzeigen (Anzahl: 2)
Zum allgemeinen Verständnis.
Schau dir mal Bild 1 (sin1.png) an! In dem ersten Plot ist ein 50Hz-Sinus und in dem zweiten Plot ein 150Hz Sinus, wobei die Amplitude bei den 150Hz etwas geringer ist. Die Phase beider Schwingungen ist identisch. Sie fangen beide am Anfang mit 0 an und laufen in positive Richtung los. Im dritten Plot ist die Summe beider Funktionen gezeichnet. Wichtig dabei ist, dass die Summe aus reinen Sinus-Funktionen erstellt wurde. Die Aufgabe der FFT besteht darin, wenn man nur den unteren Signalverlauf hat, die beiden Ausgangsfunktionen wiederherzustellen bzw. die Parameter der Sinus-Funktionen zu bekommen. Und eine Sinus-Funktion braucht eine Amplitude und einen Phasenwinkel. Also genau das, was die komplexe Zahl aussagt. Und das bekommst du aus der FFT (für diskrete Abtastwerte) heraus. In dem zweiten Bild sin2.png habe ich noch dargestellt, was eben die Phase bedeutet. Hier ist die 150Hz-Schwingung um pi/4 verschoben. So, nun habe ich nur 2 Schwingungen addiert (also zwei unterschiedliche Frequenzen). Es gibt neben 50Hz und 150Hz natürlich noch unendlich viele weitere Frequenzen. Und du kannst jedes (periodische) Signal in genau solche Frequenzanteile, also in solche Sinus-Funktionen, zerlegen. Im Allgemeinen sind es mehr als nur zwei Anteile. Edit: Ein Wort geändert |
Re: Problem bei FFT
Die FA liefert überhaupt keine Information über ein wann. Es ist ja gerade die Aufgabe, ein Signal von einer Zeit/Amplituden Darstellung in eine Frequenz/Phasen/Ausprägung Darstellung zu überführen.
Wenn du ein Sample nimmst, in dem die Hälfte der Zeit 50Hz brummen, die andere hälfte 70Hz, dann bekommst du nicht einfach nur 50 und 70Hz Peaks im Spektrum, sondern nahezu jede weitere Frequenz ist auch mit von der Partie, und zwar so, dass wenn man sie überlagert, wieder deine 50 und 70Hz herauskommen. |
Re: Problem bei FFT
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz