fix_math.h 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #ifndef _FIX_MATH_H__
  2. #define _FIX_MATH_H__
  3. #include "bsp/bsp.h"
  4. #include "os/os_types.h"
  5. typedef signed short sfix16En10_t;
  6. typedef signed short sfix16En6_t;
  7. typedef signed short sfix16En5_t;
  8. typedef signed short sfix16En4_t;
  9. typedef int sfix32En4_t;
  10. #define Fix10_6(x) (x >> 4)
  11. #define i2sFix6(x) ((sfix16En6_t)(x <<6))
  12. #define i2sFix5(x) ((sfix16En6_t)(x <<5))
  13. #define i2sFix4(x) ((sfix16En6_t)(x <<4))
  14. #define i2sFix10(x) ((sfix16En6_t)(x <<10))
  15. #define i2sFix32E4(x) ((sfix32En4_t)(x <<4))
  16. #define sFix32E4_s16(x) ((s16)(x >> 4))
  17. static __INLINE sfix16En10_t ftoSfix10(float v) {
  18. s16 num = (s16)v;
  19. float tail_f = v - num;
  20. u8 tail_u8 = (u8)(tail_f / (1.0f / 1024.0f));
  21. return (s16) ((num << 10) | (tail_u8 & 0x03FF));
  22. }
  23. static __INLINE float sfix6toF(sfix16En6_t v) {
  24. s16 num = (v >> 6) & 0xFFFF;
  25. u16 tail = v & 0x003F;
  26. float f = num + (float)tail / 64.0f;
  27. return f;
  28. }
  29. static __INLINE sfix16En6_t ftoSfix6(float v) {
  30. s16 num = (s16)v;
  31. float tail_f = v - num;
  32. u8 tail_u8 = (u8)(tail_f / (1.0f / 64.0f));
  33. return (s16) ((num << 6) | (tail_u8 & 0x003F));
  34. }
  35. #endif /* _FIX_MATH_H__ */