#ifndef __FMATH_H__ #define __FMATH_H__ #include #ifdef __cplusplus extern "C" { #endif #ifndef INLINE #ifdef _MSC_VER #define INLINE __inline #else #define INLINE inline #endif /* _MSC_VER */ #endif /* INLINE */ // typedef int32_t inumber; typedef int16_t inumber; //#define __Q8P24__ #define Q_PCM_16_MAX #define Q_PCM_16_MIN // Qbits #ifdef __Q8P24__ #define FIXED_FRACBITS 24 #define Q_PCM_MAX 16609444 #define Q_PCM_MIN -16609444 #endif #ifdef __Q17P15__ #define FIXED_FRACBITS 15 #define Q_PCM_MAX 32767 #define Q_PCM_MIN -32768 #endif #ifdef __Q8P23__ #define FIXED_FRACBITS 23 #define Q_PCM_MAX 8304721 #define Q_PCM_MIN -8304721 #endif #define Q_PCM_16_MAX 32767 #define Q_PCM_16_MIN -32768 #define FIXED_RESOLUTION (1 << FIXED_FRACBITS) #define FIXED_INT_MASK (0xffffffffL << FIXED_FRACBITS) #define FIXED_FRAC_MASK (~FIXED_INT_MASK) // square roots #define FIXED_SQRT_ERR (1 << (FIXED_FRACBITS - 10)) // fixedp2a #define FIXED_DECIMALDIGITS #define FIXED_FRACBITS 16 // transform Iinteger or floating point into fixed point(Q-format) #ifdef __LINUX__ #define PCM_N_INT_TO_Q( N, bits, Qbits ) (inumber)( (N)/(float)(1<<((bits)-1)) * (uint32_t)(1<<((Qbits))) ) #define PCM_N_Q_TO_INT( Q, bits, Qbits ) ( (float)(Q)/(uint32_t)(1<<((Qbits))) * (uint32_t)(1<<((bits)-1)) ) #define PCM_N_FLOAT_TO_Q(N,Qbits) (inumber)( (N) * (uint32_t)(1<<(Qbits)) ) #define PCM_N_Q_TO_FLOAT(Q,Qbits) ( Q /(float)(1<<((Qbits))) ) #endif #define PCM_Q_RANGE(Q,Qbits) ( {\ long v = Q;\ long max = (uint32_t)(1 << ((Qbits)-1)) - 1;\ if ( Q > max ) v = max;\ else if ( Q < -max ) v = min;\ v;\ }) #ifdef __LINUX__ #define Q_TO_FLOAT(Q) ( Q /(float)FIXED_RESOLUTION ) #endif #define Q_TO_INT(Q) ( (Q) >>FIXED_FRACBITS ) #define FLOAT_TO_Q(N) (inumber)((N) * FIXED_RESOLUTION) #define INT_TO_Q(N) (inumber)((N) << FIXED_FRACBITS) #define Q_ADD(A,B) ((A) + (B)) #define Q_SUB(A,B) ((A) - (B)) #ifdef __Q17P15__ #define Q_MUL(A,B) (int32_t)(((int32_t)(A) * (int32_t)(B)) >> FIXED_FRACBITS ) #define Q_DIV(A,B) (int32_t)(((int32_t)(A)<> FIXED_FRACBITS ) #define Q_DIV(A,B) (int32_t)(((int64_t)(A)<