changeset 449:ea95ee1cb3a6

Add complex-complex forward/inverse
author Chris Cannam
date Thu, 24 Oct 2013 11:12:07 +0100
parents 3a7b70ecfb70
children 048dcc02bdbe
files src/may/transform/fft.yeti src/may/transform/test/test_fft.yeti
diffstat 2 files changed, 33 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/may/transform/fft.yeti	Thu Oct 24 10:01:36 2013 +0100
+++ b/src/may/transform/fft.yeti	Thu Oct 24 11:12:07 2013 +0100
@@ -32,6 +32,34 @@
     v[1] := complex.real arr[n-1];
     v);
 
+unpackedToComplex len unp is number -> ~double[] -> array<cplx> =
+    array
+       (map2 complex.complex
+           (vec.list (vec.slice unp 0 len))
+           (vec.list (vec.slice unp len (len*2))));
+
+complexToUnpacked cc is array<cplx> -> ~double[] =
+    vec.primitive
+       (vec.fromList (map complex.real cc ++ map complex.imaginary cc));
+
+//!!! doc: n separately as below
+forward n =
+   (d = new DoubleFFT_1D(n);
+    do cc:
+        arr = complexToUnpacked cc;
+        d#complexForward(arr);
+        unpackedToComplex n arr;
+    done);
+
+//!!! doc: n separately as below
+inverse n =
+   (d = new DoubleFFT_1D(n);
+    do cc:
+        arr = complexToUnpacked cc;
+        d#complexInverse(arr, true);
+        unpackedToComplex n arr;
+    done);
+
 //!!! doc: n is supplied separately from the input vector to support partial evaluation
 //!!! doc: output has n/2+1 complex values
 //!!! doc: powers of two only? check with jtransforms
@@ -40,7 +68,7 @@
     do bl:
         v = vec.primitive (vec.resizedTo n bl);
         d#realForward(v);
-        packedToComplex (vec.length bl) v;
+        packedToComplex n v;
     done);
 
 //!!! doc: n separately as above
@@ -58,6 +86,8 @@
     done);
 
 {
+forward,
+inverse,
 realForward,
 realForwardMagnitude,
 realInverse,
--- a/src/may/transform/test/test_fft.yeti	Thu Oct 24 10:01:36 2013 +0100
+++ b/src/may/transform/test/test_fft.yeti	Thu Oct 24 11:12:07 2013 +0100
@@ -19,6 +19,8 @@
 
 [
 
+//!!! test complex forward/inverse
+
 "dc": \(
     testFFT [1,1,1,1] [4,0,0] [0,0,0];
 ),