1 #include "BinaryTestsQ31.h"
2 #include <stdio.h>
3 #include "Error.h"
4
5 #define SNR_THRESHOLD 100
6
7 /*
8
9 Reference patterns are generated with
10 a double precision computation.
11
12 */
13 #define ABS_ERROR_Q31 ((q31_t)5)
14 #define ABS_ERROR_Q63 ((q63_t)(1<<16))
15
16 #define ONEHALF 0x40000000
17
18 /* Upper bound of maximum matrix dimension used by Python */
19 #define MAXMATRIXDIM 40
20
checkInnerTail(q31_t * b)21 static void checkInnerTail(q31_t *b)
22 {
23 ASSERT_TRUE(b[0] == 0);
24 ASSERT_TRUE(b[1] == 0);
25 ASSERT_TRUE(b[2] == 0);
26 ASSERT_TRUE(b[3] == 0);
27 }
28
29
30 #define LOADDATA2() \
31 const q31_t *inp1=input1.ptr(); \
32 const q31_t *inp2=input2.ptr(); \
33 \
34 q31_t *ap=a.ptr(); \
35 q31_t *bp=b.ptr(); \
36 \
37 q31_t *outp=output.ptr(); \
38 int16_t *dimsp = dims.ptr(); \
39 int nbMatrixes = dims.nbSamples() / 3;\
40 int rows,internal,columns; \
41 int i;
42
43
44 #define PREPAREDATA2() \
45 in1.numRows=rows; \
46 in1.numCols=internal; \
47 memcpy((void*)ap,(const void*)inp1,2*sizeof(q31_t)*rows*internal);\
48 in1.pData = ap; \
49 \
50 in2.numRows=internal; \
51 in2.numCols=columns; \
52 memcpy((void*)bp,(const void*)inp2,2*sizeof(q31_t)*internal*columns);\
53 in2.pData = bp; \
54 \
55 out.numRows=rows; \
56 out.numCols=columns; \
57 out.pData = outp;
58
59
60
61
test_mat_mult_q31()62 void BinaryTestsQ31::test_mat_mult_q31()
63 {
64 LOADDATA2();
65 arm_status status;
66
67 for(i=0;i < nbMatrixes ; i ++)
68 {
69 rows = *dimsp++;
70 internal = *dimsp++;
71 columns = *dimsp++;
72
73 PREPAREDATA2();
74
75 status=arm_mat_mult_q31(&this->in1,&this->in2,&this->out);
76 ASSERT_TRUE(status==ARM_MATH_SUCCESS);
77
78 outp += (rows * columns);
79 checkInnerTail(outp);
80
81 }
82
83 ASSERT_SNR(output,ref,(q31_t)SNR_THRESHOLD);
84
85 ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q31);
86
87 }
88
89
90
test_mat_cmplx_mult_q31()91 void BinaryTestsQ31::test_mat_cmplx_mult_q31()
92 {
93 LOADDATA2();
94 arm_status status;
95
96 for(i=0;i < nbMatrixes ; i ++)
97 {
98 rows = *dimsp++;
99 internal = *dimsp++;
100 columns = *dimsp++;
101
102 PREPAREDATA2();
103
104 status=arm_mat_cmplx_mult_q31(&this->in1,&this->in2,&this->out);
105 ASSERT_TRUE(status==ARM_MATH_SUCCESS);
106
107 outp += (2*rows * columns);
108 checkInnerTail(outp);
109 }
110
111 ASSERT_SNR(output,ref,(q31_t)SNR_THRESHOLD);
112
113 ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q31);
114
115 }
116
test_mat_mult_opt_q31()117 void BinaryTestsQ31::test_mat_mult_opt_q31()
118 {
119 LOADDATA2();
120 q31_t *tmpPtr=tmp.ptr();
121
122 arm_status status;
123
124 for(i=0;i < nbMatrixes ; i ++)
125 {
126 rows = *dimsp++;
127 internal = *dimsp++;
128 columns = *dimsp++;
129
130 PREPAREDATA2();
131 memset(tmpPtr,0,sizeof(q31_t)*internal*columns + 16);
132 status=arm_mat_mult_opt_q31(&this->in1,&this->in2,&this->out,tmpPtr);
133 ASSERT_TRUE(status==ARM_MATH_SUCCESS);
134
135 outp += (rows * columns);
136 checkInnerTail(outp);
137 checkInnerTail(tmpPtr + internal*columns);
138
139 }
140
141 ASSERT_SNR(output,ref,(q31_t)SNR_THRESHOLD);
142
143 ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q31);
144
145 }
146
147
setUp(Testing::testID_t id,std::vector<Testing::param_t> & params,Client::PatternMgr * mgr)148 void BinaryTestsQ31::setUp(Testing::testID_t id,std::vector<Testing::param_t>& params,Client::PatternMgr *mgr)
149 {
150
151
152 (void)params;
153 switch(id)
154 {
155 case TEST_MAT_MULT_Q31_1:
156 input1.reload(BinaryTestsQ31::INPUTS1_Q31_ID,mgr);
157 input2.reload(BinaryTestsQ31::INPUTS2_Q31_ID,mgr);
158 dims.reload(BinaryTestsQ31::DIMSBINARY1_S16_ID,mgr);
159
160 ref.reload(BinaryTestsQ31::REFMUL1_Q31_ID,mgr);
161
162 output.create(ref.nbSamples(),BinaryTestsQ31::OUT_Q31_ID,mgr);
163 a.create(MAXMATRIXDIM*MAXMATRIXDIM,BinaryTestsQ31::TMPA_Q31_ID,mgr);
164 b.create(MAXMATRIXDIM*MAXMATRIXDIM,BinaryTestsQ31::TMPB_Q31_ID,mgr);
165 break;
166
167 case TEST_MAT_CMPLX_MULT_Q31_2:
168 input1.reload(BinaryTestsQ31::INPUTSC1_Q31_ID,mgr);
169 input2.reload(BinaryTestsQ31::INPUTSC2_Q31_ID,mgr);
170 dims.reload(BinaryTestsQ31::DIMSBINARY1_S16_ID,mgr);
171
172 ref.reload(BinaryTestsQ31::REFCMPLXMUL1_Q31_ID,mgr);
173
174 output.create(ref.nbSamples(),BinaryTestsQ31::OUT_Q31_ID,mgr);
175 a.create(2*MAXMATRIXDIM*MAXMATRIXDIM,BinaryTestsQ31::TMPA_Q31_ID,mgr);
176 b.create(2*MAXMATRIXDIM*MAXMATRIXDIM,BinaryTestsQ31::TMPB_Q31_ID,mgr);
177 break;
178
179 case TEST_MAT_MULT_OPT_Q31_3:
180 input1.reload(BinaryTestsQ31::INPUTS1_Q31_ID,mgr);
181 input2.reload(BinaryTestsQ31::INPUTS2_Q31_ID,mgr);
182 dims.reload(BinaryTestsQ31::DIMSBINARY1_S16_ID,mgr);
183
184 ref.reload(BinaryTestsQ31::REFMUL1_Q31_ID,mgr);
185
186 output.create(ref.nbSamples(),BinaryTestsQ31::OUT_Q31_ID,mgr);
187 a.create(MAXMATRIXDIM*MAXMATRIXDIM,BinaryTestsQ31::TMPA_Q31_ID,mgr);
188 b.create(MAXMATRIXDIM*MAXMATRIXDIM,BinaryTestsQ31::TMPB_Q31_ID,mgr);
189
190 tmp.create(MAXMATRIXDIM*MAXMATRIXDIM,BinaryTestsQ31::TMPC_Q31_ID,mgr);
191
192 break;
193
194
195
196
197 }
198
199
200
201 }
202
tearDown(Testing::testID_t id,Client::PatternMgr * mgr)203 void BinaryTestsQ31::tearDown(Testing::testID_t id,Client::PatternMgr *mgr)
204 {
205 (void)id;
206 output.dump(mgr);
207 }
208