Mercurial > hg > peckfft
diff _peck_fft_guts.h @ 6:fee54f1878f7
kill FIXED_POINT stuff, simplify
author | Peter Meerwald <p.meerwald@bct-electronic.com> |
---|---|
date | Fri, 16 Sep 2011 15:18:28 +0200 |
parents | 2d6c49fcafcb |
children | 655dc5c14169 |
line wrap: on
line diff
--- a/_peck_fft_guts.h Fri Sep 16 15:08:29 2011 +0200 +++ b/_peck_fft_guts.h Fri Sep 16 15:18:28 2011 +0200 @@ -33,102 +33,46 @@ }; /* - Explanation of macros dealing with complex math: - - C_MUL(m,a,b) : m = a*b - C_FIXDIV( c , div ) : if a fixed point impl., c /= div. noop otherwise - C_SUB( res, a,b) : res = a - b - C_SUBFROM( res , a) : res -= a - C_ADDTO( res , a) : res += a - * */ -#ifdef FIXED_POINT -#if (FIXED_POINT==32) -# define FRACBITS 31 -# define SAMPPROD int64_t -#define SAMP_MAX 2147483647 -#else -# define FRACBITS 15 -# define SAMPPROD int32_t -#define SAMP_MAX 32767 -#endif - -#define SAMP_MIN -SAMP_MAX - -#if defined(CHECK_OVERFLOW) -# define CHECK_OVERFLOW_OP(a,op,b) \ - if ( (SAMPPROD)(a) op (SAMPPROD)(b) > SAMP_MAX || (SAMPPROD)(a) op (SAMPPROD)(b) < SAMP_MIN ) { \ - fprintf(stderr,"WARNING:overflow @ " __FILE__ "(%d): (%d " #op" %d) = %ld\n",__LINE__,(a),(b),(SAMPPROD)(a) op (SAMPPROD)(b) ); } -#endif - - -# define smul(a,b) ( (SAMPPROD)(a)*(b) ) -# define sround( x ) (peck_fft_scalar)( ( (x) + (1<<(FRACBITS-1)) ) >> FRACBITS ) - -# define S_MUL(a,b) sround( smul(a,b) ) - -# define C_MUL(m,a,b) \ - do{ (m).r = sround( smul((a).r,(b).r) - smul((a).i,(b).i) ); \ - (m).i = sround( smul((a).r,(b).i) + smul((a).i,(b).r) ); }while(0) - -# define DIVSCALAR(x,k) \ - (x) = sround( smul( x, SAMP_MAX/k ) ) - -# define C_FIXDIV(c,div) \ - do { DIVSCALAR( (c).r , div); \ - DIVSCALAR( (c).i , div); }while (0) - -# define C_MULBYSCALAR( c, s ) \ - do{ (c).r = sround( smul( (c).r , s ) ) ;\ - (c).i = sround( smul( (c).i , s ) ) ; }while(0) + * Explanation of macros dealing with complex math: + * C_MUL(m,a,b) : m = a*b + * C_SUB( res, a,b) : res = a - b + * C_SUBFROM( res , a) : res -= a + * C_ADDTO( res , a) : res += a + */ -#else /* not FIXED_POINT*/ - -# define S_MUL(a,b) ( (a)*(b) ) -#define C_MUL(m,a,b) \ - do{ (m).r = (a).r*(b).r - (a).i*(b).i;\ - (m).i = (a).r*(b).i + (a).i*(b).r; }while(0) -# define C_FIXDIV(c,div) /* NOOP */ -# define C_MULBYSCALAR( c, s ) \ - do{ (c).r *= (s);\ - (c).i *= (s); }while(0) -#endif - -#ifndef CHECK_OVERFLOW_OP -# define CHECK_OVERFLOW_OP(a,op,b) /* noop */ -#endif - -#define C_ADD( res, a,b)\ +#define S_MUL(a, b) ((a) * (b)) +#define C_MUL(m, a, b) \ do { \ - CHECK_OVERFLOW_OP((a).r,+,(b).r)\ - CHECK_OVERFLOW_OP((a).i,+,(b).i)\ - (res).r=(a).r+(b).r; (res).i=(a).i+(b).i; \ - }while(0) -#define C_SUB( res, a,b)\ + (m).r = (a).r*(b).r - (a).i*(b).i; \ + (m).i = (a).r*(b).i + (a).i*(b).r; \ + } while(0) +#define C_MULBYSCALAR(c, s ) \ + do { \ + (c).r *= (s); \ + (c).i *= (s); \ + } while(0) +#define C_ADD(res, a, b) \ do { \ - CHECK_OVERFLOW_OP((a).r,-,(b).r)\ - CHECK_OVERFLOW_OP((a).i,-,(b).i)\ - (res).r=(a).r-(b).r; (res).i=(a).i-(b).i; \ - }while(0) -#define C_ADDTO( res , a)\ + (res).r = (a).r + (b).r; \ + (res).i = (a).i + (b).i; \ + } while(0) +#define C_SUB(res, a, b) \ do { \ - CHECK_OVERFLOW_OP((res).r,+,(a).r)\ - CHECK_OVERFLOW_OP((res).i,+,(a).i)\ - (res).r += (a).r; (res).i += (a).i;\ - }while(0) + (res).r = (a).r - (b).r; \ + (res).i = (a).i - (b).i; \ + } while(0) +#define C_ADDTO(res, a) \ + do { \ + (res).r += (a).r; \ + (res).i += (a).i; \ + } while(0) +#define C_SUBFROM(res, a) \ + do { \ + (res).r -= (a).r; \ + (res).i -= (a).i; \ + } while(0) -#define C_SUBFROM( res , a)\ - do {\ - CHECK_OVERFLOW_OP((res).r,-,(a).r)\ - CHECK_OVERFLOW_OP((res).i,-,(a).i)\ - (res).r -= (a).r; (res).i -= (a).i; \ - }while(0) - - -#ifdef FIXED_POINT - #define PECK_FFT_COS(phase) floorf(0.5f+SAMP_MAX * cosf(phase)) - #define PECK_FFT_SIN(phase) floorf(0.5f+SAMP_MAX * sinf(phase)) - #define HALF_OF(x) ((x)>>1) -#elif USE_SIMD == SIMD_SSE2 +#if USE_SIMD == SIMD_SSE2 #define PECK_FFT_COS(phase) _mm_set1_ps(cosf(phase)) #define PECK_FFT_SIN(phase) _mm_set1_ps(sinf(phase)) #define HALF_OF(x) ((x)*_mm_set1_ps(0.5f)) @@ -147,16 +91,10 @@ #endif #define kf_cexp(x,phase) \ - do{ \ - (x)->r = PECK_FFT_COS(phase);\ - (x)->i = PECK_FFT_SIN(phase);\ - }while(0) - - -/* a debugging function */ -#define pcpx(c)\ - fprintf(stderr,"%g + %gi\n",(double)((c)->r),(double)((c)->i) ) - + do { \ + (x)->r = PECK_FFT_COS(phase); \ + (x)->i = PECK_FFT_SIN(phase); \ + } while(0) #ifdef PECK_FFT_USE_ALLOCA // define this to allow use of alloca instead of malloc for temporary buffers