Mercurial > hg > qm-dsp
diff ext/kissfft/test/testcpp.cc @ 184:76ec2365b250
Bring in kissfft into this repo (formerly a subrepo, but the remote is not responding)
author | Chris Cannam |
---|---|
date | Tue, 21 Jul 2015 07:34:15 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ext/kissfft/test/testcpp.cc Tue Jul 21 07:34:15 2015 +0100 @@ -0,0 +1,73 @@ +#include "kissfft.hh" +#include <iostream> +#include <cstdlib> +#include <typeinfo> + +#include <sys/time.h> +static inline +double curtime(void) +{ + struct timeval tv; + gettimeofday(&tv, NULL); + return (double)tv.tv_sec + (double)tv.tv_usec*.000001; +} + +using namespace std; + +template <class T> +void dotest(int nfft) +{ + typedef kissfft<T> FFT; + typedef std::complex<T> cpx_type; + + cout << "type:" << typeid(T).name() << " nfft:" << nfft; + + FFT fft(nfft,false); + + vector<cpx_type> inbuf(nfft); + vector<cpx_type> outbuf(nfft); + for (int k=0;k<nfft;++k) + inbuf[k]= cpx_type( + (T)(rand()/(double)RAND_MAX - .5), + (T)(rand()/(double)RAND_MAX - .5) ); + fft.transform( &inbuf[0] , &outbuf[0] ); + + long double totalpower=0; + long double difpower=0; + for (int k0=0;k0<nfft;++k0) { + complex<long double> acc = 0; + long double phinc = 2*k0* M_PIl / nfft; + for (int k1=0;k1<nfft;++k1) { + complex<long double> x(inbuf[k1].real(),inbuf[k1].imag()); + acc += x * exp( complex<long double>(0,-k1*phinc) ); + } + totalpower += norm(acc); + complex<long double> x(outbuf[k0].real(),outbuf[k0].imag()); + complex<long double> dif = acc - x; + difpower += norm(dif); + } + cout << " RMSE:" << sqrt(difpower/totalpower) << "\t"; + + double t0 = curtime(); + int nits=20e6/nfft; + for (int k=0;k<nits;++k) { + fft.transform( &inbuf[0] , &outbuf[0] ); + } + double t1 = curtime(); + cout << " MSPS:" << ( (nits*nfft)*1e-6/ (t1-t0) ) << endl; +} + +int main(int argc,char ** argv) +{ + if (argc>1) { + for (int k=1;k<argc;++k) { + int nfft = atoi(argv[k]); + dotest<float>(nfft); dotest<double>(nfft); dotest<long double>(nfft); + } + }else{ + dotest<float>(32); dotest<double>(32); dotest<long double>(32); + dotest<float>(1024); dotest<double>(1024); dotest<long double>(1024); + dotest<float>(840); dotest<double>(840); dotest<long double>(840); + } + return 0; +}