@@ -33,25 +33,56 @@ function fft!(out::AbstractVector{T}, in::AbstractVector{U}, start_out::Int, sta
3333 N2 = right. sz
3434 s_in = root. s_in
3535 s_out = root. s_out
36+ tmp = g. workspace[idx]
37+
38+ _CompositeFFT_right_loop (tmp, in, N1, N2, start_in, s_in, d, g, right. type, right_idx)
39+ _CompositeFFT_left_loop (out, tmp, N2, start_out, s_out, d, g, left. type, left_idx)
40+ end
3641
42+ function _CompositeFFT_right_loop (
43+ tmp:: AbstractVector{T} ,
44+ in:: AbstractVector{T} ,
45+ N1:: Int ,
46+ N2:: Int ,
47+ start_in:: Int ,
48+ s_in:: Int ,
49+ d:: Direction ,
50+ g:: CallGraph ,
51+ type:: AbstractFFTType ,
52+ idx:: Int
53+ ) where T
54+
55+ N = N1 * N2
3756 w1 = convert (T, cispi (direction_sign (d)* 2 / N))
3857 wj1 = one (T)
39- tmp = g. workspace[idx]
4058 @inbounds for j1 in 0 : N1- 1
4159 wk2 = wj1
42- g (tmp, in, N2* j1+ 1 , start_in + j1* s_in, d, right . type, right_idx )
60+ g (tmp, in, N2* j1+ 1 , start_in + j1* s_in, d, type, idx )
4361 j1 > 0 && @inbounds for k2 in 1 : N2- 1
4462 tmp[N2* j1 + k2 + 1 ] *= wk2
4563 wk2 *= wj1
4664 end
4765 wj1 *= w1
4866 end
67+ end
4968
50- @inbounds for k2 in 0 : N2- 1
51- g (out, tmp, start_out + k2* s_out, k2+ 1 , d, left. type, left_idx)
69+ function _CompositeFFT_left_loop (
70+ out:: AbstractVector{T} ,
71+ tmp:: AbstractVector{T} ,
72+ N:: Int ,
73+ start_out:: Int ,
74+ s_out:: Int ,
75+ d:: Direction ,
76+ g:: CallGraph ,
77+ type:: AbstractFFTType ,
78+ idx:: Int
79+ ) where T
80+ @inbounds for k in 0 : N- 1
81+ g (out, tmp, start_out + k* s_out, k+ 1 , d, type, idx)
5282 end
5383end
5484
85+
5586"""
5687$(TYPEDSIGNATURES)
5788Discrete Fourier Transform, O(N^2) algorithm, in place.
0 commit comments