StatsTestsQ31.cpp 12 KB

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