@@ -52,34 +52,33 @@ function AbstractFFTs.plan_bfft(x::AbstractArray{T}, region; kwargs...)::FFTAPla
52
52
end
53
53
end
54
54
55
- function AbstractFFTs. plan_rfft (x:: AbstractArray{T} , region; kwargs... ):: FFTAPlan_re{T } where {T <: Real }
55
+ function AbstractFFTs. plan_rfft (x:: AbstractArray{T} , region; kwargs... ):: FFTAPlan_re{Complex{T} } where {T <: Real }
56
56
N = length (region)
57
57
@assert N <= 2 " Only supports vectors and matrices"
58
58
if N == 1
59
59
g = CallGraph {Complex{T}} (size (x,region[]))
60
- pinv = FFTAInvPlan {T ,N} ()
61
- return FFTAPlan_re {T ,N} ((g, ), region, FFT_FORWARD, pinv, size (x,region[]))
60
+ pinv = FFTAInvPlan {Complex{T} ,N} ()
61
+ return FFTAPlan_re {Complex{T} ,N} (tuple (g ), region, FFT_FORWARD, pinv, size (x,region[]))
62
62
else
63
63
sort! (region)
64
64
g1 = CallGraph {Complex{T}} (size (x,region[1 ]))
65
65
g2 = CallGraph {Complex{T}} (size (x,region[2 ]))
66
- pinv = FFTAInvPlan {T ,N} ()
67
- return FFTAPlan_re {T ,N} ((g1,g2), region, FFT_FORWARD, pinv, size (x,region[1 ]))
66
+ pinv = FFTAInvPlan {Complex{T} ,N} ()
67
+ return FFTAPlan_re {Complex{T} ,N} (tuple (g1,g2), region, FFT_FORWARD, pinv, size (x,region[1 ]))
68
68
end
69
69
end
70
70
71
71
function AbstractFFTs. plan_brfft (x:: AbstractArray{T} , len, region; kwargs... ):: FFTAPlan_re{T} where {T}
72
72
N = length (region)
73
- @info " " x
74
73
@assert N <= 2 " Only supports vectors and matrices"
75
74
if N == 1
76
- g = CallGraph {Complex{T} } (len)
75
+ g = CallGraph {T } (len)
77
76
pinv = FFTAInvPlan {T,N} ()
78
77
return FFTAPlan_re {T,N} ((g,), region, FFT_BACKWARD, pinv, len)
79
78
else
80
79
sort! (region)
81
- g1 = CallGraph {Complex{T} } (len)
82
- g2 = CallGraph {Complex{T} } (size (x,region[2 ]))
80
+ g1 = CallGraph {T } (len)
81
+ g2 = CallGraph {T } (size (x,region[2 ]))
83
82
pinv = FFTAInvPlan {T,N} ()
84
83
return FFTAPlan_re {T,N} ((g1,g2), region, FFT_BACKWARD, pinv, len)
85
84
end
@@ -107,37 +106,15 @@ function LinearAlgebra.mul!(y::AbstractArray{U,N}, p::FFTAPlan{T,1}, x::Abstract
107
106
end
108
107
end
109
108
110
- function LinearAlgebra. mul! (y:: AbstractArray{U,N} , p:: FFTAPlan_cx{T,2} , x:: AbstractArray{T,N} ) where {T,U,N}
111
- R1 = CartesianIndices (size (x)[1 : p. region[1 ]- 1 ])
112
- R2 = CartesianIndices (size (x)[p. region[1 ]+ 1 : p. region[2 ]- 1 ])
113
- R3 = CartesianIndices (size (x)[p. region[2 ]+ 1 : end ])
114
- y_tmp = similar (y, axes (y)[p. region])
115
- for I1 in R1
116
- for I2 in R2
117
- for I3 in R3
118
- rows,cols = size (x)[p. region]
119
- for k in 1 : cols
120
- @views fft! (y_tmp[:,k], x[I1,:,I2,k,I3], 1 , 1 , p. dir, p. callgraph[2 ][1 ]. type, p. callgraph[2 ], 1 )
121
- end
122
-
123
- for k in 1 : rows
124
- @views fft! (y[I1,k,I2,:,I3], y_tmp[k,:], 1 , 1 , p. dir, p. callgraph[1 ][1 ]. type, p. callgraph[1 ], 1 )
125
- end
126
- end
127
- end
128
- end
129
- end
130
-
131
-
132
- function LinearAlgebra. mul! (y:: AbstractArray{U,N} , p:: FFTAPlan_re{T,2} , x:: AbstractArray{T,N} ) where {T,U,N}
109
+ function LinearAlgebra. mul! (y:: AbstractArray{U,N} , p:: FFTAPlan{T,2} , x:: AbstractArray{T,N} ) where {T,U,N}
133
110
R1 = CartesianIndices (size (x)[1 : p. region[1 ]- 1 ])
134
111
R2 = CartesianIndices (size (x)[p. region[1 ]+ 1 : p. region[2 ]- 1 ])
135
112
R3 = CartesianIndices (size (x)[p. region[2 ]+ 1 : end ])
136
113
y_tmp = similar (y, axes (y)[p. region])
114
+ rows,cols = size (x)[p. region]
137
115
for I1 in R1
138
116
for I2 in R2
139
117
for I3 in R3
140
- rows,cols = size (x)[p. region]
141
118
for k in 1 : cols
142
119
@views fft! (y_tmp[:,k], x[I1,:,I2,k,I3], 1 , 1 , p. dir, p. callgraph[2 ][1 ]. type, p. callgraph[2 ], 1 )
143
120
end
@@ -163,9 +140,18 @@ function *(p::FFTAPlan{T,N1}, x::AbstractArray{T,N2}) where {T<:Union{Real, Comp
163
140
end
164
141
165
142
function * (p:: FFTAPlan_re{T,1} , x:: AbstractVector{T} ) where {T<: Union{Real, Complex} }
166
- y = similar (x, T <: Real ? Complex{T} : T)
167
- LinearAlgebra. mul! (y, p, x)
168
- y[1 : end ÷ 2 + 1 ]
143
+ if p. dir == FFT_FORWARD
144
+ y = similar (x, T <: Real ? Complex{T} : T)
145
+ LinearAlgebra. mul! (y, p, x)
146
+ return y[1 : end ÷ 2 + 1 ]
147
+ else
148
+ x_tmp = similar (x, p. flen)
149
+ x_tmp[1 : end ÷ 2 + 1 ] .= x
150
+ x_tmp[end ÷ 2 + 2 : end ] .= iseven (p. flen) ? conj .(x[end - 1 : - 1 : 2 ]) : conj .(x[end : - 1 : 2 ])
151
+ y = similar (x_tmp)
152
+ LinearAlgebra. mul! (y, p, x_tmp)
153
+ return y
154
+ end
169
155
end
170
156
171
157
function * (p:: FFTAPlan_re{T,N} , x:: AbstractArray{T,2} ) where {T<: Union{Real, Complex} , N}
0 commit comments