1 ! Copyright (c) 2012 John Benediktsson
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: arrays kernel locals math math.constants math.functions
4 math.vectors sequences sequences.extras sequences.private ;
5 IN: math.transforms.fft
9 :: (slow-fft) ( seq inverse? -- seq' )
11 inverse? 1 -1 ? 2pi * i* N / :> O
13 0 seq [ O k * * e^ * + ] each-index
17 :: (fft) ( seq inverse? -- seq' )
20 inverse? 1 -1 ? 2pi * i* N / :> O
23 seq even-indices inverse? (fft)
24 seq odd-indices inverse? (fft)
25 [ [ [ O * e^ * + inverse? [ 2 / ] when ] [ X set-nth-unsafe ] bi ] 2each-index ]
26 [ [ [ O * e^ * - inverse? [ 2 / ] when ] [ M + X set-nth-unsafe ] bi ] 2each-index ]
29 ] if ; inline recursive
33 ERROR: not-enough-data ;
37 f over length even? [ (fft) ] [ (slow-fft) ] if
40 : ifft ( seq -- seq' )
42 t over length even? [ (fft) ] [ (slow-fft) ] if
45 : correlate ( x y -- z )
46 [ fft ] [ reverse fft ] bi* v* ifft ;