mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
Add DUCC FFT support
This commit is contained in:
committed by
Rasmus Munk Larsen
parent
6f1a143418
commit
db85838ee2
@@ -37,12 +37,13 @@
|
||||
* - fftw (http://www.fftw.org) : faster, GPL -- incompatible with Eigen in LGPL form, bigger code size.
|
||||
* - MKL (https://www.intel.com/content/www/us/en/developer/tools/oneapi/onemkl-download.html) : fastest, free -- may be
|
||||
* incompatible with Eigen in GPL form.
|
||||
* - pocketfft (https://gitlab.mpcdf.mpg.de/mtr/pocketfft) : faster than kissfft, BSD 3-clause.
|
||||
* - PocketFFT/DUCC (https://gitlab.mpcdf.mpg.de/mtr/pocketfft, https://gitlab.mpcdf.mpg.de/mtr/ducc) : faster than kissfft, BSD 3-clause.
|
||||
* It is a heavily modified implementation of FFTPack, with the following advantages:
|
||||
* 1.strictly C++11 compliant
|
||||
* 2.more accurate twiddle factor computation
|
||||
* 3.very fast plan generation
|
||||
* 4.worst case complexity for transform sizes with large prime factors is N*log(N), because Bluestein's algorithm is
|
||||
* According to the author, DUCC contains the "evolution" of pocketfft, though the interface is very similar.
|
||||
* used for these cases
|
||||
*
|
||||
* \section FFTDesign Design
|
||||
@@ -85,7 +86,7 @@
|
||||
#ifdef EIGEN_FFTW_DEFAULT
|
||||
// FFTW: faster, GPL -- incompatible with Eigen in LGPL form, bigger code size
|
||||
#include <fftw3.h>
|
||||
#include "src/FFT/ei_fftw_impl.h"
|
||||
#include "src/FFT/fftw_impl.h"
|
||||
namespace Eigen {
|
||||
// template <typename T> typedef struct internal::fftw_impl default_fft_impl; this does not work
|
||||
template <typename T>
|
||||
@@ -93,7 +94,7 @@ struct default_fft_impl : public internal::fftw_impl<T> {};
|
||||
} // namespace Eigen
|
||||
#elif defined EIGEN_MKL_DEFAULT
|
||||
// intel Math Kernel Library: fastest, free -- may be incompatible with Eigen in GPL form
|
||||
#include "src/FFT/ei_imklfft_impl.h"
|
||||
#include "src/FFT/imklfft_impl.h"
|
||||
namespace Eigen {
|
||||
template <typename T>
|
||||
struct default_fft_impl : public internal::imklfft::imklfft_impl<T> {};
|
||||
@@ -101,14 +102,24 @@ struct default_fft_impl : public internal::imklfft::imklfft_impl<T> {};
|
||||
#elif defined EIGEN_POCKETFFT_DEFAULT
|
||||
// internal::pocketfft_impl: a heavily modified implementation of FFTPack, with many advantages.
|
||||
#include <pocketfft_hdronly.h>
|
||||
#include "src/FFT/ei_pocketfft_impl.h"
|
||||
#include "src/FFT/pocketfft_impl.h"
|
||||
namespace Eigen {
|
||||
template <typename T>
|
||||
struct default_fft_impl : public internal::pocketfft_impl<T> {};
|
||||
} // namespace Eigen
|
||||
#elif defined EIGEN_DUCCFFT_DEFAULT
|
||||
#include <ducc0/fft/fft.h>
|
||||
#include <ducc0/infra/string_utils.h>
|
||||
#include <ducc0/fft/fft.h>
|
||||
#include <ducc0/fft/fftnd_impl.h>
|
||||
#include "src/FFT/duccfft_impl.h"
|
||||
namespace Eigen {
|
||||
template <typename T>
|
||||
struct default_fft_impl : public internal::duccfft_impl<T> {};
|
||||
} // namespace Eigen
|
||||
#else
|
||||
// internal::kissfft_impl: small, free, reasonably efficient default, derived from kissfft
|
||||
#include "src/FFT/ei_kissfft_impl.h"
|
||||
#include "src/FFT/kissfft_impl.h"
|
||||
namespace Eigen {
|
||||
template <typename T>
|
||||
struct default_fft_impl : public internal::kissfft_impl<T> {};
|
||||
@@ -204,7 +215,8 @@ class FFT {
|
||||
|
||||
inline void fwd(Complex* dst, const Complex* src, Index nfft) { m_impl.fwd(dst, src, static_cast<int>(nfft)); }
|
||||
|
||||
#if defined EIGEN_FFTW_DEFAULT || defined EIGEN_POCKETFFT_DEFAULT || defined EIGEN_MKL_DEFAULT
|
||||
#if defined EIGEN_FFTW_DEFAULT || defined EIGEN_POCKETFFT_DEFAULT || defined EIGEN_DUCCFFT_DEFAULT || \
|
||||
defined EIGEN_MKL_DEFAULT
|
||||
inline void fwd2(Complex* dst, const Complex* src, int n0, int n1) { m_impl.fwd2(dst, src, n0, n1); }
|
||||
#endif
|
||||
|
||||
@@ -366,7 +378,8 @@ class FFT {
|
||||
inv(&dst[0], &src[0], nfft);
|
||||
}
|
||||
|
||||
#if defined EIGEN_FFTW_DEFAULT || defined EIGEN_POCKETFFT_DEFAULT || defined EIGEN_MKL_DEFAULT
|
||||
#if defined EIGEN_FFTW_DEFAULT || defined EIGEN_POCKETFFT_DEFAULT || defined EIGEN_DUCCFFT_DEFAULT || \
|
||||
defined EIGEN_MKL_DEFAULT
|
||||
inline void inv2(Complex* dst, const Complex* src, int n0, int n1) {
|
||||
m_impl.inv2(dst, src, n0, n1);
|
||||
if (HasFlag(Unscaled) == false) scale(dst, 1. / (n0 * n1), n0 * n1);
|
||||
@@ -385,7 +398,6 @@ class FFT {
|
||||
Matrix<T_Data, Dynamic, 1>::Map(x, nx) *= s;
|
||||
else
|
||||
Matrix<T_Data, Dynamic, 1>::MapAligned(x, nx) *= s;
|
||||
// Matrix<T_Data, Dynamic, Dynamic>::Map(x,nx) * s;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user