math.transforms.fft: fix Cooley-Tukey only works for powers of two.
parent
6bf3470e62
commit
e260edc32b
|
@ -6,6 +6,8 @@ IN: math.transforms.fft
|
||||||
|
|
||||||
<PRIVATE
|
<PRIVATE
|
||||||
|
|
||||||
|
DEFER: (fft)
|
||||||
|
|
||||||
! Discrete Fourier Transform
|
! Discrete Fourier Transform
|
||||||
:: (slow-fft) ( seq inverse? -- seq' )
|
:: (slow-fft) ( seq inverse? -- seq' )
|
||||||
seq length :> N
|
seq length :> N
|
||||||
|
@ -16,7 +18,7 @@ IN: math.transforms.fft
|
||||||
] map ; inline
|
] map ; inline
|
||||||
|
|
||||||
! Cooley–Tukey Algorithm
|
! Cooley–Tukey Algorithm
|
||||||
:: (fft) ( seq inverse? -- seq' )
|
:: (fast-fft) ( seq inverse? -- seq' )
|
||||||
seq length :> N
|
seq length :> N
|
||||||
N 1 = [ seq ] [
|
N 1 = [ seq ] [
|
||||||
seq even-indices inverse? (fft)
|
seq even-indices inverse? (fft)
|
||||||
|
@ -28,19 +30,19 @@ IN: math.transforms.fft
|
||||||
2bi append
|
2bi append
|
||||||
] if ; inline recursive
|
] if ; inline recursive
|
||||||
|
|
||||||
|
: (fft) ( seq inverse? -- seq' )
|
||||||
|
over length power-of-2?
|
||||||
|
[ (fast-fft) ] [ (slow-fft) ] if ; inline recursive
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
ERROR: not-enough-data ;
|
ERROR: not-enough-data ;
|
||||||
|
|
||||||
: fft ( seq -- seq' )
|
: fft ( seq -- seq' )
|
||||||
[ not-enough-data ] [
|
[ not-enough-data ] [ f (fft) ] if-empty ;
|
||||||
f over length even? [ (fft) ] [ (slow-fft) ] if
|
|
||||||
] if-empty ;
|
|
||||||
|
|
||||||
: ifft ( seq -- seq' )
|
: ifft ( seq -- seq' )
|
||||||
[ not-enough-data ] [
|
[ not-enough-data ] [ t (fft) ] if-empty ;
|
||||||
t over length even? [ (fft) ] [ (slow-fft) ] if
|
|
||||||
] if-empty ;
|
|
||||||
|
|
||||||
: correlate ( x y -- z )
|
: correlate ( x y -- z )
|
||||||
[ fft ] [ reverse fft ] bi* v* ifft ;
|
[ fft ] [ reverse fft ] bi* v* ifft ;
|
||||||
|
|
Loading…
Reference in New Issue