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