@@ -37,6 +37,14 @@ struct ShuffledR2HC{T,Pl<:Plan} <: AbstractShuffledPlan{T}
37
37
plan:: Pl
38
38
end
39
39
40
+ """
41
+ Gives a shuffled version of the real IFFT, with order
42
+ 1,sin(θ),cos(θ),sin(2θ)…
43
+ """
44
+ struct ShuffledIR2HC{T,Pl<: Plan } <: AbstractShuffledPlan{T}
45
+ plan:: Pl
46
+ end
47
+
40
48
"""
41
49
Gives a shuffled version of the FFT, with order
42
50
1,sin(θ),cos(θ),sin(2θ)…
@@ -45,6 +53,14 @@ struct ShuffledFFT{T,Pl<:Plan} <: AbstractShuffledPlan{T}
45
53
plan:: Pl
46
54
end
47
55
56
+ """
57
+ Gives a shuffled version of the IFFT, with order
58
+ 1,sin(θ),cos(θ),sin(2θ)…
59
+ """
60
+ struct ShuffledIFFT{T,Pl<: Plan } <: AbstractShuffledPlan{T}
61
+ plan:: Pl
62
+ end
63
+
48
64
size (F:: AbstractShuffledPlan , k) = size (F. plan,k)
49
65
size (F:: AbstractShuffledPlan ) = size (F. plan)
50
66
@@ -54,84 +70,70 @@ ShuffledR2HC{T}(n, d...) where T = ShuffledR2HC{T}(FFTW.plan_r2r(Array{T}(undef,
54
70
ShuffledFFT {T} (p:: Pl ) where {T,Pl<: Plan } = ShuffledFFT {T,Pl} (p)
55
71
ShuffledFFT {T} (n, d... ) where T = ShuffledFFT {T} (FFTW. plan_fft (Array {T} (undef, n), d... ))
56
72
73
+ ShuffledIFFT {T} (p:: Pl ) where {T,Pl<: Plan } = ShuffledIFFT {T,Pl} (p)
74
+ ShuffledIR2HC {T} (p:: Pl ) where {T,Pl<: Plan } = ShuffledIR2HC {T,Pl} (p)
57
75
58
- function _shuffledR2HC_postscale! (_, ret:: AbstractVector{T} ) where T
76
+ inv (P:: ShuffledR2HC{T} ) where T = ShuffledIR2HC {T} (inv (P. plan))
77
+ inv (P:: ShuffledFFT{T} ) where T = ShuffledIFFT {T} (inv (P. plan))
78
+
79
+
80
+ _shuffled_prescale! (_, ret:: AbstractVector ) = ret
81
+ _shuffled_postscale! (_, ret:: AbstractVector ) = ret
82
+
83
+ function _shuffled_postscale! (:: ShuffledR2HC , ret:: AbstractVector{T} ) where T
59
84
n = length (ret)
60
85
lmul! (convert (T,2 )/ n, ret)
61
86
ret[1 ] /= 2
62
87
iseven (n) && (ret[n÷ 2 + 1 ] /= 2 )
63
88
negateeven! (reverseeven! (interlace! (ret,1 )))
64
89
end
65
90
66
- function _shuffledR2HC_postscale! (d:: Number , ret:: AbstractMatrix{T} ) where T
67
- if isone (d)
68
- n = size (ret,1 )
69
- lmul! (convert (T,2 )/ n, ret)
70
- ldiv! (2 , view (ret,1 ,:))
71
- iseven (n) && ldiv! (2 , view (ret,n÷ 2 + 1 ,:))
72
- for j in axes (ret,2 )
73
- negateeven! (reverseeven! (interlace! (view (ret,:,j),1 )))
74
- end
75
- else
76
- n = size (ret,2 )
77
- lmul! (convert (T,2 )/ n, ret)
78
- ldiv! (2 , view (ret,:,1 ))
79
- iseven (n) && ldiv! (2 , view (ret,:,n÷ 2 + 1 ))
80
- for k in axes (ret,1 )
81
- negateeven! (reverseeven! (interlace! (view (ret,k,:),1 )))
82
- end
83
- end
84
- ret
91
+ function _shuffled_prescale! (:: ShuffledIR2HC , ret:: AbstractVector{T} ) where T
92
+ n = length (ret)
93
+ reverseeven! (negateeven! (ret))
94
+ ret .= [ret[1 : 2 : end ]; ret[2 : 2 : end ]] # todo: non-allocating
95
+ iseven (n) && (ret[n÷ 2 + 1 ] *= 2 )
96
+ ret[1 ] *= 2
97
+ lmul! (convert (T,n)/ 2 , ret)
85
98
end
86
99
87
- function _shuffledFFT_postscale! (_ , ret:: AbstractVector{T} ) where T
100
+ function _shuffled_postscale! ( :: ShuffledFFT , ret:: AbstractVector{T} ) where T
88
101
n = length (ret)
89
102
cfs = lmul! (inv (convert (T,n)), ret)
90
103
reverseeven! (interlace! (cfs,1 ))
91
104
end
92
105
93
- function _shuffledFFT_postscale! (d:: Number , ret:: AbstractMatrix{T} ) where T
94
- if isone (d)
95
- n = size (ret,1 )
96
- lmul! (inv (convert (T,n)), ret)
97
- for j in axes (ret,2 )
98
- reverseeven! (interlace! (view (ret,:,j),1 ))
99
- end
100
- else
101
- n = size (ret,2 )
102
- lmul! (inv (convert (T,n)), ret)
103
- for k in axes (ret,1 )
104
- reverseeven! (interlace! (view (ret,k,:),1 ))
106
+ _region (F:: Plan ) = F. region
107
+ _region (F:: ScaledPlan ) = F. p. region
108
+
109
+ for func in (:_shuffled_postscale! , :_shuffled_prescale! )
110
+ @eval function $func (F:: AbstractShuffledPlan , ret:: AbstractMatrix{T} ) where T
111
+ d = _region (F. plan)
112
+ if isone (d)
113
+ for j in axes (ret,2 )
114
+ $ func (F, view (ret,:,j))
115
+ end
116
+ else
117
+ @assert d == 2
118
+ for k in axes (ret,1 )
119
+ $ func (F, view (ret,k,:))
120
+ end
105
121
end
122
+ ret
106
123
end
107
- ret
108
124
end
109
125
110
- function mul! (ret:: AbstractArray{T} , F:: ShuffledR2HC{T} , b:: AbstractArray ) where T
111
- mul! (ret, F. plan, convert (Array{T}, b))
112
- _shuffledR2HC_postscale! (F. plan. region, ret)
126
+ function mul! (ret:: AbstractArray{T} , F:: AbstractShuffledPlan{T} , bin:: AbstractArray ) where T
127
+ b = _shuffled_prescale! (F, Array {T} (bin))
128
+ mul! (ret, F. plan, b)
129
+ _shuffled_postscale! (F, ret)
113
130
end
114
131
115
- function mul! (ret:: AbstractArray{T} , F:: ShuffledFFT{T} , b:: AbstractArray ) where T
116
- mul! (ret, F. plan, convert (Array{T}, b))
117
- _shuffledFFT_postscale! (F. plan. region, ret)
118
- end
119
132
120
133
* (F:: AbstractShuffledPlan{T} , b:: AbstractVecOrMat ) where T = mul! (similar (b, T), F, b)
121
134
122
- factorize (L:: SubQuasiArray{T,2,<:Fourier,<:Tuple{<:Inclusion,<:OneTo}} ) where T =
123
- TransformFactorization (grid (L), ShuffledR2HC {T} (size (L,2 )))
124
- factorize (L:: SubQuasiArray{T,2,<:Fourier,<:Tuple{<:Inclusion,<:OneTo}} , d) where T =
125
- TransformFactorization (grid (L), ShuffledR2HC {T} ((size (L,2 ),d),1 ))
126
-
127
- factorize (L:: SubQuasiArray{T,2,<:Laurent,<:Tuple{<:Inclusion,<:OneTo}} ) where T =
128
- TransformFactorization (grid (L), ShuffledFFT {T} (size (L,2 )))
129
- factorize (L:: SubQuasiArray{T,2,<:Laurent,<:Tuple{<:Inclusion,<:OneTo}} , d) where T =
130
- TransformFactorization (grid (L), ShuffledFFT {T} ((size (L,2 ),d),1 ))
131
-
132
-
133
- factorize (L:: SubQuasiArray{T,2,<:AbstractFourier,<:Tuple{<:Inclusion,<:BlockSlice}} ,d... ) where T =
134
- ProjectionFactorization (factorize (parent (L)[:,OneTo (size (L,2 ))],d... ),parentindices (L)[2 ])
135
+ plan_grid_transform (F:: Fourier{T} , szs:: NTuple{N,Int} , dims... ) where {T,N} = grid (F, szs[1 ]), ShuffledR2HC {T} (szs, dims... )
136
+ plan_grid_transform (F:: Laurent{T} , szs:: NTuple{N,Int} , dims... ) where {T,N} = grid (F, szs[1 ]), ShuffledFFT {T} (szs, dims... )
135
137
136
138
import BlockBandedMatrices: _BlockSkylineMatrix
137
139
0 commit comments