Eigen::internal::kissfft_impl< Scalar_ > Struct Template Reference

#include <ei_kissfft_impl.h>

Public Types

typedef Scalar_ Scalar
 
typedef std::complex< ScalarComplex
 

Public Member Functions

void clear ()
 
void fwd (Complex *dst, const Complex *src, int nfft)
 
void fwd2 (Complex *dst, const Complex *src, int n0, int n1)
 
void inv2 (Complex *dst, const Complex *src, int n0, int n1)
 
void fwd (Complex *dst, const Scalar *src, int nfft)
 
void inv (Complex *dst, const Complex *src, int nfft)
 
void inv (Scalar *dst, const Complex *src, int nfft)
 

Protected Types

typedef kiss_cpx_fft< ScalarPlanData
 
typedef std::map< int, PlanDataPlanMap
 

Protected Member Functions

int PlanKey (int nfft, bool isinverse) const
 
PlanDataget_plan (int nfft, bool inverse)
 
Complexreal_twiddles (int ncfft2)
 

Protected Attributes

PlanMap m_plans
 
std::map< int, std::vector< Complex > > m_realTwiddles
 
std::vector< Complexm_tmpBuf1
 
std::vector< Complexm_tmpBuf2
 

Member Typedef Documentation

◆ Complex

template<typename Scalar_ >
typedef std::complex<Scalar> Eigen::internal::kissfft_impl< Scalar_ >::Complex

◆ PlanData

template<typename Scalar_ >
typedef kiss_cpx_fft<Scalar> Eigen::internal::kissfft_impl< Scalar_ >::PlanData
protected

◆ PlanMap

template<typename Scalar_ >
typedef std::map<int, PlanData> Eigen::internal::kissfft_impl< Scalar_ >::PlanMap
protected

◆ Scalar

template<typename Scalar_ >
typedef Scalar_ Eigen::internal::kissfft_impl< Scalar_ >::Scalar

Member Function Documentation

◆ clear()

template<typename Scalar_ >
void Eigen::internal::kissfft_impl< Scalar_ >::clear ( )
inline
293  {
294  m_plans.clear();
295  m_realTwiddles.clear();
296  }
PlanMap m_plans
Definition: ei_kissfft_impl.h:384
std::map< int, std::vector< Complex > > m_realTwiddles
Definition: ei_kissfft_impl.h:385

References Eigen::internal::kissfft_impl< Scalar_ >::m_plans, and Eigen::internal::kissfft_impl< Scalar_ >::m_realTwiddles.

◆ fwd() [1/2]

template<typename Scalar_ >
void Eigen::internal::kissfft_impl< Scalar_ >::fwd ( Complex dst,
const Complex src,
int  nfft 
)
inline
298 { get_plan(nfft, false).work(0, dst, src, 1, 1); }
void work(int stage, Complex *xout, const Src_ *xin, size_t fstride, size_t in_stride)
Definition: ei_kissfft_impl.h:95
PlanData & get_plan(int nfft, bool inverse)
Definition: ei_kissfft_impl.h:391

References Eigen::internal::kissfft_impl< Scalar_ >::get_plan(), and Eigen::internal::kiss_cpx_fft< Scalar_ >::work().

Referenced by Eigen::internal::kissfft_impl< Scalar_ >::fwd().

◆ fwd() [2/2]

template<typename Scalar_ >
void Eigen::internal::kissfft_impl< Scalar_ >::fwd ( Complex dst,
const Scalar src,
int  nfft 
)
inline
318  {
319  if (nfft & 3) {
320  // use generic mode for odd
321  m_tmpBuf1.resize(nfft);
322  get_plan(nfft, false).work(0, &m_tmpBuf1[0], src, 1, 1);
323  std::copy(m_tmpBuf1.begin(), m_tmpBuf1.begin() + (nfft >> 1) + 1, dst);
324  } else {
325  int ncfft = nfft >> 1;
326  int ncfft2 = nfft >> 2;
327  Complex *rtw = real_twiddles(ncfft2);
328 
329  // use optimized mode for even real
330  fwd(dst, reinterpret_cast<const Complex *>(src), ncfft);
331  Complex dc(dst[0].real() + dst[0].imag());
332  Complex nyquist(dst[0].real() - dst[0].imag());
333  int k;
334  for (k = 1; k <= ncfft2; ++k) {
335  Complex fpk = dst[k];
336  Complex fpnk = conj(dst[ncfft - k]);
337  Complex f1k = fpk + fpnk;
338  Complex f2k = fpk - fpnk;
339  Complex tw = f2k * rtw[k - 1];
340  dst[k] = (f1k + tw) * Scalar(.5);
341  dst[ncfft - k] = conj(f1k - tw) * Scalar(.5);
342  }
343  dst[0] = dc;
344  dst[ncfft] = nyquist;
345  }
346  }
std::complex< RealScalar > Complex
Definition: common.h:71
EIGEN_BLAS_FUNC() copy(int *n, RealScalar *px, int *incx, RealScalar *py, int *incy)
Definition: level1_impl.h:32
char char char int int * k
Definition: level2_impl.h:374
const AutoDiffScalar< DerType > & real(const AutoDiffScalar< DerType > &x)
Definition: AutoDiffScalar.h:486
DerType::Scalar imag(const AutoDiffScalar< DerType > &)
Definition: AutoDiffScalar.h:490
const AutoDiffScalar< DerType > & conj(const AutoDiffScalar< DerType > &x)
Definition: AutoDiffScalar.h:482
Complex * real_twiddles(int ncfft2)
Definition: ei_kissfft_impl.h:401
Scalar_ Scalar
Definition: ei_kissfft_impl.h:290
void fwd(Complex *dst, const Complex *src, int nfft)
Definition: ei_kissfft_impl.h:298
std::vector< Complex > m_tmpBuf1
Definition: ei_kissfft_impl.h:386

References Eigen::conj(), copy(), Eigen::internal::kissfft_impl< Scalar_ >::fwd(), Eigen::internal::kissfft_impl< Scalar_ >::get_plan(), Eigen::imag(), k, Eigen::internal::kissfft_impl< Scalar_ >::m_tmpBuf1, Eigen::real(), Eigen::internal::kissfft_impl< Scalar_ >::real_twiddles(), and Eigen::internal::kiss_cpx_fft< Scalar_ >::work().

◆ fwd2()

template<typename Scalar_ >
void Eigen::internal::kissfft_impl< Scalar_ >::fwd2 ( Complex dst,
const Complex src,
int  n0,
int  n1 
)
inline
300  {
305  }
#define EIGEN_UNUSED_VARIABLE(var)
Definition: Macros.h:966

References EIGEN_UNUSED_VARIABLE.

◆ get_plan()

template<typename Scalar_ >
PlanData& Eigen::internal::kissfft_impl< Scalar_ >::get_plan ( int  nfft,
bool  inverse 
)
inlineprotected
391  {
392  // TODO look for PlanKey(nfft, ! inverse) and conjugate the twiddles
393  PlanData &pd = m_plans[PlanKey(nfft, inverse)];
394  if (pd.m_twiddles.size() == 0) {
395  pd.make_twiddles(nfft, inverse);
396  pd.factorize(nfft);
397  }
398  return pd;
399  }
void inverse(const MatrixType &m)
Definition: inverse.cpp:64
int PlanKey(int nfft, bool isinverse) const
Definition: ei_kissfft_impl.h:389
kiss_cpx_fft< Scalar > PlanData
Definition: ei_kissfft_impl.h:381

References Eigen::internal::kiss_cpx_fft< Scalar_ >::factorize(), inverse(), Eigen::internal::kissfft_impl< Scalar_ >::m_plans, Eigen::internal::kiss_cpx_fft< Scalar_ >::m_twiddles, Eigen::internal::kiss_cpx_fft< Scalar_ >::make_twiddles(), and Eigen::internal::kissfft_impl< Scalar_ >::PlanKey().

Referenced by Eigen::internal::kissfft_impl< Scalar_ >::fwd(), and Eigen::internal::kissfft_impl< Scalar_ >::inv().

◆ inv() [1/2]

template<typename Scalar_ >
void Eigen::internal::kissfft_impl< Scalar_ >::inv ( Complex dst,
const Complex src,
int  nfft 
)
inline

◆ inv() [2/2]

template<typename Scalar_ >
void Eigen::internal::kissfft_impl< Scalar_ >::inv ( Scalar dst,
const Complex src,
int  nfft 
)
inline
352  {
353  if (nfft & 3) {
354  m_tmpBuf1.resize(nfft);
355  m_tmpBuf2.resize(nfft);
356  std::copy(src, src + (nfft >> 1) + 1, m_tmpBuf1.begin());
357  for (int k = 1; k < (nfft >> 1) + 1; ++k) m_tmpBuf1[nfft - k] = conj(m_tmpBuf1[k]);
358  inv(&m_tmpBuf2[0], &m_tmpBuf1[0], nfft);
359  for (int k = 0; k < nfft; ++k) dst[k] = m_tmpBuf2[k].real();
360  } else {
361  // optimized version for multiple of 4
362  int ncfft = nfft >> 1;
363  int ncfft2 = nfft >> 2;
364  Complex *rtw = real_twiddles(ncfft2);
365  m_tmpBuf1.resize(ncfft);
366  m_tmpBuf1[0] = Complex(src[0].real() + src[ncfft].real(), src[0].real() - src[ncfft].real());
367  for (int k = 1; k <= ncfft / 2; ++k) {
368  Complex fk = src[k];
369  Complex fnkc = conj(src[ncfft - k]);
370  Complex fek = fk + fnkc;
371  Complex tmp = fk - fnkc;
372  Complex fok = tmp * conj(rtw[k - 1]);
373  m_tmpBuf1[k] = fek + fok;
374  m_tmpBuf1[ncfft - k] = conj(fek - fok);
375  }
376  get_plan(ncfft, true).work(0, reinterpret_cast<Complex *>(dst), &m_tmpBuf1[0], 1, 1);
377  }
378  }
Eigen::Matrix< Scalar, Dynamic, Dynamic, ColMajor > tmp
Definition: level3_impl.h:365
std::vector< Complex > m_tmpBuf2
Definition: ei_kissfft_impl.h:387
void inv(Complex *dst, const Complex *src, int nfft)
Definition: ei_kissfft_impl.h:349
std::complex< Scalar > Complex
Definition: ei_kissfft_impl.h:291

References Eigen::conj(), copy(), Eigen::internal::kissfft_impl< Scalar_ >::get_plan(), Eigen::internal::kissfft_impl< Scalar_ >::inv(), k, Eigen::internal::kissfft_impl< Scalar_ >::m_tmpBuf1, Eigen::internal::kissfft_impl< Scalar_ >::m_tmpBuf2, Eigen::real(), Eigen::internal::kissfft_impl< Scalar_ >::real_twiddles(), tmp, and Eigen::internal::kiss_cpx_fft< Scalar_ >::work().

◆ inv2()

template<typename Scalar_ >
void Eigen::internal::kissfft_impl< Scalar_ >::inv2 ( Complex dst,
const Complex src,
int  n0,
int  n1 
)
inline
307  {
312  }

References EIGEN_UNUSED_VARIABLE.

◆ PlanKey()

template<typename Scalar_ >
int Eigen::internal::kissfft_impl< Scalar_ >::PlanKey ( int  nfft,
bool  isinverse 
) const
inlineprotected
389 { return (nfft << 1) | int(isinverse); }
return int(ret)+1

References int().

Referenced by Eigen::internal::kissfft_impl< Scalar_ >::get_plan().

◆ real_twiddles()

template<typename Scalar_ >
Complex* Eigen::internal::kissfft_impl< Scalar_ >::real_twiddles ( int  ncfft2)
inlineprotected
401  {
402  using std::acos;
403  std::vector<Complex> &twidref = m_realTwiddles[ncfft2]; // creates new if not there
404  if ((int)twidref.size() != ncfft2) {
405  twidref.resize(ncfft2);
406  int ncfft = ncfft2 << 1;
407  Scalar pi = acos(Scalar(-1));
408  for (int k = 1; k <= ncfft2; ++k) twidref[k - 1] = exp(Complex(0, -pi * (Scalar(k) / ncfft + Scalar(.5))));
409  }
410  return &twidref[0];
411  }
AnnoyingScalar acos(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:138
SCALAR Scalar
Definition: bench_gemm.cpp:45
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 exp(const bfloat16 &a)
Definition: BFloat16.h:615
const Mdouble pi
Definition: ExtendedMath.h:23

References acos(), Eigen::bfloat16_impl::exp(), k, Eigen::internal::kissfft_impl< Scalar_ >::m_realTwiddles, and constants::pi.

Referenced by Eigen::internal::kissfft_impl< Scalar_ >::fwd(), and Eigen::internal::kissfft_impl< Scalar_ >::inv().

Member Data Documentation

◆ m_plans

◆ m_realTwiddles

template<typename Scalar_ >
std::map<int, std::vector<Complex> > Eigen::internal::kissfft_impl< Scalar_ >::m_realTwiddles
protected

◆ m_tmpBuf1

template<typename Scalar_ >
std::vector<Complex> Eigen::internal::kissfft_impl< Scalar_ >::m_tmpBuf1
protected

◆ m_tmpBuf2

template<typename Scalar_ >
std::vector<Complex> Eigen::internal::kissfft_impl< Scalar_ >::m_tmpBuf2
protected

The documentation for this struct was generated from the following file: