procedure FFT( var XREAL,XIMAG: ZISU; var N,NU: integer ); type ZISU= array[1..100] of real; var N2,NU1,K,L,I,P,K1,K1N2: integer; ARG,C,S,TREAL,TIMAG : real; function IBITR( J,NU: integer ): integer; var J1,I,J2,B: integer; begin J1:=J; B:=0; for I:=1 to NU do begin J2:=J1 div 2; B:=B*2+(J1-2*J2); J1:=J2 end ; IBITR:=B end; function BEKI( NU1: integer ): integer; var Z,C: integer ; begin C:=1; for Z:=1 to NU1 do C:=C*2; BEKI:=C end; begin N2:=N div 2; NU1:=NU-1; K:=0; for L:=1 to NU do begin repeat for I:=1 to N2 do begin P:=IBITR( K div BEKI(NU1),NU ); ARG:=2*3.14*P/N; C:=cos(ARG); S:=sin(ARG); K1:=K+1; K1N2:=K1+N2; TREAL:=XREAL[K1N2]*C+XIMAG[K1N2]*S; TIMAG:=XIMAG[K1N2]*C-XREAL[K1N2]*S; XREAL[K1N2]:=XREAL[K1]-TREAL; XIMAG[K1N2]:=XIMAG[K1]-TIMAG; XREAL[K1]:=XREAL[K1]+TREAL; XIMAG[K1]:=XIMAG[K1]+TIMAG; K:=K+1 end; K:=K+N2; until(K>=N) ; K:=0; NU1:=NU1-1; N2:=N2 div 2 end; for K:=1 to N do begin I:=IBITR(K-1,NU)+1; if I>K then begin TREAL:=XREAL[K]; TIMAG:=XIMAG[K]; XREAL[K]:=XREAL[I]; XIMAG[K]:=XIMAG[I]; XREAL[I]:=TREAL; XIMAG[I]:=TIMAG end end end;