Mercurial > hg > may
annotate yetilab/transform/fft.yeti @ 271:c206de7c3018
Faster sparseProductLeft. Similar code would work for other sparseProducts
author | Chris Cannam |
---|---|
date | Thu, 23 May 2013 16:12:21 +0100 |
parents | d7dd391a90fd |
children | 197d23954a4e |
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@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 |