StatsTestsQ15.cpp 13 KB

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