Delphi-PRAXiS
Seite 6 von 10   « Erste     456 78     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Circular spectrum visualizer (https://www.delphipraxis.net/200135-circular-spectrum-visualizer.html)

Michael II 26. Mär 2019 11:23

AW: Circular spectrum visualizer
 
Hoi EWeiss

schön klappt's.

DFT sollte funktionieren, ich habe die Funktion anhand einiger Beispiele durchgerechnet und bei weniger plausiblen Argumenten mit den Werten meiner eigenen Funktion verglichen.

Zum View=0 Fall. Ich hatte übersehen, dass der Autor für diesen Fall die Funktion FFT "missbraucht". Sowas gehört eigentlich (wie er es beim Fall View=1 getan hat) in die Prozedur, welche die Werte grafisch darstellt.

Wenn du den View=0 Fall dennoch (wie im Original) in die FFT() einbauen willst, dann so:

Delphi-Quellcode:
procedure TSpectrum.FFT( var Dat : array of TComplex );
var a : uDFT.TComplexArray;
    i, n : integer;
    sr : single;
begin
  n := length( Dat );
  setlength( a, n );

  for i := 0 to n-1 do
  begin
    a[i].re := Dat[i].r;
    a[i].im := Dat[i].i;
  end;

  DFT( a );

  if FView = 0 then
  sr := FGain/50
  else
  sr := 1/n;

  for i := 0 to n-1 do
  begin
    Dat[i].r := a[i].re * sr;
    Dat[i].i := a[i].im * sr;
  end;
end;

Und falls du View nicht in FFT einbaust, dann musst du für View=0 die Spektren mit dem Faktor scale (Code unten) skalieren:

Delphi-Quellcode:
    0:
      begin
        scale := FFFTSize/FGain*50;

        for o := 0 to FOctaveCount - 1 do
        begin
          fl := True;
          q2 := q2 + OctAreaSize;

          i2 := i1 * 2;
          while i1 < i2 do
          begin
            b := scale*Sqr(Spectrum[i1].r * Spectrum[i1].r + Spectrum[i1].i * Spectrum[i1].i);

EWeiss 26. Mär 2019 11:31

AW: Circular spectrum visualizer
 
Danke dir erstmal wie immer ;)

Ich habe es so gemacht.. mit einer anderen FFT die funktioniert sorry.

Delphi-Quellcode:
procedure TSpectrum.FFT(var Dat: array of TComplex);
var
  tp: array of TComplex;
  i: integer;
  sr: Extended;

begin

  SetLength(tp, FFFTSize);

  for i := 0 to FFFTSize - 1 do
  begin
    tp[i].re := Dat[i].re;
    tp[i].im := Dat[i].im;
  end;

  ForwardFFT(Dat, tp, FFFTSize);

  if FView = 0 then
    sr := (4096 * FGain) / FFFTSize
  else
  sr := 1 / FFFTSize;

  for i := 0 to (FFFTSize div 2) - 1 do
  begin
    Dat[i].re := tp[i].re * sr;
    Dat[i].im := tp[i].im * sr;
  end;

end;
Zitat:

Und falls du View nicht in FFT einbaust, dann musst du für View=0 die Spektren mit dem Faktor scale (Code unten) skalieren:
View ist nötig weil ich hier den Effekt umschalte zwischen Ring und Sector. Ohne funktioniert Rings nicht.

Ich kann deine FFT gerne nochmal gegentesten mit deiner Änderung.

gruss

Michael II 26. Mär 2019 12:02

AW: Circular spectrum visualizer
 
Ist klar, dass du View benötigst.

Ich würde es entweder wie im Code 2 gezeigt nachbessern; oder du kannst die angepasste FFT verwenden.

EWeiss 26. Mär 2019 12:07

AW: Circular spectrum visualizer
 
Zitat:

Zitat von Michael II (Beitrag 1428733)
Ist klar, dass du View benötigst.

Ich würde es entweder wie im Code 2 gezeigt nachbessern; oder du kannst die angepasste FFT verwenden.

Werde ich tun.. Danke
PN ist unterwegs.

gruss

EWeiss 26. Mär 2019 12:20

AW: Circular spectrum visualizer
 
Habe es versucht aber deine Version funktioniert leider nicht.
Mit meiner FFT.

nur das hier von mir geändert.
Delphi-Quellcode:
  if FView = 0 then
     sr := (4096 * FGain) / FFFTSize
   else
   sr := 1 / FFFTSize;

   for i := 0 to (FFFTSize div 2) - 1 do
   begin
     Dat[i].re := tp[i].re * sr;
     Dat[i].im := tp[i].im * sr;
   end;
anbei noch ein shot der Ringe..

gruss

EWeiss 26. Mär 2019 14:30

AW: Circular spectrum visualizer
 
Neue Version oben danke an @Michael II für seine Hilfe (Mitarbeit an der FFT) Ich verwende seine ;)
sowie an @Neutral General für die Lösung des 2D Arrays in eins zu verschieben.

Source include.

In D2010 geschrieben ihr müsst leider VCL.. selbst zu Grapics usw.. addieren in neueren Delphi Versionen.

gruss

EWeiss 27. Mär 2019 22:50

AW: Circular spectrum visualizer
 
Neue Version.
Wollte schon aufgeben wegen der Farben aber gut habe es gefixt!


- remove grWindow
- Add DoubleBuffer (Danke Michael II für die Idee)
- fix FarbSpectrum
- remove alte ARGB Function

fehlt noch Fade, Blur, Fire muss sehen was da noch falsch läuft.
Eventuell muss ich die Funktion direkt in die Draw Routine integrieren. (Mal sehn)

Habe die ARGB Funktion entfernt..
1. Kombination von Unsigned + Signed DateiType
2. Overflow konnte es nicht fixen (verwende jetzt meine eigene).

War Fehlerhaft bzw.. zu anfällig für Fehler
Delphi-Quellcode:
function ARGB(Alpha: Byte; Col: ColorRef): ColorRef;
begin

  if Alpha > 127 then
    Result := ColorRef(Int64(Col and $FFFFFF or (Int64(Alpha) - 256) * $1000000))
  else
  Result := Col and $FFFFFF or (Alpha * $1000000);
end;
{$ENDREGION}
Die alte Version habe ich mal oben gelassen zum vergleich.

gruss

EWeiss 2. Apr 2019 12:42

AW: Circular spectrum visualizer
 
Aktualisierte Version hochgeladen.
Änderungen siehe oben.

gruss

Klaus01 2. Apr 2019 13:13

AW: Circular spectrum visualizer
 
Hallo Emil,

Delphi-Quellcode:
            a := (((SpectrumData2D[x, y] and $FF000000) div $1000000) and $FF);
            a := a - d;

            c := SpectrumData2D[x, y] and $FFFFFF;

            if a > 127 then
              SpectrumData2D[x, y] := LongWord(c or ((a - 256) * $1000000))
            else
            SpectrumData2D[x, y] := LongWord(c or (a * $1000000));
a ist bei Dir als Byte definiert

Was passiert wenn d > a ist?

Es gibt ein wahrscheinlich nicht erwartetes Ergebnis.
Michael II hatte Dir dazu schon eine Lösung gepostet.

Grüße
Klaus

EWeiss 2. Apr 2019 13:17

AW: Circular spectrum visualizer
 
Zitat:

Zitat von Klaus01 (Beitrag 1429327)
Hallo Emil,

Delphi-Quellcode:
            a := (((SpectrumData2D[x, y] and $FF000000) div $1000000) and $FF);
            a := a - d;

            c := SpectrumData2D[x, y] and $FFFFFF;

            if a > 127 then
              SpectrumData2D[x, y] := LongWord(c or ((a - 256) * $1000000))
            else
            SpectrumData2D[x, y] := LongWord(c or (a * $1000000));
a ist bei Dir als Byte definiert

Was passiert wenn d > a ist?

Es gibt ein wahrscheinlich nicht erwartetes Ergebnis.
Michael II hatte Dir dazu schon eine Lösung gepostet.

Grüße
Klaus

Danke ;)

Es ging mir erst einmal darum den Original Quelltext einzubinden.
Weil wie gesagt alle anderen aus was für gründen auch immer nicht funktioniert haben.
Die Lösung vom Michael gibt auch überall 0 zurück auch mit geänderten DatenTyp zu LongWord.

Michael II verwendet auch Byte.
Sorry nein DWORD.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:25 Uhr.
Seite 6 von 10   « Erste     456 78     Letzte »    

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 by Thomas Breitkreuz