UnaryTestsQ15.cpp 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. #include "UnaryTestsQ15.h"
  2. #include "Error.h"
  3. #define SNR_THRESHOLD 70
  4. /*
  5. Reference patterns are generated with
  6. a double precision computation.
  7. */
  8. #define ABS_ERROR_Q15 ((q15_t)2)
  9. #define ABS_ERROR_Q63 ((q63_t)(1<<16))
  10. #define ONEHALF 0x4000
  11. /* Upper bound of maximum matrix dimension used by Python */
  12. #define MAXMATRIXDIM 40
  13. #define LOADDATA2() \
  14. const q15_t *inp1=input1.ptr(); \
  15. const q15_t *inp2=input2.ptr(); \
  16. \
  17. q15_t *ap=a.ptr(); \
  18. q15_t *bp=b.ptr(); \
  19. \
  20. q15_t *outp=output.ptr(); \
  21. int16_t *dimsp = dims.ptr(); \
  22. int nbMatrixes = dims.nbSamples() >> 1;\
  23. int rows,columns; \
  24. int i;
  25. #define LOADDATA1() \
  26. const q15_t *inp1=input1.ptr(); \
  27. \
  28. q15_t *ap=a.ptr(); \
  29. \
  30. q15_t *outp=output.ptr(); \
  31. int16_t *dimsp = dims.ptr(); \
  32. int nbMatrixes = dims.nbSamples() >> 1;\
  33. int rows,columns; \
  34. int i;
  35. #define PREPAREDATA2() \
  36. in1.numRows=rows; \
  37. in1.numCols=columns; \
  38. memcpy((void*)ap,(const void*)inp1,sizeof(q15_t)*rows*columns);\
  39. in1.pData = ap; \
  40. \
  41. in2.numRows=rows; \
  42. in2.numCols=columns; \
  43. memcpy((void*)bp,(const void*)inp2,sizeof(q15_t)*rows*columns);\
  44. in2.pData = bp; \
  45. \
  46. out.numRows=rows; \
  47. out.numCols=columns; \
  48. out.pData = outp;
  49. #define PREPAREDATA1(TRANSPOSED) \
  50. in1.numRows=rows; \
  51. in1.numCols=columns; \
  52. memcpy((void*)ap,(const void*)inp1,sizeof(q15_t)*rows*columns);\
  53. in1.pData = ap; \
  54. \
  55. if (TRANSPOSED) \
  56. { \
  57. out.numRows=columns; \
  58. out.numCols=rows; \
  59. } \
  60. else \
  61. { \
  62. out.numRows=rows; \
  63. out.numCols=columns; \
  64. } \
  65. out.pData = outp;
  66. void UnaryTestsQ15::test_mat_add_q15()
  67. {
  68. LOADDATA2();
  69. for(i=0;i < nbMatrixes ; i ++)
  70. {
  71. rows = *dimsp++;
  72. columns = *dimsp++;
  73. PREPAREDATA2();
  74. arm_mat_add_q15(&this->in1,&this->in2,&this->out);
  75. outp += (rows * columns);
  76. }
  77. ASSERT_EMPTY_TAIL(output);
  78. ASSERT_SNR(output,ref,(q15_t)SNR_THRESHOLD);
  79. ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q15);
  80. }
  81. void UnaryTestsQ15::test_mat_sub_q15()
  82. {
  83. LOADDATA2();
  84. for(i=0;i < nbMatrixes ; i ++)
  85. {
  86. rows = *dimsp++;
  87. columns = *dimsp++;
  88. PREPAREDATA2();
  89. arm_mat_sub_q15(&this->in1,&this->in2,&this->out);
  90. outp += (rows * columns);
  91. }
  92. ASSERT_EMPTY_TAIL(output);
  93. ASSERT_SNR(output,ref,(q15_t)SNR_THRESHOLD);
  94. ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q15);
  95. }
  96. void UnaryTestsQ15::test_mat_scale_q15()
  97. {
  98. LOADDATA1();
  99. for(i=0;i < nbMatrixes ; i ++)
  100. {
  101. rows = *dimsp++;
  102. columns = *dimsp++;
  103. PREPAREDATA1(false);
  104. arm_mat_scale_q15(&this->in1,ONEHALF,0,&this->out);
  105. outp += (rows * columns);
  106. }
  107. ASSERT_EMPTY_TAIL(output);
  108. ASSERT_SNR(output,ref,(q15_t)SNR_THRESHOLD);
  109. ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q15);
  110. }
  111. void UnaryTestsQ15::test_mat_trans_q15()
  112. {
  113. LOADDATA1();
  114. for(i=0;i < nbMatrixes ; i ++)
  115. {
  116. rows = *dimsp++;
  117. columns = *dimsp++;
  118. PREPAREDATA1(true);
  119. arm_mat_trans_q15(&this->in1,&this->out);
  120. outp += (rows * columns);
  121. }
  122. ASSERT_EMPTY_TAIL(output);
  123. ASSERT_SNR(output,ref,(q15_t)SNR_THRESHOLD);
  124. ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q15);
  125. }
  126. void UnaryTestsQ15::setUp(Testing::testID_t id,std::vector<Testing::param_t>& params,Client::PatternMgr *mgr)
  127. {
  128. switch(id)
  129. {
  130. case TEST_MAT_ADD_Q15_1:
  131. input1.reload(UnaryTestsQ15::INPUTS1_Q15_ID,mgr);
  132. input2.reload(UnaryTestsQ15::INPUTS2_Q15_ID,mgr);
  133. dims.reload(UnaryTestsQ15::DIMSUNARY1_S16_ID,mgr);
  134. ref.reload(UnaryTestsQ15::REFADD1_Q15_ID,mgr);
  135. output.create(ref.nbSamples(),UnaryTestsQ15::OUT_Q15_ID,mgr);
  136. a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsQ15::TMPA_Q15_ID,mgr);
  137. b.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsQ15::TMPB_Q15_ID,mgr);
  138. break;
  139. case TEST_MAT_SUB_Q15_2:
  140. input1.reload(UnaryTestsQ15::INPUTS1_Q15_ID,mgr);
  141. input2.reload(UnaryTestsQ15::INPUTS2_Q15_ID,mgr);
  142. dims.reload(UnaryTestsQ15::DIMSUNARY1_S16_ID,mgr);
  143. ref.reload(UnaryTestsQ15::REFSUB1_Q15_ID,mgr);
  144. output.create(ref.nbSamples(),UnaryTestsQ15::OUT_Q15_ID,mgr);
  145. a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsQ15::TMPA_Q15_ID,mgr);
  146. b.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsQ15::TMPB_Q15_ID,mgr);
  147. break;
  148. case TEST_MAT_SCALE_Q15_3:
  149. input1.reload(UnaryTestsQ15::INPUTS1_Q15_ID,mgr);
  150. dims.reload(UnaryTestsQ15::DIMSUNARY1_S16_ID,mgr);
  151. ref.reload(UnaryTestsQ15::REFSCALE1_Q15_ID,mgr);
  152. output.create(ref.nbSamples(),UnaryTestsQ15::OUT_Q15_ID,mgr);
  153. a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsQ15::TMPA_Q15_ID,mgr);
  154. break;
  155. case TEST_MAT_TRANS_Q15_4:
  156. input1.reload(UnaryTestsQ15::INPUTS1_Q15_ID,mgr);
  157. dims.reload(UnaryTestsQ15::DIMSUNARY1_S16_ID,mgr);
  158. ref.reload(UnaryTestsQ15::REFTRANS1_Q15_ID,mgr);
  159. output.create(ref.nbSamples(),UnaryTestsQ15::OUT_Q15_ID,mgr);
  160. a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsQ15::TMPA_Q15_ID,mgr);
  161. break;
  162. }
  163. }
  164. void UnaryTestsQ15::tearDown(Testing::testID_t id,Client::PatternMgr *mgr)
  165. {
  166. output.dump(mgr);
  167. }