<div dir="ltr"><div>I have used both libs extensively during my PhD, and made Python wrappers for them [1, 2]. I am also involved with upstream NFFT development so I can give you a bit more insights regarding the difference between the two.<br><br></div><div>NUFFT is a Fortran implementation of a fast algorithm for computing the convolution part of the accelerated NUFT. For that, is uses a Gaussian kernel which offers a nice trade-off between memory foot-print and performance. The accuracy / speed trade-off is defined by a single parameter (eps), which automatically choose the appropriate width of the kernel and size of the oversampled convolution grid. The implementation is serial, with no way to re-use past computed problems AFAIK.<br><br></div><div>NFFT on the other hand replicates the design of FFTW, i.e. a plan data structure holds the precomputed internals of the problem and is passed to execution routines (trafo / adjoint in NFFT, execute_dft in FFTW). By default, the NFFT uses a Kaiser-Bessel kernel and difference pre-allocation strategies may be used. The control over the NUFT problem parameters is more granular and plans can be re-used once pre-allocated, which leads to better performance with repeated computations. OpenMP can also be used to speed things up.<br></div><div><br></div><div>NUFFT is now BSD licensed. NFFT is GPLv2. I spoke with the upstream devs on the subject a while back, and they had no intentions to use a more permssive license in the future.<br></div><div><br></div><div>Hope that helps,<br><br></div><div>Ghis<br></div><div><br></div>[1] NUFFT: <a href="https://github.com/ghisvail/nufft-f2py">https://github.com/ghisvail/nufft-f2py</a><br><div>[2] NFFT: <a href="https://github.com/ghisvail/pyNFFT">https://github.com/ghisvail/pyNFFT</a><br></div></div>