]> gitweb.factorcode.org Git - factor.git/commitdiff
math.transforms.fft: fix Cooley-Tukey only works for powers of two.
authorJohn Benediktsson <mrjbq7@gmail.com>
Wed, 4 Jun 2014 19:06:45 +0000 (12:06 -0700)
committerJohn Benediktsson <mrjbq7@gmail.com>
Wed, 4 Jun 2014 19:06:45 +0000 (12:06 -0700)
extra/math/transforms/fft/fft.factor

index 5c6ba88f07ba9b3860213f14927784e7f464cb89..14ee7381383374e8b27a2b7b39a9993b838cafcc 100644 (file)
@@ -6,6 +6,8 @@ IN: math.transforms.fft
 
 <PRIVATE
 
+DEFER: (fft)
+
 ! Discrete Fourier Transform
 :: (slow-fft) ( seq inverse? -- seq' )
     seq length :> N
@@ -16,7 +18,7 @@ IN: math.transforms.fft
     ] map ; inline
 
 ! Cooley–Tukey Algorithm
-:: (fft) ( seq inverse? -- seq' )
+:: (fast-fft) ( seq inverse? -- seq' )
     seq length :> N
     N 1 = [ seq ] [
         seq even-indices inverse? (fft)
@@ -28,19 +30,19 @@ IN: math.transforms.fft
         2bi append
     ] if ; inline recursive
 
+: (fft) ( seq inverse? -- seq' )
+    over length power-of-2?
+    [ (fast-fft) ] [ (slow-fft) ] if ; inline recursive
+
 PRIVATE>
 
 ERROR: not-enough-data ;
 
 : fft ( seq -- seq' )
-    [ not-enough-data ] [
-        f over length even? [ (fft) ] [ (slow-fft) ] if
-    ] if-empty ;
+    [ not-enough-data ] [ f (fft) ] if-empty ;
 
 : ifft ( seq -- seq' )
-    [ not-enough-data ] [
-        t over length even? [ (fft) ] [ (slow-fft) ] if
-    ] if-empty ;
+    [ not-enough-data ] [ t (fft) ] if-empty ;
 
 : correlate ( x y -- z )
     [ fft ] [ reverse fft ] bi* v* ifft ;