fix_math.h 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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 sfix10_t;
  6. typedef signed short sfix6_t;
  7. typedef signed short sfix2_t;
  8. typedef signed short sfix1_t;
  9. #define Fix10_6(x) (x >> 4)
  10. #define i2sFix2(x) ((sfix2_t)(x <<2))
  11. #define i2sFix6(x) ((sfix6_t)(x <<6))
  12. #define i2sFix10(x) ((sfix6_t)(x <<10))
  13. #define i2sFix1(x) ((sfix2_1)(x <<1))
  14. #define sFix2ToI(x) ((s16)(x >> 2))
  15. static __INLINE sfix6_t ftoSfix10(float v) {
  16. s16 num = (s16)v;
  17. float tail_f = v - num;
  18. u8 tail_u8 = (u8)(tail_f / (1.0f / 1024.0f));
  19. return (s16) ((num << 10) | (tail_u8 & 0x03FF));
  20. }
  21. static __INLINE float sfix6toF(sfix6_t v) {
  22. s16 num = (v >> 6) & 0xFFFF;
  23. u16 tail = v & 0x003F;
  24. float f = num + (float)tail / 64.0f;
  25. return f;
  26. }
  27. static __INLINE sfix6_t ftoSfix6(float v) {
  28. s16 num = (s16)v;
  29. float tail_f = v - num;
  30. u8 tail_u8 = (u8)(tail_f / (1.0f / 64.0f));
  31. return (s16) ((num << 6) | (tail_u8 & 0x003F));
  32. }
  33. static __INLINE float sfix2toF(sfix6_t v) {
  34. s16 num = (v >> 2) & 0xFFFF;
  35. u16 tail = v & 0x003;
  36. float f = num + (float)tail / 4.0f;
  37. return f;
  38. }
  39. static __INLINE sfix6_t ftoSfix2(float v) {
  40. s16 num = (s16)v;
  41. float tail_f = v - num;
  42. u8 tail_u8 = (u8)(tail_f / (1.0f / 4.0f));
  43. return (s16) ((num << 2) | (tail_u8 & 0x0003));
  44. }
  45. #endif /* _FIX_MATH_H__ */