annotate yetilab/transform/fft.yeti @ 296:ec6a36d88f57

Move complex tests to complex package
author Chris Cannam
date Fri, 31 May 2013 22:02:03 +0100
parents 197d23954a4e
children 4aa43959137d
rev   line source
Chris@41 1
Chris@93 2 module yetilab.transform.fft;
Chris@41 3
Chris@41 4 import edu.emory.mathcs.jtransforms.fft: DoubleFFT_1D;
Chris@41 5
Chris@273 6 vec = load yetilab.vector;
Chris@273 7 complex = load yetilab.complex;
Chris@41 8
Chris@273 9 load yetilab.complex.type;
Chris@213 10
Chris@213 11 packedToComplex len p is number -> ~double[] -> array<cplx> =
Chris@213 12 (n = len / 2;
Chris@46 13 array
Chris@46 14 (map do i:
Chris@46 15 re = if i == n then p[1] else p[i*2] fi;
Chris@46 16 im = if i == 0 or i == n then 0 else p[i*2+1] fi;
Chris@46 17 complex.complex re im;
Chris@46 18 done [0..n]));
Chris@41 19
Chris@48 20 complexToPacked arr =
Chris@48 21 (n = length arr;
Chris@221 22 v = new double[n*2-2];
Chris@221 23 for [0..(n-1)*2-1] do i:
Chris@221 24 ix = int (i/2);
Chris@221 25 v[i] :=
Chris@48 26 if i == ix*2 then
Chris@48 27 complex.real arr[ix]
Chris@48 28 else
Chris@48 29 complex.imaginary arr[ix]
Chris@48 30 fi;
Chris@221 31 done;
Chris@48 32 v[1] := complex.real arr[n-1];
Chris@48 33 v);
Chris@48 34
Chris@270 35 //!!! doc: n is supplied separately from the input vector to support partial evaluation
Chris@48 36 realForward n =
Chris@41 37 (d = new DoubleFFT_1D(n);
Chris@41 38 do bl:
Chris@213 39 v = vec.primitive bl;
Chris@41 40 d#realForward(v);
Chris@213 41 packedToComplex (vec.length bl) v;
Chris@48 42 done);
Chris@48 43
Chris@48 44 realInverse n =
Chris@48 45 (d = new DoubleFFT_1D(n);
Chris@48 46 do arr:
Chris@48 47 v = complexToPacked arr;
Chris@48 48 d#realInverse(v, true);
Chris@213 49 vec.vector v;
Chris@41 50 done);
Chris@41 51
Chris@41 52 {
Chris@48 53 realForward,
Chris@48 54 realInverse,
Chris@41 55 }
Chris@41 56