@@ -9,7 +9,7 @@ const ComplexFloats = Complex{T} where T<:AbstractFloat
9
9
# To add more types, add them in the union of the function's signature.
10
10
11
11
function generic_fft (x:: Vector{T} ) where T<: AbstractFloats
12
- T <: FFTW.fftwNumber && (@warn (" Using generic fft for FFTW number type." ))
12
+ T <: FFTW.fftwNumber && (@warn (" Using generic fft for FFTW number type." ))
13
13
n = length (x)
14
14
ispow2 (n) && return generic_fft_pow2 (x)
15
15
ks = range (zero (real (T)),stop= n- one (real (T)),length= n)
37
37
38
38
generic_bfft (x:: Vector{T} ) where {T <: AbstractFloats } = conj! (generic_fft (conj (x)))
39
39
function generic_bfft! (x:: Vector{T} ) where {T <: AbstractFloats }
40
- x[:] = generic_bfft (x)
41
- return x
40
+ x[:] = generic_bfft (x)
41
+ return x
42
42
end
43
43
44
44
generic_brfft (v:: Vector , n:: Integer ) = generic_irfft (v, n)* n
@@ -113,9 +113,9 @@ function generic_ifft_pow2(x::Vector{Complex{T}}) where T<:AbstractFloat
113
113
end
114
114
115
115
function generic_dct (a:: AbstractVector{Complex{T}} ) where {T <: AbstractFloat }
116
- T <: FFTW.fftwNumber && (@warn (" Using generic dct for FFTW number type." ))
117
- N = length (a)
118
- twoN = convert (T,2 ) * N
116
+ T <: FFTW.fftwNumber && (@warn (" Using generic dct for FFTW number type." ))
117
+ N = length (a)
118
+ twoN = convert (T,2 ) * N
119
119
c = generic_fft ([a; reverse (a, dims= 1 )]) # c = generic_fft([a; flipdim(a,1)])
120
120
d = c[1 : N]
121
121
d .*= exp .((- im* convert (T, pi )). * (0 : N- 1 ). / twoN)
126
126
generic_dct (a:: AbstractArray{T} ) where {T <: AbstractFloat } = real (generic_dct (complex (a)))
127
127
128
128
function generic_idct (a:: AbstractVector{Complex{T}} ) where {T <: AbstractFloat }
129
- T <: FFTW.fftwNumber && (@warn (" Using generic idct for FFTW number type." ))
130
- N = length (a)
131
- twoN = convert (T,2 )* N
129
+ T <: FFTW.fftwNumber && (@warn (" Using generic idct for FFTW number type." ))
130
+ N = length (a)
131
+ twoN = convert (T,2 )* N
132
132
b = a * sqrt (twoN)
133
133
b[1 ] = b[1 ] * sqrt (convert (T,2 ))
134
134
shift = exp .(- im * 2 * convert (T, pi ) * (N - convert (T,1 )/ 2 ) * (0 : (2 N- 1 )) / twoN)
@@ -154,32 +154,37 @@ end
154
154
155
155
# dummy plans
156
156
abstract type DummyPlan{T} <: Plan{T} end
157
- struct DummyFFTPlan{T,inplace} <: DummyPlan{T} end
158
- struct DummyiFFTPlan{T,inplace} <: DummyPlan{T} end
159
- struct DummybFFTPlan{T,inplace} <: DummyPlan{T} end
160
- struct DummyDCTPlan{T,inplace} <: DummyPlan{T} end
161
- struct DummyiDCTPlan{T,inplace} <: DummyPlan{T} end
162
- struct DummyrFFTPlan{T,inplace} <: DummyPlan{T}
163
- n:: Integer
164
- end
165
- struct DummyirFFTPlan{T,inplace} <: DummyPlan{T}
166
- n:: Integer
157
+ for P in (:DummyFFTPlan , :DummyiFFTPlan , :DummybFFTPlan , :DummyDCTPlan , :DummyiDCTPlan )
158
+ # All plans need an initially undefined pinv field
159
+ @eval begin
160
+ mutable struct $ P{T,inplace} <: DummyPlan{T}
161
+ pinv:: DummyPlan{T}
162
+ $ P {T,inplace} () where {T<: AbstractFloats , inplace} = new ()
163
+ end
164
+ end
167
165
end
168
- struct DummybrFFTPlan{T,inplace} <: DummyPlan{T}
169
- n:: Integer
166
+ for P in (:DummyrFFTPlan , :DummyirFFTPlan , :DummybrFFTPlan )
167
+ @eval begin
168
+ mutable struct $ P{T,inplace} <: DummyPlan{T}
169
+ n:: Integer
170
+ pinv:: DummyPlan{T}
171
+ $ P {T,inplace} (n:: Integer ) where {T<: AbstractFloats , inplace} = new (n)
172
+ end
173
+ end
170
174
end
171
175
172
176
for (Plan,iPlan) in ((:DummyFFTPlan ,:DummyiFFTPlan ),
173
177
(:DummyDCTPlan ,:DummyiDCTPlan ))
174
178
@eval begin
175
- Base . inv (:: $Plan{T,inplace} ) where {T,inplace} = $ iPlan {T,inplace} ()
176
- Base . inv (:: $iPlan{T,inplace} ) where {T,inplace} = $ Plan {T,inplace} ()
179
+ plan_inv (:: $Plan{T,inplace} ) where {T,inplace} = $ iPlan {T,inplace} ()
180
+ plan_inv (:: $iPlan{T,inplace} ) where {T,inplace} = $ Plan {T,inplace} ()
177
181
end
178
182
end
179
183
180
184
# Specific for rfft, irfft and brfft:
181
- Base. inv (:: DummyirFFTPlan{T,inplace} ) where {T,inplace} = DummyrFFTPlan {T,Inplace} (p. n)
182
- Base. inv (:: DummyrFFTPlan{T,inplace} ) where {T,inplace} = DummyirFFTPlan {T,Inplace} (p. n)
185
+ plan_inv (p:: DummyirFFTPlan{T,inplace} ) where {T,inplace} = DummyrFFTPlan {T,Inplace} (p. n)
186
+ plan_inv (p:: DummyrFFTPlan{T,inplace} ) where {T,inplace} = DummyirFFTPlan {T,Inplace} (p. n)
187
+
183
188
184
189
185
190
for (Plan,ff,ff!) in ((:DummyFFTPlan ,:generic_fft ,:generic_fft! ),
@@ -202,14 +207,14 @@ end
202
207
* (p:: DummyirFFTPlan{T,true} , x:: StridedArray{T,N} ) where {T<: AbstractFloats ,N} = generic_irfft! (x, p. n)
203
208
* (p:: DummyirFFTPlan{T,false} , x:: StridedArray{T,N} ) where {T<: AbstractFloats ,N} = generic_irfft (x, p. n)
204
209
function mul! (C:: StridedVector , p:: DummyirFFTPlan , x:: StridedVector )
205
- C[:] = generic_irfft (x, p. n)
206
- C
210
+ C[:] = generic_irfft (x, p. n)
211
+ C
207
212
end
208
213
* (p:: DummybrFFTPlan{T,true} , x:: StridedArray{T,N} ) where {T<: AbstractFloats ,N} = generic_brfft! (x, p. n)
209
214
* (p:: DummybrFFTPlan{T,false} , x:: StridedArray{T,N} ) where {T<: AbstractFloats ,N} = generic_brfft (x, p. n)
210
215
function mul! (C:: StridedVector , p:: DummybrFFTPlan , x:: StridedVector )
211
- C[:] = generic_brfft (x, p. n)
212
- C
216
+ C[:] = generic_brfft (x, p. n)
217
+ C
213
218
end
214
219
215
220
0 commit comments