Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Prism FFT + Bassdllplayer (https://www.delphipraxis.net/114246-fft-bassdllplayer.html)

Masteric 22. Mai 2008 01:05


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:
 
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;
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.

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

omata 22. Mai 2008 01:16

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

Masteric 22. Mai 2008 19:33

Re: FFT + Bassdllplayer
 
Kann ich das irgendwie genauer rausbekommen?? So auf 10Hz genau?
Und geht es immer ab 20 kHz aus?

Gruß Masteric

omata 22. Mai 2008 19:42

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

Masteric 22. Mai 2008 20:25

Re: FFT + Bassdllplayer
 
danke für die hilfe, PS: du meinst bei 2048 sind es 10Hz Schritte 20.000 : 2048 ~ 10 :P

omata 22. Mai 2008 21:05

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:
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)
Gruss
Thorsten

Masteric 22. Mai 2008 21:37

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:
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;
das array in selbiger unit
Delphi-Quellcode:
  TFFTData = array[0.255] of Single;
und nun in meiner unit, wo ich die function aufrufe:

Delphi-Quellcode:
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;
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.

Gruß Masteric

omata 22. Mai 2008 21:53

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

Masteric 22. Mai 2008 22:27

Re: FFT + Bassdllplayer
 
Liste der Anhänge anzeigen (Anzahl: 1)
also, ich habe das array so
Delphi-Quellcode:
  TFFTData = array[0..2048] of Single;
geändert.

danach die function so:
Delphi-Quellcode:
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;
und meine unit so
Delphi-Quellcode:
 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;
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.

Gruß Masteric

omata 22. Mai 2008 22:31

Re: FFT + Bassdllplayer
 
Dann setzt doch mal einen Breakpoint und finde die Zeile heraus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:00 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz