![]() |
FFT + Bassdllplayer
Hi,
ich habe eine kleine Frage zum Verstandniss. Ich habe folgenden code hier in der DP gefunden, der eine nette Balkenvisialisierung macht.
Delphi-Quellcode:
Doch nun die Frage, was sagen mir die Werte in dem Data Array, ich hab mir die mal angeschaut, jedoch sind es nur 0,xxxxxx Werte.data := BassdllPlayer1.GetFFTData; Image1.Canvas.Pen.Width:=1; for i := 0 to 255 do Data[i] := Data[i] * ln(i + 1) * (Image1.Height)*2; for i := 0 to 255 do begin Image1.Canvas.pen.color := RGB(255- i, i, i); Image1.Canvas.MoveTo(i+25, Image1.height-5); Image1.Canvas.LineTo(i+25, (Image1.height-5) - round(Data[i]) ); end; Image1.Update; Ich gehe einfach mal davon aus, dass es sich bei dem Diagramm um ein Amplitude(y- Achse) und Frequenz (x-Achse) Diagram handelt. Warum habe ich dann nur 255 Werte, obwohl man als Mensch ja so ca. 20Hz bis 20kHz hört? Wie kann ich aus Data die Frequenz und die Amplitude bekommen? Denke mal ihr habt da mehr Ahnung :wink: Gruß Masteric |
Re: FFT + Bassdllplayer
Die größe des Arrays (hier 255 Werte) erstreckt sich über den gesamten Frequenzbereich (20KHz / 255 = alle 78Hz).
Die Werte im Array stehen dabei für die Stärke der einzelnen Frequenzen. Gruss Thorsten |
Re: FFT + Bassdllplayer
Kann ich das irgendwie genauer rausbekommen?? So auf 10Hz genau?
Und geht es immer ab 20 kHz aus? Gruß Masteric |
Re: FFT + Bassdllplayer
Ja es geht immer von 20KHz aus (mehr kann deine Soundkarte nicht).
Wenn du es genauer haben möchtest, musst du einfach mehr abtasten. Das kann man bei der Bass-Dll über Konstanten vorgeben. Zum Beispiel: 512, 2048, 4096 Bei 4096 sind es dann ~10Hz-Schritte. Gruss Thorsten |
Re: FFT + Bassdllplayer
danke für die hilfe, PS: du meinst bei 2048 sind es 10Hz Schritte 20.000 : 2048 ~ 10 :P
|
Re: FFT + Bassdllplayer
Bei einer FFT kannst du nur die Hälfte der Werte gebrauchen, deshalb war 4096 = 10Hz schon richtig.
Aus der Bass-Hilfe...
Code:
Gruss
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) Thorsten |
Re: FFT + Bassdllplayer
muss ich eigentlich die größe des array erhöhen?, im mom ist tfftdate ein array vom typ single und 0..255 groß, muss das erhöht werden?
also das ist die funktion in der bassdllplayer.pas
Delphi-Quellcode:
das array in selbiger unit
function TBassdllPlayer.getfftdata: TFFTData;
begin if status <> sndPLAYING then exit; if (BASS_ChannelGetData(Channel, @Result, BASS_DATA_FFT4096) = 2048) = False then begin ZeroMemory(@Result, SizeOf(Result)); end; end;
Delphi-Quellcode:
und nun in meiner unit, wo ich die function aufrufe:
TFFTData = array[0.255] of Single;
Delphi-Quellcode:
Wenn ich nun das array tfftdata erhöhe auf 4096 und dann auch in meinem schreibe for i:=0 to irgendwas was größer als 255 ist, bekomm ich immer nen Speicherfehler.
data := BassdllPlayer1.GetFFTData;
Image1.Canvas.Pen.Width:=1; for i := 0 to 255 do Data[i] := Data[i] * ln(i + 1) * (Image1.Height)*2; for i := 0 to 255 do begin Image1.Canvas.pen.color := RGB(255- i, i, i); Image1.Canvas.MoveTo(i+25, Image1.height-5); Image1.Canvas.LineTo(i+25, (Image1.height-5) - round(Data[i]) ); end; Gruß Masteric |
Re: FFT + Bassdllplayer
Habe ich doch oben schon geschrieben.
Bei 4096 bekommst du 2048 Werte, also musst du das Array anpassen. Wo genau bekommst du einen Speicherfehler? Gruss Thorsten |
Re: FFT + Bassdllplayer
Liste der Anhänge anzeigen (Anzahl: 1)
also, ich habe das array so
Delphi-Quellcode:
geändert.
TFFTData = array[0..2048] of Single;
danach die function so:
Delphi-Quellcode:
und meine unit so
function TBassPlayer.getfftdata: TFFTData;
begin if status <> sndPLAYING then exit; if (BASS_ChannelGetData(Channel, @Result, BASS_DATA_FFT4096) = 2048) = False then begin ZeroMemory(@Result, SizeOf(Result)); end; end;
Delphi-Quellcode:
Wo genau ich den Fehler bekomme, kann ich dir nicht sagen, ich poste unten aber mal die Fehlermeldung. Es öffnet sich außerdem das CPU Fenster.
data := BassdllPlayer1.GetFFTData;
Image1.Canvas.Pen.Width:=1; for i := 0 to 2048 do Data[i] := Data[i] * ln(i + 1) * (Image1.Height)*2; for i := 0 to 2048 do begin Image1.Canvas.pen.color := RGB(255- i, i, i); Image1.Canvas.MoveTo(i+25, Image1.height-5); Image1.Canvas.LineTo(i+25, (Image1.height-5) - round(Data[i]) ); end; Gruß Masteric |
Re: FFT + Bassdllplayer
Dann setzt doch mal einen Breakpoint und finde die Zeile heraus.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:07 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