Mercurial > hg > qm-dsp
diff ext/kissfft/test/benchkiss.c @ 409:1f1999b0f577
Bring in kissfft into this repo (formerly a subrepo, but the remote is not responding)
author | Chris Cannam <c.cannam@qmul.ac.uk> |
---|---|
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/benchkiss.c Tue Jul 21 07:34:15 2015 +0100 @@ -0,0 +1,122 @@ +#include <stdio.h> +#include <stdlib.h> +#include <sys/times.h> +#include <unistd.h> +#include "kiss_fft.h" +#include "kiss_fftr.h" +#include "kiss_fftnd.h" +#include "kiss_fftndr.h" + +#include "pstats.h" + +static +int getdims(int * dims, char * arg) +{ + char *s; + int ndims=0; + while ( (s=strtok( arg , ",") ) ) { + dims[ndims++] = atoi(s); + //printf("%s=%d\n",s,dims[ndims-1]); + arg=NULL; + } + return ndims; +} + +int main(int argc,char ** argv) +{ + int k; + int nfft[32]; + int ndims = 1; + int isinverse=0; + int numffts=1000,i; + kiss_fft_cpx * buf; + kiss_fft_cpx * bufout; + int real = 0; + + nfft[0] = 1024;// default + + while (1) { + int c = getopt (argc, argv, "n:ix:r"); + if (c == -1) + break; + switch (c) { + case 'r': + real = 1; + break; + case 'n': + ndims = getdims(nfft, optarg ); + if (nfft[0] != kiss_fft_next_fast_size(nfft[0]) ) { + int ng = kiss_fft_next_fast_size(nfft[0]); + fprintf(stderr,"warning: %d might be a better choice for speed than %d\n",ng,nfft[0]); + } + break; + case 'x': + numffts = atoi (optarg); + break; + case 'i': + isinverse = 1; + break; + } + } + int nbytes = sizeof(kiss_fft_cpx); + for (k=0;k<ndims;++k) + nbytes *= nfft[k]; + +#ifdef USE_SIMD + numffts /= 4; + fprintf(stderr,"since SIMD implementation does 4 ffts at a time, numffts is being reduced to %d\n",numffts); +#endif + + buf=(kiss_fft_cpx*)KISS_FFT_MALLOC(nbytes); + bufout=(kiss_fft_cpx*)KISS_FFT_MALLOC(nbytes); + memset(buf,0,nbytes); + + pstats_init(); + + if (ndims==1) { + if (real) { + kiss_fftr_cfg st = kiss_fftr_alloc( nfft[0] ,isinverse ,0,0); + if (isinverse) + for (i=0;i<numffts;++i) + kiss_fftri( st ,(kiss_fft_cpx*)buf,(kiss_fft_scalar*)bufout ); + else + for (i=0;i<numffts;++i) + kiss_fftr( st ,(kiss_fft_scalar*)buf,(kiss_fft_cpx*)bufout ); + free(st); + }else{ + kiss_fft_cfg st = kiss_fft_alloc( nfft[0] ,isinverse ,0,0); + for (i=0;i<numffts;++i) + kiss_fft( st ,buf,bufout ); + free(st); + } + }else{ + if (real) { + kiss_fftndr_cfg st = kiss_fftndr_alloc( nfft,ndims ,isinverse ,0,0); + if (isinverse) + for (i=0;i<numffts;++i) + kiss_fftndri( st ,(kiss_fft_cpx*)buf,(kiss_fft_scalar*)bufout ); + else + for (i=0;i<numffts;++i) + kiss_fftndr( st ,(kiss_fft_scalar*)buf,(kiss_fft_cpx*)bufout ); + free(st); + }else{ + kiss_fftnd_cfg st= kiss_fftnd_alloc(nfft,ndims,isinverse ,0,0); + for (i=0;i<numffts;++i) + kiss_fftnd( st ,buf,bufout ); + free(st); + } + } + + free(buf); free(bufout); + + fprintf(stderr,"KISS\tnfft="); + for (k=0;k<ndims;++k) + fprintf(stderr, "%d,",nfft[k]); + fprintf(stderr,"\tnumffts=%d\n" ,numffts); + pstats_report(); + + kiss_fft_cleanup(); + + return 0; +} +