Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Seltsame Ergebnisse bei DFT (https://www.delphipraxis.net/85441-seltsame-ergebnisse-bei-dft.html)

sirius 31. Jan 2007 15:53

Re: Seltsame Ergebnisse bei DFT
 
Zitat:

Zitat von gammatester
Ich weiß nicht ganz, vorauf sich dein Einwand bezieht. Mein Hinweis bezog sich auf FFTs, deren Längen keine 2-er-Potenz sind, und davon finde ich nichts (oder bin blind).

Nee, da war ich blind :stupid:

Das ist ja interessant. Zugegeben, ich hab mich noch nie intensiver mit FFT-Algos beschäftigt,... ich habs schon mal runtergeladen. Das werde ich mir mal reinziehen.


Edit: Sehr schön der zweite Link
Aber Hanning machen die alle nicht (und in den Kurzfassungen beim ersten Link stehts auch nicht drin). Die Bass.dll tuts laut Beschreibung. Sollte man vielleicht noch ergänzen.

3_of_8 31. Jan 2007 21:20

Re: Seltsame Ergebnisse bei DFT
 
Liste der Anhänge anzeigen (Anzahl: 1)
OK, ich hab hier noch ein Problem.

Ich suche mir momentan den Spitzenwert und rechne aus dem die Frequenz aus.

Meine Idee war jetzt, alle Werte der ersten Hälfte des fouriertransformierten Vektors mit der Frequenz, für die sie stehen, zu multiplizieren und dann am Ende das ganze durch alle Werte dieser Vektorhälfte zu teilen. Also in etwa so wie im Anhang.

Da bekomme ich Werte die ziemlich (aber nicht aber nicht ganz) gar nichts mit den wirklichen Frequenzen zu tun haben.

Also habe ich etwas eingebaut, was ich als NOISE_THRESHOLD bezeichne. NOISE_THRESHOLD ist eine Single-Konstante mit dem Wert 0.001. Werte aus dem Vektor gehen nur dann in die Berechnung ein, wenn sie >= NOISE_THRESHOLD*a[max] sind, wobei a mein Vektor ist und max der Index des Spitzenwertes. Das heißt, alle Werte, die kleiner sind als 1/1000 des Maximalwertes, werden vernachlässigt.

Dadurch erreiche ich eine Genauigkeit von +/- 1Hz, also statt 1420Hz erhalte ich 1419Hz.

Das klingt sehr gut, funktioniert aber nur bei Sinustönen.

Bei Square- oder Sägezahntönen stimmen die Werte überhaupt nicht.

sirius 31. Jan 2007 21:37

Re: Seltsame Ergebnisse bei DFT
 
Ich habs jetzt mehrmals durchgelesen und verstehe nicht, was du willst.

Deine Formel kann man übrigens noch kürzen, dann bleibt nur noch die Summe aller Frequenzen übrig, die Amplituden (a) verschwinden.

3_of_8 31. Jan 2007 21:56

Re: Seltsame Ergebnisse bei DFT
 
Liste der Anhänge anzeigen (Anzahl: 1)
Bei meiner Formel hab ich mich verschrieben, ich hab die richtige Version wieder im Anhang. Bin mir aber nicht ganz sicher, ob man die nicht auch kürzen kann.

Ich will sozusagen den Durchschnitt aller Frequenzen haben, gewichtet nach Lautstärke und hoffe, damit die Frequenz meines Tons genau herauszufinden.

Soweit ich weiß, bekommt man doch die Frequenz des vorherrschenden Tons genau dadurch, dass man den Durchschnitt nimmt, oder?

EDIT: Die Formel lässt sich nicht weiter kürzen.

sirius 31. Jan 2007 22:24

Re: Seltsame Ergebnisse bei DFT
 
Hmm, da fehlen mir wohl ein paar Akustik vorlesungen. Keine ahnung. Ich dachte man hat ein eindeutiges Maximum, dass sich von allen anderen abhebt. Dem ist anscheinend nicht so. Kannst du mal so ein Spektrum zeichnen. Das würde mich mal persönlich interessieren.

Was du da mathematisch machst, da bin ich noch nicht ganz durchgestiegen. Aber du wichtest irgendwie höhere Frequenzen stärker als niedrige.

3_of_8 31. Jan 2007 22:30

Re: Seltsame Ergebnisse bei DFT
 
Nein.

Ich habe eine eindeutige Spitze, aber nur bei Sinustönen. Bei Sägezahntönen zum Beispiel habe ich die nicht, da habe ich etwa 3 solche Spitzen, die von der Amplitude her abnehmen, also eine sehr große, eine mittlere und eine kleinere.

Mathematisch gesehen mache ich eine einfache, gewichtete Durchschnittsbildung. Höhere Frequenzen werden natürlich nicht höher gewichtet, sie sind nur einfach größer und ziehen damit den Durchschnitt "in die Höhe". Man könnte es vergleichen mit einem Vektor für Notenverteilungen bei einem Test in der Schule:

Man hat einen Vektor (a1,...,a6), bei dem a1 die Anzahl der 1en und a6 die Anzahl der 6en ist. Die Durchschnittsnote des Tests bildet sich aus (a1*1+a2*2+a3*3+a4*4+a5*5+a6*6)/(a1+a2+a3+a4+a5+a6).

Das ist mathematisch gesehen das gleiche wie bei meiner Frequenzberechnung.

sirius 31. Jan 2007 22:39

Re: Seltsame Ergebnisse bei DFT
 
Mit der Mathematik hast du Recht. Ist für mich jetzt zu spät.

Aus Wiki: "Die Schwingung mit der niedrigsten Frequenz (gleichartige Schwingung der gesamten Saite) ist hier die Grundfrequenz, die anderen Schwingungen Oberschwingungen."
Soweit

Was ist den Sägezahn für ein Ton? Harmonisch ist der bestimmt nicht. Und er besteht auch nicht aus einem Grundton.
Was ist den z.B., wenn ich am Klavier drei Tasten anschlage, oder auf der Gitarre alle 6 Saiten schlage?
Für was entscheidet sich dann so ein Gitarrenstimmgerät?

3_of_8 31. Jan 2007 22:46

Re: Seltsame Ergebnisse bei DFT
 
Liste der Anhänge anzeigen (Anzahl: 1)
*kratz*

Frag mich nicht.

Ein Sägezahnton hat halt statt der Sinusfunktion eine lineare Funktion.

Schwingung (rot) und FFT (grün) hab ich mal angehängt.

EDIT: http://de.wikipedia.org/wiki/Kippschwingung

sirius 1. Feb 2007 08:20

Re: Seltsame Ergebnisse bei DFT
 
Zitat:

Zitat von Wiki
Sägezahnschwingung als Überlagerung von Obertönen

wzbw (was zu beweisen war) :wink:
Der Sägezahn ist eine reine Überlagerung von Oberschwingungen.

Wenn also die Länge eines Zahns 0,2s dauert, also T=0,2s, dann ist f=5Hz deine Grundschwingung. Zu dieser Grundschwingung überlagern sich jetzt noch alle Harmonischen (bzw. Oberschwingungen), also alle n*5Hz (n..jede natürliche Zahl) Die Amplituden verkleinern sich allerdings mit jeder Oberschwingung (nur der Gleichanteil 0Hz kann etwas aus der Reihe tanzen, je nachdem wo der Sägezahn die Mitte hat).

Und das sieht man auch in deinem Bild: Eine Spitze immer im gleichen Abstand. die erste Spitze nach dem Gleichanteil ist die Grundschwingung.
Evtl. ist die Grundschwinung kein Vielfaches von Abtastfrequenz/(Anzahl der Abtastwerte), dann musst du die umliegenden Frequenzen irgendwie gruppieren.

btw: Wenn du ein Hanningfenster drüber legst, werden die Spitzen schärfer.

3_of_8 1. Feb 2007 14:14

Re: Seltsame Ergebnisse bei DFT
 
Ich schätze mal, ein Hanningfenster ist eine Art Filter. Wie funktioniert der?

EDIT: Aha. Das Ding heißt korrekt von Hann-Fenster und hat die Gleichung 0.5*(1+cos(2*Pi*n/M)) mit -M/2<=n<=M/2

Meine Implementation sieht so aus:

Delphi-Quellcode:
procedure vonHannWindow(var a: array of Single);
var I, M, n: Integer;
begin
  M:=length(a);
  for I:=0 to (M shr 1)-1 do
  begin
    n:=I-(M shr 2);
    a[I]:=a[I]*0.5*(1+cos(2*Pi*n/(M shr 2)));
  end;
end;
Ich erhalte klare Spitzen, kann aber immer noch keine Rechtecks/Sägezahntöne erkennen. Aber vielleicht geht das auch einfach nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:57 Uhr.
Seite 2 von 3     12 3      

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