benchkiss.c 3.2 KB

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