Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Frequenz (https://www.delphipraxis.net/85019-frequenz.html)

ebber 24. Jan 2007 19:06


Frequenz
 
Hallo

Ich habe mit der bass.dll eine Sound Stream;
Wie bekomme ich jetzt die Laustärke von einzelnen Frequenzen/Frequenzbreichen?

MfG

Jens Schumann 24. Jan 2007 19:24

Re: Frequenz
 
Hallo,
such mal in der Bass Hilfe nach FFT (Fast Fourier Transformation)

ebber 25. Jan 2007 18:20

Re: Frequenz
 
Ich hab das nu mal gelsesen, aber jetzt weis ich auch nur wenig mehr als vorher.

Kann mir jemand mal ein Beispiel geben pls.

MfG

BloodySmartie 29. Jan 2007 14:41

Re: Frequenz
 
Soweit Du BASS und nicht BASSASIO verwendest, gibts es eine Methode namens BASS_GetChannelData.

Delphi-Quellcode:
function BASS_ChannelGetData(handle: DWORD; buffer: Pointer; length: DWORD): DWORD;
An "length" übergibst Du dabei eine der folgenden vordefinierten Konstanten:

Zitat:

BASS_DATA_FLOAT Return floating-point sample data.
BASS_DATA_FFT512 512 sample FFT (returns 256 floating-point values)
BASS_DATA_FFT1024 1024 sample FFT (returns 512 floating-point values)
BASS_DATA_FFT2048 2048 sample FFT (returns 1024 floating-point values)
BASS_DATA_FFT4096 4096 sample FFT (returns 2048 floating-point values)
BASS_DATA_FFT_INDIVIDUAL Use this flag to request separate FFT data for each channel. The size of the data returned is multiplied by the number channels.
BASS_DATA_FFT_NOWINDOW This flag can be used to prevent a Hanning window being applied to the sample data when performing an FFT.
Wenn Du einer der Konstanten mit "FFT" im Namen übergibst, dann wird Dir ein Puffer geliefert, der die Sampledaten einer Fast Fourier Transformation unterzogen hat. In diesem Fall dient die FFT dazu, Dir eine aufsteigend nach Frequenzen geordnete Datenmengenge zu liefern, welche die einzelnen Lautstärken enthält. Je mehr Samples Du Dir geben lässt (z.B. BASS_DATA_FFT1024 statt BASS_DATA_FFT512), desto feiner sind die einzelnen Lautstärken aufgelöst.

Um z.B. ein einfaches Spektrum auszugeben, durchläufst du schlicht den Puffer in einer Schleife und zeichnest auf den Canvas, wobei der x-Wert dem Wert der Zählervariablen entspricht und y sich so

Delphi-Quellcode:
y:=DatenArray[x];
errechnet.


Du wirst dann schon merken, was Du für Daten vor Dir hast. Um die Funktionsfähigkeit zu überprüfen empfehle ich Dir, Dateien zu benutzen, die nur einen einzigen Sinus-Ton in einer bestimmten Frequenz enthalten. Z.B. muss bei korrekter Ausgabe der "Peak" bei einem 440 Hz - Ton viel weiter links liegen als ein 10 kHz - Ton.

Wenn Du die Daten statt aus einem Channel direkt aus dem Stream lesen möchtest, musst Du nen kleinen Umweg gehen:

1. Daten aus dem Stream z.B. in ein Pufferarray einlesen
2. Frequenzspektrum über eine FFT aus den Daten erstellen
3. Ausgabe des Spektrums (...oder was immer Du damit vor hast).

Eine FFT selbst zu implementieren ist recht schwierig. Ich empfehle Dir, mal auf
http://www.simdesign.nl/fft.html
nachzusehen. Dort kannst Du die entsprechenden Units kostenlos bekommen.

Du wirst merken, dass die FFT-Funktion mit Arrays gefüttert werden will, das aus komplexen Zahlen besteht. Diese besitzen einen Realteil und einen Imaginärteil.

Delphi-Quellcode:
type
  // Complex numbers, with precision specified in TFloat (Types unit)
  TComplex = packed record
    Re: TFloat; // Real part
    Im: TFloat; // Imaginary part
  end;
Lade Deine Sampledaten dann einfach nur in den Realteil und setze die Imaginärteile jeweils auf 0.

Ich hoffe, meine Erklärung hat Dir etwas weitergeholfen. Wenn Du noch Fragen hast, dann frag einfach :)

Digital Signal Processing macht Spass!! :spin2:

ebber 31. Jan 2007 13:32

Re: Frequenz
 
Danke für die Erleuchtung.

Aber wie komme ich jetzt auf eine genaue Frequenz ?

Ist das nu z.B. 41000/512=86 dann ist jeweils 1 immer der durschnitt der Lautstärke von 86 Frequenzen ?
Oder habe ich nu was ganz falsch verstanden ?

MfG

BloodySmartie 31. Jan 2007 13:48

Re: Frequenz
 
Damit beschäftige ich mich auch gerade :) Es dürfte sich in etwa so verhalten, wie Du es gerade beschrieben hast - wenn nicht, dann weiß ich es in ein paar Tagen und sag Dir Bescheid. An diesem Problem bastel ich auch gerade.

Was dann allerdings ein Element des "Lauststärkearrays" enthält, ist Dir überlassen. Du kannst ja zum Beispiel das arithmetische oder geometrische Mittel der enthaltenen Frequenz-Lautstärken ermitteln, oder einfach den Maximalwert des Teilarrays nehmen.

ebber 31. Jan 2007 14:07

Re: Frequenz
 
Danke.

Wenn ich jetzt so das mache dann kommen solche Werte bei den Werten 1-512 raus :



...

2,62817666694213E-308
4,31727782175805E-308
3,45845952088873E-322
2,12260832960046E-314
1,89873035990593E269
2,62832945125094E-308
1,47207590662377E269
1,82829799321222E-307
0
2,08630088400675E-317
6,11931922575718E-318
1,65233992562079E269
NAN
1,44687856257008E269

...

Hab ich da einen Fehler gemacht ?

sirius 31. Jan 2007 14:13

Re: Frequenz
 
Die Auswertung der Frequenzanalyse und die Implementationen (von 3_of_8) gibts hier:
DP - FFT
DP - DFT

ebber 31. Jan 2007 14:42

Re: Frequenz
 
Danke

Ich hab mir das mal angeschaut, aber das übersteigt leider meine Mathematischen und Programmiererischen Fähigkeiten.
Gibt es irgenwie was fertiges das mir die Laustärken der Frequenzen ausgibt ?

MfG

omata 31. Jan 2007 14:47

Re: Frequenz
 
Sonst schau dir doch mal mein Beispiel an.

Dort ist alles drin.

Gruss
Thorsten


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:43 Uhr.
Seite 1 von 3  1 23      

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