Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FFT support for ComplexFloat?` #18

Open
AshtonSBradley opened this issue Sep 25, 2019 · 1 comment
Open

FFT support for ComplexFloat?` #18

AshtonSBradley opened this issue Sep 25, 2019 · 1 comment

Comments

@AshtonSBradley
Copy link

I find I can

using FFTW, PaddedViews
a = reshape(1:9, 3, 3)
x = PaddedView(-1, a, (4, 5))
fft(x)

and get complex float array of the right size.

But if instead I try to use complex floats, I get a method error

a = reshape(1.:9., 3, 3) |> complex
x=PaddedView(-1., a, (4, 5))
fft(x)

I get a method error

ERROR: MethodError: no method matching plan_fft(::PaddedView{Complex{Float64},2,Tuple{Base.OneTo{Int64},Base.OneTo{Int64}},Array{Complex{Float64},2}}, ::UnitRange{Int64})
Closest candidates are:
  plan_fft(::Union{DenseArray{T<:Union{Complex{Float32}, Complex{Float64}},N}, Base.ReinterpretArray{T<:Union{Complex{Float32}, Complex{Float64}},N,S,A} where S where A<:Union{SubArray{T,N,A,I,true} where I<:Union{Tuple{Vararg{Real,N} where N}, Tuple{AbstractUnitRange,Vararg{Any,N} where N}} where A<:DenseArray where N where T, DenseArray}, Base.ReshapedArray{T<:Union{Complex{Float32}, Complex{Float64}},N,A,MI} where MI<:Tuple{Vararg{Base.MultiplicativeInverses.SignedMultiplicativeInverse{Int64},N} where N} where A<:Union{Base.ReinterpretArray{T,N,S,A} where S where A<:Union{SubArray{T,N,A,I,true} where I<:Union{Tuple{Vararg{Real,N} where N}, Tuple{AbstractUnitRange,Vararg{Any,N} where N}} where A<:DenseArray where N where T, DenseArray} where N where T, SubArray{T,N,A,I,true} where I<:Union{Tuple{Vararg{Real,N} where N}, Tuple{AbstractUnitRange,Vararg{Any,N} where N}} where A<:DenseArray where N where T, DenseArray}, SubArray{T<:Union{Complex{Float32}, Complex{Float64}},N,A,I,L} where L where I<:Tuple{Vararg{Union{Int64, AbstractRange{Int64}, Base.AbstractCartesianIndex},N} where N} where A<:Union{Base.ReinterpretArray{T,N,S,A} where S where A<:Union{SubArray{T,N,A,I,true} where I<:Union{Tuple{Vararg{Real,N} where N}, Tuple{AbstractUnitRange,Vararg{Any,N} where N}} where A<:DenseArray where N where T, DenseArray} where N where T, Base.ReshapedArray{T,N,A,MI} where MI<:Tuple{Vararg{Base.MultiplicativeInverses.SignedMultiplicativeInverse{Int64},N} where N} where A<:Union{Base.ReinterpretArray{T,N,S,A} where S where A<:Union{SubArray{T,N,A,I,true} where I<:Union{Tuple{Vararg{Real,N} where N}, Tuple{AbstractUnitRange,Vararg{Any,N} where N}} where A<:DenseArray where N where T, DenseArray} where N where T, SubArray{T,N,A,I,true} where I<:Union{Tuple{Vararg{Real,N} where N}, Tuple{AbstractUnitRange,Vararg{Any,N} where N}} where A<:DenseArray where N where T, DenseArray} where N where T, DenseArray}}, ::Any; flags, timelimit) where {T<:Union{Complex{Float32}, Complex{Float64}}, N} at /Users/abradley/.julia/packages/FFTW/MJ7kl/src/fft.jl:619
  plan_fft(::AbstractArray{#s16,N} where N where #s16<:Real, ::Any; kws...) at /Users/abradley/.julia/packages/AbstractFFTs/PUqOK/src/definitions.jl:199
  plan_fft(::AbstractArray{#s25,N} where N where #s25<:(Complex{#s26} where #s26<:Union{Integer, Rational}), ::Any; kws...) at /Users/abradley/.julia/packages/AbstractFFTs/PUqOK/src/definitions.jl:201
  ...
Stacktrace:
 [1] #plan_fft#1(::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}, ::typeof(plan_fft), ::PaddedView{Complex{Float64},2,Tuple{Base.OneTo{Int64},Base.OneTo{Int64}},Array{Complex{Float64},2}}) at /Users/abradley/.julia/packages/AbstractFFTs/PUqOK/src/definitions.jl:52
 [2] plan_fft(::PaddedView{Complex{Float64},2,Tuple{Base.OneTo{Int64},Base.OneTo{Int64}},Array{Complex{Float64},2}}) at /Users/abradley/.julia/packages/AbstractFFTs/PUqOK/src/definitions.jl:52
 [3] fft(::PaddedView{Complex{Float64},2,Tuple{Base.OneTo{Int64},Base.OneTo{Int64}},Array{Complex{Float64},2}}) at /Users/abradley/.julia/packages/AbstractFFTs/PUqOK/src/definitions.jl:50
 [4] top-level scope at none:0

Is there anything fundamentally in the way here? It would be great to be able to pad before transforming as this simplifies many common operations such as convolution and some more specialised operations that turn up in quantum mechanics involving projections.

@roflmaostc
Copy link

Hm, quite an old issue, but a workaround is to collect before.

a = reshape(1.:9., 3, 3) |> complex
x=PaddedView(-1., a, (4, 5))
fft(collect(x))

I believe that FFTW.jl in the case when you provide the Padded Array with real inputs it anyways copies that to a complex one. When it is already complex, it tries to work with that, which fails since the underlying FFTW library cannot handle this datatype

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants