xref: /aosp_15_r20/system/chre/external/kiss_fft/kiss_fft.h (revision 84e339476a462649f82315436d70fd732297a399)
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