Mercurial > hg > may
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 |