today we can announce the release of FourierTools.jl.
The package, as the name suggests, provides several tools based on Fourier space.
The workhorse behind many algorithms is of course FFTW.jl.
sinc interpolation allows to up and downsample a (bandlimited) signal (which replaces FFTResampling.jl)
array/image shifting (including noteworthy subpixel shifts)
several tools like
ftetc. allowing simpler use with Fourier transforms supporting automatic centering in real and Fourier space
Some examples are shown in the docs and with Pluto notebooks on GitHub.
rfftshift_view, etc.) which does not copy data but simply manipulates the indices (
FFTW.fftshift copies data) based on
ShiftedArrays.circshift. Likely, there will be also
ShiftedArrays.fftshift in the next release of ShiftedArrays.jl .
Since we are working in the field of optics it is usually much more convenient to have the center frequency in the middle.
The pattern below occurs quite often and is then simplified, slightly faster and more memory efficient:
julia> using FFTW, FourierTools, BenchmarkTools julia> x = randn((101, 113)); julia> y = randn((101, 113)); f(x, y) = ifft(ifftshift(fftshift(fft(x)) .* y)) # classical version using FFTW f (generic function with 1 method) g(x, y) = iffts(ffts(x) .* y) # simplified version using FourierTools g (generic function with 1 method) julia> @btime f($x, $y); 1.448 ms (84 allocations: 897.72 KiB) julia> @btime g($x, $y); 1.401 ms (58 allocations: 718.53 KiB)
A full example showing many functionalities with images is here
It is not yet clear what else we include in the future but good support for CUDA and automatic differentiation is definitely something we have in mind.
Rainer & Felix