RosettaCodeData/Task/Fast-Fourier-transform/PascalABC.NET/fast-fourier-transform.pas

33 lines
711 B
ObjectPascal

function fft(x: array of complex): array of complex;
begin
var n := x.length;
if n = 0 then exit;
setlength(result, n);
if n = 1 then
begin
result[0] := x[0];
exit;
end;
var evens := x.Where((x, i) -> i mod 2 = 0).ToArray;
var odds := x.Where((x, i) -> i mod 2 = 1).ToArray;
var (even, odd) := (fft(evens), fft(odds));
var halfn := n div 2;
for var k := 0 to halfn - 1 do
begin
var a := exp(new Complex(0.0, -2 * Pi * k / n)) * odd[k];
result[k] := even[k] + a;
result[k + halfn] := even[k] - a;
end;
end;
begin
var test := |1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0|;
foreach var x in fft(test.select(x -> new Complex(x, 0)).ToArray) do
println(x)
end.