AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Problem bei FFT

Ein Thema von 3_of_8 · begonnen am 27. Jan 2007 · letzter Beitrag vom 25. Mai 2009
Antwort Antwort
Seite 4 von 6   « Erste     234 56   
SunBlack

Registriert seit: 18. Mär 2008
8 Beiträge
 
Turbo Delphi für Win32
 
#31

Re: Problem bei FFT

  Alt 19. Mär 2008, 09:54
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.
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#32

Re: Problem bei FFT

  Alt 19. Mär 2008, 10:01
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
SunBlack

Registriert seit: 18. Mär 2008
8 Beiträge
 
Turbo Delphi für Win32
 
#33

Re: Problem bei FFT

  Alt 19. Mär 2008, 10:13
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.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#34

Re: Problem bei FFT

  Alt 19. Mär 2008, 11:13
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)
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
SunBlack

Registriert seit: 18. Mär 2008
8 Beiträge
 
Turbo Delphi für Win32
 
#35

Re: Problem bei FFT

  Alt 19. Mär 2008, 11:49
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?
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#36

Re: Problem bei FFT

  Alt 19. Mär 2008, 12:08
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
SunBlack

Registriert seit: 18. Mär 2008
8 Beiträge
 
Turbo Delphi für Win32
 
#37

Re: Problem bei FFT

  Alt 19. Mär 2008, 12:17
Ich glaube, ich habe gerade nen Denkfehler .

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 )
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#38

Re: Problem bei FFT

  Alt 19. Mär 2008, 13:17
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
Miniaturansicht angehängter Grafiken
sin2_585.png   sin1_170.png  
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#39

Re: Problem bei FFT

  Alt 19. Mär 2008, 13:28
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#40

Re: Problem bei FFT

  Alt 19. Mär 2008, 13:33
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:43 Uhr.
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