@@ -829,65 +829,95 @@ function _imfilter_fft!(r::AbstractCPU{FFT},
829
829
Af = filtfft (A, krn, r. settings. plan1, r. settings. plan2, r. settings. plan3)
830
830
if map (first, axes (out)) == map (first, axes (Af))
831
831
R = CartesianIndices (axes (out))
832
+ # @info "here" axes(out) axes(Af)
832
833
copyto! (out, R, Af, R)
833
834
else
834
835
# Exploit the periodic boundary conditions of FFTView
835
836
dest = FFTView (out)
836
837
# src = OffsetArray(view(FFTView(Af), axes(dest)...), axes(dest))
837
838
src = view (FFTView (Af), axes (dest)... )
839
+ @info " there"
838
840
copyto! (dest, src)
839
841
end
840
- out
842
+ return out
841
843
end
842
844
843
845
function buffered_planned_rfft (a:: AbstractArray{T} ) where {T<: AbstractFloat }
844
846
buf = RFFT. RCpair {T} (undef, size (a))
845
- plan = RFFT. plan_rfft! (buf)
846
- return function (a :: AbstractArray )
847
- copy! (buf, OffsetArrays . no_offset_view (a ))
847
+ plan = RFFT. plan_rfft! (buf; flags = FFTW . MEASURE )
848
+ return function (arr :: AbstractArray{T} ) where {T <: AbstractFloat }
849
+ copy! (buf, FFTW . AbstractFFTs . to1 (arr ))
848
850
return plan (buf)
849
851
end
850
852
end
851
- function buffered_planned_irfft (a:: AbstractArray{T} ) where {T<: AbstractFloat }
853
+ function buffered_planned_irfft (a:: AbstractArray{T} ) where {T}
854
+ # @show size(a)
852
855
buf = RFFT. RCpair {T} (undef, size (a))
853
- plan = RFFT. plan_irfft! (buf)
854
- return function (a:: AbstractArray )
855
- copy! (buf, a)
856
+ plan = RFFT. plan_irfft! (buf; flags= FFTW. MEASURE)
857
+ return function (arr:: AbstractArray{T} ) where {T<: Complex }
858
+ # @info "inner" size(buf.R) size(buf.C) size(a)
859
+ copy! (buf, FFTW. AbstractFFTs. to1 (arr))
856
860
return plan (buf)
857
861
end
858
862
end
859
863
860
864
function planned_fft (A:: AbstractArray{T,N} ,
861
- kernel:: Tuple{AbstractArray,Vararg{AbstractArray}} ,
862
- border:: BorderSpecAny = Pad (:replicate )) where {T,N}
865
+ kernel:: Tuple{AbstractArray,Vararg{AbstractArray}} ,
866
+ border:: BorderSpecAny = Pad (:replicate )) where {T,N}
863
867
bord = border (kernel, A, Algorithm. FFT ())
864
868
_A = padarray (T, A, bord)
869
+ # @info "bfp1" size(_A)
865
870
bfp1 = buffered_planned_rfft (_A)
866
-
871
+ # B = complex(bfp1(_A))
867
872
kern = samedims (_A, kernelconv (kernel... ))
868
873
krn = FFTView (zeros (eltype (kern), map (length, axes (_A))))
874
+ for I in CartesianIndices (axes (kern))
875
+ krn[I] = kern[I]
876
+ end
877
+ # @info "bfp2" size(B)
878
+ @show krn[1 : 3 ] sum (krn)
879
+ @show size (_A) size (krn)
869
880
bfp2 = buffered_planned_rfft (krn)
881
+ # B .*= conj!(complex(bfp2(real(krn))))
882
+ # @info "bfp3" size(B) size(krn) size(A) size(_A) size(conj!(_A))
870
883
bfp3 = buffered_planned_irfft (_A)
884
+ # @info "return"
871
885
return Algorithm. FFT (bfp1, bfp2, bfp3)
872
886
end
873
887
874
888
function filtfft (A, krn, planned_rfft1:: Function , planned_rfft2:: Function , planned_irfft:: Function )
875
- B = complex (planned_rfft1 (A)) * FFTW. AbstractFFTs. to1 (A)
876
- _B = rfft (A)
877
- @show B[1 : 4 ] _B[1 : 4 ]
889
+ B = complex (planned_rfft1 (A))
890
+ # @info "filtfft" size(A) size(FFTW.AbstractFFTs.to1(A)) size(B)
891
+ # @info "filtfft planned" FFTW.AbstractFFTs.to1(A)[1:2] B[1:2] typeof(krn) axes(krn)
892
+ @show krn[1 : 3 ] sum (krn)
893
+ @info " bad one 1" complex (planned_rfft2 (krn))[1 : 3 ]
878
894
B .*= conj! (complex (planned_rfft2 (krn)))
879
- out = irfft (B, length (axes (A, 1 )))
880
- @show complex (B)[1 : 2 ,1 : 2 ] axes (complex (B)) out[1 : 2 ,1 : 2 ]
881
- return out
882
- # return real(planned_irfft(complex(B)))
895
+ Af = real (planned_irfft (complex (B)))
896
+
897
+ #
898
+ buf = RFFT. RCpair {Float64} (undef, size (krn))
899
+ _rfft_plan = RFFT. plan_rfft! (buf)
900
+ copy! (buf, FFTW. AbstractFFTs. to1 (krn))
901
+ _k = complex (_rfft_plan (buf))
902
+ @info " bad one 2" _k[1 : 3 ]
903
+ #
904
+
905
+ @info " filtfft planned" B[1 : 2 ] Af[1 : 2 ]
906
+ # TODO : convert Af back to a padded view so that the center of the image is copied in _imfilter_fft!
907
+ # @info "filtfft planned return" typeof(A) size(A) size(B) typeof(Af) size(Af)
908
+ return Af
883
909
end
884
910
filtfft (A, krn, :: Nothing , :: Nothing , :: Nothing ) = filtfft (A, krn)
885
911
function filtfft (A, krn)
886
912
B = rfft (A)
913
+ # @info "filtfft unplanned" FFTW.AbstractFFTs.to1(A)[1:2] B[1:2] typeof(krn) axes(krn)
914
+ # @show krn[1:3] sum(krn)
915
+ @info " good one" rfft (krn)[1 : 3 ]
887
916
B .*= conj! (rfft (krn))
888
- out = irfft (B, length (axes (A, 1 )))
889
- @show B[1 : 2 ,1 : 2 ] axes (B) out[1 : 2 ,1 : 2 ]
890
- return out
917
+ Af = irfft (B, length (axes (A, 1 )))
918
+ @info " filtfft unplanned" B[1 : 2 ] Af[1 : 2 ]
919
+ # @info "filtfft unplanned return" typeof(A) size(A) size(B) typeof(Af) size(Af)
920
+ return Af
891
921
end
892
922
function filtfft (A:: AbstractArray{C} , krn) where {C<: Colorant }
893
923
Av, dims = channelview_dims (A)
0 commit comments