Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [BASS.DLL] Lauten Ton registrieren (https://www.delphipraxis.net/154098-%5Bbass-dll%5D-lauten-ton-registrieren.html)

Clemens L. 27. Aug 2010 16:01

[BASS.DLL] Lauten Ton registrieren
 
Hallöchen,

ich versuche momentan mithilfe der BASS.DLL auf einen lauten Ton in einer Umgebung mit normaler Hintergrundlautstärke zu reagieren. Da ich zuvor noch nicht mit BASS gearbeitet habe, bin ich mir nicht sicher, was die beste Vorgehensweise wäre. Ich habe bereits einen Recording Channel, sowie das zugehörige Callback. Jetzt weiss ich jedoch nicht, wie ich die aufgenommenen Daten auswerten könnte, und welche Daten für die Erkennung überhaupt relevant wären.

Ich stelle mir das so vor, dass, wenn beispielsweise ein Buch herunterfällt oder jemand in die Hände klatscht, das Programm diesen Ton erkennt und ein Ereignis ausgeführt wird. Dieser Ton würde sich aufjedenfall von den sonstigen Lauten aus der Umgebung hervorheben, weshalb ich mir die Erkennung eigentlich recht simpel vorgestellt hatte.

Wie gesagt kenne ich mich mit der BASS-API noch nicht aus, weshalb mir momentan die Anhaltspunkte fehlen.

Mit freundlichen Grüßen :-D

blackfin 27. Aug 2010 16:19

AW: [BASS.DLL] Lauten Ton registrieren
 
Dafür müsste eigentlich die Funktion
Delphi-Quellcode:
BASS_ChannelGetLevel(channelHandle)
ausreichen,
die du innerhalb deiner DSP-Callback funktion aufrufst.

Diese ermittelt ganz einfach das Level (Lautstärke) des Channels und gibt diesen als Word zurück, dabei ist das Lo-Word der linke Kanal und das Hi-Word der rechte Kanal. Somit liegt der Wertebereich zwischen 0-255 für jede Seite.

Zur Analyse brauchst du eigentlich nur einen Schwellwert, wenn ein gewisses Level überschritten wird, dann trigger eine Funktion.
Anders machen es selbst Studio-Geräte (z.B. Kompressoren mit den "Threshold"-Werten) auch nicht :)

Willst du einen Peak nur innerhalb eines bestimmten Frequenzbereichs erkennen, brauchst du dafür eine FFT-Analyse.
Ich denke mal, dafür gibts für Bass auch ein Addon / PlugIn.
Aber wenn du nur einen generellen Lautstärke-Peak erkennen willst, brauchst du keine FFT.


Zitat:

Wie gesagt kenne ich mich mit der BASS-API noch nicht aus, weshalb mir momentan die Anhaltspunkte fehlen
Im ZIP-Archiv des bass-Downloads ist auch eine bass.chm enthalten. Da steht eigentlich alles drin, was man an Doku dazu braucht, und übersichtlich ists auch noch :)

Clemens L. 27. Aug 2010 16:59

AW: [BASS.DLL] Lauten Ton registrieren
 
Hallo,

danke für die schnelle Antwort. Ich habe es jetzt mit der Funktion schon einigermaßen hingekriegt, indem ich am Anfang eine 5 sekündige Kalibration durchlaufen lasse, um die durchschnittliche Standardlautstärke zu ermitteln. Wenn diese (deutlich) überschritten wird, wird jetzt ein Ereignis ausgelöst.

Mit dem Begriff FFT-Analyse kann ich jetzt ehrlich gesagt nicht allzuviel anfangen :P, allerdings klingt das auch sehr interessant, da im Moment doch recht viele Fehlauslöser vorkommen. Vielleicht könnte ich in der Kalibrationsphase auch noch eine Erfassung der Frequenz des gesuchten Geräusches einbauen. Wenn du mir Tipps geben könntest, wie man das realisieren könnte oder wo ich mehr über solche Verfahren erfahren kann, wär das echt toll.

Zu den Demos: Die habe ich mir auch schon angeschaut, und so auch die grundlegende Aufnahme Funktionalität hingekriegt. Und in der Dokumentation finde ich nicht so recht das, was ich brauche, sondern nur alle Funktionen aufgelistet, und da ist es schwer den Überblick zu behalten.

Mit freundlichen Grüßen

LargoD 27. Aug 2010 17:28

AW: [BASS.DLL] Lauten Ton registrieren
 
Zitat:

Zitat von Clemens L. (Beitrag 1045575)
... Ich habe es jetzt mit der Funktion schon einigermaßen hingekriegt, indem ich am Anfang eine 5 sekündige Kalibration durchlaufen lasse, um die durchschnittliche Standardlautstärke zu ermitteln. Wenn diese (deutlich) überschritten wird, wird jetzt ein Ereignis ausgelöst.

Besser ist es, statt vorheriger Kalibrierung einen gleitenden Mittelwert über einige Sekunden mitzuführen, dann passt sich das System an veränderliche Hintergrundpegel an.

Gruß
Erich

Clemens L. 27. Aug 2010 21:00

AW: [BASS.DLL] Lauten Ton registrieren
 
Da bin ich wieder,

ich habe mir mittlerweile das mit FFT mal angeschaut, blicke jedoch noch nicht wirklich durch. Ich konnte mithilfe der Funktion BASS_ChannelGetData ein Array bekommen, weiss jedoch nicht wie ich mithilfe dieser Werte einen Ton mit vorher aufgenommenen Werten vergleichen kann. :?

Ich bekomme mein Array folgendermaßen:

Delphi-Quellcode:
var
  buf: array[0..4095] of Single;

  BASS_ChannelGetData(RecordingChannel, @buf, BASS_DATA_FFT8192 or BASS_DATA_FLOAT);
Ich habe ein solches Array zu dem Zeitpunkt wo ein Ton mit hoher Lautstärke registriert wurde, und möchte diesen Ton nun mit einem vorher aufgenommenen Vergleichen. Ich hoffe ihr könnt mir ein bisschen auf die Sprünge helfen, mit Audio-Programmierung kenne ich mich leider kaum aus. :oops:

Gruß

Mithrandir 28. Aug 2010 12:09

AW: [BASS.DLL] Lauten Ton registrieren
 
Hast du den Hinweis von LargoD schon umgesetzt? Wäre imho einfacher als eine FFT.

Clemens L. 28. Aug 2010 13:27

AW: [BASS.DLL] Lauten Ton registrieren
 
Zitat:

Zitat von Mithrandir (Beitrag 1045697)
Hast du den Hinweis von LargoD schon umgesetzt? Wäre imho einfacher als eine FFT.

Das habe ich, jedoch wäre es sehr praktisch, den Ton grob von anderen Geräuschen isolieren zu können.

Zitat:

Zitat von blackfin (Beitrag 1045569)
Dafür müsste eigentlich die Funktion
Delphi-Quellcode:
BASS_ChannelGetLevel(channelHandle)
ausreichen,
die du innerhalb deiner DSP-Callback funktion aufrufst.

Mir fällt gerade auf, dass ich die Töne in einem Timer auswerte, statt es in dem Recording Callback (ich nehme an das gleiche wie DSP-Callback) zu tun. Macht das einen Unterschied?

Gruß

rollstuhlfahrer 28. Aug 2010 17:45

AW: [BASS.DLL] Lauten Ton registrieren
 
Ein Timer löst immer dann aus, wenn das Intervall rum ist. Das Callback immer dann, wenn neue Daten da sind. Folglich wird das Callback häufiger auslösen. Wenn der Ton jetzt mehrere Sekunden lang ist und du nicht den exakten Anfang und das exakte Ende für eine genaue Zeitdauerberechnung brauchst, sollte der Timer reichen.

Bernhard

Clemens L. 28. Aug 2010 18:23

AW: [BASS.DLL] Lauten Ton registrieren
 
Zitat:

Zitat von rollstuhlfahrer (Beitrag 1045779)
Ein Timer löst immer dann aus, wenn das Intervall rum ist. Das Callback immer dann, wenn neue Daten da sind. Folglich wird das Callback häufiger auslösen. Wenn der Ton jetzt mehrere Sekunden lang ist und du nicht den exakten Anfang und das exakte Ende für eine genaue Zeitdauerberechnung brauchst, sollte der Timer reichen.

Bernhard

Danke, dann werde ich wohl beim Timer bleiben. Allerdings wird mein Timer anscheinend öfters ausgelöst als das Callback, also öfter, als neue Daten da sind. Muss ich mich damit abfinden, oder kann ich die Aufnahmegeschwindigkeit / Buffergröße so verändern das ich genauer messen kann.

rollstuhlfahrer 28. Aug 2010 18:33

AW: [BASS.DLL] Lauten Ton registrieren
 
wenn das so ist, würde ich beim Timer bleiben (weil wohl doch genauer). Ich habe mich allerdings nicht so genau mit der Bass.DLL und den Fähigkeiten beschäftigt. Das liegt daran, dass ich alles über Hier im Forum suchenTBassPlayerEx kapsele.

Bernhard


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 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-2025 by Thomas Breitkreuz