Thema: Delphi Frequenz

Einzelnen Beitrag anzeigen

BloodySmartie
(Gast)

n/a Beiträge
 
#4

Re: Frequenz

  Alt 29. Jan 2007, 14:41
Soweit Du BASS und nicht BASSASIO verwendest, gibts es eine Methode namens BASS_GetChannelData.

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

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!!
  Mit Zitat antworten Zitat