fix_math.h 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #ifndef _FIX_MATH_H__
  2. #define _FIX_MATH_H__
  3. #include "bsp/bsp.h"
  4. #include "os/os_types.h"
  5. #include "libs/utils.h"
  6. typedef signed short s16q14_t;
  7. typedef signed short s16q10_t;
  8. typedef signed short s16q5_t;
  9. //typedef signed short s16q4_t;
  10. typedef int32_t s32q4_t;
  11. typedef int32_t s32q14_t;
  12. typedef int32_t s32q5_t;
  13. typedef int32_t s32q19_t;
  14. //#define S16Q4(A) (signed short)((A) * 16.0F)
  15. #define S16Q5(A) (signed short)((A) * 32.0F)
  16. #define S16Q10(A) (signed short)((A) * 1024.0F)
  17. #define S16Q14(A) (signed short)((A) * 16384.0F)
  18. #define S32Q4(A) (signed int)((A) * 16.0F)
  19. #define S32Q14(A) (signed int)((A) * 16384.0F)
  20. #define S32Q14_MUL(a, b) (((a)*(b)) >>14)
  21. #define S16_mul(a, b, q) (((u32)(a)*(b)) >> q)
  22. /*
  23. static __INLINE float S16Q4toF(s16q4_t v) {
  24. s16 num = (v >> 4) & 0xFFFF;
  25. u16 tail = v & 0x000F;
  26. float f = num + (float)tail / 16.0f;
  27. return f;
  28. }
  29. */
  30. static __INLINE float S16Q5toF(s16q5_t v) {
  31. s16 num = (v >> 5) & 0xFFFF;
  32. u16 tail = v & 0x001F;
  33. float f = num + (float)tail / 32.0f;
  34. return f;
  35. }
  36. static __INLINE float S16Q10toF(s16q5_t v) {
  37. s16 num = (v >> 10) & 0xFFFF;
  38. u16 tail = v & 0x03FF;
  39. float f = num + (float)tail / 1024.0f;
  40. return f;
  41. }
  42. static __INLINE float S32Q4toF(s32q4_t v) {
  43. s32 num = (v >> 4) & 0xFFFFFFFF;
  44. u16 tail = v & 0x000F;
  45. float f = num + (float)tail / 16.0f;
  46. return f;
  47. }
  48. #define MATH_sat(in, minOut, maxOut) (min((in), MAX((in), (minOut))))
  49. static __INLINE u16 Sqrt_Fix( u32 wInput )
  50. {
  51. s32 wtemprootnew;
  52. u8 biter = 0u;
  53. s32 wtemproot;
  54. if ( wInput <= ( s32 )2097152 ) {
  55. wtemproot = ( s32 )128;
  56. } else {
  57. wtemproot = ( s32 )8192;
  58. }
  59. do {
  60. wtemprootnew = ( wtemproot + wInput / wtemproot ) / ( s32 )2;
  61. if ( wtemprootnew == wtemproot ) {
  62. biter = 6u;
  63. } else {
  64. biter ++;
  65. wtemproot = wtemprootnew;
  66. }
  67. } while ( biter < 6u );
  68. return ( wtemprootnew );
  69. }
  70. void SinCos_Lut(s16q5_t angle, s16q14_t *s, s16q14_t *c);
  71. #endif /* _FIX_MATH_H__ */