ComplexTestsQ31.cpp 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. #include "ComplexTestsQ31.h"
  2. #include <stdio.h>
  3. #include "Error.h"
  4. #define SNR_THRESHOLD 100
  5. /*
  6. Reference patterns are generated with
  7. a double precision computation.
  8. */
  9. #define ABS_ERROR_Q31 ((q31_t)20)
  10. #define ABS_ERROR_Q63 ((q63_t)(1<<18))
  11. void ComplexTestsQ31::test_cmplx_conj_q31()
  12. {
  13. const q31_t *inp1=input1.ptr();
  14. q31_t *refp=ref.ptr();
  15. q31_t *outp=output.ptr();
  16. arm_cmplx_conj_q31(inp1,outp,input1.nbSamples() >> 1 );
  17. ASSERT_EMPTY_TAIL(output);
  18. ASSERT_SNR(output,ref,(float32_t)SNR_THRESHOLD);
  19. ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q31);
  20. }
  21. void ComplexTestsQ31::test_cmplx_dot_prod_q31()
  22. {
  23. q63_t re,im;
  24. const q31_t *inp1=input1.ptr();
  25. const q31_t *inp2=input2.ptr();
  26. q63_t *outp=dotOutput.ptr();
  27. arm_cmplx_dot_prod_q31(inp1,inp2,input1.nbSamples() >> 1 ,&re,&im);
  28. outp[0] = re;
  29. outp[1] = im;
  30. ASSERT_SNR(dotOutput,dotRef,(float32_t)SNR_THRESHOLD);
  31. ASSERT_NEAR_EQ(dotOutput,dotRef,ABS_ERROR_Q63);
  32. ASSERT_EMPTY_TAIL(dotOutput);
  33. }
  34. void ComplexTestsQ31::test_cmplx_mag_q31()
  35. {
  36. const q31_t *inp1=input1.ptr();
  37. q31_t *refp=ref.ptr();
  38. q31_t *outp=output.ptr();
  39. arm_cmplx_mag_q31(inp1,outp,input1.nbSamples() >> 1 );
  40. ASSERT_EMPTY_TAIL(output);
  41. ASSERT_SNR(output,ref,(float32_t)SNR_THRESHOLD);
  42. ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q31);
  43. }
  44. void ComplexTestsQ31::test_cmplx_mag_squared_q31()
  45. {
  46. const q31_t *inp1=input1.ptr();
  47. q31_t *refp=ref.ptr();
  48. q31_t *outp=output.ptr();
  49. arm_cmplx_mag_squared_q31(inp1,outp,input1.nbSamples() >> 1 );
  50. ASSERT_EMPTY_TAIL(output);
  51. ASSERT_SNR(output,ref,(float32_t)SNR_THRESHOLD);
  52. ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q31);
  53. }
  54. void ComplexTestsQ31::test_cmplx_mult_cmplx_q31()
  55. {
  56. const q31_t *inp1=input1.ptr();
  57. const q31_t *inp2=input2.ptr();
  58. q31_t *refp=ref.ptr();
  59. q31_t *outp=output.ptr();
  60. arm_cmplx_mult_cmplx_q31(inp1,inp2,outp,input1.nbSamples() >> 1 );
  61. ASSERT_EMPTY_TAIL(output);
  62. ASSERT_SNR(output,ref,(float32_t)SNR_THRESHOLD);
  63. ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q31);
  64. }
  65. void ComplexTestsQ31::test_cmplx_mult_real_q31()
  66. {
  67. const q31_t *inp1=input1.ptr();
  68. const q31_t *inp2=input2.ptr();
  69. q31_t *refp=ref.ptr();
  70. q31_t *outp=output.ptr();
  71. arm_cmplx_mult_real_q31(inp1,inp2,outp,input1.nbSamples() >> 1 );
  72. ASSERT_EMPTY_TAIL(output);
  73. ASSERT_SNR(output,ref,(float32_t)SNR_THRESHOLD);
  74. ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q31);
  75. }
  76. void ComplexTestsQ31::setUp(Testing::testID_t id,std::vector<Testing::param_t>& params,Client::PatternMgr *mgr)
  77. {
  78. Testing::nbSamples_t nb=MAX_NB_SAMPLES;
  79. switch(id)
  80. {
  81. case ComplexTestsQ31::TEST_CMPLX_CONJ_Q31_1:
  82. nb = 3;
  83. ref.reload(ComplexTestsQ31::REF_CONJ_Q31_ID,mgr,nb << 1);
  84. input1.reload(ComplexTestsQ31::INPUT1_Q31_ID,mgr,nb << 1);
  85. output.create(ref.nbSamples(),ComplexTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  86. break;
  87. case ComplexTestsQ31::TEST_CMPLX_CONJ_Q31_2:
  88. nb = 8;
  89. ref.reload(ComplexTestsQ31::REF_CONJ_Q31_ID,mgr,nb << 1);
  90. input1.reload(ComplexTestsQ31::INPUT1_Q31_ID,mgr,nb << 1);
  91. output.create(ref.nbSamples(),ComplexTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  92. break;
  93. case ComplexTestsQ31::TEST_CMPLX_CONJ_Q31_3:
  94. nb = 11;
  95. ref.reload(ComplexTestsQ31::REF_CONJ_Q31_ID,mgr,nb << 1);
  96. input1.reload(ComplexTestsQ31::INPUT1_Q31_ID,mgr,nb << 1);
  97. output.create(ref.nbSamples(),ComplexTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  98. break;
  99. case ComplexTestsQ31::TEST_CMPLX_DOT_PROD_Q31_4:
  100. nb = 3;
  101. dotRef.reload(ComplexTestsQ31::REF_DOT_PROD_3_Q31_ID,mgr);
  102. input1.reload(ComplexTestsQ31::INPUT1_Q31_ID,mgr,nb << 1);
  103. input2.reload(ComplexTestsQ31::INPUT2_Q31_ID,mgr,nb << 1);
  104. dotOutput.create(dotRef.nbSamples(),ComplexTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  105. break;
  106. case ComplexTestsQ31::TEST_CMPLX_DOT_PROD_Q31_5:
  107. nb = 8;
  108. dotRef.reload(ComplexTestsQ31::REF_DOT_PROD_4N_Q31_ID,mgr);
  109. input1.reload(ComplexTestsQ31::INPUT1_Q31_ID,mgr,nb << 1);
  110. input2.reload(ComplexTestsQ31::INPUT2_Q31_ID,mgr,nb << 1);
  111. dotOutput.create(dotRef.nbSamples(),ComplexTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  112. break;
  113. case ComplexTestsQ31::TEST_CMPLX_DOT_PROD_Q31_6:
  114. nb = 11;
  115. dotRef.reload(ComplexTestsQ31::REF_DOT_PROD_4N1_Q31_ID,mgr);
  116. input1.reload(ComplexTestsQ31::INPUT1_Q31_ID,mgr,nb << 1);
  117. input2.reload(ComplexTestsQ31::INPUT2_Q31_ID,mgr,nb << 1);
  118. dotOutput.create(dotRef.nbSamples(),ComplexTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  119. break;
  120. case ComplexTestsQ31::TEST_CMPLX_MAG_Q31_7:
  121. nb = 3;
  122. ref.reload(ComplexTestsQ31::REF_MAG_Q31_ID,mgr,nb);
  123. input1.reload(ComplexTestsQ31::INPUT1_Q31_ID,mgr,nb << 1);
  124. output.create(ref.nbSamples(),ComplexTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  125. break;
  126. case ComplexTestsQ31::TEST_CMPLX_MAG_Q31_8:
  127. nb = 8;
  128. ref.reload(ComplexTestsQ31::REF_MAG_Q31_ID,mgr,nb);
  129. input1.reload(ComplexTestsQ31::INPUT1_Q31_ID,mgr,nb << 1);
  130. output.create(ref.nbSamples(),ComplexTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  131. break;
  132. case ComplexTestsQ31::TEST_CMPLX_MAG_Q31_9:
  133. nb = 11;
  134. ref.reload(ComplexTestsQ31::REF_MAG_Q31_ID,mgr,nb);
  135. input1.reload(ComplexTestsQ31::INPUT1_Q31_ID,mgr,nb << 1);
  136. output.create(ref.nbSamples(),ComplexTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  137. break;
  138. case ComplexTestsQ31::TEST_CMPLX_MAG_SQUARED_Q31_10:
  139. nb = 3;
  140. ref.reload(ComplexTestsQ31::REF_MAG_SQUARED_Q31_ID,mgr,nb);
  141. input1.reload(ComplexTestsQ31::INPUT1_Q31_ID,mgr,nb << 1);
  142. output.create(ref.nbSamples(),ComplexTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  143. break;
  144. case ComplexTestsQ31::TEST_CMPLX_MAG_SQUARED_Q31_11:
  145. nb = 8;
  146. ref.reload(ComplexTestsQ31::REF_MAG_SQUARED_Q31_ID,mgr,nb);
  147. input1.reload(ComplexTestsQ31::INPUT1_Q31_ID,mgr,nb << 1);
  148. output.create(ref.nbSamples(),ComplexTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  149. break;
  150. case ComplexTestsQ31::TEST_CMPLX_MAG_SQUARED_Q31_12:
  151. nb = 11;
  152. ref.reload(ComplexTestsQ31::REF_MAG_SQUARED_Q31_ID,mgr,nb);
  153. input1.reload(ComplexTestsQ31::INPUT1_Q31_ID,mgr,nb << 1);
  154. output.create(ref.nbSamples(),ComplexTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  155. break;
  156. case ComplexTestsQ31::TEST_CMPLX_MULT_CMPLX_Q31_13:
  157. nb = 3;
  158. ref.reload(ComplexTestsQ31::REF_CMPLX_MULT_CMPLX_Q31_ID,mgr,nb << 1);
  159. input1.reload(ComplexTestsQ31::INPUT1_Q31_ID,mgr,nb << 1);
  160. input2.reload(ComplexTestsQ31::INPUT2_Q31_ID,mgr,nb << 1);
  161. output.create(ref.nbSamples(),ComplexTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  162. break;
  163. case ComplexTestsQ31::TEST_CMPLX_MULT_CMPLX_Q31_14:
  164. nb = 8;
  165. ref.reload(ComplexTestsQ31::REF_CMPLX_MULT_CMPLX_Q31_ID,mgr,nb << 1);
  166. input1.reload(ComplexTestsQ31::INPUT1_Q31_ID,mgr,nb << 1);
  167. input2.reload(ComplexTestsQ31::INPUT2_Q31_ID,mgr,nb << 1);
  168. output.create(ref.nbSamples(),ComplexTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  169. break;
  170. case ComplexTestsQ31::TEST_CMPLX_MULT_CMPLX_Q31_15:
  171. nb = 11;
  172. ref.reload(ComplexTestsQ31::REF_CMPLX_MULT_CMPLX_Q31_ID,mgr,nb << 1);
  173. input1.reload(ComplexTestsQ31::INPUT1_Q31_ID,mgr,nb << 1);
  174. input2.reload(ComplexTestsQ31::INPUT2_Q31_ID,mgr,nb << 1);
  175. output.create(ref.nbSamples(),ComplexTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  176. break;
  177. case ComplexTestsQ31::TEST_CMPLX_MULT_REAL_Q31_16:
  178. nb = 3;
  179. ref.reload(ComplexTestsQ31::REF_CMPLX_MULT_REAL_Q31_ID,mgr,nb << 1);
  180. input1.reload(ComplexTestsQ31::INPUT1_Q31_ID,mgr,nb << 1);
  181. input2.reload(ComplexTestsQ31::INPUT3_Q31_ID,mgr,nb);
  182. output.create(ref.nbSamples(),ComplexTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  183. break;
  184. case ComplexTestsQ31::TEST_CMPLX_MULT_REAL_Q31_17:
  185. nb = 8;
  186. ref.reload(ComplexTestsQ31::REF_CMPLX_MULT_REAL_Q31_ID,mgr,nb << 1);
  187. input1.reload(ComplexTestsQ31::INPUT1_Q31_ID,mgr,nb << 1);
  188. input2.reload(ComplexTestsQ31::INPUT3_Q31_ID,mgr,nb);
  189. output.create(ref.nbSamples(),ComplexTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  190. break;
  191. case ComplexTestsQ31::TEST_CMPLX_MULT_REAL_Q31_18:
  192. nb = 11;
  193. ref.reload(ComplexTestsQ31::REF_CMPLX_MULT_REAL_Q31_ID,mgr,nb << 1);
  194. input1.reload(ComplexTestsQ31::INPUT1_Q31_ID,mgr,nb << 1);
  195. input2.reload(ComplexTestsQ31::INPUT3_Q31_ID,mgr,nb);
  196. output.create(ref.nbSamples(),ComplexTestsQ31::OUT_SAMPLES_Q31_ID,mgr);
  197. break;
  198. }
  199. }
  200. void ComplexTestsQ31::tearDown(Testing::testID_t id,Client::PatternMgr *mgr)
  201. {
  202. switch(id)
  203. {
  204. case ComplexTestsQ31::TEST_CMPLX_DOT_PROD_Q31_4:
  205. case ComplexTestsQ31::TEST_CMPLX_DOT_PROD_Q31_5:
  206. case ComplexTestsQ31::TEST_CMPLX_DOT_PROD_Q31_6:
  207. dotOutput.dump(mgr);
  208. break;
  209. default:
  210. output.dump(mgr);
  211. }
  212. }