![]() |
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); |
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:
Ich kann deine FFT gerne nochmal gegentesten mit deiner Änderung. gruss |
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. |
AW: Circular spectrum visualizer
Zitat:
PN ist unterwegs. gruss |
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:
anbei noch ein shot der Ringe..
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; gruss |
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 |
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:
Die alte Version habe ich mal oben gelassen zum vergleich.
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} gruss |
AW: Circular spectrum visualizer
Aktualisierte Version hochgeladen.
Änderungen siehe oben. gruss |
AW: Circular spectrum visualizer
Hallo Emil,
Delphi-Quellcode:
a ist bei Dir als Byte definiert
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)); 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 |
AW: Circular spectrum visualizer
Zitat:
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. |
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