Sande-Tukey-FFT-Algorithmus
Programm zur Berechnung einer diskreten Fouriertransformation mittels des
Sande-Tukey-FFT-Algorithmus.
program SchnelleFourierTransformation;
{Berechnung einer diskreten Fouriertransformation mittels des
Sande-Tukey-FFT-Algorithmus}
uses
stdfile;
const
MaxArray = 1024; {<= 32767}
var
i, j, k, l, m, n, n1, n2: integer;
angle, argument, xdum, ydum, c, s: double;
x: array [0..MaxArray] of double;
y: array [0..MaxArray] of double;
procedure init;
var
fName: string;
f: text;
begin {init}
writeln('Darstellung der Berechnung einer diskreten Fouriertransformation');
writeln('mittels des Sande-Tukey-FFT-Algorithmus.)');
writeln;
writeln('In welcher Datei liegt die Funktion? (In fft.dat liegt als Beispiel y(x)=cos(3t)-sin(10t.)');
readln(fName);
if StdOpen(f, fName) then begin
n := -1;
repeat
n := n + 1;
if n > MaxArray then begin
writeln('Die Datei "', fName, '" hat zu viele Punkte (mehr als ', MaxArray, ').');
halt
end; {if}
until not StdRead2(f, x[n], y[n]);
n := n - 1
end else begin {if}
writeln('Die Datei "', fName, '" kann nicht geoeffnet werden.');
halt
end; {if}
close(f);
writeln('Insgesamt wurden ', n + 1, ' Werte eingelesen.');
n := n + 1;
m := trunc(ln(n)/ln(2.0));
end; {init}
procedure result;
var
i: integer;
begin {result}
for i:=1 to n-1 do begin
writeln(y[i]/n:7:3,' ',x[i]/n:7:3)
end {for}
end; {result}
begin {FFT}
init;
n2 := n;
for k:=1 to m do begin
n1 := n2;
n2 := n2 div 2;
angle := 0.0;
argument := 2.0*Pi/n1;
for j:=0 to n2-1 do begin
c := cos(angle);
s := sin(angle);
i := j;
while i < n-1 do begin
l := i + n2;
xdum := x[i] - x[l];
x[i] := x[i] + x[l];
ydum := y[i] - y[l];
y[i] := y[i] + y[l];
x[l] := xdum*c - ydum*s;
y[l] := ydum*c + xdum*s;
i := i+n1
end; {while}
angle := (j+1)*argument
end {for}
end; {for}
j := 0;
for i:=0 to n-2 do begin
if i < j then begin
xdum := x[j];
x[j] := x[i];
x[i] := xdum;
ydum := y[j];
y[j] := y[i];
y[i] := ydum
end; {if}
k := n div 2;
while k < j+1 do begin
j := j - k;
k := k div 2
end; {while}
j := j + k
end; {for}
result
end. {FFT}