Быстрые многомерные преобразования Уолша-Адамара в Юии - PullRequest
0 голосов
/ 31 мая 2018

Здравствуйте, я новичок в julia, и у меня возникла проблема с пониманием фрагмента кода. Я искал быструю реализацию FWHT (быстрое преобразование Уолша-Адамара), чтобы понять ее и реализовать в 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 голосов
/ 21 июня 2018

Это построение плана FFTW для выполнения многомерного БПФ.Тип cFFTWPlan является оберткой вокруг указателя C fftw_plan и реализован в модуле FFTW.jl .Аргументами в фигурных скобках являются параметры типа Julia : в этом случае указывается тип числа (Tc), направление преобразования FFTW FORWARD, установлено ли преобразование на месте (X===Y)и размерность преобразования (N).Здесь есть два метода, один для FWHT данных комплексного числа, который создает cFFTWPlan (который вызывает fftw_plan_guru_dft), и один для данных действительного числа, который создает r2rFFTWPlan (который вызывает fftw_plan_guru_r2r ).(Эти внутренние типы FFTW.jl недокументированы. Низкоуровневые вызовы C непосредственно в библиотеку FFTW документированы в руководстве FFTW.

В принципе, должно быть возможно сделать аналогичные вызовы FFTW дляМассивы NumPy. Однако существующие оболочки pyFFTW , похоже, не поддерживают преобразования r2r FFTW (необходимые для FWHT реальных данных), поэтому вам придется добавить это.

Или выВы можете вызвать модуль Julia Hadamard.jl из Python через пакет pyjulia . Или вы можете использовать другой пакет Python FWHT, например https://github.com/FALCONN-LIB/FFHT

.
...