diff options
Diffstat (limited to 'src/ffts.h')
-rw-r--r-- | src/ffts.h | 273 |
1 files changed, 155 insertions, 118 deletions
@@ -30,21 +30,21 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + #ifndef __CP_SSE_H__ #define __CP_SSE_H__ -#include "config.h" +//#include "config.h" +//#include "codegen.h" +#include "ffts_attributes.h" +#include "types.h" -#include <stdio.h> -#include <stdlib.h> +#include <malloc.h> #include <math.h> #include <stddef.h> #include <stdint.h> -//#include <stdalign.h> - -//#include "codegen.h" -#include "types.h" - +#include <stdlib.h> +#include <stdio.h> #ifdef __ANDROID__ #include <android/log.h> @@ -53,29 +53,14 @@ #define LOG(s) fprintf(stderr, s) #endif -#define PI 3.1415926535897932384626433832795028841971693993751058209 - -static const __attribute__ ((aligned(64))) float w_data[16] = { - 0.70710678118654757273731092936941, 0.70710678118654746171500846685376, - -0.70710678118654757273731092936941, -0.70710678118654746171500846685376, - 1.0f, 0.70710678118654757273731092936941f, - -0.0f, -0.70710678118654746171500846685376, - 0.70710678118654757273731092936941, 0.70710678118654746171500846685376, - 0.70710678118654757273731092936941, 0.70710678118654746171500846685376, - 1.0f, 0.70710678118654757273731092936941f, - 0.0f, 0.70710678118654746171500846685376 -}; - -__INLINE float W_re(float N, float k) { return cos(-2.0f * PI * k / N); } -__INLINE float W_im(float N, float k) { return sin(-2.0f * PI * k / N); } - -typedef size_t transform_index_t; - -//typedef void (*transform_func_t)(float *data, size_t N, float *LUT); -typedef void (*transform_func_t)(float *data, size_t N, float *LUT); +#ifndef M_PI +#define M_PI 3.1415926535897932384626433832795028841971693993751058209 +#endif typedef struct _ffts_plan_t ffts_plan_t; +typedef void (*transform_func_t)(ffts_plan_t *p, const void *in, void *out); + /** * Contains all the Information need to perform FFT * @@ -86,101 +71,153 @@ typedef struct _ffts_plan_t ffts_plan_t; */ struct _ffts_plan_t { - /** - * - */ - ptrdiff_t *offsets; + /** + * + */ + ptrdiff_t *offsets; #ifdef DYNAMIC_DISABLED - /** - * Twiddle factors - */ - void *ws; - /** - * ee - 2 size x size8 - * oo - 2 x size4 in parallel - * oe - - */ - void *oe_ws, *eo_ws, *ee_ws; + /** + * Twiddle factors + */ + void *ws; + + /** + * ee - 2 size x size8 + * oo - 2 x size4 in parallel + * oe - + */ + void *oe_ws, *eo_ws, *ee_ws; #else - void __attribute__((aligned(32))) *ws; - void __attribute__((aligned(32))) *oe_ws, *eo_ws, *ee_ws; + void FFTS_ALIGN(32) *ws; + void FFTS_ALIGN(32) *oe_ws, *eo_ws, *ee_ws; #endif - /** - * Pointer into an array of precomputed indexes for the input data array - */ - ptrdiff_t *is; - - /** - * Twiddle Factor Indexes - */ - size_t *ws_is; - - /** - * Size of the loops for the base cases - */ - size_t i0, i1, n_luts; - - /** - * Size fo the Transform - */ - size_t N; - void *lastlut; - /** - * Used in multidimensional Code ?? - */ - transform_index_t *transforms; - //transform_func_t transform; - - /** - * Pointer to the dynamically generated function - * that will execute the FFT - */ - void (*transform)(ffts_plan_t * , const void * , void * ); - - /** - * Pointer to the base memory address of - * of the transform function - */ - void *transform_base; - - /** - * Size of the memory block contain the - * generated code - */ - size_t transform_size; - - /** - * Points to the cosnant variables used by - * the Assembly Code - */ - void *constants; - - // multi-dimensional stuff: - struct _ffts_plan_t **plans; - int rank; - size_t *Ns, *Ms; - void *buf; - - void *transpose_buf; - - /** - * Pointer to the destroy function - * to clean up the plan after use - * (differs for real and multi dimension transforms - */ - void (*destroy)(ffts_plan_t *); - - /** - * Coefficiants for the real valued transforms - */ - float *A, *B; - - size_t i2; + + /** + * Pointer into an array of precomputed indexes for the input data array + */ + ptrdiff_t *is; + + /** + * Twiddle Factor Indexes + */ + size_t *ws_is; + + /** + * Size of the loops for the base cases + */ + size_t i0, i1, n_luts; + + /** + * Size fo the Transform + */ + size_t N; + void *lastlut; + + /** + * Used in multidimensional Code ?? + */ + size_t *transforms; + + /** + * Pointer to the dynamically generated function + * that will execute the FFT + */ + transform_func_t transform; + + /** + * Pointer to the base memory address of + * of the transform function + */ + void *transform_base; + + /** + * Size of the memory block contain the + * generated code + */ + size_t transform_size; + + /** + * Points to the cosnant variables used by + * the Assembly Code + */ + void *constants; + + // multi-dimensional stuff: + struct _ffts_plan_t **plans; + int rank; + size_t *Ns, *Ms; + void *buf; + + void *transpose_buf; + + /** + * Pointer to the destroy function + * to clean up the plan after use + * (differs for real and multi dimension transforms + */ + void (*destroy)(ffts_plan_t *); + + /** + * Coefficiants for the real valued transforms + */ + float *A, *B; + + size_t i2; }; +static FFTS_INLINE void *ffts_aligned_malloc(size_t size) +{ +#if defined(_MSC_VER) + return _aligned_malloc(size, 32); +#else + return valloc(size); +#endif +} -void ffts_free(ffts_plan_t *); +static FFTS_INLINE void ffts_aligned_free(void *p) +{ +#if defined(_MSC_VER) + _aligned_free(p); +#else + free(p); +#endif +} + +#if GCC_VERSION_AT_LEAST(3,3) +#define ffts_ctzl __builtin_ctzl +#elif defined(_MSC_VER) +#include <intrin.h> +#ifdef _M_AMD64 +#pragma intrinsic(_BitScanForward64) +static __inline unsigned long ffts_ctzl(size_t N) +{ + unsigned long count; + _BitScanForward64((unsigned long*) &count, N); + return count; +} +#else +#pragma intrinsic(_BitScanForward) +static __inline unsigned long ffts_ctzl(size_t N) +{ + unsigned long count; + _BitScanForward((unsigned long*) &count, N); + return count; +} +#endif /* _WIN64 */ +#endif /* _MSC_VER */ + +static FFTS_ALWAYS_INLINE float W_re(float N, float k) +{ + return cos(-2.0 * M_PI * k / N); +} + +static FFTS_ALWAYS_INLINE float W_im(float N, float k) +{ + return sin(-2.0 * M_PI * k / N); +} + +void ffts_free(ffts_plan_t *); +void ffts_execute(ffts_plan_t *, const void *, void *); ffts_plan_t *ffts_init_1d(size_t N, int sign); -void ffts_execute(ffts_plan_t *, const void *, void *); + #endif -// vim: set autoindent noexpandtab tabstop=3 shiftwidth=3: |