# HG changeset patch # User Chris Cannam # Date 1382609527 -3600 # Node ID ea95ee1cb3a635d963771bd50f4066c01960cae6 # Parent 3a7b70ecfb706ebadce4764c858a756394f29f66 Add complex-complex forward/inverse diff -r 3a7b70ecfb70 -r ea95ee1cb3a6 src/may/transform/fft.yeti --- 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 = + array + (map2 complex.complex + (vec.list (vec.slice unp 0 len)) + (vec.list (vec.slice unp len (len*2)))); + +complexToUnpacked cc is array -> ~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, diff -r 3a7b70ecfb70 -r ea95ee1cb3a6 src/may/transform/test/test_fft.yeti --- 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]; ),