aboutsummaryrefslogtreecommitdiffhomepage
path: root/unsupported/Eigen/src/FFT
diff options
context:
space:
mode:
authorGravatar Mark Borgerding <mark@borgerding.net>2009-05-23 22:50:07 -0400
committerGravatar Mark Borgerding <mark@borgerding.net>2009-05-23 22:50:07 -0400
commit326ea773908c2d7e46101085af8f72d20b3f8cbc (patch)
tree7745c4f0c97ae7bec5329b9ba8ef6bff53a06163 /unsupported/Eigen/src/FFT
parent304798817268706463f3ff645c8c8b2c887c090a (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.h31
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);