@@ -13,10 +13,11 @@ struct FFTAPlan_cx{T,N} <: FFTAPlan{T,N}
13
13
end
14
14
15
15
struct FFTAPlan_re{T,N} <: FFTAPlan{T,N}
16
- callgraph:: NTuple{N, CallGraph{Complex{T} }}
16
+ callgraph:: NTuple{N, CallGraph{T }}
17
17
region:: Union{Int,AbstractVector{<:Int}}
18
18
dir:: Direction
19
19
pinv:: FFTAInvPlan{T}
20
+ flen:: Int
20
21
end
21
22
22
23
function AbstractFFTs. plan_fft (x:: AbstractArray{T} , region; kwargs... ):: FFTAPlan_cx{T} where {T <: Complex }
@@ -57,29 +58,30 @@ function AbstractFFTs.plan_rfft(x::AbstractArray{T}, region; kwargs...)::FFTAPla
57
58
if N == 1
58
59
g = CallGraph {Complex{T}} (size (x,region[]))
59
60
pinv = FFTAInvPlan {T,N} ()
60
- return FFTAPlan_re {T,N} ((g,), region, FFT_FORWARD, pinv)
61
+ return FFTAPlan_re {T,N} ((g,), region, FFT_FORWARD, pinv, size (x,region[]) )
61
62
else
62
63
sort! (region)
63
64
g1 = CallGraph {Complex{T}} (size (x,region[1 ]))
64
65
g2 = CallGraph {Complex{T}} (size (x,region[2 ]))
65
66
pinv = FFTAInvPlan {T,N} ()
66
- return FFTAPlan_re {T,N} ((g1,g2), region, FFT_FORWARD, pinv)
67
+ return FFTAPlan_re {T,N} ((g1,g2), region, FFT_FORWARD, pinv, size (x,region[ 1 ]) )
67
68
end
68
69
end
69
70
70
- function AbstractFFTs. plan_brfft (x:: AbstractArray{T} , len, region; kwargs... ):: FFTAPlan_cx {T} where {T}
71
+ function AbstractFFTs. plan_brfft (x:: AbstractArray{T} , len, region; kwargs... ):: FFTAPlan_re {T} where {T}
71
72
N = length (region)
73
+ @info " " x
72
74
@assert N <= 2 " Only supports vectors and matrices"
73
75
if N == 1
74
- g = CallGraph {Complex{T}} (size (x,region[]) )
76
+ g = CallGraph {Complex{T}} (len )
75
77
pinv = FFTAInvPlan {T,N} ()
76
- return FFTAPlan_cx {T,N} ((g,), region, FFT_BACKWARD, pinv)
78
+ return FFTAPlan_re {T,N} ((g,), region, FFT_BACKWARD, pinv, len )
77
79
else
78
80
sort! (region)
79
- g1 = CallGraph {Complex{T}} (size (x,region[ 1 ]) )
81
+ g1 = CallGraph {Complex{T}} (len )
80
82
g2 = CallGraph {Complex{T}} (size (x,region[2 ]))
81
83
pinv = FFTAInvPlan {T,N} ()
82
- return FFTAPlan_cx {T,N} ((g1,g2), region, FFT_BACKWARD, pinv)
84
+ return FFTAPlan_re {T,N} ((g1,g2), region, FFT_BACKWARD, pinv, len )
83
85
end
84
86
end
85
87
@@ -88,7 +90,7 @@ function AbstractFFTs.plan_bfft(p::FFTAPlan_cx{T,N}) where {T,N}
88
90
end
89
91
90
92
function AbstractFFTs. plan_brfft (p:: FFTAPlan_re{T,N} ) where {T,N}
91
- return FFTAPlan_cx {T,N} (p. callgraph, p. region, - p. dir, p. pinv)
93
+ return FFTAPlan_re {T,N} (p. callgraph, p. region, - p. dir, p. pinv, p . flen )
92
94
end
93
95
94
96
function LinearAlgebra. mul! (y:: AbstractVector{U} , p:: FFTAPlan{T,1} , x:: AbstractVector{T} ) where {T,U}
@@ -105,19 +107,29 @@ function LinearAlgebra.mul!(y::AbstractArray{U,N}, p::FFTAPlan{T,1}, x::Abstract
105
107
end
106
108
end
107
109
108
- function LinearAlgebra. mul! (y:: AbstractMatrix{U} , p:: FFTAPlan{T,1} , x:: AbstractMatrix{T} ) where {T,U}
109
- rows,cols = size (x)[p. region]
110
- y_tmp = similar (y)
111
- for k in 1 : cols
112
- @views fft! (y_tmp[:,k], x[:,k], 1 , 1 , p. dir, p. callgraph[2 ][1 ]. type, p. callgraph[2 ], 1 )
113
- end
114
-
115
- for k in 1 : rows
116
- @views fft! (y[k,:], y_tmp[k,:], 1 , 1 , p. dir, p. callgraph[1 ][1 ]. type, p. callgraph[1 ], 1 )
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
117
128
end
118
129
end
119
130
120
- function LinearAlgebra. mul! (y:: AbstractArray{U,N} , p:: FFTAPlan{T,2} , x:: AbstractArray{T,N} ) where {T,U,N}
131
+
132
+ function LinearAlgebra. mul! (y:: AbstractArray{U,N} , p:: FFTAPlan_re{T,2} , x:: AbstractArray{T,N} ) where {T,U,N}
121
133
R1 = CartesianIndices (size (x)[1 : p. region[1 ]- 1 ])
122
134
R2 = CartesianIndices (size (x)[p. region[1 ]+ 1 : p. region[2 ]- 1 ])
123
135
R3 = CartesianIndices (size (x)[p. region[2 ]+ 1 : end ])
@@ -153,10 +165,10 @@ end
153
165
function * (p:: FFTAPlan_re{T,1} , x:: AbstractVector{T} ) where {T<: Union{Real, Complex} }
154
166
y = similar (x, T <: Real ? Complex{T} : T)
155
167
LinearAlgebra. mul! (y, p, x)
156
- y
168
+ y[ 1 : end ÷ 2 + 1 ]
157
169
end
158
170
159
- function * (p:: FFTAPlan_re{T,N1 } , x:: AbstractArray{T,N2 } ) where {T<: Union{Real, Complex} , N1, N2 }
171
+ function * (p:: FFTAPlan_re{T,N } , x:: AbstractArray{T,2 } ) where {T<: Union{Real, Complex} , N }
160
172
y = similar (x, T <: Real ? Complex{T} : T)
161
173
LinearAlgebra. mul! (y, p, x)
162
174
y
0 commit comments