Running on an ancient version.
9!:14''
4.06/2001-05-22/23:00
]A34=: j./?.1+i.2 3 4
0 1 1j7 2j10
1 0j6 4j1 5j8
8j14 3j12 5j21 9j20
The assumption on A34 should be correct. Thank you for your work!
mar, 23 Mar 2010, David Hotham skribis:
> Well, we can reconstruct A34 by doing the inverse transform on FFTA34.
> Obviously this makes the test somewhat circular - though the fact that a
> sensible-looking A34 (with integer valued elements) exists is encouraging...
>
> OK, then, here goes for hopefully final versions of script (fftw.ijs), test
> script (testfftw.ijs) and updated lab (fftw.ijt)
>
> David
>
>
> fftw.ijs:
>
> NB. built from project: ~Addons/math/fftw/fftw
> NB. z definitions:
>
> script_z_ '~system\main\dll.ijs'
>
> coclass 'jfftw'
>
>
> fftw_z_=: (_1 & fftwnd_jfftw_) :. (1 & fftwnd_jfftw_)
> ifftw_z_=: (1 & fftwnd_jfftw_) :. (_1 & fftwnd_jfftw_)
>
> NB. fftw utils
> NB.
> NB. cd 15!:0
> NB. clean clean numbers near 0
> NB. info cover for wdinfo
> NB. matchclean if clean x-y is all 0
>
> zzero=: 1j1-1j1
>
> 3 : 0''
> if. IFUNIX do.
> DLL=: 'libfftw3.so.3'
> else.
> DLL=: '"',~'"',jpath '~addons\math\fftw\libfftw3-3.dll'
> end.
> )
>
> FFTW_FORWARD=: _1
> FFTW_BACKWARD=: 1
> FFTW_ESTIMATE=: 6 (33 b.) 1
> FFTW_MEASURE=: 0
>
> FFTW_VERSION=: 3.2
>
> cd=: 15!:0
>
> info=: wdinfo @ ('FFTW'&;)
>
> matchclean=: 0: *./ . = clean @ , @: -
>
> NB. =========================================================
> NB.*clean v clean numbers to tolerance (default 1e_10)
> NB. sets values less than tolerance to 0
> clean=: (1e_10&$:) : (4 : 0)
> if. L. y do.
> x clean each y
> else.
> if. 16 ~: 3!:0 y do.
> y * x <: |y
> else.
> j./"1 y* x <: | y=. +.y
> end.
> end.
> )
>
>
> NB. fftw
>
> NB. =========================================================
> NB.*createplan v create a plan
> NB. y = shape ; in ; out ; direction; flag
> NB.
> NB. direction = FFTW_FORWARD | FFTW_BACKWARD
> NB. flag = FFTW_ESTIMATE | FFTW_MEASURE
> createplan=: 3 : 0
> 'shape in out dir flag'=. y
> assert dir e. FFTW_FORWARD,FFTW_BACKWARD
> assert flag e. FFTW_ESTIMATE, FFTW_MEASURE
> shape=. ,shape
> cmd=. DLL,' fftw_plan_dft + x i *i *j *j i i'
> 0 pick cmd cd (#shape);shape;in;out;dir;flag
> )
>
> NB. =========================================================
> NB.*destroyplan v destroy a plan
> destroyplan=: 3 : 0
> cmd=. DLL,' fftw_destroy_plan + n x'
> 1 [ cmd cd y
> )
>
> NB. =========================================================
> NB.*fftwnd d n-dimensional FFT
> NB. x = _1 forward
> NB. 1 backward
> NB. y = data
> fftwnd=: 4 : 0
> shp=. $y
> if. 0 e. shp do. y return. end.
> in=. zzero + , |: y
> out=. in * 0
> assert x e. _1 1
> dir=. x
> plan=. createplan shp;in;out;dir;FFTW_ESTIMATE
> fftwexecute plan
> destroyplan plan
> res=. |: (|.shp) $ out
> if. dir=1 do. res % */shp end.
> )
>
> NB. =========================================================
> NB.*fftwexecute d one call to n-dimensional FFT
> NB. y = plan
> fftwexecute=: 3 : 0
> cmd=. DLL,' fftw_execute + n x'
> 1 [ cmd cd y
> )
>
>
> testfftw.ijs
>
> NB. test fftw system
> NB.
> NB. load this file with 0!:2
> NB.
> NB. 0!:2 <'\jx\addon\fftw\fftw\testfftw.ijs'
>
> load '~addons\math\fftw\fftw.ijs'
>
> clean=: 1e_10&$: : (4 : 0)
> if. (3!:0 y) e. 16 16384 do.
> j./"1 y* x <: | y=. +.y
> else.
> y * x <: |y
> end.
> )
>
> dfft=: 3 : '+/ y * ^ (#y) %~ (- o. 0j2 ) * */~ i.#y'
> matchclean=: 0: *./ . = clean @ , @: -
> round=: [ * [: <. 0.5"_ + %~
>
> a34=: ". ;._2 (0 : 0)
> 0 1 1j7 2j10
> 1 0j6 4j1 5j8
> 8j14 3j12 5j21 9j20
> )
>
> FFTA34=: ". ;._2 (0 : 0)
> 39j99 _10j_10 10.3661j18.8301 9.3205j_6.6795
> _8j6 _33.0788j_17.2417 _13.9282j3.0526 8.634j10.1698
> _1j13 _25.3205j_41.3205 24.0789j_39.7584 _0.0718j_35.0526
> )
>
> NB. =========================================================
> NB. test dat = ifftw fftw dat
>
> f=: matchclean if...@fftw
> f 3
> f i.8
> f i.4096
> f i.2 3 4
> f ?.(6?.10)$100
>
> NB. =========================================================
> NB. test against direct calculation
>
> f=: dfft matchclean fftw
> f 3
> f i.8
> f i.132
>
> NB. =========================================================
> NB. known examples:
> a=: 2 0 1 0 0 0 1 0
> b=: 4 2 0 2 4 2 0 2
>
> a matchclean ifftw b
> b matchclean fftw a
> FFTA34 matchclean 1e_4 round fftw A34
>
> NB. =========================================================
> NB. createplan, performance 'measure'
> NB. In this case, must initialize input array _after_ creating plan.
> NB. Note use of in-place modification to do this, and to re-use the plan
> with
> NB. new input.
> in=: 12 $ 1j1 NB. Make sure elements are complex
> values.
> out=: in * 0
> P=: createplan_jfftw_ 3 4;in;out;_1;0
> in=: (,|:A34) a: } in
> fftwexecute_jfftw_ P
> FFTA34 matchclean 1e_4 round |: (4 3) $ out
> in=: (2 * in) a: } in
> fftwexecute_jfftw_ P
> FFTA34 matchclean 1e_4 round -: |: (4 3) $ out
> destroyplan_jfftw_ P
>
> NB. createplan, performance 'estimate'
> NB. Again note use of in-place modification when re-using plan with new
> input.
> in=: , |: A34
> out=: in * 0
> P=: createplan_jfftw_ 3 4;in;out;_1;64
> fftwexecute_jfftw_ P
> FFTA34 matchclean 1e_4 round |: (4 3) $ out
> in=: (2 * in) a: } in
> fftwexecute_jfftw_ P
> FFTA34 matchclean 1e_4 round -: |: (4 3) $ out
> destroyplan_jfftw_ P
>
>
> fftw.ijt:
>
> LABTITLE=: 'Fast Fourier Transform'
> LABWINDOWED=: 0
> LABFOCUS=: 0
>
> NB. =========================================================
> Lab Section FFTW
> Fast Fourier Transform routines in J are based on the FFTW library, i.e. the
> Fastest Fourier Transform in the West.
>
> FFTW is a comprehensive collection of fast C routines for computing the
> discrete Fourier transform (DFT) in one or more dimensions, of both real and
> complex data, and of arbitrary input size.
>
> FFTW was developed at MIT by Matteo Frigo and Steven G. Johnson, and a full
> description is available at the FFTW home page:
> http://theory.lcs.mit.edu/~fftw/
>
> FFTW is licensed under the GNU General Public License, see
> addons/math/fftw/gpl.htm.
> )
>
> NB. =========================================================
> Lab Section Source Files
> The FFTW routines are packaged in file libfftw3-3.dll, which includes the
> complete set of complex number routines in FFTW.
>
> These routines are accessible to J through the J DLL call mechanism as
> documented in User Manual chapter "Dlls and Memory Management".
> )
>
> NB. =========================================================
> Lab Section
> The scripts and other files for FFTW are in subdirectory fftw/math
> of the addons directory, i.e.
> )
> jpath '~addons/math/fftw'
>
> NB. =========================================================
> Lab Section Loading FFTW
> Load the fftw.ijs script to access FFTW.
>
> The main definitions for FFTW are read into locale jfftw.
>
> Two verbs are defined in the z locale:
>
> fftw forward FFT
> ifftw backward FFT
> )
> load 'math/fftw'
>
> NB. =========================================================
> Lab Section Examples
> Here is a simple example:
> )
> fftw i.8
>
> NB. =========================================================
> Lab Section
> This example is easily verified by direct computation in J.
>
> The discrete FFT for vector f is given by:
>
> N-1
> F(k) = sigma f(n) exp ((- j 2 pi n k)/N) k = 0 ... N-1
> n=0
>
> The verb dfft defined below implements the above expression, and matches the
> result of fftw. However, it is very inefficient for large arguments.
>
> Note that we remove small rounding errors by using the verb clean from the
> numeric script.
> )
> dfft=: 3 : '+/ y * ^ (#y) %~ (- o. 0j2 ) * */~ i.#y'
>
> require 'numeric'
> clean (dfft - fftw) i.8
>
> NB. =========================================================
> Lab Section
> The inverse FFT is given by:
>
> ifftw
>
> or equivalently:
>
> fftw inverse
>
> Note that the inverse is normalized, so that the inverse FFT returns the
> original data.
> )
> ifftw fftw i.8
>
> fftw inverse fftw i.8
>
> NB. =========================================================
> Lab Section
> Doing a FFT followed by an inverse FFT returns the original data, so that
> the following expression is everywhere zero:
>
> dat - ifftw fftw dat
>
> In practice, there may be small rounding errors. Again, we use clean to
> remove these.
> )
>
> A=: ?.~ 8
>
> A - ifftw fftw A
>
> clean A - ifftw fftw A
>
> NB. =========================================================
> Lab Section
> In general, the arguments to fftw and ifftw are complex, multidimensional
> arrays.
>
> The next section computes the FFT on a random complex, 6-dimensional array
> of shape 3 4 5 6 7 8. This may take a few seconds to run.
> )
>
> NB. =========================================================
> Lab Section
> )
> A=: j./ ?. 1 + i. 2 3 4 5 6 7 8
>
> $A
>
> $B=: fftw A
>
> $C=: ifftw B
>
> +/ , clean A - C NB. A matches C
>
> NB. =========================================================
> Lab Section Other Facilities
> The verbs fftw and ifftw should cover practically all uses of FFTW.
>
> However, there are two other facilities that are designed to optimize
> repeated uses of the FFTW library on arguments of the same shape, which are
> supported by the utilities in the jfftw locale:
>
> saved plans
> performance measures
> )
>
> NB. =========================================================
> Lab Section
> When using the underlying facilities directly, take care to ensure the
> arguments given are correct. Calling DLL procedures incorrectly can crash
> your system or corrupt memory.
> )
>
> NB. =========================================================
> Lab Section Saved Plans
> The verbs fftw and ifftw dynamically create and destroy plans. If you are
> calling an FFT on same sized arrays repeatedly, you can create and reuse a
> plan, destroying it when no longer required.
>
> In the following example, a plan is created for a 2 3 4 array, and FFT is
> called twice using it:
> )
> shape=: 2 3 4
> data=: j./? 1+ i.2, shape NB. random data
>
> NB. get data in right shape for library call and allocate
> NB. space for output.
> in=: (,|:data)
> out=: in * 0
>
> [P=: createplan_jfftw_ shape;in;out;_1;64 NB. create plan
>
> NB. execute plan. Result goes to out, which we must reshape
> fftwexecute_jfftw_ P
> |: (|.shape) $ out
>
> data=: j./? 1+ i.2, shape NB. new random data
>
> in=: (,|:data) a: } in NB. in-place update of input
> data
>
> fftwexecute_jfftw_ P NB. reuse existing plan
> |: (|.shape) $ out
>
> destroyplan_jfftw_ P NB. destroy plan
>
> NB. =========================================================
> Lab Section Performance Measures
> The final argument to the verb createplan is a flag, 0=MEASURE or
> 64=ESTIMATE, where ESTIMATE is the default.
>
> Plans created with the MEASURE flag are optimized for a given array size. It
> takes much longer to create such plans than with ESTIMATE, and so you would
> do this only when a large number of FFTs are to be calculated for the same
> array shape.
>
> When creating plans with the ESTIMATE flag you may set up the input either
> before or after creating the plan. But when creating plans with the MEASURE
> flag, you must set up the input after creating the plan.
>
> The next section creates a plan with a performance measure. It will take a
> little longer to run, most of the time being spent creating the plan.
> )
>
> NB. =========================================================
> Lab Section
> )
> shape=: 2 3 4
> in=: (*/ shape) $ 1j1 NB. input must hold complex
> values
> out=: in * 0
>
> [P=: createplan_jfftw_ shape;in;out;_1;0 NB. create plan
>
> NB. populate input after creating plan.
> data=: j./? 1+ i.2, shape
> in=: (,|:data) a: } in
>
> fftwexecute_jfftw_ P NB. execute plan
> |: (|.shape) $ out NB. result goes to out
>
> destroyplan_jfftw_ P NB. destroy plan
>
>
> "bill lam" <[email protected]> wrote in message
> news:[email protected]...
> [---=| TOFU protection by t-prot: 22 lines snipped |=---]
--
regards,
====================================================
GPG key 1024D/4434BAB3 2008-08-24
gpg --keyserver subkeys.pgp.net --recv-keys 4434BAB3
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm