Changed the pulse spreading rotations so that the number of iterations is
[opus.git] / libcelt / kiss_fft.h
index b5d6453..f71a839 100644 (file)
@@ -33,22 +33,52 @@ extern "C" {
 
 #ifdef FIXED_POINT
 #include "arch.h"      
-#  define kiss_fft_scalar spx_int16_t
+#ifdef DOUBLE_PRECISION
+#  define kiss_fft_scalar celt_int32_t
+#  define kiss_twiddle_scalar celt_int32_t
+#  define KF_SUFFIX _celt_double
+#else
+#  define kiss_fft_scalar celt_int16_t
+#  define kiss_twiddle_scalar celt_int16_t
+#  define KF_SUFFIX _celt_single
+#endif
 #else
 # ifndef kiss_fft_scalar
 /*  default is float */
 #   define kiss_fft_scalar float
+#   define kiss_twiddle_scalar float
+#   define KF_SUFFIX _celt_single
 # endif
 #endif
 
+
+/* This adds a suffix to all the kiss_fft functions so we
+   can easily link with more than one copy of the fft */
+#define CAT_SUFFIX(a,b) a ## b
+#define SUF(a,b) CAT_SUFFIX(a, b)
+
+#define kiss_fft_alloc SUF(kiss_fft_alloc,KF_SUFFIX)
+#define kf_work SUF(kf_work,KF_SUFFIX)
+#define ki_work SUF(ki_work,KF_SUFFIX)
+#define kiss_fft SUF(kiss_fft,KF_SUFFIX)
+#define kiss_ifft SUF(kiss_ifft,KF_SUFFIX)
+#define kiss_fft_stride SUF(kiss_fft_stride,KF_SUFFIX)
+#define kiss_ifft_stride SUF(kiss_ifft_stride,KF_SUFFIX)
+
+
 typedef struct {
     kiss_fft_scalar r;
     kiss_fft_scalar i;
 }kiss_fft_cpx;
 
+typedef struct {
+   kiss_twiddle_scalar r;
+   kiss_twiddle_scalar i;
+}kiss_twiddle_cpx;
+
 typedef struct kiss_fft_state* kiss_fft_cfg;
 
-/* 
+/** 
  *  kiss_fft_alloc
  *  
  *  Initialize a FFT (or IFFT) algorithm's cfg/state buffer.
@@ -71,9 +101,16 @@ typedef struct kiss_fft_state* kiss_fft_cfg;
  *      buffer size in *lenmem.
  * */
 
-kiss_fft_cfg kiss_fft_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem); 
+kiss_fft_cfg kiss_fft_alloc(int nfft,void * mem,size_t * lenmem); 
 
-/*
+void kf_work(kiss_fft_cpx * Fout,const kiss_fft_cpx * f,const size_t fstride,
+             int in_stride,int * factors,const kiss_fft_cfg st,int N,int s2,int m2);
+
+/** Internal function. Can be useful when you want to do the bit-reversing yourself */
+void ki_work(kiss_fft_cpx * Fout, const kiss_fft_cpx * f, const size_t fstride,
+             int in_stride,int * factors,const kiss_fft_cfg st,int N,int s2,int m2);
+
+/**
  * kiss_fft(cfg,in_out_buf)
  *
  * Perform an FFT on a complex input buffer.
@@ -84,22 +121,18 @@ kiss_fft_cfg kiss_fft_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem)
     f[k].r and f[k].i
  * */
 void kiss_fft(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout);
+void kiss_ifft(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout);
 
-/*
+/**
  A more generic version of the above function. It reads its input from every Nth sample.
  * */
 void kiss_fft_stride(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int fin_stride);
+void kiss_ifft_stride(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int fin_stride);
 
-/* If kiss_fft_alloc allocated a buffer, it is one contiguous 
+/** If kiss_fft_alloc allocated a buffer, it is one contiguous 
    buffer and can be simply free()d when no longer needed*/
 #define kiss_fft_free celt_free
 
-/*
- Cleans up some memory that gets managed internally. Not necessary to call, but it might clean up 
- your compiler output to call this before you exit.
-*/
-void kiss_fft_cleanup(void);
-       
 
 #ifdef __cplusplus
 }