diff --git a/unsupported/test/CMakeLists.txt b/unsupported/test/CMakeLists.txt
index 23217811f..f42077bdc 100644
--- a/unsupported/test/CMakeLists.txt
+++ b/unsupported/test/CMakeLists.txt
@@ -23,6 +23,6 @@ ei_add_test(FFT)
find_package(FFTW)
if(FFTW_FOUND)
- ei_add_test(FFTW " " "${FFTW_LIBRARIES}" )
+ ei_add_test(FFTW " " "-lfftw3 -lfftw3f -lfftw3l" )
endif(FFTW_FOUND)
diff --git a/unsupported/test/FFTW.cpp b/unsupported/test/FFTW.cpp
new file mode 100644
index 000000000..cf7be75aa
--- /dev/null
+++ b/unsupported/test/FFTW.cpp
@@ -0,0 +1,136 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra. Eigen itself is part of the KDE project.
+//
+// Copyright (C) 2009 Mark Borgerding mark a borgerding net
+//
+// Eigen is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 3 of the License, or (at your option) any later version.
+//
+// Alternatively, you can redistribute it and/or
+// modify it under the terms of the GNU General Public License as
+// published by the Free Software Foundation; either version 2 of
+// the License, or (at your option) any later version.
+//
+// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License and a copy of the GNU General Public License along with
+// Eigen. If not, see .
+
+#include "main.h"
+#include
+#include
+
+using namespace std;
+
+float norm(float x) {return x*x;}
+double norm(double x) {return x*x;}
+long double norm(long double x) {return x*x;}
+
+template < typename T>
+complex promote(complex x) { return complex(x.real(),x.imag()); }
+
+complex promote(float x) { return complex( x); }
+complex promote(double x) { return complex( x); }
+complex promote(long double x) { return complex( x); }
+
+
+ template
+ long double fft_rmse( const vector & fftbuf,const vector & timebuf)
+ {
+ long double totalpower=0;
+ long double difpower=0;
+ cerr <<"idx\ttruth\t\tvalue\t|dif|=\n";
+ for (size_t k0=0;k0 acc = 0;
+ long double phinc = -2.*k0* M_PIl / timebuf.size();
+ for (size_t k1=0;k1(0,k1*phinc) );
+ }
+ totalpower += norm(acc);
+ complex x = promote(fftbuf[k0]);
+ complex dif = acc - x;
+ difpower += norm(dif);
+ cerr << k0 << "\t" << acc << "\t" << x << "\t" << sqrt(norm(dif)) << endl;
+ }
+ cerr << "rmse:" << sqrt(difpower/totalpower) << endl;
+ return sqrt(difpower/totalpower);
+ }
+
+ template
+ long double dif_rmse( const vector buf1,const vector buf2)
+ {
+ long double totalpower=0;
+ long double difpower=0;
+ size_t n = min( buf1.size(),buf2.size() );
+ for (size_t k=0;k
+void test_scalar(int nfft)
+{
+ typedef typename Eigen::FFT::Complex Complex;
+ typedef typename Eigen::FFT::Scalar Scalar;
+
+ FFT fft;
+ vector inbuf(nfft);
+ vector outbuf;
+ for (int k=0;k() );// gross check
+
+ vector buf3;
+ fft.inv( buf3 , outbuf);
+ VERIFY( dif_rmse(inbuf,buf3) < test_precision() );// gross check
+}
+
+template
+void test_complex(int nfft)
+{
+ typedef typename Eigen::FFT::Complex Complex;
+
+ FFT fft;
+
+ vector inbuf(nfft);
+ vector outbuf;
+ vector buf3;
+ for (int k=0;k() );// gross check
+
+ fft.inv( buf3 , outbuf);
+
+ VERIFY( dif_rmse(inbuf,buf3) < test_precision() );// gross check
+}
+
+void test_FFTW()
+{
+
+ CALL_SUBTEST( test_complex(32) ); CALL_SUBTEST( test_complex(32) ); CALL_SUBTEST( test_complex(32) );
+ CALL_SUBTEST( test_complex(256) ); CALL_SUBTEST( test_complex(256) ); CALL_SUBTEST( test_complex(256) );
+ CALL_SUBTEST( test_complex(3*8) ); CALL_SUBTEST( test_complex(3*8) ); CALL_SUBTEST( test_complex(3*8) );
+ CALL_SUBTEST( test_complex(5*32) ); CALL_SUBTEST( test_complex(5*32) ); CALL_SUBTEST( test_complex(5*32) );
+ CALL_SUBTEST( test_complex(2*3*4) ); CALL_SUBTEST( test_complex(2*3*4) ); CALL_SUBTEST( test_complex(2*3*4) );
+ CALL_SUBTEST( test_complex(2*3*4*5) ); CALL_SUBTEST( test_complex(2*3*4*5) ); CALL_SUBTEST( test_complex(2*3*4*5) );
+ CALL_SUBTEST( test_complex(2*3*4*5*7) ); CALL_SUBTEST( test_complex(2*3*4*5*7) ); CALL_SUBTEST( test_complex(2*3*4*5*7) );
+
+
+
+ CALL_SUBTEST( test_scalar(32) ); CALL_SUBTEST( test_scalar(32) ); CALL_SUBTEST( test_scalar(32) );
+ CALL_SUBTEST( test_scalar(45) ); CALL_SUBTEST( test_scalar(45) ); CALL_SUBTEST( test_scalar(45) );
+ CALL_SUBTEST( test_scalar(50) ); CALL_SUBTEST( test_scalar(50) ); CALL_SUBTEST( test_scalar(50) );
+ CALL_SUBTEST( test_scalar(256) ); CALL_SUBTEST( test_scalar(256) ); CALL_SUBTEST( test_scalar(256) );
+ CALL_SUBTEST( test_scalar(2*3*4*5*7) ); CALL_SUBTEST( test_scalar(2*3*4*5*7) ); CALL_SUBTEST( test_scalar(2*3*4*5*7) );
+}