annotate yetilab/transform/fft.yeti @ 213:d841bfc143dd matrix_opaque_immutable

Update complex, fft
author Chris Cannam
date Sat, 11 May 2013 11:27:34 +0100
parents d0abc9afe608
children ddc8fa794880
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@213 6 vec = load yetilab.block.vector;
Chris@93 7 complex = load yetilab.block.complex;
Chris@41 8
Chris@213 9 load yetilab.block.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@213 22 v = (map do i:
Chris@48 23 ix = int (i/2);
Chris@48 24 if i == ix*2 then
Chris@48 25 complex.real arr[ix]
Chris@48 26 else
Chris@48 27 complex.imaginary arr[ix]
Chris@48 28 fi;
Chris@213 29 done [0..(n-1)*2-1]) as ~double[];
Chris@48 30 v[1] := complex.real arr[n-1];
Chris@48 31 v);
Chris@48 32
Chris@48 33 realForward n =
Chris@41 34 (d = new DoubleFFT_1D(n);
Chris@41 35 do bl:
Chris@213 36 v = vec.primitive bl;
Chris@41 37 d#realForward(v);
Chris@213 38 packedToComplex (vec.length bl) v;
Chris@48 39 done);
Chris@48 40
Chris@48 41 realInverse n =
Chris@48 42 (d = new DoubleFFT_1D(n);
Chris@48 43 do arr:
Chris@48 44 v = complexToPacked arr;
Chris@48 45 d#realInverse(v, true);
Chris@213 46 vec.vector v;
Chris@41 47 done);
Chris@41 48
Chris@41 49 {
Chris@48 50 realForward,
Chris@48 51 realInverse,
Chris@41 52 }
Chris@41 53