my_math.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. #include "my_math.h"
  2. uint16_t sqrt_u16(uint32_t value)
  3. {
  4. uint32_t rem = 0;
  5. uint32_t sqrt_value = 0;
  6. uint32_t divisor = 0;
  7. for(int i = 0; i < 16; i++)
  8. {
  9. sqrt_value <<= 1;
  10. rem = ((rem << 2) + (value >> 30));
  11. value <<= 2;
  12. divisor = (sqrt_value << 1) + 1;
  13. if(divisor <= rem)
  14. {
  15. rem -= divisor;
  16. sqrt_value++;
  17. }
  18. }
  19. return (uint16_t)sqrt_value;
  20. }
  21. uint32_t sqrt_u32(uint64_t value)
  22. {
  23. uint32_t sqrt_value;
  24. uint64_t temp,ttp; //结果、循环计数
  25. if(value == 0) //被开方数,开方结果也为0
  26. {
  27. return 0;
  28. }
  29. sqrt_value = 0;
  30. temp = (value >> 30); //获取最高位
  31. temp <<= 2;
  32. if(temp > 1) //最高位为1
  33. {
  34. sqrt_value++; //结果当前位为1,否则为默认的0
  35. temp -= sqrt_value;
  36. }
  37. for(int i = 15; i > 0; i--) //求剩余的15位
  38. {
  39. sqrt_value <<= 1; //左移一位
  40. temp <<= 2;
  41. temp += (value >> 30); //假设
  42. ttp = sqrt_value;
  43. ttp = (ttp << 1) + 1;
  44. value <<= 2;
  45. if(temp >= ttp) //假设成立
  46. {
  47. temp -= ttp;
  48. sqrt_value++;
  49. }
  50. }
  51. return sqrt_value;
  52. }
  53. int16_t No_MaxMin_Average_short(int16_t *dest,uint32_t size)
  54. {
  55. int16_t min,max;
  56. int32_t value = 0;
  57. uint32_t i = 0;
  58. min = dest[0];
  59. max = dest[0];
  60. for(i = 1; i < size; i++)
  61. {
  62. if(dest[i] < min)
  63. {
  64. min = dest[i];
  65. }
  66. if(dest[i] > max)
  67. {
  68. max = dest[i];
  69. }
  70. }
  71. for(i = 0; i < size; i++)
  72. {
  73. value += dest[i];
  74. }
  75. value = value - min - max;
  76. value /= (size - 2);
  77. return (int16_t)value;
  78. }
  79. int16_t Average_short(int16_t *dest,uint32_t size)
  80. {
  81. int32_t value = 0;
  82. uint32_t i = 0;
  83. if(size == 1)
  84. {
  85. return *dest;
  86. }
  87. for(i = 0; i < size; i++)
  88. {
  89. value += dest[i];
  90. }
  91. value /= size;
  92. return (int16_t)value;
  93. }
  94. float Average_float(float *dest,uint32_t size)
  95. {
  96. float value = 0;
  97. if(size == 1)
  98. {
  99. return *dest;
  100. }
  101. value = dest[0];
  102. for(int i = 1; i < size; i++)
  103. {
  104. value += dest[i];
  105. value /= 2.0;
  106. }
  107. return value;
  108. }
  109. bool get_MaxMinValue(int16_t *max,int16_t *min,int16_t *value,uint32_t size)
  110. {
  111. if(size < 2)
  112. {
  113. return false;
  114. }
  115. *max = *value;
  116. *min = *value++;
  117. size--;
  118. while(size--)
  119. {
  120. if(*value < *min)
  121. {
  122. *min = *value;
  123. }
  124. else if(*value > *max)
  125. {
  126. *max = *value;
  127. }
  128. value++;
  129. }
  130. return true;
  131. }
  132. int get_MaxFloatArray(float *max,float *array,int count)
  133. {
  134. int idx = 0;
  135. for(int i = 0; i < count; i++)
  136. {
  137. if(*max < array[i])
  138. {
  139. *max = array[i];
  140. idx = i;
  141. }
  142. }
  143. return idx;
  144. }
  145. float get_float_Variance_Sum(float *value,int len)
  146. {
  147. float var = 0;
  148. float sum = 0;
  149. for(int i = 0; i < len; i++)
  150. {
  151. var += value[i];
  152. }
  153. var /= len;
  154. for(int i=0;i<len;i++)
  155. {
  156. sum+=(value[i]-var)*(value[i]-var);
  157. }
  158. return sum;
  159. }
  160. float get_float_abs(float value)
  161. {
  162. if(value < 0)
  163. {
  164. value = 0 - value;
  165. }
  166. return value;
  167. }
  168. double simpson(double (*f)(double),double l,double r){
  169. return (r - l) * (f(l) + 4 * f((l + r) / 2) + f(r)) / 6;
  170. }
  171. ///* 函数功能:计算函数1+x*x的函数值 */
  172. //float Fun1(float x)
  173. //{
  174. // return 1 + x * x;
  175. //}
  176. //
  177. ///* 函数功能:计算函数x/(1+x*x)的函数值 */
  178. //float Fun2(float x)
  179. //{
  180. // return x / (1 + x * x);
  181. //}
  182. /* 函数功能:用梯形法计算函数的定积分 */
  183. float Integral(float (*f)(float), float a, float b,int n)
  184. {
  185. float s, h;
  186. // int n = 100, i;
  187. s = ((*f)(a) + (*f)(b)) / 2;
  188. h = (b - a) / n;
  189. for (int i=1; i<n; i++)
  190. {
  191. s += (*f)(a + i * h);
  192. }
  193. return s * h ;
  194. }
  195. int get_int_Variance_Sum(int *value,int len)
  196. {
  197. int var=0;
  198. int sum=0;
  199. for(int i=0;i<len;i++)
  200. {
  201. var += value[i];
  202. }
  203. var /= len;
  204. for(int i=0;i<len;i++)
  205. {
  206. sum += (value[i]-var) * (value[i]-var);
  207. }
  208. return sum;
  209. }
  210. int get_ushort_Variance_Sum(uint16_t *value,int len)
  211. {
  212. int var=0;
  213. int sum=0;
  214. for(int i=0;i<len;i++)
  215. {
  216. var += value[i];
  217. }
  218. var /= len;
  219. for(int i=0;i<len;i++)
  220. {
  221. sum += (value[i]-var) * (value[i]-var);
  222. }
  223. return sum;
  224. }
  225. //将任意字符转换为十进制 [0-9a-zA-Z],61个字符,最大表示62进制
  226. int Base62_convertToDec(char c)
  227. {
  228. int decNum = 0;
  229. if(c>='0' && c<='9')
  230. {
  231. decNum = c - 48;
  232. }
  233. else if(c>='a' && c<='z')
  234. {
  235. decNum = c - 87;
  236. }
  237. else if(c>='A' && c<='Z')
  238. {
  239. decNum = c - 29;
  240. }
  241. return decNum;
  242. }
  243. //将十进制转换为这些字符 [0-9a-zA-Z],61个字符,最大表示62进制
  244. char Base62_convertFromDec(int c)
  245. {
  246. char objchar;
  247. if(c>=0 && c<=9)
  248. objchar=c+48;
  249. else if(c>=10 && c<=35)
  250. objchar=c+87;
  251. else if(c>=36 && c<=61)
  252. objchar=c+29;
  253. return objchar;
  254. }