Советы по Delphi


         

рекурсивная часть, вызываемая при готовности


/p>
unit cplxfft1;

interface

uses Cplx;

type
PScalar = ^TScalar;TScalar = TComplex; {Легко получаем преобразование в реальную величину}
PScalars = ^TScalars;TScalars = array[0..High(integer) div SizeOf(TScalar) - 1]of TScalar;
const

TrigTableDepth: word = 0;TrigTable : PScalars = nil;
procedure InitTrigTable(Depth: word);

procedure FFT(Depth: word;
Src: PScalars;Dest: PScalars);
{Перед вызовом Src и Dest ТРЕБУЕТСЯ распределение

(integer(1) shl Depth) * SizeOf(TScalar)

байт памяти!}

implementation

procedure DoFFT(Depth: word;
Src: PScalars;SrcSpacing: word;Dest: PScalars);{ рекурсивная часть, вызываемая при готовности FFT}
var j, N: integer; Temp: TScalar; Shift: word;
begin
if
Depth = 0 then
begin
Dest^[0]:= Src^[0];exit;end;
N:= integer(1) shl (Depth - 1);

DoFFT(Depth - 1, Src, SrcSpacing * 2, Dest);
DoFFT(Depth - 1, @Src^[SrcSpacing], SrcSpacing * 2, @Dest^[N] );

Shift:= TrigTableDepth - Depth;

for j:= 0 to N - 1 do
begin

Temp:= Product(TrigTable^[j shl Shift],Dest^[j + N]);Dest^[j + N]:= Difference(Dest^[j], Temp);Dest^[j] := Sum(Dest^[j], Temp);end;

end;

procedure FFT(Depth: word;
Src: PScalars;Dest: PScalars);var j, N: integer; Normalizer: extended;
begin

N:= integer(1) shl depth;

if Depth TrigTableDepth then
InitTrigTable(Depth);
DoFFT(Depth, Src, 1, Dest);

Normalizer:= 1 / sqrt(N) ;

for j:=0 to N - 1 do
Dest^[j]:= TimesReal(Dest^[j], Normalizer);
end;

procedure InitTrigTable(Depth: word);
var j, N: integer;
begin

N:= integer(1) shl depth;
ReAllocMem(TrigTable, N * SizeOf(TScalar));
for j:=0 to N - 1 do
TrigTable^[j]:= EiT(-(2*Pi)*j/N);TrigTableDepth:= Depth;

end;

initialization

;
finalization
ReAllocMem(TrigTable, 0);
end.
unit DemoForm;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls;
type
TForm1 = class(TForm)Button1: TButton;Memo1: TMemo;Edit1: TEdit;Label1: TLabel;procedure Button1Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;
var
Form1: TForm1;
implementation

{$R *.DFM}

uses cplx, cplxfft1, MMSystem;

procedure TForm1.Button1Click(Sender: TObject);
var j: integer; s:string;
src, dest: PScalars;norm: extended;d,N,count:integer;st,et: longint;begin

d:= StrToIntDef(edit1.text, -1) ;if d <1 thenraise exception.Create('глубина рекурсии должны быть положительным целым числом');

N:= integer(1) shl d ;
GetMem(Src, N*Sizeof(TScalar));GetMem(Dest, N*SizeOf(TScalar));
for j:=0 to N-1 dobeginsrc^[j]:= MakeComplex(random, random);end;
begin

st:= timeGetTime;FFT(d, Src, dest);et:= timeGetTime;
end;

Memo1.Lines.Add('N = ' + IntToStr(N));Memo1.Lines.Add('норма ожидания: ' +#9+ FloatToStr(N*2/3));
norm:=0;for j:=0 to N-1 do norm:= norm + AbsSquared(src^[j]);Memo1.Lines.Add('Норма данных: '+#9+FloatToStr(norm));norm:=0;for j:=0 to N-1 do norm:= norm + AbsSquared(dest^[j]);Memo1.Lines.Add('Норма FT: '+#9#9+FloatToStr(norm));

Memo1.Lines.Add('Время расчета FFT: '+#9+ inttostr(et - st)+ ' мс.');Memo1.Lines.Add(' ');
FreeMem(Src);FreeMem(DEst);end;

end.
<

Содержание  Назад  Вперед