Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi FFT Berechnung fails (https://www.delphipraxis.net/208329-fft-berechnung-fails.html)

venice2 15. Jul 2021 12:44

FFT Berechnung fails
 
Nein es macht nicht wirklich Probleme aber es ist unverständlich für mich weil irgendwie unlogisch.

Ich habe 2 Kanäle jedem ist ein Array 0..511 zugewiesen.
0..511 = 512 Samples pro Kanal = 1024

Jetzt hole ich mir über Bass_ChannelGetdata die entsprechenden Samples um das Array zu füttern BASS_DATA_FFT1024
Nach meinem Verständnis sollte das eigentlich ausreichen um das Array zu befüllen.

Die Daten werden jetzt verschickt
Delphi-Quellcode:
CopyMemory(@gSOP.FFT, @FFFTdata, 1024);


Sieht auch für mich logisch aus.
Nun werden diese Ausgewertet.

Delphi-Quellcode:
        for I := 0 to 255 do
        begin
          VisData.Spectrum[0, I] :=
            Max(0, Min(255,
            (Trunc(Power(Data32Pos^, FFTSAmplification *
            IfThen(VisInfo^.UltraPlayerVis, 0.5, 1)) * 255))));
          inc(Data32Pos, FFT_SkipCount);

          VisData.Spectrum[1, I] :=
            Max(0, Min(255,
            (Trunc(Power(Data32Pos^, FFTSAmplification *
            IfThen(VisInfo^.UltraPlayerVis, 0.5, 1)) * 255))));
          inc(Data32Pos);
        end;
Die Frage die da wäre warum wird aber nur ein viertel der FFT gezeichnet?
Also bei einem Spektrum von 8 Balken nur 4 ?

hoika 15. Jul 2021 12:54

AW: FFT Berechnung fails
 
Hallo,
viel, viel zu wenig Informationen.

Der Fehler kann doch überall liegen,
vielleicht sogar schon beim Abholen der Daten über die BASS-Dll.

oder hier:
0..511
und in der Schleife geht es bis 255?

venice2 15. Jul 2021 13:03

AW: FFT Berechnung fails
 
Zitat:

Zitat von hoika (Beitrag 1492350)
Hallo,
viel, viel zu wenig Informationen.

Der Fehler kann doch überall liegen,
vielleicht sogar schon beim Abholen der Daten über die BASS-Dll.

oder hier:
0..511
und in der Schleife geht es bis 255?

Welche brauchst du?
Ja was ist an dem wert 255 falsch? Der ist so definiert und kann nicht höher sein.

Delphi-Quellcode:
    Waveform     : array[0..1, 0..511] of shortint;
    Spectrum     : array[0..1, 0..255] of byte;
ist auch logisch oder?
0..255 = 256 Samples pro Kanal = 512 und 0.. 511 = 512

hoika 15. Jul 2021 13:28

AW: FFT Berechnung fails
 
Hallo,
Zitat:

Spectrum : array[0..1, 0..255] of byte;
Das stand im ersten Post nicht, also nicht logisch.

Du wirst hier wohl vielleicht keinen finden, der die FFT in Delphi schon mal gemacht hat.


Also poste doch bitte mal Delphi-Code hier so rein,
dass man damit was anfangen kann.

geg.:
Arrays
gefüllt oder nicht?

Aufgabe:
Werte "irgendwie" füllen

ges.:
???

Was ist denn konkret (in Delphi-Worten) dein Problem?

venice2 15. Jul 2021 13:48

AW: FFT Berechnung fails
 
Zitat:

Spectrum : array[0..1, 0..255] of byte;
Zitat:

Das stand im ersten Post nicht, also nicht logisch.
Nein?
Also ich kann im ersten Post lesen das für den rechten und linken Kanal 2 werte eingelesen werden und zwar jeweils 256 Samples.
Würde das Array also so nicht definiert sein.. Ja dann wäre es unlogisch.
Normalerweise sollte man das doch so voraussetzen oder?

Zitat:

Also poste doch bitte mal Delphi-Code hier so rein,
dass man damit was anfangen kann.
Der Code der für das Problem relevant ist habe ich gepostet.

Zitat:

Was ist denn konkret (in Delphi-Worten) dein Problem?
Die Frage die da wäre warum wird aber nur ein viertel der FFT gezeichnet?

Nun wie ich schon sagte es ist kein eigentliches Problem denn ich habe es so gelöst.

Ich hole ich mir jetzt über Bass_ChannelGetdata BASS_DATA_FFT2048 Samples und übergebe
Delphi-Quellcode:
CopyMemory(@gSOP.FFT, @FFFTdata, 2048);


Jetzt werden alle 8 Balken der Visualisierung gerendert so wie es sein soll!

Also nochmal die Frage warum muß ich ein 4 Faches an Samples übergeben obwohl doch nur 512 davon ausgewertet werden.
Das ist das Unverständnis das ich habe.

Ich hoffe du verstehst warum es mir geht.
Ich verstehe nicht warum BASS_DATA_FFT1024 Samples nicht ausreichend sind um ein Array von 512 Samples auszuwerten. (letztendlich nur 256 Samples pro Kanal)

TiGü 15. Jul 2021 15:02

AW: FFT Berechnung fails
 
Ich hätte ja testhalber einfach mal meine Zwischen-Datenquelle mit Testdaten gefüllt und dann geschaut, ob meine Malroutine richtig ist.
Bspw. so hier:

Delphi-Quellcode:
        for I := 0 to 255 do
        begin
          VisData.Spectrum[0, I] := I;

          VisData.Spectrum[1, I] := 255 - I;
        end;
Da müssten dann ja zwei Rampen bei raus kommen.

venice2 15. Jul 2021 15:07

AW: FFT Berechnung fails
 
Zitat:

Zitat von TiGü (Beitrag 1492357)
Ich hätte ja testhalber einfach mal meine Zwischen-Datenquelle mit Testdaten gefüllt und dann geschaut, ob meine Malroutine richtig ist.
Bspw. so hier:

Delphi-Quellcode:
        for I := 0 to 255 do
        begin
          VisData.Spectrum[0, I] := I;

          VisData.Spectrum[1, I] := 255 - I;
        end;
Da müssten dann ja zwei Rampen bei raus kommen.

Es geht um die Frage warum ich ein 4 Faches an Samples (2048) einlesen muß um das Spektrum korrekt zu füllen obwohl es nur eine Größe von 256 Einträgen hat.
Das ist was mir unverständlich ist.

Ansonsten funktioniert es ja.
Wie man an den Bildern erkennen kann alle 8 Balken sind gefüllt.

TiGü 15. Jul 2021 15:15

AW: FFT Berechnung fails
 
Es fehlt uns allen hier wieder essentielle Informationen über dein Programm und vollständiger Quelltext und die Bitte um ein kompaktes Demoprojekt sind wie immer vergebens (Starrsinn gepaart mit Unfähigkeit Probleme zu abstrahieren und auf das Wesentliche zu reduzieren), daher können wir nur raten.
Übrigens: Außer dir programmieren hier ganz ganz ganz wenige Leute Visualisierungen für Musikabspielsoftware, von daher kannst du nicht erwarten, dass wir immer so im Thema drinstecken.

Glaskugel sagt:
1024 Samples / 256 = nur 4 Balken (linke/untere vier)
2048 Samples / 256 = alle 8 Balken

TiGü 15. Jul 2021 15:18

AW: FFT Berechnung fails
 
(Englische) Doku (nicht) lesen ist auch noch so ein Punkt, der dir oft auf die Füße fällt:

http://www.un4seen.com/doc/#bass/BAS...elGetData.html

Zitat:

BASS_DATA_FFT1024 1024 sample FFT (returns 512 values).
BASS_DATA_FFT2048 2048 sample FFT (returns 1024 values).

venice2 15. Jul 2021 15:31

AW: FFT Berechnung fails
 
Zitat:

Zitat von TiGü (Beitrag 1492360)
Zitat:

BASS_DATA_FFT1024 1024 sample FFT (returns 512 values).
BASS_DATA_FFT2048 2048 sample FFT (returns 1024 values).

Und warum funktioniert es dann nicht bei einem Array von 256 Einträgen?
512 sollten doch reichen oder nicht?
Für jeden Kanal die Hälfte.

Er rendert dann zumindest nur 4 Balken.
Erst mit BASS_DATA_FFT2048 (1024 Samples) und das ist nun mal ein vierfaches von 256.
Unverständlich.

Zitat:

1024 Samples / 256 = nur 4 Balken (linke/untere vier)
2048 Samples / 256 = alle 8 Balken
Ok hatte das nicht gelesen.
Hat sich dann erledigt. Danke

Delphi.Narium 15. Jul 2021 16:13

AW: FFT Berechnung fails
 
Vor längerer Zeit hat mal hier bei der Konkurenz jemand was dazu gepostet, die dort verlinkte ZIP-Datei mit den Quellen ist noch verfügbar.

Habe das vor Jahren mal für meinen Player genutzt. Eventuell kannst Du den Quellen ja entnehmen, wie der Umgang mit FFT dort realisiert wurde und das eine oder andere für Dich entsprechend adaptieren.

venice2 15. Jul 2021 16:26

AW: FFT Berechnung fails
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1492364)
Vor längerer Zeit hat mal hier bei der Konkurenz jemand was dazu gepostet, die dort verlinkte ZIP-Datei mit den Quellen ist noch verfügbar.

Habe das vor Jahren mal für meinen Player genutzt. Eventuell kannst Du den Quellen ja entnehmen, wie der Umgang mit FFT dort realisiert wurde und das eine oder andere für Dich entsprechend adaptieren.

Danke ich benötige keinen Fremdcode es funktioniert doch alles.
Es ging nur um die frage warum ich BASS_DATA_FFT2048 anstelle von BASS_DATA_FFT1024 1024 verwenden muß weil mir einige Balken fehlten.
Das ist mittlerweile beantwortet.

Es gab da einige Unstimmigkeiten.

TomyN 2. Okt 2021 17:01

AW: FFT Berechnung fails
 
Eine FFT ist bei einem realen Input symetrisch, d.h. es genügt die Hälfte der Werte.
Wenn ich es richtig verstehe, dann hast Du ja zwei Kanäle, daher macht das alles schon Sinn.

Blup 4. Okt 2021 16:24

AW: FFT Berechnung fails
 
Was soll FFT_SkipCount den in dieser Reihenfolge bewirken?
Die Samples der einzelnen Channels liegen direkt hintereinander.
Da wäre es eher anders herum sinnvoll, wenn man Samples auslassen will.
Ich würde in FFT_SkipCount eher die zu überspringenden Sample-Paare angeben:
Delphi-Quellcode:
VisData.Spectrum[0, I] := fn(Data32Pos^)
inc(Data32Pos);
VisData.Spectrum[1, I] := fn(Data32Pos^)
inc(Data32Pos, 1 + (2 * FFT_SkipCount));
Schon bei FFT_SkipCount = 1 wird jetzt DataPos bei jedem Schleifendurchlauf um 4 Samples weiter gesetzt.
Bei 256 Durchläufen sind das 1024 Samples. Größere Werte für FFT_SkipCount sind hier nicht zulässig.

venice2 4. Okt 2021 21:16

AW: FFT Berechnung fails
 
Keine Ahnung auf was du hinaus willst.
Du weist doch gar nicht wofür FFT_SkipCount steht.

Delphi-Quellcode:
  BASS_SONIQUEVIS_CONFIG_FFT_SKIPCOUNT = 2; // Skip count range is from 1 to 3 (because of limited FFT request size)
  BASS_SONIQUEVIS_CONFIG_WAVE_SKIPCOUNT = 3; // Skip count range is from 0 to (...) try it out, whenever Bass crashes or does not return enough sample data
Definition von FFT_SKIPCOUNT und WAVE_SKIPCOUNT.

Der Speicher wird so zugewiesen
Delphi-Quellcode:
GetMem(Data32, FFT_SkipCount shl 13);


FFTSize ist abhängig vom übergebenen FFT_SkipCount
BASS_DATA_FFT1024, BASS_DATA_FFT2048, BASS_DATA_FFT4096

Delphi-Quellcode:
        case (FFT_SkipCount) of
          1:
            FFTSize := BASS_DATA_FFT1024;
          2:
            FFTSize := BASS_DATA_FFT2048;
          3:
            FFTSize := BASS_DATA_FFT4096;
        else
          FFT_SkipCount := 1;
          FFTSize := BASS_DATA_FFT1024;
        end;

        Bass_ChannelGetdata(channel, Data32, FFTSize or DWORD(IfThen(ChanInfo.chans = 2,
              BASS_DATA_FFT_INDIVIDUAL) or IfThen(not VisInfo^.UltraPlayerVis,
              BASS_DATA_FFT_NOWINDOW)));
Dementsprechend hole ich mir dann die passenden Werte über Bass_ChannelGetdata. Siehe FFTSize
Zitat:

Bei 256 Durchläufen sind das 1024 Samples. Größere Werte für FFT_SkipCount sind hier nicht zulässig.
Man muß das gesamt Bild sehen und nicht nur einen Teil davon. Du darfst hier nicht von einen festen Wert ausgehen BASS_DATA_FFT1024

Aber hat nichts mit meiner Frage in diesen Thread zu tun und dieser war ja auch schon beantwortet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:03 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