AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Circular spectrum visualizer
Thema durchsuchen
Ansicht
Themen-Optionen

Circular spectrum visualizer

Ein Thema von EWeiss · begonnen am 22. Mär 2019 · letzter Beitrag vom 23. Jun 2019
Antwort Antwort
Seite 6 von 10   « Erste     456 78     Letzte »    
EWeiss
Projekt entfernt..

Geändert von EWeiss (24. Jul 2019 um 05:46 Uhr)
 
Michael II

 
Delphi 11 Alexandria
 
#51
  Alt 26. Mär 2019, 11:23
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);
Michael Gasser
  Mit Zitat antworten Zitat
EWeiss
 
#52
  Alt 26. Mär 2019, 11:31
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

Geändert von EWeiss (26. Mär 2019 um 11:35 Uhr)
  Mit Zitat antworten Zitat
Michael II

 
Delphi 11 Alexandria
 
#53
  Alt 26. Mär 2019, 12:02
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.
Michael Gasser
  Mit Zitat antworten Zitat
EWeiss
 
#54
  Alt 26. Mär 2019, 12:07
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
  Mit Zitat antworten Zitat
EWeiss
 
#55
  Alt 26. Mär 2019, 12:20
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

Geändert von EWeiss (11. Jul 2019 um 16:56 Uhr)
  Mit Zitat antworten Zitat
EWeiss
 
#56
  Alt 26. Mär 2019, 14:30
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

Geändert von EWeiss (26. Mär 2019 um 16:13 Uhr)
  Mit Zitat antworten Zitat
EWeiss
 
#57
  Alt 27. Mär 2019, 22:50
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

Geändert von EWeiss (27. Mär 2019 um 23:07 Uhr)
  Mit Zitat antworten Zitat
EWeiss
 
#58
  Alt 2. Apr 2019, 12:42
Aktualisierte Version hochgeladen.
Änderungen siehe oben.

gruss
  Mit Zitat antworten Zitat
Klaus01

 
Delphi 10.4 Sydney
 
#59
  Alt 2. Apr 2019, 13:13
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
Klaus
  Mit Zitat antworten Zitat
EWeiss
 
#60
  Alt 2. Apr 2019, 13:17
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

Geändert von EWeiss ( 2. Apr 2019 um 13:20 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 6 von 10   « Erste     456 78     Letzte »    


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 19:24 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