my_math.c 7.9 KB

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