![]() |
Beat Detection ?
Hi,
ich versuche gerade mit Hilfe der bass.dll eine Beaterkennung zu ralisieren. Mein Ansatz dazu sieht bisher so aus:
Delphi-Quellcode:
Die Idee zu dem code ist folgende:
function BeatDetection(area: integer): bool;
var fft: array[1..512] of single; fft_area: array[1..32] of single; i, x: integer; begin BASS_ChannelGetData(RecChannel, @fft, BASS_DATA_FFT512); for i := 1 to 32 do begin for x := 1 to 256 do begin if (x <= (i * 8)) and (x > (i - 1) * 8) then begin fft_area[i] := fft_area[i] + fft[x]; end; end; fft_area[i] := fft_area[i] / 8; end; if sum_old > 0 then begin if fft_area[area] >= sum_old * 1.2 then result := true else result := false; end; sum_old := fft_area[area]; end; 1. FFT Daten in 32 prüfbare Bereiche aufteilen 2. Einzelne Bereiche durch 8 teilen um den Durchschnitt der 8 im Bereich gespeichterten FFT Daten zu ermitteln 3. Prüfen ob die neu ermittelten Daten um den Faktor (hier jetzt 1.2) größer sind, wenn ja Beat erkennt wenn Nein dann nicht Nun sind meine Fragen dazu ob ich im obigen Code einen Denkfehler habe, oder ob es allgemein einen schlauere bzw. bessere Art gibt einen Beat zu erkennen. mfg Blamaster |
Re: Beat Detection ?
Einzige Anmerkung wäre, dass sich in der üblichen westlichen Pop- und Rockmusik ein Beat meist stark im Bassanteil wiederspiegelt. Daher könnte es sinnig sein lediglich tiefere Frequenzen bis ca. 100 Hz zu betrachten. Hat auch den Vorteil, dass du weniger summieren musst, und dadurch etwas schneller bist :)
Evtl. ließe sich noch ein adaptives System bauen, dass den Faktor anpassen kann. Wenn der gerade erkannte Beat z.B. ungewöhnlich schnell oder langsam ist (oder garnix erkannt wird), den Faktor erhöhen bzw. senken, bis sich der Erkannte Beat in einem üblichen Rahmen bewegt (so 80 - 250 bpm wäre schon ein großzügiger Bereich). |
Re: Beat Detection ?
Hi,
Danke für deine antwort. Zitat:
Mfg Blamaster |
Re: Beat Detection ?
Eine FFT (bzw. generell Fourier Transformation) ist ein Verfahren, dass ein Signal vom Zeit-Amplituden Raum in den Frequenz-Amplituden Raum transformiert. Das heisst du bist im Grunde schon fertig, und musst einfach nur die paar ersten Elemente im Array betrachten (0=DC Offset; 1=niedrigster Frequenzbereich; 2=nächst höherer Bereich usw.). Welche Frequenzen nun genau in welchem Index abgebildet sind, hängt von der Sampleanzahl (und damit implizit von der Samplefrequenz und des Zeitabschnittes) ab.
Ich komme grad irgendwie nicht an die Wikipedia, aber ich meine die Artikel zu FFT und der Fourier Transformation allgemein sind sehr brauchbar, und mindestens einen Blick wert - ich meine da auch schon gesehen zu haben wie der Zusammenhang Sampleanzahl/Frequenzbänder läuft, nagel mich aber jetzt nicht drauf fest ;) |
Re: Beat Detection ?
Wenn man nur die niedrigen Frequenzen bis 100 Hz oder ähnlich messen möchte, kann übrigens statt FFT einen ganz normalen Tiefpassfilter benutzen (z.B. State Variable Filter). Das verbraucht nur einen Bruchteil der Resourcen.
|
Re: Beat Detection ?
@Medium
Danke, sprich dann mache ich ja aktuell gerade auhcn icht wirklich was anders, denn ich Teile ja sozusagen die FFT Daten in 32 Bereich mit steigender Frequenz auf. Und über den area Wert kann ich ja dann auswählen welchen Frequenzbereich ich prüfen möchte. (Auch wenn ich dannn nur grob schätzen kann in welchem Frequenzbereich ich da gerade liege) Ich habe gerade noch eine Seite gefunde, die sich mit dem Thema Beatdetection auseinandersetzt. ![]() Ich verstehe aber leide rnicht alles dort beschriebene (bzw. das geschriebene schon aber die Formeln nicht). Könnte ich irgendetwas von dem dort geschriebenen noch zu Verbesserung meiner Funktion nutzen ? mfg Blamaster |
Re: Beat Detection ?
Keiner mehr eine Idee ?
|
Re: Beat Detection ?
Denke nicht das das wirklich weiterhilft, mir ist nur gerade der Gedanke durch den Kopf geschossen, das eigentlich der Beat eine ziemlich niedrige Frequenz im Musikstück ist, also wäre es wieder eine FFT-Analyse aber mit welchen Parametern?
//Brainstorming Der Beat oder vieleicht besser Takt, muss leider auch nicht unbedingt aus lauten Bässen bestehen, z.b. Scorpions Wind of change, sondern ist wohl eher der zeitliche Abstand von irgendwelchen ansteigenden Flanken und/oder Pausen. |
Re: Beat Detection ?
Ich selbst versuche gerade das selbe. Zur Zeit erziele ich relativ gute Ergebnisse mit der FFT-Analyse, dabei Werte ich jedoch die Peaks des Höchsten Frequenzbandes aus (klinkt komisch, funktioniert aber :D ). Für mich war es sehr hilfreich mir die Erkennung zu Visualisieren, dazu zeichne ich mir einen Graphen mit dem Aktuellen Erkennungswert.
lg Björn |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:04 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