UnaryTestsQ7.cpp 7.1 KB

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