35 #include "cpu_support.h"
42 # include <xmmintrin.h>
43 # define kiss_fft_scalar __m128
44 #define KISS_FFT_MALLOC(nbytes) memalign(16,nbytes)
46 #define KISS_FFT_MALLOC opus_alloc
52 # define kiss_fft_scalar opus_int32
53 # define kiss_twiddle_scalar opus_int16
57 # ifndef kiss_fft_scalar
59 # define kiss_fft_scalar float
60 # define kiss_twiddle_scalar float
61 # define KF_SUFFIX _celt_single
71 kiss_twiddle_scalar r;
72 kiss_twiddle_scalar i;
81 typedef struct arch_fft_state{
86 typedef struct kiss_fft_state{
93 opus_int16 factors[2*MAXFACTORS];
94 const opus_int16 *bitrev;
95 const kiss_twiddle_cpx *twiddles;
96 arch_fft_state *arch_fft;
99 #if defined(HAVE_ARM_NE10)
100 #include "arm/fft_arm.h"
128 kiss_fft_state *opus_fft_alloc_twiddles(
int nfft,
void * mem,
size_t * lenmem,
const kiss_fft_state *base,
int arch);
130 kiss_fft_state *opus_fft_alloc(
int nfft,
void * mem,
size_t * lenmem,
int arch);
142 void opus_fft_c(
const kiss_fft_state *cfg,
const kiss_fft_cpx *fin,kiss_fft_cpx *fout);
143 void opus_ifft_c(
const kiss_fft_state *cfg,
const kiss_fft_cpx *fin,kiss_fft_cpx *fout);
145 void opus_fft_impl(
const kiss_fft_state *st,kiss_fft_cpx *fout);
146 void opus_ifft_impl(
const kiss_fft_state *st,kiss_fft_cpx *fout);
148 void opus_fft_free(
const kiss_fft_state *cfg,
int arch);
151 void opus_fft_free_arch_c(kiss_fft_state *st);
152 int opus_fft_alloc_arch_c(kiss_fft_state *st);
154 #if !defined(OVERRIDE_OPUS_FFT)
156 #if defined(OPUS_HAVE_RTCD) && (defined(HAVE_ARM_NE10))
158 extern int (*
const OPUS_FFT_ALLOC_ARCH_IMPL[OPUS_ARCHMASK+1])(
161 #define opus_fft_alloc_arch(_st, arch) \
162 ((*OPUS_FFT_ALLOC_ARCH_IMPL[(arch)&OPUS_ARCHMASK])(_st))
164 extern void (*
const OPUS_FFT_FREE_ARCH_IMPL[OPUS_ARCHMASK+1])(
166 #define opus_fft_free_arch(_st, arch) \
167 ((*OPUS_FFT_FREE_ARCH_IMPL[(arch)&OPUS_ARCHMASK])(_st))
169 extern void (*
const OPUS_FFT[OPUS_ARCHMASK+1])(
const kiss_fft_state *cfg,
170 const kiss_fft_cpx *fin, kiss_fft_cpx *fout);
171 #define opus_fft(_cfg, _fin, _fout, arch) \
172 ((*OPUS_FFT[(arch)&OPUS_ARCHMASK])(_cfg, _fin, _fout))
174 extern void (*
const OPUS_IFFT[OPUS_ARCHMASK+1])(
const kiss_fft_state *cfg,
175 const kiss_fft_cpx *fin, kiss_fft_cpx *fout);
176 #define opus_ifft(_cfg, _fin, _fout, arch) \
177 ((*OPUS_IFFT[(arch)&OPUS_ARCHMASK])(_cfg, _fin, _fout))
181 #define opus_fft_alloc_arch(_st, arch) \
182 ((void)(arch), opus_fft_alloc_arch_c(_st))
184 #define opus_fft_free_arch(_st, arch) \
185 ((void)(arch), opus_fft_free_arch_c(_st))
187 #define opus_fft(_cfg, _fin, _fout, arch) \
188 ((void)(arch), opus_fft_c(_cfg, _fin, _fout))
190 #define opus_ifft(_cfg, _fin, _fout, arch) \
191 ((void)(arch), opus_ifft_c(_cfg, _fin, _fout))