StatsTestsQ31.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476
  1. #include "arm_math.h"
  2. #include "StatsTestsQ31.h"
  3. #include <stdio.h>
  4. #include "Error.h"
  5. #include "Test.h"
  6. //#include <cstdio>
  7. #define SNR_THRESHOLD 100
  8. /*
  9. Reference patterns are generated with
  10. a double precision computation.
  11. */
  12. #define ABS_ERROR_Q31 ((q31_t)(100))
  13. #define ABS_ERROR_Q63 ((q63_t)(1<<18))
  14. void StatsTestsQ31::test_max_q31()
  15. {
  16. const q31_t *inp = inputA.ptr();
  17. q31_t result;
  18. uint32_t indexval;
  19. q31_t *refp = ref.ptr();
  20. int16_t *refind = maxIndexes.ptr();
  21. q31_t *outp = output.ptr();
  22. int16_t *ind = index.ptr();
  23. arm_max_q31(inp,
  24. inputA.nbSamples(),
  25. &result,
  26. &indexval);
  27. outp[0] = result;
  28. ind[0] = indexval;
  29. ASSERT_EQ(result,refp[this->refOffset]);
  30. ASSERT_EQ((int16_t)indexval,refind[this->refOffset]);
  31. }
  32. void StatsTestsQ31::test_min_q31()
  33. {
  34. const q31_t *inp = inputA.ptr();
  35. q31_t result;
  36. uint32_t indexval;
  37. q31_t *refp = ref.ptr();
  38. int16_t *refind = minIndexes.ptr();
  39. q31_t *outp = output.ptr();
  40. int16_t *ind = index.ptr();
  41. arm_min_q31(inp,
  42. inputA.nbSamples(),
  43. &result,
  44. &indexval);
  45. outp[0] = result;
  46. ind[0] = indexval;
  47. ASSERT_EQ(result,refp[this->refOffset]);
  48. ASSERT_EQ((int16_t)indexval,refind[this->refOffset]);
  49. }
  50. void StatsTestsQ31::test_mean_q31()
  51. {
  52. const q31_t *inp = inputA.ptr();
  53. q31_t result;
  54. q31_t *refp = ref.ptr();
  55. q31_t *outp = output.ptr();
  56. arm_mean_q31(inp,
  57. inputA.nbSamples(),
  58. &result);
  59. outp[0] = result;
  60. ASSERT_SNR(result,refp[this->refOffset],(float32_t)SNR_THRESHOLD);
  61. ASSERT_NEAR_EQ(result,refp[this->refOffset],ABS_ERROR_Q31);
  62. }
  63. void StatsTestsQ31::test_power_q31()
  64. {
  65. const q31_t *inp = inputA.ptr();
  66. q63_t result;
  67. q63_t *refp = refPower.ptr();
  68. q63_t *outp = outputPower.ptr();
  69. arm_power_q31(inp,
  70. inputA.nbSamples(),
  71. &result);
  72. outp[0] = result;
  73. ASSERT_SNR(result,refp[this->refOffset],(float32_t)SNR_THRESHOLD);
  74. ASSERT_NEAR_EQ(result,refp[this->refOffset],(q63_t)ABS_ERROR_Q63);
  75. }
  76. void StatsTestsQ31::test_rms_q31()
  77. {
  78. const q31_t *inp = inputA.ptr();
  79. q31_t result;
  80. q31_t *refp = ref.ptr();
  81. q31_t *outp = output.ptr();
  82. arm_rms_q31(inp,
  83. inputA.nbSamples(),
  84. &result);
  85. outp[0] = result;
  86. ASSERT_SNR(result,refp[this->refOffset],(float32_t)SNR_THRESHOLD);
  87. ASSERT_NEAR_EQ(result,refp[this->refOffset],ABS_ERROR_Q31);
  88. }
  89. void StatsTestsQ31::test_std_q31()
  90. {
  91. const q31_t *inp = inputA.ptr();
  92. q31_t result;
  93. q31_t *refp = ref.ptr();
  94. q31_t *outp = output.ptr();
  95. arm_std_q31(inp,
  96. inputA.nbSamples(),
  97. &result);
  98. outp[0] = result;
  99. ASSERT_SNR(result,refp[this->refOffset],(float32_t)SNR_THRESHOLD);
  100. ASSERT_NEAR_EQ(result,refp[this->refOffset],ABS_ERROR_Q31);
  101. }
  102. void StatsTestsQ31::test_var_q31()
  103. {
  104. const q31_t *inp = inputA.ptr();
  105. q31_t result;
  106. q31_t *refp = ref.ptr();
  107. q31_t *outp = output.ptr();
  108. arm_var_q31(inp,
  109. inputA.nbSamples(),
  110. &result);
  111. outp[0] = result;
  112. ASSERT_SNR(result,refp[this->refOffset],(float32_t)SNR_THRESHOLD);
  113. ASSERT_NEAR_EQ(result,refp[this->refOffset],ABS_ERROR_Q31);
  114. }
  115. void StatsTestsQ31::setUp(Testing::testID_t id,std::vector<Testing::param_t>& paramsArgs,Client::PatternMgr *mgr)
  116. {
  117. switch(id)
  118. {
  119. case StatsTestsQ31::TEST_MAX_Q31_1:
  120. {
  121. inputA.reload(StatsTestsQ31::INPUT1_Q31_ID,mgr,3);
  122. maxIndexes.reload(StatsTestsQ31::MAXINDEXES_S16_ID,mgr);
  123. ref.reload(StatsTestsQ31::MAXVALS_Q31_ID,mgr);
  124. output.create(1,StatsTestsQ31::OUT_Q31_ID,mgr);
  125. index.create(1,StatsTestsQ31::OUT_S16_ID,mgr);
  126. refOffset = 0;
  127. }
  128. break;
  129. case StatsTestsQ31::TEST_MAX_Q31_2:
  130. {
  131. inputA.reload(StatsTestsQ31::INPUT1_Q31_ID,mgr,8);
  132. maxIndexes.reload(StatsTestsQ31::MAXINDEXES_S16_ID,mgr);
  133. ref.reload(StatsTestsQ31::MAXVALS_Q31_ID,mgr);
  134. output.create(1,StatsTestsQ31::OUT_Q31_ID,mgr);
  135. index.create(1,StatsTestsQ31::OUT_S16_ID,mgr);
  136. refOffset = 1;
  137. }
  138. break;
  139. case StatsTestsQ31::TEST_MAX_Q31_3:
  140. {
  141. inputA.reload(StatsTestsQ31::INPUT1_Q31_ID,mgr,11);
  142. maxIndexes.reload(StatsTestsQ31::MAXINDEXES_S16_ID,mgr);
  143. ref.reload(StatsTestsQ31::MAXVALS_Q31_ID,mgr);
  144. output.create(1,StatsTestsQ31::OUT_Q31_ID,mgr);
  145. index.create(1,StatsTestsQ31::OUT_S16_ID,mgr);
  146. refOffset = 2;
  147. }
  148. break;
  149. case StatsTestsQ31::TEST_MEAN_Q31_4:
  150. {
  151. inputA.reload(StatsTestsQ31::INPUT2_Q31_ID,mgr,3);
  152. ref.reload(StatsTestsQ31::MEANVALS_Q31_ID,mgr);
  153. output.create(1,StatsTestsQ31::OUT_Q31_ID,mgr);
  154. refOffset = 0;
  155. }
  156. break;
  157. case StatsTestsQ31::TEST_MEAN_Q31_5:
  158. {
  159. inputA.reload(StatsTestsQ31::INPUT2_Q31_ID,mgr,8);
  160. ref.reload(StatsTestsQ31::MEANVALS_Q31_ID,mgr);
  161. output.create(1,StatsTestsQ31::OUT_Q31_ID,mgr);
  162. refOffset = 1;
  163. }
  164. break;
  165. case StatsTestsQ31::TEST_MEAN_Q31_6:
  166. {
  167. inputA.reload(StatsTestsQ31::INPUT2_Q31_ID,mgr,11);
  168. ref.reload(StatsTestsQ31::MEANVALS_Q31_ID,mgr);
  169. output.create(1,StatsTestsQ31::OUT_Q31_ID,mgr);
  170. refOffset = 2;
  171. }
  172. break;
  173. case StatsTestsQ31::TEST_MIN_Q31_7:
  174. {
  175. inputA.reload(StatsTestsQ31::INPUT1_Q31_ID,mgr,3);
  176. minIndexes.reload(StatsTestsQ31::MININDEXES_S16_ID,mgr);
  177. ref.reload(StatsTestsQ31::MINVALS_Q31_ID,mgr);
  178. output.create(1,StatsTestsQ31::OUT_Q31_ID,mgr);
  179. index.create(1,StatsTestsQ31::OUT_S16_ID,mgr);
  180. refOffset = 0;
  181. }
  182. break;
  183. case StatsTestsQ31::TEST_MIN_Q31_8:
  184. {
  185. inputA.reload(StatsTestsQ31::INPUT1_Q31_ID,mgr,8);
  186. minIndexes.reload(StatsTestsQ31::MININDEXES_S16_ID,mgr);
  187. ref.reload(StatsTestsQ31::MINVALS_Q31_ID,mgr);
  188. output.create(1,StatsTestsQ31::OUT_Q31_ID,mgr);
  189. index.create(1,StatsTestsQ31::OUT_S16_ID,mgr);
  190. refOffset = 1;
  191. }
  192. break;
  193. case StatsTestsQ31::TEST_MIN_Q31_9:
  194. {
  195. inputA.reload(StatsTestsQ31::INPUT1_Q31_ID,mgr,11);
  196. minIndexes.reload(StatsTestsQ31::MININDEXES_S16_ID,mgr);
  197. ref.reload(StatsTestsQ31::MINVALS_Q31_ID,mgr);
  198. output.create(1,StatsTestsQ31::OUT_Q31_ID,mgr);
  199. index.create(1,StatsTestsQ31::OUT_S16_ID,mgr);
  200. refOffset = 2;
  201. }
  202. break;
  203. case StatsTestsQ31::TEST_POWER_Q31_10:
  204. {
  205. inputA.reload(StatsTestsQ31::INPUT1_Q31_ID,mgr,3);
  206. refPower.reload(StatsTestsQ31::POWERVALS_Q63_ID,mgr);
  207. outputPower.create(1,StatsTestsQ31::OUT_Q31_ID,mgr);
  208. refOffset = 0;
  209. }
  210. break;
  211. case StatsTestsQ31::TEST_POWER_Q31_11:
  212. {
  213. inputA.reload(StatsTestsQ31::INPUT1_Q31_ID,mgr,8);
  214. refPower.reload(StatsTestsQ31::POWERVALS_Q63_ID,mgr);
  215. outputPower.create(1,StatsTestsQ31::OUT_Q31_ID,mgr);
  216. refOffset = 1;
  217. }
  218. break;
  219. case StatsTestsQ31::TEST_POWER_Q31_12:
  220. {
  221. inputA.reload(StatsTestsQ31::INPUT1_Q31_ID,mgr,11);
  222. refPower.reload(StatsTestsQ31::POWERVALS_Q63_ID,mgr);
  223. outputPower.create(1,StatsTestsQ31::OUT_Q31_ID,mgr);
  224. refOffset = 2;
  225. }
  226. break;
  227. case StatsTestsQ31::TEST_RMS_Q31_13:
  228. {
  229. inputA.reload(StatsTestsQ31::INPUT1_Q31_ID,mgr,3);
  230. ref.reload(StatsTestsQ31::RMSVALS_Q31_ID,mgr);
  231. output.create(1,StatsTestsQ31::OUT_Q31_ID,mgr);
  232. refOffset = 0;
  233. }
  234. break;
  235. case StatsTestsQ31::TEST_RMS_Q31_14:
  236. {
  237. inputA.reload(StatsTestsQ31::INPUT1_Q31_ID,mgr,8);
  238. ref.reload(StatsTestsQ31::RMSVALS_Q31_ID,mgr);
  239. output.create(1,StatsTestsQ31::OUT_Q31_ID,mgr);
  240. refOffset = 1;
  241. }
  242. break;
  243. case StatsTestsQ31::TEST_RMS_Q31_15:
  244. {
  245. inputA.reload(StatsTestsQ31::INPUT1_Q31_ID,mgr,11);
  246. ref.reload(StatsTestsQ31::RMSVALS_Q31_ID,mgr);
  247. output.create(1,StatsTestsQ31::OUT_Q31_ID,mgr);
  248. refOffset = 2;
  249. }
  250. break;
  251. case StatsTestsQ31::TEST_STD_Q31_16:
  252. {
  253. inputA.reload(StatsTestsQ31::INPUT1_Q31_ID,mgr,3);
  254. ref.reload(StatsTestsQ31::STDVALS_Q31_ID,mgr);
  255. output.create(1,StatsTestsQ31::OUT_Q31_ID,mgr);
  256. refOffset = 0;
  257. }
  258. break;
  259. case StatsTestsQ31::TEST_STD_Q31_17:
  260. {
  261. inputA.reload(StatsTestsQ31::INPUT1_Q31_ID,mgr,8);
  262. ref.reload(StatsTestsQ31::STDVALS_Q31_ID,mgr);
  263. output.create(1,StatsTestsQ31::OUT_Q31_ID,mgr);
  264. refOffset = 1;
  265. }
  266. break;
  267. case StatsTestsQ31::TEST_STD_Q31_18:
  268. {
  269. inputA.reload(StatsTestsQ31::INPUT1_Q31_ID,mgr,11);
  270. ref.reload(StatsTestsQ31::STDVALS_Q31_ID,mgr);
  271. output.create(1,StatsTestsQ31::OUT_Q31_ID,mgr);
  272. refOffset = 2;
  273. }
  274. break;
  275. case StatsTestsQ31::TEST_VAR_Q31_19:
  276. {
  277. inputA.reload(StatsTestsQ31::INPUT1_Q31_ID,mgr,3);
  278. ref.reload(StatsTestsQ31::VARVALS_Q31_ID,mgr);
  279. output.create(1,StatsTestsQ31::OUT_Q31_ID,mgr);
  280. refOffset = 0;
  281. }
  282. break;
  283. case StatsTestsQ31::TEST_VAR_Q31_20:
  284. {
  285. inputA.reload(StatsTestsQ31::INPUT1_Q31_ID,mgr,8);
  286. ref.reload(StatsTestsQ31::VARVALS_Q31_ID,mgr);
  287. output.create(1,StatsTestsQ31::OUT_Q31_ID,mgr);
  288. refOffset = 1;
  289. }
  290. break;
  291. case StatsTestsQ31::TEST_VAR_Q31_21:
  292. {
  293. inputA.reload(StatsTestsQ31::INPUT1_Q31_ID,mgr,11);
  294. ref.reload(StatsTestsQ31::VARVALS_Q31_ID,mgr);
  295. output.create(1,StatsTestsQ31::OUT_Q31_ID,mgr);
  296. refOffset = 2;
  297. }
  298. break;
  299. }
  300. }
  301. void StatsTestsQ31::tearDown(Testing::testID_t id,Client::PatternMgr *mgr)
  302. {
  303. switch(id)
  304. {
  305. case StatsTestsQ31::TEST_MAX_Q31_1:
  306. case StatsTestsQ31::TEST_MAX_Q31_2:
  307. case StatsTestsQ31::TEST_MAX_Q31_3:
  308. index.dump(mgr);
  309. output.dump(mgr);
  310. break;
  311. case TEST_POWER_Q31_10:
  312. case TEST_POWER_Q31_11:
  313. case TEST_POWER_Q31_12:
  314. outputPower.dump(mgr);
  315. break;
  316. default:
  317. output.dump(mgr);
  318. }
  319. }