3
FFTW - Fastest Fourier Transform in the West library
5
This interface unit is (C) 2005 by Daniel Mantione
6
member of the Free Pascal development team.
8
See the file COPYING.FPC, included in this distribution,
9
for details about the copyright.
11
This file carries, as a independend work calling a well
12
documented binary interface, the Free Pascal LGPL license
13
with static linking exception.
15
Note that the FFTW library itself carries the GPL license
16
and can therefore not be used in non-GPL software.
19
{*****************************************************************************}
21
{*****************************************************************************}
23
{$CALLING cdecl} {Saves some typing.}
28
type complex_single=record
31
Pcomplex_single=^complex_single;
33
fftw_plan_single=type pointer;
35
fftw_sign=(fftw_backward=1,fftw_forward=$ffffffff);
37
fftw_flag=(fftw_measure, {generated optimized algorithm}
38
fftw_destroy_input, {default}
39
fftw_unaligned, {data is unaligned}
40
fftw_conserve_memory, {needs no explanation}
41
fftw_exhaustive, {search optimal algorithm}
42
fftw_preserve_input, {don't overwrite input}
43
fftw_patient, {generate highly optimized alg.}
44
fftw_estimate); {don't optimize, just use an alg.}
45
fftw_flagset=set of fftw_flag;
48
{Complex to complex transformations.}
49
function fftw_plan_dft_1d(n:cardinal;i,o:Pcomplex_single;
50
sign:fftw_sign;flags:fftw_flagset):fftw_plan_single;
51
external 'fftw3f' name 'fftwf_plan_dft_1d';
52
function fftw_plan_dft_2d(nx,ny:cardinal;i,o:Pcomplex_single;
53
sign:fftw_sign;flags:fftw_flagset):fftw_plan_single;
54
external 'fftw3f' name 'fftwf_plan_dft_2d';
55
function fftw_plan_dft_3d(nx,ny,nz:cardinal;i,o:Pcomplex_single;
56
sign:fftw_sign;flags:fftw_flagset):fftw_plan_single;
57
external 'fftw3f' name 'fftwf_plan_dft_3d';
59
function fftw_plan_dft(rank:cardinal;n:Pcardinal;i,o:Pcomplex_single;
60
sign:fftw_sign;flags:fftw_flagset):fftw_plan_single;
61
external 'fftw3f' name 'fftwf_plan_dft';
63
{Real to complex transformations.}
64
function fftw_plan_dft_1d(n:cardinal;i:Psingle;o:Pcomplex_single;
65
flags:fftw_flagset):fftw_plan_single;
66
external 'fftw3f' name 'fftwf_plan_dft_r2c_1d';
67
function fftw_plan_dft_2d(nx,ny:cardinal;i:Psingle;o:Pcomplex_single;
68
flags:fftw_flagset):fftw_plan_single;
69
external 'fftw3f' name 'fftwf_plan_dft_r2c_2d';
70
function fftw_plan_dft_3d(nx,ny,nz:cardinal;i:Psingle;o:Pcomplex_single;
71
flags:fftw_flagset):fftw_plan_single;
72
external 'fftw3f' name 'fftwf_plan_dft_r2c_3d';
73
function fftw_plan_dft(rank:cardinal;n:Pcardinal;i:Psingle;o:Pcomplex_single;
74
flags:fftw_flagset):fftw_plan_single;
75
external 'fftw3f' name 'fftwf_plan_dft_r2c';
77
{Complex to real transformations.}
78
function fftw_plan_dft_1d(n:cardinal;i:Pcomplex_single;o:Psingle;
79
flags:fftw_flagset):fftw_plan_single;
80
external 'fftw3f' name 'fftwf_plan_dft_c2r_1d';
81
function fftw_plan_dft_2d(nx,ny:cardinal;i:Pcomplex_single;o:Psingle;
82
flags:fftw_flagset):fftw_plan_single;
83
external 'fftw3f' name 'fftwf_plan_dft_c2r_2d';
84
function fftw_plan_dft_3d(nx,ny,nz:cardinal;i:Pcomplex_single;o:Psingle;
85
flags:fftw_flagset):fftw_plan_single;
86
external 'fftw3f' name 'fftwf_plan_dft_c2r_3d';
87
function fftw_plan_dft(rank:cardinal;n:Pcardinal;i:Pcomplex_single;o:Psingle;
88
flags:fftw_flagset):fftw_plan_single;
89
external 'fftw3f' name 'fftwf_plan_dft_c2r';
92
procedure fftw_destroy_plan(plan:fftw_plan_single);
93
external 'fftw3f' name 'fftwf_destroy_plan';
94
procedure fftw_execute(plan:fftw_plan_single);
95
external 'fftw3f' name 'fftwf_execute';
97
{*****************************************************************************}
99
{*****************************************************************************}
103
{Required libraries by libfftw3}
108
{$calling register} {Back to normal!}
110
{Better don't use fftw_malloc and fftw_free, but provide Pascal replacements.}
112
{$IF defined(cpui386) or defined(cpupowerpc)}
116
procedure fftw_getmem(var p:pointer;size:sizeint);
121
ptruint(p):=(ptruint(p)+align-1) and not (align-1);
127
procedure fftw_freemem(p:pointer);inline;