
#ifndef _FIXED_POINT_H_
#define _FIXED_POINT_H_   1

#ifdef _MSC_VER
#define inline __inline
#endif

#ifdef Linux_make
#include "SamsungTxECNS_typedef.h"
#elif defined Linux_gcc_make
#include "SamsungTxECNS_typedef.h"
#else
#include "../Main/SamsungTxECNS_typedef.h"
#endif

#ifdef __cplusplus
extern "C"{
#endif

#define FLOAT2FIXED(R, qfrac)   ((Word32)((float)(R) * (float)FIXED_ONE(qfrac) + ((R >= 0) ? 0.5f : -0.5f)))
#define FIXED_ONE(qfrac)        ((U_Word32)      1 << (qfrac))
/**
No matter in Fixed-point DSP or Float point DSP, the mutiply or divide operation between a float value and a integer value
which is the exponent of 2(2^x) must excute very quickly because the float bits mode.
*/
extern inline Word16 fl2Fixed_f(double value, U_Word32 qForm);
extern inline float Fixed2fp_f(Word16 fx_v, U_Word32 qForm);
extern inline Word32 fp2Fixed32_f(double value, U_Word32 qForm);
extern inline float Fixed32_2_fp_f(Word32 fx_v, U_Word32 qForm);
extern inline Word32 int2Fixed32_f(int value, U_Word32 qForm);
extern inline Word16 int2Fixed_f(int value, U_Word32 qForm);
extern inline Word32 Fixed2Fixed_f(Word32 value, U_Word32 valueQForm, U_Word32 targetQForm);
extern inline Word16 F32_2_F16_f(Word32 value, U_Word32 valueQForm, U_Word32 targetQForm);
extern inline Word32 F16_2_F32_f(Word16 value, U_Word32 valueQForm, U_Word32 targetQForm);
extern inline Word32 multiply(Word32 var1, U_Word32 var1_qForm, Word32 var2, U_Word32 var2_qForm, U_Word32 dest_qForm);

extern Word16 divide_ss(Word16 var1_denorm, Word16 q1, Word16 var2_denorm, Word16 q2, Word16 dest_qForm);
extern Word32 divide(Word32 var1_denorm, Word32 q1, Word32 var2_denorm, Word32 q2, Word32 dest_qForm);
extern Word32 exp_fixed(Word32 arg_in, Word32 Q_in, Word32 Q_out);

extern Word32 SRCB_Pow2(Word16 exponant,Word16 fraction);
extern Word32 Pow_E(Word32 in, Word16 Q_in);
extern Word16 fn_recursive_avg_s(Word16 x, Word16 beta, Word16 y, Word16 beta_1);
//extern Word32 fn_recursive_avg_l(Word32 x, Word16 beta, Word32 y, Word16 beta_1);
//extern Word64 fn_recursive_avg_ll(Word64 x, Word32 beta, Word64 y, Word32 beta_1);
extern Word64 divide_ll(Word64 x1, Word16 q_x1, Word64 x2, Word16 q_x2, Word16 q_out);
extern Word32 SamsungTxECNS_GEVD_sqrt(Word64 in, int in_Q, int out_Q);
extern Word32 div_alt(Word32 var1_denorm, Word16 q1, Word32 var2_denorm, Word16 q2, Word16 dest_qForm);

#ifdef __cplusplus
}
#endif

#endif//_FIXED_POINT_H_

