diff options
author | Mark Borgerding <mark@borgerding.net> | 2009-05-23 22:50:07 -0400 |
---|---|---|
committer | Mark Borgerding <mark@borgerding.net> | 2009-05-23 22:50:07 -0400 |
commit | 326ea773908c2d7e46101085af8f72d20b3f8cbc (patch) | |
tree | 7745c4f0c97ae7bec5329b9ba8ef6bff53a06163 /unsupported/Eigen/src/FFT | |
parent | 304798817268706463f3ff645c8c8b2c887c090a (diff) |
added FFT inverse complex-to-scalar interface (not yet optimized)
Diffstat (limited to 'unsupported/Eigen/src/FFT')
-rw-r--r-- | unsupported/Eigen/src/FFT/simple_fft_traits.h | 31 |
1 files changed, 13 insertions, 18 deletions
diff --git a/unsupported/Eigen/src/FFT/simple_fft_traits.h b/unsupported/Eigen/src/FFT/simple_fft_traits.h index f7dd2b9cf..1e2be8f79 100644 --- a/unsupported/Eigen/src/FFT/simple_fft_traits.h +++ b/unsupported/Eigen/src/FFT/simple_fft_traits.h @@ -54,28 +54,14 @@ namespace Eigen { work(0, dst, src, 1,1); }else{ int ncfft = nfft>>1; + int ncfft2 = nfft>>2; // use optimized mode for even real fwd( dst, reinterpret_cast<const Complex*> (src),ncfft); make_real_twiddles(nfft); - std::cerr << "dst[0] = " << dst[0] << "\n"; Complex dc = dst[0].real() + dst[0].imag(); Complex nyquist = dst[0].real() - dst[0].imag(); int k; -#if 0 - using namespace std; - cerr << "desired:\n"; - for ( k=1;k <= (ncfft>>1) ; ++k ) { - Complex x = exp( Complex(0,-3.14159265358979323846264338327 * ((double) (k) / ncfft + .5) ) ); - cerr << k << " " << x << "angle(x):" << arg(x) << "\n"; - } - dc=0; - cerr << "twiddles:\n"; - for (k=0;k<ncfft;++k) { - Complex x = m_twiddles[k]; - cerr << k << " " << x << "angle(-x):" << arg(-x) << "\n"; - } -#endif - for ( k=1;k <= (ncfft>>1) ; ++k ) { + for ( k=1;k <= ncfft2 ; ++k ) { Complex fpk = dst[k]; Complex fpnk = conj(dst[ncfft-k]); Complex f1k = fpk + fpnk; @@ -87,7 +73,6 @@ namespace Eigen { dst[ncfft-k] = conj(f1k -tw)*Scalar(.5); } - // place conjugate-symmetric half at the end for completeness // TODO: make this configurable ( opt-out ) for ( k=1;k < ncfft ; ++k ) @@ -98,6 +83,16 @@ namespace Eigen { } } + // half-complex to scalar + void inv( Scalar * dst,const Complex * src,int nfft) + { + // TODO add optimized version for even numbers + std::vector<Complex> tmp(nfft); + inv(&tmp[0],src,nfft); + for (int k=0;k<nfft;++k) + dst[k] = tmp[k].real(); + } + void inv(Complex * dst,const Complex *src,int nfft) { prepare(nfft,true); @@ -156,7 +151,7 @@ namespace Eigen { default: p += 2; break; } if (p*p>n) - p=n;// no more factors + p=n;// impossible to have a factor > sqrt(n) } n /= p; m_stageRadix.push_back(p); |