1*84e33947SAndroid Build Coastguard Worker #ifndef KISS_FFT_H 2*84e33947SAndroid Build Coastguard Worker #define KISS_FFT_H 3*84e33947SAndroid Build Coastguard Worker 4*84e33947SAndroid Build Coastguard Worker #include <stdlib.h> 5*84e33947SAndroid Build Coastguard Worker #include <stdio.h> 6*84e33947SAndroid Build Coastguard Worker #include <math.h> 7*84e33947SAndroid Build Coastguard Worker #include <string.h> 8*84e33947SAndroid Build Coastguard Worker 9*84e33947SAndroid Build Coastguard Worker #ifdef __cplusplus 10*84e33947SAndroid Build Coastguard Worker extern "C" { 11*84e33947SAndroid Build Coastguard Worker #endif 12*84e33947SAndroid Build Coastguard Worker 13*84e33947SAndroid Build Coastguard Worker /* 14*84e33947SAndroid Build Coastguard Worker ATTENTION! 15*84e33947SAndroid Build Coastguard Worker If you would like a : 16*84e33947SAndroid Build Coastguard Worker -- a utility that will handle the caching of fft objects 17*84e33947SAndroid Build Coastguard Worker -- real-only (no imaginary time component ) FFT 18*84e33947SAndroid Build Coastguard Worker -- a multi-dimensional FFT 19*84e33947SAndroid Build Coastguard Worker -- a command-line utility to perform ffts 20*84e33947SAndroid Build Coastguard Worker -- a command-line utility to perform fast-convolution filtering 21*84e33947SAndroid Build Coastguard Worker 22*84e33947SAndroid Build Coastguard Worker Then see kfc.h kiss_fftr.h kiss_fftnd.h fftutil.c kiss_fastfir.c 23*84e33947SAndroid Build Coastguard Worker in the tools/ directory. 24*84e33947SAndroid Build Coastguard Worker */ 25*84e33947SAndroid Build Coastguard Worker 26*84e33947SAndroid Build Coastguard Worker #ifdef USE_SIMD 27*84e33947SAndroid Build Coastguard Worker # include <xmmintrin.h> 28*84e33947SAndroid Build Coastguard Worker # define kiss_fft_scalar __m128 29*84e33947SAndroid Build Coastguard Worker #define KISS_FFT_MALLOC(nbytes) _mm_malloc(nbytes,16) 30*84e33947SAndroid Build Coastguard Worker #define KISS_FFT_FREE _mm_free 31*84e33947SAndroid Build Coastguard Worker #else 32*84e33947SAndroid Build Coastguard Worker #define KISS_FFT_MALLOC malloc 33*84e33947SAndroid Build Coastguard Worker #define KISS_FFT_FREE free 34*84e33947SAndroid Build Coastguard Worker #endif 35*84e33947SAndroid Build Coastguard Worker 36*84e33947SAndroid Build Coastguard Worker 37*84e33947SAndroid Build Coastguard Worker #ifdef FIXED_POINT 38*84e33947SAndroid Build Coastguard Worker #include <stdint.h> 39*84e33947SAndroid Build Coastguard Worker # if (FIXED_POINT == 32) 40*84e33947SAndroid Build Coastguard Worker # define kiss_fft_scalar int32_t 41*84e33947SAndroid Build Coastguard Worker # else 42*84e33947SAndroid Build Coastguard Worker # define kiss_fft_scalar int16_t 43*84e33947SAndroid Build Coastguard Worker # endif 44*84e33947SAndroid Build Coastguard Worker #else 45*84e33947SAndroid Build Coastguard Worker # ifndef kiss_fft_scalar 46*84e33947SAndroid Build Coastguard Worker /* default is float */ 47*84e33947SAndroid Build Coastguard Worker # define kiss_fft_scalar float 48*84e33947SAndroid Build Coastguard Worker # endif 49*84e33947SAndroid Build Coastguard Worker #endif 50*84e33947SAndroid Build Coastguard Worker 51*84e33947SAndroid Build Coastguard Worker typedef struct { 52*84e33947SAndroid Build Coastguard Worker kiss_fft_scalar r; 53*84e33947SAndroid Build Coastguard Worker kiss_fft_scalar i; 54*84e33947SAndroid Build Coastguard Worker }kiss_fft_cpx; 55*84e33947SAndroid Build Coastguard Worker 56*84e33947SAndroid Build Coastguard Worker typedef struct kiss_fft_state* kiss_fft_cfg; 57*84e33947SAndroid Build Coastguard Worker 58*84e33947SAndroid Build Coastguard Worker /* 59*84e33947SAndroid Build Coastguard Worker * kiss_fft_alloc 60*84e33947SAndroid Build Coastguard Worker * 61*84e33947SAndroid Build Coastguard Worker * Initialize a FFT (or IFFT) algorithm's cfg/state buffer. 62*84e33947SAndroid Build Coastguard Worker * 63*84e33947SAndroid Build Coastguard Worker * typical usage: kiss_fft_cfg mycfg=kiss_fft_alloc(1024,0,NULL,NULL); 64*84e33947SAndroid Build Coastguard Worker * 65*84e33947SAndroid Build Coastguard Worker * The return value from fft_alloc is a cfg buffer used internally 66*84e33947SAndroid Build Coastguard Worker * by the fft routine or NULL. 67*84e33947SAndroid Build Coastguard Worker * 68*84e33947SAndroid Build Coastguard Worker * If lenmem is NULL, then kiss_fft_alloc will allocate a cfg buffer using malloc. 69*84e33947SAndroid Build Coastguard Worker * The returned value should be free()d when done to avoid memory leaks. 70*84e33947SAndroid Build Coastguard Worker * 71*84e33947SAndroid Build Coastguard Worker * The state can be placed in a user supplied buffer 'mem': 72*84e33947SAndroid Build Coastguard Worker * If lenmem is not NULL and mem is not NULL and *lenmem is large enough, 73*84e33947SAndroid Build Coastguard Worker * then the function places the cfg in mem and the size used in *lenmem 74*84e33947SAndroid Build Coastguard Worker * and returns mem. 75*84e33947SAndroid Build Coastguard Worker * 76*84e33947SAndroid Build Coastguard Worker * If lenmem is not NULL and ( mem is NULL or *lenmem is not large enough), 77*84e33947SAndroid Build Coastguard Worker * then the function returns NULL and places the minimum cfg 78*84e33947SAndroid Build Coastguard Worker * buffer size in *lenmem. 79*84e33947SAndroid Build Coastguard Worker * */ 80*84e33947SAndroid Build Coastguard Worker 81*84e33947SAndroid Build Coastguard Worker kiss_fft_cfg kiss_fft_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem); 82*84e33947SAndroid Build Coastguard Worker 83*84e33947SAndroid Build Coastguard Worker /* 84*84e33947SAndroid Build Coastguard Worker * kiss_fft(cfg,in_out_buf) 85*84e33947SAndroid Build Coastguard Worker * 86*84e33947SAndroid Build Coastguard Worker * Perform an FFT on a complex input buffer. 87*84e33947SAndroid Build Coastguard Worker * for a forward FFT, 88*84e33947SAndroid Build Coastguard Worker * fin should be f[0] , f[1] , ... ,f[nfft-1] 89*84e33947SAndroid Build Coastguard Worker * fout will be F[0] , F[1] , ... ,F[nfft-1] 90*84e33947SAndroid Build Coastguard Worker * Note that each element is complex and can be accessed like 91*84e33947SAndroid Build Coastguard Worker f[k].r and f[k].i 92*84e33947SAndroid Build Coastguard Worker * */ 93*84e33947SAndroid Build Coastguard Worker void kiss_fft(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout); 94*84e33947SAndroid Build Coastguard Worker 95*84e33947SAndroid Build Coastguard Worker /* 96*84e33947SAndroid Build Coastguard Worker A more generic version of the above function. It reads its input from every Nth sample. 97*84e33947SAndroid Build Coastguard Worker * */ 98*84e33947SAndroid Build Coastguard Worker void kiss_fft_stride(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int fin_stride); 99*84e33947SAndroid Build Coastguard Worker 100*84e33947SAndroid Build Coastguard Worker /* If kiss_fft_alloc allocated a buffer, it is one contiguous 101*84e33947SAndroid Build Coastguard Worker buffer and can be simply free()d when no longer needed*/ 102*84e33947SAndroid Build Coastguard Worker #define kiss_fft_free free 103*84e33947SAndroid Build Coastguard Worker 104*84e33947SAndroid Build Coastguard Worker /* 105*84e33947SAndroid Build Coastguard Worker Cleans up some memory that gets managed internally. Not necessary to call, but it might clean up 106*84e33947SAndroid Build Coastguard Worker your compiler output to call this before you exit. 107*84e33947SAndroid Build Coastguard Worker */ 108*84e33947SAndroid Build Coastguard Worker void kiss_fft_cleanup(void); 109*84e33947SAndroid Build Coastguard Worker 110*84e33947SAndroid Build Coastguard Worker 111*84e33947SAndroid Build Coastguard Worker /* 112*84e33947SAndroid Build Coastguard Worker * Returns the smallest integer k, such that k>=n and k has only "fast" factors (2,3,5) 113*84e33947SAndroid Build Coastguard Worker */ 114*84e33947SAndroid Build Coastguard Worker int kiss_fft_next_fast_size(int n); 115*84e33947SAndroid Build Coastguard Worker 116*84e33947SAndroid Build Coastguard Worker /* for real ffts, we need an even size */ 117*84e33947SAndroid Build Coastguard Worker #define kiss_fftr_next_fast_size_real(n) \ 118*84e33947SAndroid Build Coastguard Worker (kiss_fft_next_fast_size( ((n)+1)>>1)<<1) 119*84e33947SAndroid Build Coastguard Worker 120*84e33947SAndroid Build Coastguard Worker #ifdef __cplusplus 121*84e33947SAndroid Build Coastguard Worker } 122*84e33947SAndroid Build Coastguard Worker #endif 123*84e33947SAndroid Build Coastguard Worker 124*84e33947SAndroid Build Coastguard Worker #endif 125