Mercurial > hg > may
annotate yetilab/transform/fft.yeti @ 288:16a9ee99efcf
Window overlap scale factor
author | Chris Cannam |
---|---|
date | Thu, 30 May 2013 20:27:54 +0100 |
parents | 197d23954a4e |
children | 4aa43959137d |
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@273 | 6 vec = load yetilab.vector; |
Chris@273 | 7 complex = load yetilab.complex; |
Chris@41 | 8 |
Chris@273 | 9 load yetilab.complex.type; |
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 |