StatsTestsQ15.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480
  1. #include "StatsTestsQ15.h"
  2. #include <stdio.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. (void)paramsArgs;
  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. (void)id;
  304. switch(id)
  305. {
  306. case StatsTestsQ15::TEST_MAX_Q15_1:
  307. case StatsTestsQ15::TEST_MAX_Q15_2:
  308. case StatsTestsQ15::TEST_MAX_Q15_3:
  309. case StatsTestsQ15::TEST_MIN_Q15_7:
  310. case StatsTestsQ15::TEST_MIN_Q15_8:
  311. case StatsTestsQ15::TEST_MIN_Q15_9:
  312. index.dump(mgr);
  313. output.dump(mgr);
  314. break;
  315. case TEST_POWER_Q15_10:
  316. case TEST_POWER_Q15_11:
  317. case TEST_POWER_Q15_12:
  318. outputPower.dump(mgr);
  319. break;
  320. default:
  321. output.dump(mgr);
  322. }
  323. }