您好我是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}
提前致谢!!
答案 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