![]() |
Frequenz
Hallo
Ich habe mit der bass.dll eine Sound Stream; Wie bekomme ich jetzt die Laustärke von einzelnen Frequenzen/Frequenzbreichen? MfG |
Re: Frequenz
|
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 |
Re: Frequenz
Soweit Du BASS und nicht BASSASIO verwendest, gibts es eine Methode namens BASS_GetChannelData.
Delphi-Quellcode:
An "length" übergibst Du dabei eine der folgenden vordefinierten Konstanten:
function BASS_ChannelGetData(handle: DWORD; buffer: Pointer; length: DWORD): DWORD;
Zitat:
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:
errechnet.
y:=DatenArray[x];
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 ![]() 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:
Lade Deine Sampledaten dann einfach nur in den Realteil und setze die Imaginärteile jeweils auf 0.
type
// Complex numbers, with precision specified in TFloat (Types unit) TComplex = packed record Re: TFloat; // Real part Im: TFloat; // Imaginary part end; Ich hoffe, meine Erklärung hat Dir etwas weitergeholfen. Wenn Du noch Fragen hast, dann frag einfach :) Digital Signal Processing macht Spass!! :spin2: |
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 |
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. |
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 ? |
Re: Frequenz
|
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 |
Re: Frequenz
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:46 Uhr. |
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 by Thomas Breitkreuz