AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

FFT + Bassdllplayer

Offene Frage von "Masteric"
Ein Thema von Masteric · begonnen am 22. Mai 2008 · letzter Beitrag vom 23. Mai 2008
Antwort Antwort
Seite 1 von 2  1 2      
Masteric

Registriert seit: 1. Aug 2007
Ort: Melsungen
155 Beiträge
 
Delphi 7 Professional
 
#1

FFT + Bassdllplayer

  Alt 22. Mai 2008, 02:05
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

Gruß Masteric
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: FFT + Bassdllplayer

  Alt 22. Mai 2008, 02:16
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
  Mit Zitat antworten Zitat
Masteric

Registriert seit: 1. Aug 2007
Ort: Melsungen
155 Beiträge
 
Delphi 7 Professional
 
#3

Re: FFT + Bassdllplayer

  Alt 22. Mai 2008, 20:33
Kann ich das irgendwie genauer rausbekommen?? So auf 10Hz genau?
Und geht es immer ab 20 kHz aus?

Gruß Masteric
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: FFT + Bassdllplayer

  Alt 22. Mai 2008, 20:42
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
  Mit Zitat antworten Zitat
Masteric

Registriert seit: 1. Aug 2007
Ort: Melsungen
155 Beiträge
 
Delphi 7 Professional
 
#5

Re: FFT + Bassdllplayer

  Alt 22. Mai 2008, 21:25
danke für die hilfe, PS: du meinst bei 2048 sind es 10Hz Schritte 20.000 : 2048 ~ 10
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: FFT + Bassdllplayer

  Alt 22. Mai 2008, 22:05
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
  Mit Zitat antworten Zitat
Masteric

Registriert seit: 1. Aug 2007
Ort: Melsungen
155 Beiträge
 
Delphi 7 Professional
 
#7

Re: FFT + Bassdllplayer

  Alt 22. Mai 2008, 22:37
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
  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
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: FFT + Bassdllplayer

  Alt 22. Mai 2008, 22:53
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
  Mit Zitat antworten Zitat
Masteric

Registriert seit: 1. Aug 2007
Ort: Melsungen
155 Beiträge
 
Delphi 7 Professional
 
#9

Re: FFT + Bassdllplayer

  Alt 22. Mai 2008, 23:27
also, ich habe das array so
  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
Miniaturansicht angehängter Grafiken
fm_185.jpg  
"Programmieren ist eine der universellsten, allübergreifendsten und höchsten von Menschen erreichten Formen der Kreativität."
Nur weil Gott die Welt in 6 Tagen erschaffen hat, heisst das nicht, dass Informatiker alles in 6 Tagen programmieren können.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: FFT + Bassdllplayer

  Alt 22. Mai 2008, 23:31
Dann setzt doch mal einen Breakpoint und finde die Zeile heraus.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:30 Uhr.
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