AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Frequenz

Ein Thema von ebber · begonnen am 24. Jan 2007 · letzter Beitrag vom 5. Feb 2007
Antwort Antwort
Seite 1 von 3  1 23      
ebber

Registriert seit: 31. Okt 2006
243 Beiträge
 
#1

Frequenz

  Alt 24. Jan 2007, 20:06
Hallo

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

MfG
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Frequenz

  Alt 24. Jan 2007, 20:24
Hallo,
such mal in der Bass Hilfe nach FFT (Fast Fourier Transformation)
I come from outer space to save the human race
  Mit Zitat antworten Zitat
ebber

Registriert seit: 31. Okt 2006
243 Beiträge
 
#3

Re: Frequenz

  Alt 25. Jan 2007, 19:20
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
  Mit Zitat antworten Zitat
BloodySmartie
(Gast)

n/a Beiträge
 
#4

Re: Frequenz

  Alt 29. Jan 2007, 15: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
ebber

Registriert seit: 31. Okt 2006
243 Beiträge
 
#5

Re: Frequenz

  Alt 31. Jan 2007, 14:32
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
  Mit Zitat antworten Zitat
BloodySmartie
(Gast)

n/a Beiträge
 
#6

Re: Frequenz

  Alt 31. Jan 2007, 14:48
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.
  Mit Zitat antworten Zitat
ebber

Registriert seit: 31. Okt 2006
243 Beiträge
 
#7

Re: Frequenz

  Alt 31. Jan 2007, 15:07
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

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

Re: Frequenz

  Alt 31. Jan 2007, 15:13
Die Auswertung der Frequenzanalyse und die Implementationen (von 3_of_8) gibts hier:
DP - FFT
DP - DFT
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
ebber

Registriert seit: 31. Okt 2006
243 Beiträge
 
#9

Re: Frequenz

  Alt 31. Jan 2007, 15:42
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
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Frequenz

  Alt 31. Jan 2007, 15:47
Sonst schau dir doch mal mein Beispiel an.

Dort ist alles drin.

Gruss
Thorsten
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 02:04 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