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