快速多维Walsh-Hadamard在juia变换

时间:2018-05-31 07:09:01

标签: julia

您好我是julia的新手并且在理解一段代码时遇到了问题。我正在寻找快速实现FWHT(Fast Walsh-Hadamard转换)来理解它并在python中实现它(实现应该能够处理n维数组,应该能够在任何特定的维度集上应用转换。)所以我遇到了julia实现(https://github.com/stevengj/Hadamard.jl),这似乎相当不错,但由于我是julia的新手我是无法理解代码的一部分:

for (Tr,Tc,fftw,lib) in ((:Float64,:Complex128,"fftw",FFTW.libfftw),
                     (:Float32,:Complex64,"fftwf",FFTW.libfftwf))
    @eval function Plan_Hadamard{N}(X::StridedArray{$Tc,N}, Y::StridedArray{$Tc,N},
                             region, flags::Unsigned, timelimit::Real,
                             bitreverse::Bool)
        set_timelimit($Tr, timelimit)
        dims, howmany = dims_howmany(X, Y, [size(X)...], region)
        dims = hadamardize(dims, bitreverse)
        plan = ccall(($(string(fftw,"_plan_guru64_dft")),$lib),
                 PlanPtr,
                 (Int32, Ptr{Int}, Int32, Ptr{Int},
                  Ptr{$Tc}, Ptr{$Tc}, Int32, UInt32),
                 size(dims,2), dims, size(howmany,2), howmany,
                 X, Y, FFTW.FORWARD, flags)
        set_timelimit($Tr, NO_TIMELIMIT)
            if plan == C_NULL
                error("FFTW could not create plan") # shouldn't normally happen
            end
        return cFFTWPlan{$Tc,FFTW.FORWARD,X===Y,N}(plan, flags, region, X, Y)
    end

    @eval function Plan_Hadamard{N}(X::StridedArray{$Tr,N}, Y::StridedArray{$Tr,N},
                             region, flags::Unsigned, timelimit::Real,
                             bitreverse::Bool)
        set_timelimit($Tr, timelimit)
        dims, howmany = dims_howmany(X, Y, [size(X)...], region)
        dims = hadamardize(dims, bitreverse)
        kind = Array{Int32}(size(dims,2))
        kind[:] = R2HC
        plan = ccall(($(string(fftw,"_plan_guru64_r2r")),$lib),
                 PlanPtr,
                 (Int32, Ptr{Int}, Int32, Ptr{Int},
                  Ptr{$Tr}, Ptr{$Tr}, Ptr{Int32}, UInt32),
                 size(dims,2), dims, size(howmany,2), howmany,
                 X, Y, kind, flags)
        set_timelimit($Tr, NO_TIMELIMIT)
        if plan == C_NULL
            error("FFTW could not create plan") # shouldn't normally happen
        end
        return r2rFFTWPlan{$Tr,(map(Int,kind)...),X===Y,N}(plan, flags, region, X, Y)
    end
end

在上面的代码中,什么是计划变量,它是如何使用的,在哪里可以找到它的实现以及下面一行的花括号中的输入。

cFFTWPlan{$Tc,FFTW.FORWARD,X===Y,N}

提前致谢!!

1 个答案:

答案 0 :(得分:0)

这正在构造一个FFTW "plan"来执行多维FFT。 cFFTWPlan类型是C fftw_plan指针的包装,并在FFTW.jl module中实现。大括号中的参数为Julia type parameters:在这种情况下,指示数字类型(Tc),FFTW变换方向FORWARD,是否就地变换({{1 }},以及转换的维度(X===Y。这里有两种方法,一种用于创建N的复数数据的FWHT(调用fftw_plan_guru_dft),另一种用于创建cFFTWPlan的实数数据的FWHT(调用fftw_plan_guru_r2r)。 (这些FFTW.jl的内部类型未记录。直接对FFTW库的低级C调用记录在FFTW手册中。

原则上,应该可以对NumPy数组进行类似的FFTW调用。但是,现有的pyFFTW wrappers似乎不支持FFTW的r2r转换(实数据的FWHT需要),因此您必须添加它。

或者您可以通过pyjulia package从Python调用Julia Hadamard.jl模块。或者,您可以使用其他一些Python FWHT软件包,例如https://github.com/FALCONN-LIB/FFHT