diff options
author | Erich Eckner <git@eckner.net> | 2015-08-25 09:49:22 +0200 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2015-08-25 09:49:22 +0200 |
commit | 91d297c99e0ba84ec80a4eb4c3a3788b50b70299 (patch) | |
tree | 69e46ca453811548b6a876234af366a877220516 /fftw_l.pas | |
parent | a8cea7550aa11a56535183f5f5cf98454e322d8f (diff) | |
download | units-91d297c99e0ba84ec80a4eb4c3a3788b50b70299.tar.xz |
fftw-Units eingefuegt
Diffstat (limited to 'fftw_l.pas')
-rw-r--r-- | fftw_l.pas | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/fftw_l.pas b/fftw_l.pas new file mode 100644 index 0000000..b906b52 --- /dev/null +++ b/fftw_l.pas @@ -0,0 +1,157 @@ +unit fftw_l; +{ + FFTW - Fastest Fourier Transform in the West library + + This interface unit is (C) 2005 by Daniel Mantione + member of the Free Pascal development team. + + See the file COPYING.FPC, included in this distribution, + for details about the copyright. + + This file carries, as a independend work calling a well + documented binary interface, the Free Pascal LGPL license + with static linking exception. + + Note that the FFTW library itself carries the GPL license + and can therefore not be used in non-GPL software. +} + +{*****************************************************************************} + interface +{*****************************************************************************} + +{$CALLING cdecl} {Saves some typing.} + +{$MACRO on} +{$INLINE on} + +{$IFDEF Unix} + const + fftwlib = 'fftw3l'; +{$ELSE} + const + fftwlib = 'libfftw3l'; +{$ENDIF} + +type complex_extended=record + re,im:extended; + end; + Pcomplex_extended=^complex_extended; + + fftw_plan_extended=type pointer; + + fftw_sign=(fftw_forward=-1,fftw_backward=1); + + fftw_flag=(fftw_measure, {generated optimized algorithm} + fftw_destroy_input, {default} + fftw_unaligned, {data is unaligned} + fftw_conserve_memory, {needs no explanation} + fftw_exhaustive, {search optimal algorithm} + fftw_preserve_input, {don't overwrite input} + fftw_patient, {generate highly optimized alg.} + fftw_estimate); {don't optimize, just use an alg.} + fftw_flagset=set of fftw_flag; + + +{Complex to complex transformations.} +function fftw_plan_dft_1d(n:cardinal;i,o:Pcomplex_extended; + sign:fftw_sign;flags:fftw_flagset):fftw_plan_extended; + external fftwlib name 'fftwl_plan_dft_1d'; +function fftw_plan_dft_2d(nx,ny:cardinal;i,o:Pcomplex_extended; + sign:fftw_sign;flags:fftw_flagset):fftw_plan_extended; + external fftwlib name 'fftwl_plan_dft_2d'; +function fftw_plan_dft_3d(nx,ny,nz:cardinal;i,o:Pcomplex_extended; + sign:fftw_sign;flags:fftw_flagset):fftw_plan_extended; + external fftwlib name 'fftwl_plan_dft_3d'; + +function fftw_plan_dft(rank:cardinal;n:Pcardinal;i,o:Pcomplex_extended; + sign:fftw_sign;flags:fftw_flagset):fftw_plan_extended; + external fftwlib name 'fftwl_plan_dft'; + +{Real to complex transformations.} +function fftw_plan_dft_1d(n:cardinal;i:Pextended;o:Pcomplex_extended; + flags:fftw_flagset):fftw_plan_extended; + external fftwlib name 'fftwl_plan_dft_r2c_1d'; +function fftw_plan_dft_2d(nx,ny:cardinal;i:Pextended;o:Pcomplex_extended; + flags:fftw_flagset):fftw_plan_extended; + external fftwlib name 'fftwl_plan_dft_r2c_2d'; +function fftw_plan_dft_3d(nx,ny,nz:cardinal;i:Pextended;o:Pcomplex_extended; + flags:fftw_flagset):fftw_plan_extended; + external fftwlib name 'fftwl_plan_dft_r2c_3d'; +function fftw_plan_dft(rank:cardinal;n:Pcardinal;i:Pextended;o:Pcomplex_extended; + flags:fftw_flagset):fftw_plan_extended; + external fftwlib name 'fftwl_plan_dft_r2c'; + +{Complex to real transformations.} +function fftw_plan_dft_1d(n:cardinal;i:Pcomplex_extended;o:Pextended; + flags:fftw_flagset):fftw_plan_extended; + external fftwlib name 'fftwl_plan_dft_c2r_1d'; +function fftw_plan_dft_2d(nx,ny:cardinal;i:Pcomplex_extended;o:Pextended; + flags:fftw_flagset):fftw_plan_extended; + external fftwlib name 'fftwl_plan_dft_c2r_2d'; +function fftw_plan_dft_3d(nx,ny,nz:cardinal;i:Pcomplex_extended;o:Pextended; + flags:fftw_flagset):fftw_plan_extended; + external fftwlib name 'fftwl_plan_dft_c2r_3d'; +function fftw_plan_dft(rank:cardinal;n:Pcardinal;i:Pcomplex_extended;o:Pextended; + flags:fftw_flagset):fftw_plan_extended; + external fftwlib name 'fftwl_plan_dft_c2r'; + + +procedure fftw_destroy_plan(plan:fftw_plan_extended); + external fftwlib name 'fftwl_destroy_plan'; +procedure fftw_execute(plan:fftw_plan_extended); + external fftwlib name 'fftwl_execute'; + +{$calling register} {Back to normal!} +procedure fftw_getmem(var p:pointer;size:sizeint); +procedure fftw_freemem(p:pointer);inline; + +{*****************************************************************************} + implementation +{*****************************************************************************} + +{$ifndef Windows} +{$LINKLIB fftw3f} +{$endif} + +{Required libraries by libfftw3} +{ $LINKLIB gcc} +{ $LINKLIB c} +{ $LINKLIB m} + +{Better don't use fftw_malloc and fftw_free, but provide Pascal replacements.} + +{$IF defined(cpui386) or defined(cpupowerpc)} + {$DEFINE align:=16} +{$ENDIF} + +procedure fftw_getmem(var p:pointer;size:sizeint); + +{$IFDEF align} +var + originalptr:pointer; +begin + { We allocate additional "align-1" bytes to be able to align. + And we allocate additional "SizeOf(Pointer)" to always have space to store + the value of the original pointer. } + getmem(originalptr,size + align-1 + SizeOf(Pointer)); + ptruint(p):=(ptruint(originalptr) + SizeOf(Pointer)); + ptruint(p):=(ptruint(p)+align-1) and not (align-1); + PPointer(ptruint(p) - SizeOf(Pointer))^:=originalptr; +{$ELSE} +begin + getmem(p,size); +{$ENDIF} +end; + +procedure fftw_freemem(p:pointer);inline; + +begin +{$IFDEF align} + freemem(PPointer(ptruint(p) - SizeOf(Pointer))^); +{$ELSE} + freemem(p); +{$ENDIF} +end; + +end. |