Delphi-PRAXiS
Seite 4 von 6   « Erste     234 56      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem bei FFT (https://www.delphipraxis.net/85240-problem-bei-fft.html)

SunBlack 19. Mär 2008 08:54

Re: Problem bei FFT
 
Zitat:

Zitat von sirius
Eine komplexe Zahl besteht immer aus Betrag und Phasenwinkel. Den Betrag bekommst du ja hier aus dem Pythagoras. Den Winkel aus dem Tangens (Arcustangens).

Das drt Betrag die Amplitude ist, habe ich hier schon rausgelesen ;). Mir gehts eher um etwas anderes. Und zwar zeichnet man ja komplexe Zahlen eigentlich immer ro, dass der reele Teil die x-Achse ist und der imaginäre die y-Achse. Wie könnte man die beiden Ahcsen beschriften jetzt inhaltlich beschriften?


Aber sagt mal, bin ich blind oder ist da nicht nen Fehler im Algo drin?

Delphi-Quellcode:
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;
Aber n wird nirgens gesetzt.

3_of_8 19. Mär 2008 09:01

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.

SunBlack 19. Mär 2008 09:13

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.

sirius 19. Mär 2008 10:13

Re: Problem bei FFT
 
Ein komplese Zahl kannst du darstellen als:
Code:
 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)) |     -"-
Bei der FFT interessiert dich nicht Real- oder Imaginärteil sondern Betrag und Phase

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:

Code:
f(t) = A_1 * sin (w_1*t + phi_1)
     + A_2 * sin (w_2*t + phi_2)
     + A_3 * sin (w_3*t + phi_3)
     + ...

Und die daraus resultierende Frage ist eben, kann man aus dem fertigen Signal wieder zurück auf die Ausgangsschwingungen rechnen. Und das ist die Fouriertransformation (und für konkrete Messwerte dann die DFT/FFT)

SunBlack 19. Mär 2008 10:49

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?

Medium 19. Mär 2008 11:08

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.

SunBlack 19. Mär 2008 11:17

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 ;) )

sirius 19. Mär 2008 12:17

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

Medium 19. Mär 2008 12:28

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.

sirius 19. Mär 2008 12:33

Re: Problem bei FFT
 
Zitat:

Zitat von SunBlack
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 ;) )

Du darfst sowieso nicht das gesamte Signal auf einmal durch die FFT schieben, sondern immer nur ein Zeitfenster von ..sagen wir.. 20ms (je nach Abtastrate, gewünschter Genauigkeit), dann bekommst du einen Zeitverlauf (Ein Punkt aller 20ms) für die 45Hz und einen für die 60Hz. Und dann kannst du schauen, wann welche Frequenz zu hören/sehen/.. ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:48 Uhr.
Seite 4 von 6   « Erste     234 56      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz