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);