annotate yetilab/transform/fft.yeti @ 222:77c6a81c577f matrix_opaque_immutable

Move block directory -> vector
author Chris Cannam
date Sat, 11 May 2013 15:58:36 +0100
parents ddc8fa794880
children d7dd391a90fd
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@222 6 vec = load yetilab.vector.vector;
Chris@222 7 complex = load yetilab.vector.complex;
Chris@41 8
Chris@222 9 load yetilab.vector.complextype;
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@48 35 realForward n =
Chris@41 36 (d = new DoubleFFT_1D(n);
Chris@41 37 do bl:
Chris@213 38 v = vec.primitive bl;
Chris@41 39 d#realForward(v);
Chris@213 40 packedToComplex (vec.length bl) v;
Chris@48 41 done);
Chris@48 42
Chris@48 43 realInverse n =
Chris@48 44 (d = new DoubleFFT_1D(n);
Chris@48 45 do arr:
Chris@48 46 v = complexToPacked arr;
Chris@48 47 d#realInverse(v, true);
Chris@213 48 vec.vector v;
Chris@41 49 done);
Chris@41 50
Chris@41 51 {
Chris@48 52 realForward,
Chris@48 53 realInverse,
Chris@41 54 }
Chris@41 55