Hi,
ich versuche gerade mit Hilfe der bass.dll eine Beaterkennung zu ralisieren.
Mein Ansatz dazu sieht bisher so aus:
Delphi-Quellcode:
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;
Die Idee zu dem code ist folgende:
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