Вот мой.
procedure FFT(M:TComplexMap; inv:Boolean); Overload;
Var i,j:Integer;
LL,LL1,NN,MM:Integer;
N:TComplexMap;
p1,p2:PComplex;
begin
If (M<>Nil) and (M.UnitFormat=uf1Unit) then
begin
if (M.Height and (M.Height-1)<>0) or (M.Height=0) then exit;
if (M.Width and (M.Width-1)<>0) or (M.Width=0) then exit;
N:=TComplexMap.Create(M.UnitFormat);
N.Fast:=True;
N.Width:=M.Height;
N.Height:=M.Width;
MM:=Log2Int(M.Width);
NN:=Log2Int(M.Height);
for j:=0 to M.Height-1 do
FFT(MM,M.ScanLine[j],inv);
p1:=M.Map;
p2:=N.Map;
LL:=M.LineLen;
LL1:=SizeOf(Complex)-M.Width*LL ;
for j:=0 to M.Height-1 do
begin
p1:=M.ScanLine[j];
for i:= 0 to M.Width-1 do
begin
p2^:=p1^;
Inc(DWord(p1),SizeOf(Complex));
Inc(DWord(p2),LL);
end;
inc(DWord(p2),LL1);
end;
for j:=0 to N.Height-1 do
FFT(NN,N.ScanLine[j],inv);
p1:=N.Map;
p2:=M.Map;
LL:=N.LineLen;
LL1:=SizeOf(Complex)-N.Width*LL ;
for j:=0 to N.Height-1 do
begin
p1:=N.ScanLine[j];
for i:= 0 to N.Width-1 do
begin
p2^:=p1^;
Inc(DWord(p1),SizeOf(Complex));
Inc(DWord(p2),LL);
end;
inc(DWord(p2),LL1);
end;
N.Free;
end;
end;
Бери лучше FFTW у него скорость в 10 а то во все 30 раз больше чем просто если реализовывать в паскале.