![]() |
[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 |
AW: [BASS.DLL] Lauten Ton registrieren
Dafür müsste eigentlich die Funktion
Delphi-Quellcode:
ausreichen,
BASS_ChannelGetLevel(channelHandle)
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:
|
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 |
AW: [BASS.DLL] Lauten Ton registrieren
Zitat:
Gruß Erich |
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:
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:
var
buf: array[0..4095] of Single; BASS_ChannelGetData(RecordingChannel, @buf, BASS_DATA_FFT8192 or BASS_DATA_FLOAT); Gruß |
AW: [BASS.DLL] Lauten Ton registrieren
Hast du den Hinweis von LargoD schon umgesetzt? Wäre imho einfacher als eine FFT.
|
AW: [BASS.DLL] Lauten Ton registrieren
Zitat:
Zitat:
Gruß |
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 |
AW: [BASS.DLL] Lauten Ton registrieren
Zitat:
|
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
![]() 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