annotate 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
rev   line source
c@409 1 #include <stdio.h>
c@409 2 #include <stdlib.h>
c@409 3 #include <sys/times.h>
c@409 4 #include <unistd.h>
c@409 5 #include "kiss_fft.h"
c@409 6 #include "kiss_fftr.h"
c@409 7 #include "kiss_fftnd.h"
c@409 8 #include "kiss_fftndr.h"
c@409 9
c@409 10 #include "pstats.h"
c@409 11
c@409 12 static
c@409 13 int getdims(int * dims, char * arg)
c@409 14 {
c@409 15 char *s;
c@409 16 int ndims=0;
c@409 17 while ( (s=strtok( arg , ",") ) ) {
c@409 18 dims[ndims++] = atoi(s);
c@409 19 //printf("%s=%d\n",s,dims[ndims-1]);
c@409 20 arg=NULL;
c@409 21 }
c@409 22 return ndims;
c@409 23 }
c@409 24
c@409 25 int main(int argc,char ** argv)
c@409 26 {
c@409 27 int k;
c@409 28 int nfft[32];
c@409 29 int ndims = 1;
c@409 30 int isinverse=0;
c@409 31 int numffts=1000,i;
c@409 32 kiss_fft_cpx * buf;
c@409 33 kiss_fft_cpx * bufout;
c@409 34 int real = 0;
c@409 35
c@409 36 nfft[0] = 1024;// default
c@409 37
c@409 38 while (1) {
c@409 39 int c = getopt (argc, argv, "n:ix:r");
c@409 40 if (c == -1)
c@409 41 break;
c@409 42 switch (c) {
c@409 43 case 'r':
c@409 44 real = 1;
c@409 45 break;
c@409 46 case 'n':
c@409 47 ndims = getdims(nfft, optarg );
c@409 48 if (nfft[0] != kiss_fft_next_fast_size(nfft[0]) ) {
c@409 49 int ng = kiss_fft_next_fast_size(nfft[0]);
c@409 50 fprintf(stderr,"warning: %d might be a better choice for speed than %d\n",ng,nfft[0]);
c@409 51 }
c@409 52 break;
c@409 53 case 'x':
c@409 54 numffts = atoi (optarg);
c@409 55 break;
c@409 56 case 'i':
c@409 57 isinverse = 1;
c@409 58 break;
c@409 59 }
c@409 60 }
c@409 61 int nbytes = sizeof(kiss_fft_cpx);
c@409 62 for (k=0;k<ndims;++k)
c@409 63 nbytes *= nfft[k];
c@409 64
c@409 65 #ifdef USE_SIMD
c@409 66 numffts /= 4;
c@409 67 fprintf(stderr,"since SIMD implementation does 4 ffts at a time, numffts is being reduced to %d\n",numffts);
c@409 68 #endif
c@409 69
c@409 70 buf=(kiss_fft_cpx*)KISS_FFT_MALLOC(nbytes);
c@409 71 bufout=(kiss_fft_cpx*)KISS_FFT_MALLOC(nbytes);
c@409 72 memset(buf,0,nbytes);
c@409 73
c@409 74 pstats_init();
c@409 75
c@409 76 if (ndims==1) {
c@409 77 if (real) {
c@409 78 kiss_fftr_cfg st = kiss_fftr_alloc( nfft[0] ,isinverse ,0,0);
c@409 79 if (isinverse)
c@409 80 for (i=0;i<numffts;++i)
c@409 81 kiss_fftri( st ,(kiss_fft_cpx*)buf,(kiss_fft_scalar*)bufout );
c@409 82 else
c@409 83 for (i=0;i<numffts;++i)
c@409 84 kiss_fftr( st ,(kiss_fft_scalar*)buf,(kiss_fft_cpx*)bufout );
c@409 85 free(st);
c@409 86 }else{
c@409 87 kiss_fft_cfg st = kiss_fft_alloc( nfft[0] ,isinverse ,0,0);
c@409 88 for (i=0;i<numffts;++i)
c@409 89 kiss_fft( st ,buf,bufout );
c@409 90 free(st);
c@409 91 }
c@409 92 }else{
c@409 93 if (real) {
c@409 94 kiss_fftndr_cfg st = kiss_fftndr_alloc( nfft,ndims ,isinverse ,0,0);
c@409 95 if (isinverse)
c@409 96 for (i=0;i<numffts;++i)
c@409 97 kiss_fftndri( st ,(kiss_fft_cpx*)buf,(kiss_fft_scalar*)bufout );
c@409 98 else
c@409 99 for (i=0;i<numffts;++i)
c@409 100 kiss_fftndr( st ,(kiss_fft_scalar*)buf,(kiss_fft_cpx*)bufout );
c@409 101 free(st);
c@409 102 }else{
c@409 103 kiss_fftnd_cfg st= kiss_fftnd_alloc(nfft,ndims,isinverse ,0,0);
c@409 104 for (i=0;i<numffts;++i)
c@409 105 kiss_fftnd( st ,buf,bufout );
c@409 106 free(st);
c@409 107 }
c@409 108 }
c@409 109
c@409 110 free(buf); free(bufout);
c@409 111
c@409 112 fprintf(stderr,"KISS\tnfft=");
c@409 113 for (k=0;k<ndims;++k)
c@409 114 fprintf(stderr, "%d,",nfft[k]);
c@409 115 fprintf(stderr,"\tnumffts=%d\n" ,numffts);
c@409 116 pstats_report();
c@409 117
c@409 118 kiss_fft_cleanup();
c@409 119
c@409 120 return 0;
c@409 121 }
c@409 122