BasicTestsQ31.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451
  1. #include "BasicTestsQ31.h"
  2. #include "Error.h"
  3. #define SNR_THRESHOLD 100
  4. /*
  5. Reference patterns are generated with
  6. a double precision computation.
  7. */
  8. #define ABS_ERROR_Q31 ((q31_t)2)
  9. #define ABS_ERROR_Q63 ((q63_t)(1<<16))
  10. #define ONEHALF 0x40000000
  11. #define GET_Q31_PTR() \
  12. const q31_t *inp1=input1.ptr(); \
  13. const q31_t *inp2=input2.ptr(); \
  14. q31_t *refp=ref.ptr(); \
  15. q31_t *outp=output.ptr();
  16. void BasicTestsQ31::test_add_q31()
  17. {
  18. GET_Q31_PTR();
  19. arm_add_q31(inp1,inp2,outp,input1.nbSamples());
  20. ASSERT_EMPTY_TAIL(output);
  21. ASSERT_SNR(output,ref,(float32_t)SNR_THRESHOLD);
  22. ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q31);
  23. }
  24. void BasicTestsQ31::test_sub_q31()
  25. {
  26. GET_Q31_PTR();
  27. arm_sub_q31(inp1,inp2,outp,input1.nbSamples());
  28. ASSERT_EMPTY_TAIL(output);
  29. ASSERT_SNR(output,ref,(float32_t)SNR_THRESHOLD);
  30. ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q31);
  31. }
  32. void BasicTestsQ31::test_mult_q31()
  33. {
  34. GET_Q31_PTR();
  35. arm_mult_q31(inp1,inp2,outp,input1.nbSamples());
  36. ASSERT_EMPTY_TAIL(output);
  37. ASSERT_SNR(output,ref,(float32_t)SNR_THRESHOLD);
  38. ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q31);
  39. }
  40. void BasicTestsQ31::test_negate_q31()
  41. {
  42. const q31_t *inp1=input1.ptr();
  43. q31_t *refp=ref.ptr();
  44. q31_t *outp=output.ptr();
  45. arm_negate_q31(inp1,outp,input1.nbSamples());
  46. ASSERT_EMPTY_TAIL(output);
  47. ASSERT_SNR(output,ref,(float32_t)SNR_THRESHOLD);
  48. ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q31);
  49. }
  50. void BasicTestsQ31::test_offset_q31()
  51. {
  52. const q31_t *inp1=input1.ptr();
  53. q31_t *refp=ref.ptr();
  54. q31_t *outp=output.ptr();
  55. arm_offset_q31(inp1,this->scalar,outp,input1.nbSamples());
  56. ASSERT_EMPTY_TAIL(output);
  57. ASSERT_SNR(output,ref,(float32_t)SNR_THRESHOLD);
  58. ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q31);
  59. }
  60. void BasicTestsQ31::test_scale_q31()
  61. {
  62. const q31_t *inp1=input1.ptr();
  63. q31_t *refp=ref.ptr();
  64. q31_t *outp=output.ptr();
  65. arm_scale_q31(inp1,this->scalar,0,outp,input1.nbSamples());
  66. ASSERT_EMPTY_TAIL(output);
  67. ASSERT_SNR(output,ref,(float32_t)SNR_THRESHOLD);
  68. ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q31);
  69. }
  70. void BasicTestsQ31::test_dot_prod_q31()
  71. {
  72. q63_t r;
  73. const q31_t *inp1=input1.ptr();
  74. const q31_t *inp2=input2.ptr();
  75. q63_t *refp=dotRef.ptr();
  76. q63_t *outp=dotOutput.ptr();
  77. arm_dot_prod_q31(inp1,inp2,input1.nbSamples(),&r);
  78. outp[0] = r;
  79. ASSERT_SNR(dotOutput,dotRef,(float32_t)SNR_THRESHOLD);
  80. ASSERT_NEAR_EQ(dotOutput,dotRef,(q63_t)ABS_ERROR_Q63);
  81. ASSERT_EMPTY_TAIL(dotOutput);
  82. }
  83. void BasicTestsQ31::test_abs_q31()
  84. {
  85. GET_Q31_PTR();
  86. arm_abs_q31(inp1,outp,input1.nbSamples());
  87. ASSERT_EMPTY_TAIL(output);
  88. ASSERT_SNR(output,ref,(float32_t)SNR_THRESHOLD);
  89. ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q31);
  90. }
  91. void BasicTestsQ31::test_shift_q31()
  92. {
  93. const q31_t *inp1=input1.ptr();
  94. q31_t *refp=ref.ptr();
  95. q31_t *outp=output.ptr();
  96. arm_shift_q31(inp1,1,outp,input1.nbSamples());
  97. ASSERT_EMPTY_TAIL(output);
  98. ASSERT_SNR(output,ref,(float32_t)SNR_THRESHOLD);
  99. ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q31);
  100. }
  101. void BasicTestsQ31::setUp(Testing::testID_t id,std::vector<Testing::param_t>& params,Client::PatternMgr *mgr)
  102. {
  103. Testing::nbSamples_t nb=MAX_NB_SAMPLES;
  104. this->scalar = ONEHALF;
  105. switch(id)
  106. {
  107. case BasicTestsQ31::TEST_ADD_Q31_1:
  108. nb = 3;
  109. ref.reload(BasicTestsQ31::REF_ADD_Q31_ID,mgr,nb);
  110. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  111. input1.reload(BasicTestsQ31::INPUT1_Q31_ID,mgr,nb);
  112. input2.reload(BasicTestsQ31::INPUT2_Q31_ID,mgr,nb);
  113. break;
  114. case BasicTestsQ31::TEST_ADD_Q31_2:
  115. nb = 8;
  116. ref.reload(BasicTestsQ31::REF_ADD_Q31_ID,mgr,nb);
  117. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  118. input1.reload(BasicTestsQ31::INPUT1_Q31_ID,mgr,nb);
  119. input2.reload(BasicTestsQ31::INPUT2_Q31_ID,mgr,nb);
  120. break;
  121. case BasicTestsQ31::TEST_ADD_Q31_3:
  122. nb = 9;
  123. ref.reload(BasicTestsQ31::REF_ADD_Q31_ID,mgr,nb);
  124. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  125. input1.reload(BasicTestsQ31::INPUT1_Q31_ID,mgr,nb);
  126. input2.reload(BasicTestsQ31::INPUT2_Q31_ID,mgr,nb);
  127. break;
  128. case BasicTestsQ31::TEST_SUB_Q31_4:
  129. nb = 3;
  130. ref.reload(BasicTestsQ31::REF_SUB_Q31_ID,mgr,nb);
  131. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  132. input1.reload(BasicTestsQ31::INPUT1_Q31_ID,mgr,nb);
  133. input2.reload(BasicTestsQ31::INPUT2_Q31_ID,mgr,nb);
  134. break;
  135. case BasicTestsQ31::TEST_SUB_Q31_5:
  136. nb = 8;
  137. ref.reload(BasicTestsQ31::REF_SUB_Q31_ID,mgr,nb);
  138. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  139. input1.reload(BasicTestsQ31::INPUT1_Q31_ID,mgr,nb);
  140. input2.reload(BasicTestsQ31::INPUT2_Q31_ID,mgr,nb);
  141. break;
  142. case BasicTestsQ31::TEST_SUB_Q31_6:
  143. nb = 9;
  144. ref.reload(BasicTestsQ31::REF_SUB_Q31_ID,mgr,nb);
  145. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  146. input1.reload(BasicTestsQ31::INPUT1_Q31_ID,mgr,nb);
  147. input2.reload(BasicTestsQ31::INPUT2_Q31_ID,mgr,nb);
  148. break;
  149. case BasicTestsQ31::TEST_MULT_Q31_7:
  150. nb = 3;
  151. ref.reload(BasicTestsQ31::REF_MULT_Q31_ID,mgr,nb);
  152. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  153. input1.reload(BasicTestsQ31::INPUT1_Q31_ID,mgr,nb);
  154. input2.reload(BasicTestsQ31::INPUT2_Q31_ID,mgr,nb);
  155. break;
  156. case BasicTestsQ31::TEST_MULT_Q31_8:
  157. nb = 8;
  158. ref.reload(BasicTestsQ31::REF_MULT_Q31_ID,mgr,nb);
  159. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  160. input1.reload(BasicTestsQ31::INPUT1_Q31_ID,mgr,nb);
  161. input2.reload(BasicTestsQ31::INPUT2_Q31_ID,mgr,nb);
  162. break;
  163. case BasicTestsQ31::TEST_MULT_Q31_9:
  164. nb = 9;
  165. ref.reload(BasicTestsQ31::REF_MULT_Q31_ID,mgr,nb);
  166. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  167. input1.reload(BasicTestsQ31::INPUT1_Q31_ID,mgr,nb);
  168. input2.reload(BasicTestsQ31::INPUT2_Q31_ID,mgr,nb);
  169. break;
  170. case BasicTestsQ31::TEST_NEGATE_Q31_10:
  171. nb = 3;
  172. ref.reload(BasicTestsQ31::REF_NEGATE_Q31_ID,mgr,nb);
  173. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  174. input1.reload(BasicTestsQ31::INPUT1_Q31_ID,mgr,nb);
  175. break;
  176. case BasicTestsQ31::TEST_NEGATE_Q31_11:
  177. nb = 8;
  178. ref.reload(BasicTestsQ31::REF_NEGATE_Q31_ID,mgr,nb);
  179. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  180. input1.reload(BasicTestsQ31::INPUT1_Q31_ID,mgr,nb);
  181. break;
  182. case BasicTestsQ31::TEST_NEGATE_Q31_12:
  183. nb = 9;
  184. ref.reload(BasicTestsQ31::REF_NEGATE_Q31_ID,mgr,nb);
  185. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  186. input1.reload(BasicTestsQ31::INPUT1_Q31_ID,mgr,nb);
  187. break;
  188. case BasicTestsQ31::TEST_OFFSET_Q31_13:
  189. nb = 3;
  190. ref.reload(BasicTestsQ31::REF_OFFSET_Q31_ID,mgr,nb);
  191. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  192. input1.reload(BasicTestsQ31::INPUT1_Q31_ID,mgr,nb);
  193. break;
  194. case BasicTestsQ31::TEST_OFFSET_Q31_14:
  195. nb = 8;
  196. ref.reload(BasicTestsQ31::REF_OFFSET_Q31_ID,mgr,nb);
  197. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  198. input1.reload(BasicTestsQ31::INPUT1_Q31_ID,mgr,nb);
  199. break;
  200. case BasicTestsQ31::TEST_OFFSET_Q31_15:
  201. nb = 9;
  202. ref.reload(BasicTestsQ31::REF_OFFSET_Q31_ID,mgr,nb);
  203. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  204. input1.reload(BasicTestsQ31::INPUT1_Q31_ID,mgr,nb);
  205. break;
  206. case BasicTestsQ31::TEST_SCALE_Q31_16:
  207. nb = 3;
  208. ref.reload(BasicTestsQ31::REF_SCALE_Q31_ID,mgr,nb);
  209. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  210. input1.reload(BasicTestsQ31::INPUT1_Q31_ID,mgr,nb);
  211. break;
  212. case BasicTestsQ31::TEST_SCALE_Q31_17:
  213. nb = 8;
  214. ref.reload(BasicTestsQ31::REF_SCALE_Q31_ID,mgr,nb);
  215. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  216. input1.reload(BasicTestsQ31::INPUT1_Q31_ID,mgr,nb);
  217. break;
  218. case BasicTestsQ31::TEST_SCALE_Q31_18:
  219. nb = 9;
  220. ref.reload(BasicTestsQ31::REF_SCALE_Q31_ID,mgr,nb);
  221. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  222. input1.reload(BasicTestsQ31::INPUT1_Q31_ID,mgr,nb);
  223. break;
  224. case BasicTestsQ31::TEST_DOT_PROD_Q31_19:
  225. nb = 3;
  226. dotRef.reload(BasicTestsQ31::REF_DOT_3_Q31_ID,mgr);
  227. dotOutput.create(dotRef.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  228. input1.reload(BasicTestsQ31::INPUT1_Q31_ID,mgr,nb);
  229. input2.reload(BasicTestsQ31::INPUT2_Q31_ID,mgr,nb);
  230. break;
  231. case BasicTestsQ31::TEST_DOT_PROD_Q31_20:
  232. nb = 8;
  233. dotRef.reload(BasicTestsQ31::REF_DOT_4N_Q31_ID,mgr);
  234. dotOutput.create(dotRef.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  235. input1.reload(BasicTestsQ31::INPUT1_Q31_ID,mgr,nb);
  236. input2.reload(BasicTestsQ31::INPUT2_Q31_ID,mgr,nb);
  237. break;
  238. case BasicTestsQ31::TEST_DOT_PROD_Q31_21:
  239. nb = 9;
  240. dotRef.reload(BasicTestsQ31::REF_DOT_4N1_Q31_ID,mgr);
  241. dotOutput.create(dotRef.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  242. input1.reload(BasicTestsQ31::INPUT1_Q31_ID,mgr,nb);
  243. input2.reload(BasicTestsQ31::INPUT2_Q31_ID,mgr,nb);
  244. break;
  245. case BasicTestsQ31::TEST_ABS_Q31_22:
  246. nb = 3;
  247. ref.reload(BasicTestsQ31::REF_ABS_Q31_ID,mgr,nb);
  248. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  249. input1.reload(BasicTestsQ31::INPUT1_Q31_ID,mgr,nb);
  250. input2.reload(BasicTestsQ31::INPUT2_Q31_ID,mgr,nb);
  251. break;
  252. case BasicTestsQ31::TEST_ABS_Q31_23:
  253. nb = 8;
  254. ref.reload(BasicTestsQ31::REF_ABS_Q31_ID,mgr,nb);
  255. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  256. input1.reload(BasicTestsQ31::INPUT1_Q31_ID,mgr,nb);
  257. input2.reload(BasicTestsQ31::INPUT2_Q31_ID,mgr,nb);
  258. break;
  259. case BasicTestsQ31::TEST_ABS_Q31_24:
  260. nb = 9;
  261. ref.reload(BasicTestsQ31::REF_ABS_Q31_ID,mgr,nb);
  262. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  263. input1.reload(BasicTestsQ31::INPUT1_Q31_ID,mgr,nb);
  264. input2.reload(BasicTestsQ31::INPUT2_Q31_ID,mgr,nb);
  265. break;
  266. case BasicTestsQ31::TEST_ADD_Q31_25:
  267. input1.reload(BasicTestsQ31::MAXPOS_Q31_ID,mgr);
  268. input2.reload(BasicTestsQ31::MAXPOS_Q31_ID,mgr);
  269. ref.reload(BasicTestsQ31::REF_POSSAT_12_Q31_ID,mgr);
  270. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  271. break;
  272. case BasicTestsQ31::TEST_ADD_Q31_26:
  273. input1.reload(BasicTestsQ31::MAXNEG_Q31_ID,mgr);
  274. input2.reload(BasicTestsQ31::MAXNEG_Q31_ID,mgr);
  275. ref.reload(BasicTestsQ31::REF_NEGSAT_13_Q31_ID,mgr);
  276. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  277. break;
  278. case BasicTestsQ31::TEST_SUB_Q31_27:
  279. ref.reload(BasicTestsQ31::REF_POSSAT_14_Q31_ID,mgr);
  280. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  281. input1.reload(BasicTestsQ31::MAXPOS_Q31_ID,mgr);
  282. input2.reload(BasicTestsQ31::MAXNEG_Q31_ID,mgr);
  283. break;
  284. case BasicTestsQ31::TEST_SUB_Q31_28:
  285. ref.reload(BasicTestsQ31::REF_NEGSAT_15_Q31_ID,mgr);
  286. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  287. input1.reload(BasicTestsQ31::MAXNEG_Q31_ID,mgr);
  288. input2.reload(BasicTestsQ31::MAXPOS_Q31_ID,mgr);
  289. break;
  290. case BasicTestsQ31::TEST_MULT_Q31_29:
  291. ref.reload(BasicTestsQ31::REF_POSSAT_16_Q31_ID,mgr);
  292. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  293. input1.reload(BasicTestsQ31::MAXNEG2_Q31_ID,mgr);
  294. input2.reload(BasicTestsQ31::MAXNEG2_Q31_ID,mgr);
  295. break;
  296. case BasicTestsQ31::TEST_NEGATE_Q31_30:
  297. ref.reload(BasicTestsQ31::REF_POSSAT_17_Q31_ID,mgr);
  298. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  299. input1.reload(BasicTestsQ31::MAXNEG2_Q31_ID,mgr);
  300. break;
  301. case BasicTestsQ31::TEST_OFFSET_Q31_31:
  302. ref.reload(BasicTestsQ31::REF_POSSAT_18_Q31_ID,mgr);
  303. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  304. input1.reload(BasicTestsQ31::MAXPOS_Q31_ID,mgr);
  305. /* 0.9 */
  306. this->scalar = 0x73333333;
  307. break;
  308. case BasicTestsQ31::TEST_OFFSET_Q31_32:
  309. ref.reload(BasicTestsQ31::REF_NEGSAT_19_Q31_ID,mgr);
  310. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  311. input1.reload(BasicTestsQ31::MAXNEG_Q31_ID,mgr);
  312. /* -0.9 */
  313. this->scalar = 0x8ccccccd;
  314. break;
  315. case BasicTestsQ31::TEST_SCALE_Q31_33:
  316. ref.reload(BasicTestsQ31::REF_POSSAT_20_Q31_ID,mgr);
  317. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  318. input1.reload(BasicTestsQ31::MAXNEG2_Q31_ID,mgr);
  319. /* Minus max*/
  320. this->scalar = 0x80000000;
  321. break;
  322. case BasicTestsQ31::TEST_SHIFT_Q31_34:
  323. ref.reload(BasicTestsQ31::REF_SHIFT_21_Q31_ID,mgr);
  324. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  325. input1.reload(BasicTestsQ31::INPUTRAND_Q31_ID,mgr);
  326. break;
  327. case BasicTestsQ31::TEST_SHIFT_Q31_35:
  328. ref.reload(BasicTestsQ31::REF_SHIFT_POSSAT_22_Q31_ID,mgr);
  329. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  330. input1.reload(BasicTestsQ31::MAXPOS_Q31_ID,mgr);
  331. break;
  332. case BasicTestsQ31::TEST_SHIFT_Q31_36:
  333. ref.reload(BasicTestsQ31::REF_SHIFT_NEGSAT_23_Q31_ID,mgr);
  334. output.create(ref.nbSamples(),BasicTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  335. input1.reload(BasicTestsQ31::MAXNEG_Q31_ID,mgr);
  336. break;
  337. }
  338. }
  339. void BasicTestsQ31::tearDown(Testing::testID_t id,Client::PatternMgr *mgr)
  340. {
  341. switch(id)
  342. {
  343. case BasicTestsQ31::TEST_DOT_PROD_Q31_19:
  344. case BasicTestsQ31::TEST_DOT_PROD_Q31_20:
  345. case BasicTestsQ31::TEST_DOT_PROD_Q31_21:
  346. dotOutput.dump(mgr);
  347. break;
  348. default:
  349. output.dump(mgr);
  350. }
  351. }