FFT

=?UNKNOWN?Q?Kov=E1cs_Andr=E1s?= andras at sdkteam.com
Mon Oct 14 12:35:58 CEST 2002


> Kerem , akinek van, kuldjon nekem egy FFT algoritmust (vagy linket),
> legjobb Pascal-ban lenne de minden mas megoldas is erdekel.

Ez Delphiben van, felig meddig en irtam, ha ilyesmire gondoltal,
tudok hozza nemi magyarazatot fuzni, ha talaltal jobbat akkor
nem nezek utana.



unit ufft;

interface
uses math;
type

float=single;
tdata=array[0..1000000] of float;

pdata=^tdata;

tkompl=object
 x,y:float;
 function absval:float;
 function fi:float;
end;


tcdata=array[0..1000000] of tkompl;
pcdata=^tcdata;
function fft(adat:pdata;n:integer):pcdata;
implementation
function wn(n,k:integer):tkompl;
 begin
  with result do begin
   x:=cos(2*pi*k/n);
   y:=-sin(2*pi*k/n);
  end;
 end;

function fft(adat:pdata;n:integer):pcdata;
 var eredm,eprs,eptl:pcdata;
   aprs,aptl:pdata;
   i:integer;
 begin
   eredm:=nil;
   getmem(eredm,sizeof(tkompl)*n);


   if (n>2) then begin
       eprs:=nil;
       getmem(eprs,sizeof(tkompl)*n);
       eptl:=nil;
       getmem(eptl,sizeof(tkompl)*n);
       getmem(aprs,sizeof(float)*n);
       getmem(aptl,sizeof(float)*n);
       for i:=0 to n div 2-1 do begin
          aprs[i]:=adat[2*i];
   aptl[i]:=adat[2*i+1];
       end;
       freemem(adat);
       eprs:=fft(aprs,n div 2);
       eptl:=fft(aptl,n div 2);
       for i:=0 to n div 2-1 do begin
   eredm[i].x:=eprs[i].x+wn(n,i).x*eptl[i].x-wn(n,i).y*eptl[i].y;
   eredm[i].y:=eprs[i].y+wn(n,i).x*eptl[i].y+wn(n,i).y*eptl[i].x;
   eredm[i+n div 2].x:=eprs[i].x-wn(n,i).x*eptl[i].x+wn(n,i).y*eptl[i].y;
   eredm[i+n div 2].y:=eprs[i].y-wn(n,i).x*eptl[i].y-wn(n,i).y*eptl[i].x;
       end;
       freemem(eprs);
       freemem(eptl);
   end else begin
     eredm[0].x:=adat[0]+adat[1];
 eredm[1].x:=adat[0]-adat[1];
 eredm[0].y:=0;
 eredm[1].y:=0;
 freemem(adat);
   end;
   result:=eredm;
 end;
{ tkompl }

function tkompl.absval: float;
begin
 result:=sqrt(sqr(x)+sqr(y));
end;

function tkompl.fi: float;
begin
 result:=ArcTan2(y,x);
end;

end.







More information about the Elektro mailing list