@@ -26,17 +26,17 @@ function fft!(out::AbstractVector{T}, in::AbstractVector{U}, ::Val{FFT_FORWARD},
26
26
w1 = convert (T, cispi (- 2 / N))
27
27
wj1 = one (T)
28
28
tmp = g. workspace[idx]
29
- for j1 in 1 : N1
29
+ @inbounds for j1 in 1 : N1
30
30
wk2 = wj1;
31
31
@views g (tmp[(N2* (j1- 1 ) + 1 ): (N2* j1)], in[j1: N1: end ], Val (FFT_FORWARD), right. type, idx + g[idx]. right)
32
- j1 > 1 && for k2 in 2 : N2
32
+ j1 > 1 && @inbounds for k2 in 2 : N2
33
33
tmp[N2* (j1- 1 ) + k2] *= wk2
34
34
wk2 *= wj1
35
35
end
36
36
wj1 *= w1
37
37
end
38
38
39
- for k2 in 1 : N2
39
+ @inbounds for k2 in 1 : N2
40
40
@views g (out[k2: N2: end ], tmp[k2: N2: end ], Val (FFT_FORWARD), left. type, idx + g[idx]. left)
41
41
end
42
42
end
@@ -51,17 +51,17 @@ function fft!(out::AbstractVector{T}, in::AbstractVector{U}, ::Val{FFT_BACKWARD}
51
51
w1 = convert (T, cispi (2 / N))
52
52
wj1 = one (T)
53
53
tmp = g. workspace[idx]
54
- for j1 in 2 : N1
54
+ @inbounds for j1 in 2 : N1
55
55
Complex< F,L> wk2 = wj1;
56
56
@views g (tmp[j1: N1: end ], in[N2* j1: N2* (j1- 1 )- 1 ], Val (FFT_BACKWARD), right. type, idx + g[idx]. right)
57
- for k2 in 2 : N2
57
+ @inbounds for k2 in 2 : N2
58
58
tmp[j1* N2+ k2] *= wk2
59
59
wk2 *= wj1
60
60
end
61
61
wj1 *= w1
62
62
end
63
63
64
- for k2 in 1 : N2
64
+ @inbounds for k2 in 1 : N2
65
65
@views g (out[k2: N2: end ], tmp[k2: N2: end ], Val (FFT_BACKWARD), left. type, idx + g[idx]. left)
66
66
end
67
67
end
@@ -80,8 +80,9 @@ Power of 2 FFT in place, forward
80
80
"""
81
81
function fft_pow2! (out:: AbstractVector{T} , in:: AbstractVector{T} , :: Val{FFT_FORWARD} ) where {T}
82
82
N = length (out)
83
- if N == 1
84
- out[1 ] = in[1 ]
83
+ if N == 2
84
+ out[1 ] = in[1 ] + in[2 ]
85
+ out[2 ] = in[1 ] - in[2 ]
85
86
return
86
87
end
87
88
fft_pow2! (@view (out[1 : (end ÷ 2 )]), @view (in[1 : 2 : end ]), Val (FFT_FORWARD))
@@ -90,7 +91,7 @@ function fft_pow2!(out::AbstractVector{T}, in::AbstractVector{T}, ::Val{FFT_FORW
90
91
w1 = convert (T, cispi (- 2 / N))
91
92
wj = one (T)
92
93
m = N ÷ 2
93
- for j in 1 : m
94
+ @inbounds for j in 1 : m
94
95
out_j = out[j]
95
96
out[j] = out_j + wj* out[j+ m]
96
97
out[j+ m] = out_j - wj* out[j+ m]
@@ -104,8 +105,9 @@ Power of 2 FFT in place, backward
104
105
"""
105
106
function fft_pow2! (out:: AbstractVector{T} , in:: AbstractVector{T} , :: Val{FFT_BACKWARD} ) where {T}
106
107
N = length (out)
107
- if N == 1
108
- out[1 ] = in[1 ]
108
+ if N == 2
109
+ out[1 ] = in[1 ] + in[2 ]
110
+ out[2 ] = in[1 ] - in[2 ]
109
111
return
110
112
end
111
113
fft_pow2! (@view (out[1 : (end ÷ 2 )]), @view (in[1 : 2 : end ]), Val (FFT_BACKWARD))
@@ -114,7 +116,7 @@ function fft_pow2!(out::AbstractVector{T}, in::AbstractVector{T}, ::Val{FFT_BACK
114
116
w1 = convert (T, cispi (2 / N))
115
117
wj = one (T)
116
118
m = N ÷ 2
117
- for j in 1 : m
119
+ @inbounds for j in 1 : m
118
120
out_j = out[j]
119
121
out[j] = out_j + wj* out[j+ m]
120
122
out[j+ m] = out_j - wj* out[j+ m]
@@ -128,8 +130,9 @@ Power of 2 FFT in place, forward
128
130
"""
129
131
function fft_pow2! (out:: AbstractVector{Complex{T}} , in:: AbstractVector{T} , :: Val{FFT_FORWARD} ) where {T<: Real }
130
132
N = length (out)
131
- if N == 1
132
- out[1 ] = in[1 ]
133
+ if N == 2
134
+ out[1 ] = in[1 ] + in[2 ]
135
+ out[2 ] = in[1 ] - in[2 ]
133
136
return
134
137
end
135
138
fft_pow2! (@view (out[1 : (end ÷ 2 )]), @view (in[1 : 2 : end ]), Val (FFT_FORWARD))
@@ -138,11 +141,11 @@ function fft_pow2!(out::AbstractVector{Complex{T}}, in::AbstractVector{T}, ::Val
138
141
w1 = convert (Complex{T}, cispi (- 2 / N))
139
142
wj = one (Complex{T})
140
143
m = N ÷ 2
141
- @turbo for j in 2 : m
144
+ @inbounds @ turbo for j in 2 : m
142
145
out[j] = out[j] + wj* out[j+ m]
143
146
wj *= w1
144
147
end
145
- @turbo for j in 2 : m
148
+ @inbounds @ turbo for j in 2 : m
146
149
out[m+ j] = conj (out[m- j+ 2 ])
147
150
end
148
151
end
@@ -153,8 +156,9 @@ Power of 2 FFT in place, backward
153
156
"""
154
157
function fft_pow2! (out:: AbstractVector{Complex{T}} , in:: AbstractVector{T} , :: Val{FFT_BACKWARD} ) where {T<: Real }
155
158
N = length (out)
156
- if N == 1
157
- out[1 ] = in[1 ]
159
+ if N == 2
160
+ out[1 ] = in[1 ] + in[2 ]
161
+ out[2 ] = in[1 ] - in[2 ]
158
162
return
159
163
end
160
164
fft_pow2! (@view (out[1 : (end ÷ 2 )]), @view (in[1 : 2 : end ]), Val (FFT_BACKWARD))
@@ -163,7 +167,7 @@ function fft_pow2!(out::AbstractVector{Complex{T}}, in::AbstractVector{T}, ::Val
163
167
w1 = convert (Complex{T}, cispi (2 / N))
164
168
wj = one (Complex{T})
165
169
m = N ÷ 2
166
- @turbo for j in 2 : m
170
+ @inbounds @ turbo for j in 2 : m
167
171
out[j] = out[j] + wj* out[j+ m]
168
172
out[m+ j] = conj (out[m- i+ 2 ])
169
173
wj *= w1
@@ -175,15 +179,15 @@ function fft_dft!(out::AbstractVector{T}, in::AbstractVector{T}, ::Val{FFT_FORWA
175
179
wn² = wn = w = convert (T, cispi (- 2 / N))
176
180
wn_1 = one (T)
177
181
178
- tmp = in[1 ];
179
- out .= tmp;
182
+ tmp = in[1 ]
183
+ out .= tmp
180
184
tmp = sum (in)
181
- out[1 ] = tmp;
185
+ out[1 ] = tmp
182
186
183
- wk = wn²;
184
- for d in 2 : N
187
+ wk = wn²
188
+ @inbounds for d in 2 : N
185
189
out[d] = in[d]* wk + out[d]
186
- for k in (d+ 1 ): N
190
+ @inbounds for k in (d+ 1 ): N
187
191
wk *= wn
188
192
out[d] = in[k]* wk + out[d]
189
193
out[k] = in[d]* wk + out[k]
@@ -205,10 +209,10 @@ function fft_dft!(out::AbstractVector{T}, in::AbstractVector{T}, ::Val{FFT_BACKW
205
209
tmp = sum (in)
206
210
out[1 ] = tmp
207
211
208
- wk = wn²;
209
- for d in 2 : N
212
+ wk = wn²
213
+ @inbounds @turbo for d in 2 : N
210
214
out[d] = in[d]* wk + out[d]
211
- for k in (d+ 1 ): N
215
+ @inbounds for k in (d+ 1 ): N
212
216
wk *= wn
213
217
out[d] = in[k]* wk + out[d]
214
218
out[k] = in[d]* wk + out[k]
@@ -229,17 +233,17 @@ function fft_dft!(out::AbstractVector{Complex{T}}, in::AbstractVector{T}, ::Val{
229
233
out[1 ] = sum (in)
230
234
iseven (N) && (out[halfN+ 1 ] = alternatingSum (in))
231
235
232
- for d in 2 : halfN+ 1
236
+ @inbounds @turbo for d in 2 : halfN+ 1
233
237
tmp = in[1 ]
234
- for k in 2 : N
238
+ @inbounds for k in 2 : N
235
239
tmp += wkn* in[k]
236
240
wkn *= wk
237
241
end
238
242
out[d] = tmp
239
243
wk *= w
240
244
wkn = wk
241
245
end
242
- @turbo for i in 0 : halfN- 1
246
+ @inbounds @ turbo for i in 0 : halfN- 1
243
247
out[N- i] = conj (out[halfN- i])
244
248
end
245
249
end
@@ -254,10 +258,10 @@ function fft_dft!(out::AbstractVector{Complex{T}}, in::AbstractVector{T}, ::Val{
254
258
out[1 ] = sum (in)
255
259
iseven (N) && (out[halfN+ 1 ] = alternatingSum (in))
256
260
257
- wk = wn²;
258
- for d in 2 : halfN
261
+ wk = wn²
262
+ @inbounds @turbo for d in 2 : halfN
259
263
out[d] = in[d]* wk + out[d]
260
- for k in (d+ 1 ): halfN
264
+ @inbounds for k in (d+ 1 ): halfN
261
265
wk *= wn
262
266
out[d] = in[k]* wk + out[d]
263
267
out[k] = in[d]* wk + out[k]
0 commit comments