Funktioniert doch
Ich hab alles so verwendet wie bei deiner FFT, mit folgenden Änderungen:
Delphi-Quellcode:
rocedure TForm1.Button1Click(Sender: TObject);
const Abtastwerte=3000;
Abtastfrequenz=1000;
var l:Tlineseries;
a:array[0..Abtastwerte-1] of single;
i:integer;
begin
for i:=0 to Abtastwerte-1 do
a[i]:=2 //Gleichanteil
+5*sin(2*pi*50*i/abtastfrequenz) //50Hz
+3*sin(2*pi*440*i/Abtastfrequenz) //440Hz
+1*sin(2*pi*300*i/Abtastfrequenz);//300Hz
fft(a);
chart1.FreeAllSeries;
l:=tlineseries.create(chart1);
chart1.AddSeries(l);
for i:=0 to Abtastwerte-1 do l.AddXY(i*abtastfrequenz/Abtastwerte,a[i]);
end;
Delphi-Quellcode:
procedure FFT(var a: array of Single);
var I: Integer;
b: TComplexArray;
begin
setlength(b, length(a));
for I:=0 to high(a) do b[I]:=MakeC(a[I], 0);
DoDFT(b, length(a), 0, MakeC(cos((2*Pi/length(a))), sin((2*Pi/length(a)))));
for I:=0 to high(a) do a[I]:=sqrt(sqr(b[I].re)+sqr(b[i].im))/length(a); //nur den Betrag
end;
+Exakt der angegebenen DoDFT
-->Bild ist im Anhang
Zitat:
EDIT: Nebenbei bemerkt ist dieser Algorithmus trotz einiger Optimierungen, die ich mir ausgedacht habe, sehr, sehr langsam. Nicht verwunderlich, wenn man bedenkt, dass bei n=2000 einige Millionen (Milliarden?) Additionen und Multiplikationen ausgeführt werden müssen.
Na ein "sehr" kann man weglassen (zumindest bei 2GHz Dual Core)
Aber nicht umsonst hat die FFT ihren Namen bekommen. Sie hat aber eben den Nachteil, dass du immer 2^n Abtastwerte nehmen musst. Wenn das nicht geht, musst du eben auf die DFT zurückgreifen.
Nebenbei bemerkt: Man kann die For-Schleifen noch optimieren. Dazu müsste man wahrscheinlich zu Assembler gehen. Mathworks schaffts nämlich auch ohne merkliche Zeitverzögerung (eben ausprobiert). [Edit: Quatsch Mathworks, die benutzen auch nur das
hier]
Du kannst mir ja mal sagen, was genau du vor hast. Wahrscheinlich kann man es für eine FFT hinbiegen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.