Chris@41: Chris@93: module yetilab.transform.fft; Chris@41: Chris@41: import edu.emory.mathcs.jtransforms.fft: DoubleFFT_1D; Chris@41: Chris@93: b = load yetilab.block.block; Chris@93: vec = load yetilab.block.fvector; Chris@93: complex = load yetilab.block.complex; Chris@41: Chris@48: packedToComplex p = Chris@46: (n = (vec.length p) / 2; Chris@46: array Chris@46: (map do i: Chris@46: re = if i == n then p[1] else p[i*2] fi; Chris@46: im = if i == 0 or i == n then 0 else p[i*2+1] fi; Chris@46: complex.complex re im; Chris@46: done [0..n])); Chris@41: Chris@48: complexToPacked arr = Chris@48: (n = length arr; Chris@48: v = vec.vector Chris@48: (map do i: Chris@48: ix = int (i/2); Chris@48: if i == ix*2 then Chris@48: complex.real arr[ix] Chris@48: else Chris@48: complex.imaginary arr[ix] Chris@48: fi; Chris@48: done [0..(n-1)*2-1]); Chris@48: v[1] := complex.real arr[n-1]; Chris@48: v); Chris@48: Chris@48: realForward n = Chris@41: (d = new DoubleFFT_1D(n); Chris@41: do bl: Chris@47: v = b.vector bl; Chris@41: d#realForward(v); Chris@48: packedToComplex v; Chris@48: done); Chris@48: Chris@48: realInverse n = Chris@48: (d = new DoubleFFT_1D(n); Chris@48: do arr: Chris@48: v = complexToPacked arr; Chris@48: d#realInverse(v, true); Chris@48: b.block v; Chris@41: done); Chris@41: Chris@41: { Chris@48: realForward, Chris@48: realInverse, Chris@41: } Chris@41: