StatsTestsQ15.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478
  1. #include "arm_math.h"
  2. #include "StatsTestsQ15.h"
  3. #include "Error.h"
  4. #include "Test.h"
  5. //#include <cstdio>
  6. #define SNR_THRESHOLD 50
  7. /*
  8. Reference patterns are generated with
  9. a double precision computation.
  10. */
  11. #define ABS_ERROR_Q15 ((q15_t)100)
  12. #define ABS_ERROR_Q63 (1<<17)
  13. void StatsTestsQ15::test_max_q15()
  14. {
  15. const q15_t *inp = inputA.ptr();
  16. q15_t result;
  17. uint32_t indexval;
  18. q15_t *refp = ref.ptr();
  19. int16_t *refind = maxIndexes.ptr();
  20. q15_t *outp = output.ptr();
  21. int16_t *ind = index.ptr();
  22. arm_max_q15(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 StatsTestsQ15::test_min_q15()
  32. {
  33. const q15_t *inp = inputA.ptr();
  34. q15_t result;
  35. uint32_t indexval;
  36. q15_t *refp = ref.ptr();
  37. int16_t *refind = minIndexes.ptr();
  38. q15_t *outp = output.ptr();
  39. int16_t *ind = index.ptr();
  40. arm_min_q15(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 StatsTestsQ15::test_mean_q15()
  50. {
  51. const q15_t *inp = inputA.ptr();
  52. q15_t result;
  53. q15_t *refp = ref.ptr();
  54. q15_t *outp = output.ptr();
  55. arm_mean_q15(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_Q15);
  61. }
  62. void StatsTestsQ15::test_power_q15()
  63. {
  64. const q15_t *inp = inputA.ptr();
  65. q63_t result;
  66. q63_t *refp = refPower.ptr();
  67. q63_t *outp = outputPower.ptr();
  68. arm_power_q15(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 StatsTestsQ15::test_rms_q15()
  76. {
  77. const q15_t *inp = inputA.ptr();
  78. q15_t result;
  79. q15_t *refp = ref.ptr();
  80. q15_t *outp = output.ptr();
  81. arm_rms_q15(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_Q15);
  87. }
  88. void StatsTestsQ15::test_std_q15()
  89. {
  90. const q15_t *inp = inputA.ptr();
  91. q15_t result;
  92. q15_t *refp = ref.ptr();
  93. q15_t *outp = output.ptr();
  94. arm_std_q15(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_Q15);
  100. }
  101. void StatsTestsQ15::test_var_q15()
  102. {
  103. const q15_t *inp = inputA.ptr();
  104. q15_t result;
  105. q15_t *refp = ref.ptr();
  106. q15_t *outp = output.ptr();
  107. arm_var_q15(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_Q15);
  113. }
  114. void StatsTestsQ15::setUp(Testing::testID_t id,std::vector<Testing::param_t>& paramsArgs,Client::PatternMgr *mgr)
  115. {
  116. switch(id)
  117. {
  118. case StatsTestsQ15::TEST_MAX_Q15_1:
  119. {
  120. inputA.reload(StatsTestsQ15::INPUT1_Q15_ID,mgr,7);
  121. maxIndexes.reload(StatsTestsQ15::MAXINDEXES_S16_ID,mgr);
  122. ref.reload(StatsTestsQ15::MAXVALS_Q15_ID,mgr);
  123. output.create(1,StatsTestsQ15::OUT_Q15_ID,mgr);
  124. index.create(1,StatsTestsQ15::OUT_S16_ID,mgr);
  125. refOffset = 0;
  126. }
  127. break;
  128. case StatsTestsQ15::TEST_MAX_Q15_2:
  129. {
  130. inputA.reload(StatsTestsQ15::INPUT1_Q15_ID,mgr,16);
  131. maxIndexes.reload(StatsTestsQ15::MAXINDEXES_S16_ID,mgr);
  132. ref.reload(StatsTestsQ15::MAXVALS_Q15_ID,mgr);
  133. output.create(1,StatsTestsQ15::OUT_Q15_ID,mgr);
  134. index.create(1,StatsTestsQ15::OUT_S16_ID,mgr);
  135. refOffset = 1;
  136. }
  137. break;
  138. case StatsTestsQ15::TEST_MAX_Q15_3:
  139. {
  140. inputA.reload(StatsTestsQ15::INPUT1_Q15_ID,mgr,17);
  141. maxIndexes.reload(StatsTestsQ15::MAXINDEXES_S16_ID,mgr);
  142. ref.reload(StatsTestsQ15::MAXVALS_Q15_ID,mgr);
  143. output.create(1,StatsTestsQ15::OUT_Q15_ID,mgr);
  144. index.create(1,StatsTestsQ15::OUT_S16_ID,mgr);
  145. refOffset = 2;
  146. }
  147. break;
  148. case StatsTestsQ15::TEST_MEAN_Q15_4:
  149. {
  150. inputA.reload(StatsTestsQ15::INPUT2_Q15_ID,mgr,7);
  151. ref.reload(StatsTestsQ15::MEANVALS_Q15_ID,mgr);
  152. output.create(1,StatsTestsQ15::OUT_Q15_ID,mgr);
  153. refOffset = 0;
  154. }
  155. break;
  156. case StatsTestsQ15::TEST_MEAN_Q15_5:
  157. {
  158. inputA.reload(StatsTestsQ15::INPUT2_Q15_ID,mgr,16);
  159. ref.reload(StatsTestsQ15::MEANVALS_Q15_ID,mgr);
  160. output.create(1,StatsTestsQ15::OUT_Q15_ID,mgr);
  161. refOffset = 1;
  162. }
  163. break;
  164. case StatsTestsQ15::TEST_MEAN_Q15_6:
  165. {
  166. inputA.reload(StatsTestsQ15::INPUT2_Q15_ID,mgr,17);
  167. ref.reload(StatsTestsQ15::MEANVALS_Q15_ID,mgr);
  168. output.create(1,StatsTestsQ15::OUT_Q15_ID,mgr);
  169. refOffset = 2;
  170. }
  171. break;
  172. case StatsTestsQ15::TEST_MIN_Q15_7:
  173. {
  174. inputA.reload(StatsTestsQ15::INPUT1_Q15_ID,mgr,7);
  175. minIndexes.reload(StatsTestsQ15::MININDEXES_S16_ID,mgr);
  176. ref.reload(StatsTestsQ15::MINVALS_Q15_ID,mgr);
  177. output.create(1,StatsTestsQ15::OUT_Q15_ID,mgr);
  178. index.create(1,StatsTestsQ15::OUT_S16_ID,mgr);
  179. refOffset = 0;
  180. }
  181. break;
  182. case StatsTestsQ15::TEST_MIN_Q15_8:
  183. {
  184. inputA.reload(StatsTestsQ15::INPUT1_Q15_ID,mgr,16);
  185. minIndexes.reload(StatsTestsQ15::MININDEXES_S16_ID,mgr);
  186. ref.reload(StatsTestsQ15::MINVALS_Q15_ID,mgr);
  187. output.create(1,StatsTestsQ15::OUT_Q15_ID,mgr);
  188. index.create(1,StatsTestsQ15::OUT_S16_ID,mgr);
  189. refOffset = 1;
  190. }
  191. break;
  192. case StatsTestsQ15::TEST_MIN_Q15_9:
  193. {
  194. inputA.reload(StatsTestsQ15::INPUT1_Q15_ID,mgr,17);
  195. minIndexes.reload(StatsTestsQ15::MININDEXES_S16_ID,mgr);
  196. ref.reload(StatsTestsQ15::MINVALS_Q15_ID,mgr);
  197. output.create(1,StatsTestsQ15::OUT_Q15_ID,mgr);
  198. index.create(1,StatsTestsQ15::OUT_S16_ID,mgr);
  199. refOffset = 2;
  200. }
  201. break;
  202. case StatsTestsQ15::TEST_POWER_Q15_10:
  203. {
  204. inputA.reload(StatsTestsQ15::INPUT1_Q15_ID,mgr,7);
  205. refPower.reload(StatsTestsQ15::POWERVALS_Q63_ID,mgr);
  206. outputPower.create(1,StatsTestsQ15::OUT_Q15_ID,mgr);
  207. refOffset = 0;
  208. }
  209. break;
  210. case StatsTestsQ15::TEST_POWER_Q15_11:
  211. {
  212. inputA.reload(StatsTestsQ15::INPUT1_Q15_ID,mgr,16);
  213. refPower.reload(StatsTestsQ15::POWERVALS_Q63_ID,mgr);
  214. outputPower.create(1,StatsTestsQ15::OUT_Q15_ID,mgr);
  215. refOffset = 1;
  216. }
  217. break;
  218. case StatsTestsQ15::TEST_POWER_Q15_12:
  219. {
  220. inputA.reload(StatsTestsQ15::INPUT1_Q15_ID,mgr,17);
  221. refPower.reload(StatsTestsQ15::POWERVALS_Q63_ID,mgr);
  222. outputPower.create(1,StatsTestsQ15::OUT_Q15_ID,mgr);
  223. refOffset = 2;
  224. }
  225. break;
  226. case StatsTestsQ15::TEST_RMS_Q15_13:
  227. {
  228. inputA.reload(StatsTestsQ15::INPUT1_Q15_ID,mgr,7);
  229. ref.reload(StatsTestsQ15::RMSVALS_Q15_ID,mgr);
  230. output.create(1,StatsTestsQ15::OUT_Q15_ID,mgr);
  231. refOffset = 0;
  232. }
  233. break;
  234. case StatsTestsQ15::TEST_RMS_Q15_14:
  235. {
  236. inputA.reload(StatsTestsQ15::INPUT1_Q15_ID,mgr,16);
  237. ref.reload(StatsTestsQ15::RMSVALS_Q15_ID,mgr);
  238. output.create(1,StatsTestsQ15::OUT_Q15_ID,mgr);
  239. refOffset = 1;
  240. }
  241. break;
  242. case StatsTestsQ15::TEST_RMS_Q15_15:
  243. {
  244. inputA.reload(StatsTestsQ15::INPUT1_Q15_ID,mgr,17);
  245. ref.reload(StatsTestsQ15::RMSVALS_Q15_ID,mgr);
  246. output.create(1,StatsTestsQ15::OUT_Q15_ID,mgr);
  247. refOffset = 2;
  248. }
  249. break;
  250. case StatsTestsQ15::TEST_STD_Q15_16:
  251. {
  252. inputA.reload(StatsTestsQ15::INPUT1_Q15_ID,mgr,7);
  253. ref.reload(StatsTestsQ15::STDVALS_Q15_ID,mgr);
  254. output.create(1,StatsTestsQ15::OUT_Q15_ID,mgr);
  255. refOffset = 0;
  256. }
  257. break;
  258. case StatsTestsQ15::TEST_STD_Q15_17:
  259. {
  260. inputA.reload(StatsTestsQ15::INPUT1_Q15_ID,mgr,16);
  261. ref.reload(StatsTestsQ15::STDVALS_Q15_ID,mgr);
  262. output.create(1,StatsTestsQ15::OUT_Q15_ID,mgr);
  263. refOffset = 1;
  264. }
  265. break;
  266. case StatsTestsQ15::TEST_STD_Q15_18:
  267. {
  268. inputA.reload(StatsTestsQ15::INPUT1_Q15_ID,mgr,17);
  269. ref.reload(StatsTestsQ15::STDVALS_Q15_ID,mgr);
  270. output.create(1,StatsTestsQ15::OUT_Q15_ID,mgr);
  271. refOffset = 2;
  272. }
  273. break;
  274. case StatsTestsQ15::TEST_VAR_Q15_19:
  275. {
  276. inputA.reload(StatsTestsQ15::INPUT1_Q15_ID,mgr,7);
  277. ref.reload(StatsTestsQ15::VARVALS_Q15_ID,mgr);
  278. output.create(1,StatsTestsQ15::OUT_Q15_ID,mgr);
  279. refOffset = 0;
  280. }
  281. break;
  282. case StatsTestsQ15::TEST_VAR_Q15_20:
  283. {
  284. inputA.reload(StatsTestsQ15::INPUT1_Q15_ID,mgr,16);
  285. ref.reload(StatsTestsQ15::VARVALS_Q15_ID,mgr);
  286. output.create(1,StatsTestsQ15::OUT_Q15_ID,mgr);
  287. refOffset = 1;
  288. }
  289. break;
  290. case StatsTestsQ15::TEST_VAR_Q15_21:
  291. {
  292. inputA.reload(StatsTestsQ15::INPUT1_Q15_ID,mgr,17);
  293. ref.reload(StatsTestsQ15::VARVALS_Q15_ID,mgr);
  294. output.create(1,StatsTestsQ15::OUT_Q15_ID,mgr);
  295. refOffset = 2;
  296. }
  297. break;
  298. }
  299. }
  300. void StatsTestsQ15::tearDown(Testing::testID_t id,Client::PatternMgr *mgr)
  301. {
  302. switch(id)
  303. {
  304. case StatsTestsQ15::TEST_MAX_Q15_1:
  305. case StatsTestsQ15::TEST_MAX_Q15_2:
  306. case StatsTestsQ15::TEST_MAX_Q15_3:
  307. case StatsTestsQ15::TEST_MIN_Q15_7:
  308. case StatsTestsQ15::TEST_MIN_Q15_8:
  309. case StatsTestsQ15::TEST_MIN_Q15_9:
  310. index.dump(mgr);
  311. output.dump(mgr);
  312. break;
  313. case TEST_POWER_Q15_10:
  314. case TEST_POWER_Q15_11:
  315. case TEST_POWER_Q15_12:
  316. outputPower.dump(mgr);
  317. break;
  318. default:
  319. output.dump(mgr);
  320. }
  321. }