BinaryTestsQ15.cpp 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. #include "BinaryTestsQ15.h"
  2. #include <stdio.h>
  3. #include "Error.h"
  4. #define SNR_THRESHOLD 70
  5. #define SNR_LOW_THRESHOLD 30
  6. /*
  7. Reference patterns are generated with
  8. a double precision computation.
  9. */
  10. #define ABS_HIGH_ERROR_Q15 ((q15_t)2000)
  11. #define ABS_ERROR_Q15 ((q15_t)1000)
  12. #define ABS_ERROR_Q63 ((q63_t)(1<<16))
  13. #define MULT_SNR_THRESHOLD 60
  14. #define ONEHALF 0x4000
  15. /* Upper bound of maximum matrix dimension used by Python */
  16. #define MAXMATRIXDIM 40
  17. static void checkInnerTail(q15_t *b)
  18. {
  19. ASSERT_TRUE(b[0] == 0);
  20. ASSERT_TRUE(b[1] == 0);
  21. ASSERT_TRUE(b[2] == 0);
  22. ASSERT_TRUE(b[3] == 0);
  23. ASSERT_TRUE(b[4] == 0);
  24. ASSERT_TRUE(b[5] == 0);
  25. ASSERT_TRUE(b[6] == 0);
  26. ASSERT_TRUE(b[7] == 0);
  27. }
  28. #define LOADDATA2() \
  29. const q15_t *inp1=input1.ptr(); \
  30. const q15_t *inp2=input2.ptr(); \
  31. \
  32. q15_t *ap=a.ptr(); \
  33. q15_t *bp=b.ptr(); \
  34. \
  35. q15_t *outp=output.ptr(); \
  36. q15_t *tmpPtr=tmp.ptr(); \
  37. int16_t *dimsp = dims.ptr(); \
  38. int nbMatrixes = dims.nbSamples() / 3;\
  39. int rows,internal,columns; \
  40. int i;
  41. #define PREPAREDATA2C() \
  42. in1.numRows=rows; \
  43. in1.numCols=internal; \
  44. memcpy((void*)ap,(const void*)inp1,2*sizeof(q15_t)*rows*internal);\
  45. in1.pData = ap; \
  46. \
  47. in2.numRows=internal; \
  48. in2.numCols=columns; \
  49. memcpy((void*)bp,(const void*)inp2,2*sizeof(q15_t)*internal*columns);\
  50. in2.pData = bp; \
  51. \
  52. out.numRows=rows; \
  53. out.numCols=columns; \
  54. out.pData = outp;
  55. #define PREPAREDATA2R() \
  56. in1.numRows=rows; \
  57. in1.numCols=internal; \
  58. memcpy((void*)ap,(const void*)inp1,sizeof(q15_t)*rows*internal);\
  59. in1.pData = ap; \
  60. \
  61. in2.numRows=internal; \
  62. in2.numCols=columns; \
  63. memcpy((void*)bp,(const void*)inp2,sizeof(q15_t)*internal*columns);\
  64. in2.pData = bp; \
  65. \
  66. out.numRows=rows; \
  67. out.numCols=columns; \
  68. out.pData = outp;
  69. void BinaryTestsQ15::test_mat_mult_q15()
  70. {
  71. LOADDATA2();
  72. arm_status status;
  73. for(i=0;i < nbMatrixes ; i ++)
  74. {
  75. rows = *dimsp++;
  76. internal = *dimsp++;
  77. columns = *dimsp++;
  78. PREPAREDATA2R();
  79. memset(tmpPtr,0,sizeof(q15_t)*internal*columns + 16);
  80. status=arm_mat_mult_q15(&this->in1,&this->in2,&this->out,tmpPtr);
  81. ASSERT_TRUE(status==ARM_MATH_SUCCESS);
  82. outp += (rows * columns);
  83. checkInnerTail(outp);
  84. checkInnerTail(tmpPtr + internal * columns);
  85. }
  86. ASSERT_SNR(output,ref,(q15_t)SNR_LOW_THRESHOLD);
  87. ASSERT_NEAR_EQ(output,ref,ABS_HIGH_ERROR_Q15);
  88. }
  89. void BinaryTestsQ15::test_mat_cmplx_mult_q15()
  90. {
  91. LOADDATA2();
  92. arm_status status;
  93. for(i=0;i < nbMatrixes ; i ++)
  94. {
  95. rows = *dimsp++;
  96. internal = *dimsp++;
  97. columns = *dimsp++;
  98. PREPAREDATA2C();
  99. status=arm_mat_cmplx_mult_q15(&this->in1,&this->in2,&this->out,tmpPtr);
  100. ASSERT_TRUE(status==ARM_MATH_SUCCESS);
  101. outp += (2*rows * columns);
  102. checkInnerTail(outp);
  103. }
  104. ASSERT_SNR(output,ref,(q15_t)MULT_SNR_THRESHOLD);
  105. ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q15);
  106. }
  107. void BinaryTestsQ15::setUp(Testing::testID_t id,std::vector<Testing::param_t>& params,Client::PatternMgr *mgr)
  108. {
  109. (void)params;
  110. switch(id)
  111. {
  112. case TEST_MAT_MULT_Q15_1:
  113. input1.reload(BinaryTestsQ15::INPUTS1_Q15_ID,mgr);
  114. input2.reload(BinaryTestsQ15::INPUTS2_Q15_ID,mgr);
  115. dims.reload(BinaryTestsQ15::DIMSBINARY1_S16_ID,mgr);
  116. ref.reload(BinaryTestsQ15::REFMUL1_Q15_ID,mgr);
  117. output.create(ref.nbSamples(),BinaryTestsQ15::OUT_Q15_ID,mgr);
  118. a.create(MAXMATRIXDIM*MAXMATRIXDIM,BinaryTestsQ15::TMPA_Q15_ID,mgr);
  119. b.create(MAXMATRIXDIM*MAXMATRIXDIM,BinaryTestsQ15::TMPB_Q15_ID,mgr);
  120. tmp.create(MAXMATRIXDIM*MAXMATRIXDIM,BinaryTestsQ15::TMP_Q15_ID,mgr);
  121. break;
  122. case TEST_MAT_CMPLX_MULT_Q15_2:
  123. input1.reload(BinaryTestsQ15::INPUTSC1_Q15_ID,mgr);
  124. input2.reload(BinaryTestsQ15::INPUTSC2_Q15_ID,mgr);
  125. dims.reload(BinaryTestsQ15::DIMSBINARY1_S16_ID,mgr);
  126. ref.reload(BinaryTestsQ15::REFCMPLXMUL1_Q15_ID,mgr);
  127. output.create(ref.nbSamples(),BinaryTestsQ15::OUT_Q15_ID,mgr);
  128. a.create(2*MAXMATRIXDIM*MAXMATRIXDIM,BinaryTestsQ15::TMPA_Q15_ID,mgr);
  129. b.create(2*MAXMATRIXDIM*MAXMATRIXDIM,BinaryTestsQ15::TMPB_Q15_ID,mgr);
  130. tmp.create(2*MAXMATRIXDIM*MAXMATRIXDIM,BinaryTestsQ15::TMP_Q15_ID,mgr);
  131. break;
  132. }
  133. }
  134. void BinaryTestsQ15::tearDown(Testing::testID_t id,Client::PatternMgr *mgr)
  135. {
  136. (void)id;
  137. output.dump(mgr);
  138. }