my_math.c 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. #include "my_math.h"
  2. #include "hpm_math.h"
  3. #include <float.h>
  4. /*
  5. 关于 DSP库的使用
  6. =================================已经测试可以使用的========================
  7. 100个float数据的运算
  8. sin() 1839us-----sinf() 71us------arm_sin_f32 92us
  9. 100个float数据的运算
  10. sqrt() 421us-----sqrtf() 39us------__sqrtf() 24us------arm_sin_f32 29us
  11. */
  12. // @brief 把 buf 中数据按照小端形式搬运到 float 中
  13. void buf2float(float *tfloat, unsigned char *buf)
  14. {
  15. int i;
  16. unsigned char *p1 = (unsigned char *)tfloat;
  17. unsigned char *p3 = buf;
  18. for (i = 0; i < 4; i++)
  19. {
  20. *p1 = *p3;
  21. p1++;
  22. p3++;
  23. }
  24. }
  25. // @brief 把 buf 中数据按照小端形式搬运到 long 中
  26. void buf2long(long *tfloat, unsigned char *buf)
  27. {
  28. int i;
  29. unsigned char *p1 = (unsigned char *)tfloat;
  30. unsigned char *p3 = buf;
  31. for (i = 0; i < 4; i++)
  32. {
  33. *p1 = *p3;
  34. p1++;
  35. p3++;
  36. }
  37. }
  38. // @brief 把 buf 中数据按照小端形式搬运到 int 中
  39. void buf2int(int *tint, unsigned char *buf)
  40. {
  41. int i;
  42. unsigned char *p1 = (unsigned char *)tint;
  43. unsigned char *p3 = buf;
  44. for (i = 0; i < 4; i++)
  45. {
  46. *p1 = *p3;
  47. p1++;
  48. p3++;
  49. }
  50. }
  51. // @brief 把 buf 中数据按照小端形式搬运到 short 中
  52. void buf2short(short *tshort, unsigned char *buf)
  53. {
  54. int i;
  55. unsigned char *p1 = (unsigned char *)tshort;
  56. unsigned char *p3 = buf;
  57. for (i = 0; i < 2; i++)
  58. {
  59. *p1 = *p3;
  60. p1++;
  61. p3++;
  62. }
  63. }
  64. void float2buf(unsigned char *buf, float *tfloat)
  65. {
  66. int i;
  67. unsigned char *p1 = (unsigned char *)tfloat;
  68. unsigned char *p3 = buf;
  69. for (i = 0; i < 4; i++)
  70. {
  71. *p3 = *p1;
  72. p1++;
  73. p3++;
  74. }
  75. }
  76. void int2buf(unsigned char *buf, int *tint)
  77. {
  78. int i;
  79. unsigned char *p1 = (unsigned char *)tint;
  80. unsigned char *p3 = buf;
  81. for (i = 0; i < 4; i++)
  82. {
  83. *p3 = *p1;
  84. p1++;
  85. p3++;
  86. }
  87. }
  88. /*
  89. STM32默认是小端模式
  90. 数据: 11 22 33 44
  91. 字节: 高→→→→→→→低
  92. 小端模式
  93. 地址:0 1 2 3
  94. 内存:44 33 22 11
  95. 大端模式
  96. 地址:0 1 2 3
  97. 内存:11 22 33 44
  98. */
  99. void short2buf(unsigned char *buf, short *tshort)
  100. {
  101. int i;
  102. unsigned char *p1 = (unsigned char *)tshort;
  103. unsigned char *p3 = buf;
  104. for (i = 0; i < 2; i++)
  105. {
  106. *p3 = *p1;
  107. p1++;
  108. p3++;
  109. }
  110. }
  111. int brinv(float a[], int n)
  112. {
  113. int *is, *js, i, j, k, l, u, v;
  114. int temp1[5];
  115. int temp2[5];
  116. float d, p;
  117. is = temp1;
  118. js = temp2;
  119. for (k = 0; k <= n - 1; k++)
  120. {
  121. d = 0.0f;
  122. for (i = k; i <= n - 1; i++)
  123. for (j = k; j <= n - 1; j++)
  124. {
  125. l = i * n + j;
  126. p = fabsf(a[l]);
  127. if (p > d)
  128. {
  129. d = p;
  130. is[k] = i;
  131. js[k] = j;
  132. }
  133. }
  134. if (d + 1.0f == 1.0f)
  135. {
  136. return (0);
  137. }
  138. if (is[k] != k)
  139. {
  140. for (j = 0; j <= n - 1; j++)
  141. {
  142. u = k * n + j;
  143. v = is[k] * n + j;
  144. p = a[u];
  145. a[u] = a[v];
  146. a[v] = p;
  147. }
  148. }
  149. if (js[k] != k)
  150. for (i = 0; i <= n - 1; i++)
  151. {
  152. u = i * n + k;
  153. v = i * n + js[k];
  154. p = a[u];
  155. a[u] = a[v];
  156. a[v] = p;
  157. }
  158. l = k * n + k;
  159. a[l] = 1.0f / a[l];
  160. for (j = 0; j <= n - 1; j++)
  161. if (j != k)
  162. {
  163. u = k * n + j;
  164. a[u] = a[u] * a[l];
  165. }
  166. for (i = 0; i <= n - 1; i++)
  167. if (i != k)
  168. for (j = 0; j <= n - 1; j++)
  169. if (j != k)
  170. {
  171. u = i * n + j;
  172. a[u] = a[u] - a[i * n + k] * a[k * n + j];
  173. }
  174. for (i = 0; i <= n - 1; i++)
  175. if (i != k)
  176. {
  177. u = i * n + k;
  178. a[u] = -a[u] * a[l];
  179. }
  180. }
  181. for (k = n - 1; k >= 0; k--)
  182. {
  183. if (js[k] != k)
  184. for (j = 0; j <= n - 1; j++)
  185. {
  186. u = k * n + j;
  187. v = js[k] * n + j;
  188. p = a[u];
  189. a[u] = a[v];
  190. a[v] = p;
  191. }
  192. if (is[k] != k)
  193. for (i = 0; i <= n - 1; i++)
  194. {
  195. u = i * n + k;
  196. v = i * n + is[k];
  197. p = a[u];
  198. a[u] = a[v];
  199. a[v] = p;
  200. }
  201. }
  202. return (1);
  203. }
  204. unsigned char constrain_uint8(unsigned char value, unsigned char min,
  205. unsigned char max)
  206. {
  207. if (value > max)
  208. value = max;
  209. else if (value < min)
  210. value = min;
  211. return value;
  212. }
  213. short math_constrain(short value, short min, short max)
  214. {
  215. if (value > max)
  216. value = max;
  217. else if (value < min)
  218. value = min;
  219. return value;
  220. }
  221. // constrain a value
  222. // float constrain_float(float amt, float low, float high)
  223. // {
  224. // // the check for NaN as a float prevents propogation of
  225. // // floating point errors through any function that uses
  226. // // constrain_float(). The normal float semantics already handle -Inf
  227. // // and +Inf
  228. // if (isnan(amt))
  229. // {
  230. // return (low + high) * 0.5f;
  231. // }
  232. // return ((amt) < (low) ? (low) : ((amt) > (high) ? (high) : (amt)));
  233. // }
  234. // constrain a int16_t value
  235. int16_t constrain_int16(int16_t amt, int16_t low, int16_t high)
  236. {
  237. return ((amt) < (low) ? (low) : ((amt) > (high) ? (high) : (amt)));
  238. }
  239. // constrain a int32_t value
  240. int32_t constrain_int32(int32_t amt, int32_t low, int32_t high)
  241. {
  242. return ((amt) < (low) ? (low) : ((amt) > (high) ? (high) : (amt)));
  243. }
  244. short abs_int16(short value)
  245. {
  246. if ((value > 0) || (value == 0))
  247. return value;
  248. return -value;
  249. }
  250. float min_float(float value1, float value2)
  251. {
  252. if (value1 < value2)
  253. return value1;
  254. return value2;
  255. }
  256. int min_int32(int value1, int value2)
  257. {
  258. if (value1 < value2)
  259. return value1;
  260. return value2;
  261. }
  262. short min_int16(short value1, short value2)
  263. {
  264. if (value1 < value2)
  265. return value1;
  266. return value2;
  267. }
  268. float max_float(float value1, float value2)
  269. {
  270. if (value1 > value2)
  271. return value1;
  272. return value2;
  273. }
  274. int max_int32(int value1, int value2)
  275. {
  276. if (value1 > value2)
  277. return value1;
  278. return value2;
  279. }
  280. short max_int16(short value1, short value2)
  281. {
  282. if (value1 > value2)
  283. return value1;
  284. return value2;
  285. }
  286. // is a float is zero
  287. bool is_zero(const float fVal1)
  288. {
  289. return fabsf(fVal1) < FLT_EPSILON ? true : false;
  290. }
  291. float no_zero_float(float Val1)
  292. {
  293. if (Val1 == 0.0f)
  294. return 0.1f;
  295. return Val1;
  296. }
  297. int no_zero_int32(int Val1)
  298. {
  299. if (Val1 == 0)
  300. return 1;
  301. return Val1;
  302. }
  303. // square
  304. float sq(float v) { return v * v; }
  305. // @brief 获取两个数的平方和开根号
  306. float get_norm(float a, float b)
  307. {
  308. float norm;
  309. arm_sqrt_f32(sq(a) + sq(b), &norm);
  310. return norm;
  311. }
  312. // 计算数据的标准差
  313. // float stdev(short num[], int n)
  314. // {
  315. // int i = 0;
  316. // float sum = 0.0f;
  317. // float avg = 0.0f;
  318. //
  319. // sum = 0.0f;
  320. // for (i = 0; i < n; i++)
  321. // {
  322. // sum += num[i];
  323. // }
  324. //
  325. // avg = sum / n;
  326. //
  327. // sum = 0.0f;
  328. // for (i = 0; i < n; i++)
  329. // {
  330. // sum += (num[i] - avg) * (num[i] - avg);
  331. // }
  332. //
  333. // return (__sqrtf(sum / n));
  334. // }
  335. /** @brief 插入排序算法
  336. * @param int arr[]被排数列,int n 排序窗宽
  337. * @retval none
  338. */
  339. void insert_sort(int arr[], int n)
  340. {
  341. int temp;
  342. int i, j;
  343. for (i = 1; i < n; ++i)
  344. {
  345. temp = arr[i];
  346. for (j = i; j > 0 && temp < arr[j - 1]; --j)
  347. {
  348. arr[j] = arr[j - 1];
  349. }
  350. arr[j] = temp;
  351. }
  352. }
  353. // =========================