1 #include "UnaryTestsQ15.h"
2 #include <stdio.h>
3 #include "Error.h"
4
5 #define SNR_THRESHOLD 70
6
7 /*
8
9 Reference patterns are generated with
10 a double precision computation.
11
12 */
13 #define ABS_ERROR_Q15 ((q15_t)4)
14 #define ABS_ERROR_Q63 ((q63_t)(1<<16))
15
16 #define ONEHALF 0x4000
17
18 /* Upper bound of maximum matrix dimension used by Python */
19 #define MAXMATRIXDIM 40
20
refInnerTail(q15_t * b)21 static void refInnerTail(q15_t *b)
22 {
23 b[0] = 1;
24 b[1] = -1;
25 b[2] = 2;
26 b[3] = -2;
27 b[4] = 3;
28 b[5] = -3;
29 b[6] = 4;
30 b[7] = -4;
31 }
32
checkInnerTail(q15_t * b)33 static void checkInnerTail(q15_t *b)
34 {
35 ASSERT_TRUE(b[0] == 1);
36 ASSERT_TRUE(b[1] == -1);
37 ASSERT_TRUE(b[2] == 2);
38 ASSERT_TRUE(b[3] == -2);
39 ASSERT_TRUE(b[4] == 3);
40 ASSERT_TRUE(b[5] == -3);
41 ASSERT_TRUE(b[6] == 4);
42 ASSERT_TRUE(b[7] == -4);
43 }
44
45
46 #define LOADDATA2() \
47 const q15_t *inp1=input1.ptr(); \
48 const q15_t *inp2=input2.ptr(); \
49 \
50 q15_t *ap=a.ptr(); \
51 q15_t *bp=b.ptr(); \
52 \
53 q15_t *outp=output.ptr(); \
54 int16_t *dimsp = dims.ptr(); \
55 int nbMatrixes = dims.nbSamples() >> 1;\
56 int rows,columns; \
57 int i;
58
59 #define LOADDATA1() \
60 const q15_t *inp1=input1.ptr(); \
61 \
62 q15_t *ap=a.ptr(); \
63 \
64 q15_t *outp=output.ptr(); \
65 int16_t *dimsp = dims.ptr(); \
66 int nbMatrixes = dims.nbSamples() >> 1;\
67 int rows,columns; \
68 int i;
69
70 #define PREPAREDATA2() \
71 in1.numRows=rows; \
72 in1.numCols=columns; \
73 memcpy((void*)ap,(const void*)inp1,sizeof(q15_t)*rows*columns);\
74 in1.pData = ap; \
75 \
76 in2.numRows=rows; \
77 in2.numCols=columns; \
78 memcpy((void*)bp,(const void*)inp2,sizeof(q15_t)*rows*columns);\
79 in2.pData = bp; \
80 \
81 out.numRows=rows; \
82 out.numCols=columns; \
83 out.pData = outp;
84
85 #define PREPAREDATA1(TRANSPOSED) \
86 in1.numRows=rows; \
87 in1.numCols=columns; \
88 memcpy((void*)ap,(const void*)inp1,sizeof(q15_t)*rows*columns);\
89 in1.pData = ap; \
90 \
91 if (TRANSPOSED) \
92 { \
93 out.numRows=columns; \
94 out.numCols=rows; \
95 } \
96 else \
97 { \
98 out.numRows=rows; \
99 out.numCols=columns; \
100 } \
101 out.pData = outp;
102
103 #define PREPAREDATA1C(TRANSPOSED) \
104 in1.numRows=rows; \
105 in1.numCols=columns; \
106 memcpy((void*)ap,(const void*)inp1,2*sizeof(q15_t)*rows*columns);\
107 in1.pData = ap; \
108 \
109 if (TRANSPOSED) \
110 { \
111 out.numRows=columns; \
112 out.numCols=rows; \
113 } \
114 else \
115 { \
116 out.numRows=rows; \
117 out.numCols=columns; \
118 } \
119 out.pData = outp;
120
121 #define LOADVECDATA2() \
122 const q15_t *inp1=input1.ptr(); \
123 const q15_t *inp2=input2.ptr(); \
124 \
125 q15_t *ap=a.ptr(); \
126 q15_t *bp=b.ptr(); \
127 \
128 q15_t *outp=output.ptr(); \
129 int16_t *dimsp = dims.ptr(); \
130 int nbMatrixes = dims.nbSamples() / 2;\
131 int rows,internal; \
132 int i;
133
134 #define PREPAREVECDATA2() \
135 in1.numRows=rows; \
136 in1.numCols=internal; \
137 memcpy((void*)ap,(const void*)inp1,sizeof(q15_t)*rows*internal);\
138 in1.pData = ap; \
139 \
140 memcpy((void*)bp,(const void*)inp2,sizeof(q15_t)*internal);
141
142
test_mat_vec_mult_q15()143 void UnaryTestsQ15::test_mat_vec_mult_q15()
144 {
145
146
147 LOADVECDATA2();
148
149 for(i=0;i < nbMatrixes ; i ++)
150 {
151 rows = *dimsp++;
152 internal = *dimsp++;
153
154 PREPAREVECDATA2();
155 refInnerTail(outp + rows);
156 arm_mat_vec_mult_q15(&this->in1, bp, outp);
157
158 outp += rows ;
159 checkInnerTail(outp);
160
161 }
162
163
164 ASSERT_SNR(output,ref,(q15_t)SNR_THRESHOLD);
165
166 ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q15);
167
168 }
169
test_mat_add_q15()170 void UnaryTestsQ15::test_mat_add_q15()
171 {
172 LOADDATA2();
173 arm_status status;
174
175 for(i=0;i < nbMatrixes ; i ++)
176 {
177 rows = *dimsp++;
178 columns = *dimsp++;
179
180 PREPAREDATA2();
181 refInnerTail(outp + rows * columns);
182 status=arm_mat_add_q15(&this->in1,&this->in2,&this->out);
183 ASSERT_TRUE(status==ARM_MATH_SUCCESS);
184
185 outp += (rows * columns);
186 checkInnerTail(outp);
187
188 }
189
190
191 ASSERT_SNR(output,ref,(q15_t)SNR_THRESHOLD);
192
193 ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q15);
194
195 }
196
test_mat_sub_q15()197 void UnaryTestsQ15::test_mat_sub_q15()
198 {
199 LOADDATA2();
200 arm_status status;
201
202 for(i=0;i < nbMatrixes ; i ++)
203 {
204 rows = *dimsp++;
205 columns = *dimsp++;
206
207 PREPAREDATA2();
208 refInnerTail(outp + rows * columns);
209 status=arm_mat_sub_q15(&this->in1,&this->in2,&this->out);
210 ASSERT_TRUE(status==ARM_MATH_SUCCESS);
211
212 outp += (rows * columns);
213 checkInnerTail(outp);
214
215 }
216
217
218 ASSERT_SNR(output,ref,(q15_t)SNR_THRESHOLD);
219
220 ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q15);
221
222 }
223
test_mat_scale_q15()224 void UnaryTestsQ15::test_mat_scale_q15()
225 {
226 LOADDATA1();
227 arm_status status;
228
229 for(i=0;i < nbMatrixes ; i ++)
230 {
231 rows = *dimsp++;
232 columns = *dimsp++;
233
234 PREPAREDATA1(false);
235 refInnerTail(outp + rows * columns);
236 status=arm_mat_scale_q15(&this->in1,ONEHALF,0,&this->out);
237 ASSERT_TRUE(status==ARM_MATH_SUCCESS);
238
239 outp += (rows * columns);
240 checkInnerTail(outp);
241
242 }
243
244
245 ASSERT_SNR(output,ref,(q15_t)SNR_THRESHOLD);
246
247 ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q15);
248
249 }
250
test_mat_trans_q15()251 void UnaryTestsQ15::test_mat_trans_q15()
252 {
253 LOADDATA1();
254 arm_status status;
255
256 for(i=0;i < nbMatrixes ; i ++)
257 {
258 rows = *dimsp++;
259 columns = *dimsp++;
260
261 PREPAREDATA1(true);
262 refInnerTail(outp + rows * columns);
263 status=arm_mat_trans_q15(&this->in1,&this->out);
264 ASSERT_TRUE(status==ARM_MATH_SUCCESS);
265
266 outp += (rows * columns);
267 checkInnerTail(outp);
268
269 }
270
271 ASSERT_SNR(output,ref,(q15_t)SNR_THRESHOLD);
272
273 ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q15);
274
275 }
276
test_mat_cmplx_trans_q15()277 void UnaryTestsQ15::test_mat_cmplx_trans_q15()
278 {
279 LOADDATA1();
280 arm_status status;
281
282 for(i=0;i < nbMatrixes ; i ++)
283 {
284 rows = *dimsp++;
285 columns = *dimsp++;
286
287 PREPAREDATA1C(true);
288 refInnerTail(outp + 2*rows * columns);
289 status=arm_mat_cmplx_trans_q15(&this->in1,&this->out);
290 ASSERT_TRUE(status==ARM_MATH_SUCCESS);
291
292 outp += 2*(rows * columns);
293 checkInnerTail(outp);
294
295 }
296
297
298 ASSERT_SNR(output,ref,(q15_t)SNR_THRESHOLD);
299
300 ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q15);
301
302 }
303
304
setUp(Testing::testID_t id,std::vector<Testing::param_t> & params,Client::PatternMgr * mgr)305 void UnaryTestsQ15::setUp(Testing::testID_t id,std::vector<Testing::param_t>& params,Client::PatternMgr *mgr)
306 {
307
308
309 (void)params;
310 switch(id)
311 {
312 case TEST_MAT_ADD_Q15_1:
313 input1.reload(UnaryTestsQ15::INPUTS1_Q15_ID,mgr);
314 input2.reload(UnaryTestsQ15::INPUTS2_Q15_ID,mgr);
315 dims.reload(UnaryTestsQ15::DIMSUNARY1_S16_ID,mgr);
316
317 ref.reload(UnaryTestsQ15::REFADD1_Q15_ID,mgr);
318
319 output.create(ref.nbSamples(),UnaryTestsQ15::OUT_Q15_ID,mgr);
320 a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsQ15::TMPA_Q15_ID,mgr);
321 b.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsQ15::TMPB_Q15_ID,mgr);
322 break;
323
324 case TEST_MAT_SUB_Q15_2:
325 input1.reload(UnaryTestsQ15::INPUTS1_Q15_ID,mgr);
326 input2.reload(UnaryTestsQ15::INPUTS2_Q15_ID,mgr);
327 dims.reload(UnaryTestsQ15::DIMSUNARY1_S16_ID,mgr);
328
329 ref.reload(UnaryTestsQ15::REFSUB1_Q15_ID,mgr);
330
331 output.create(ref.nbSamples(),UnaryTestsQ15::OUT_Q15_ID,mgr);
332 a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsQ15::TMPA_Q15_ID,mgr);
333 b.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsQ15::TMPB_Q15_ID,mgr);
334 break;
335
336 case TEST_MAT_SCALE_Q15_3:
337 input1.reload(UnaryTestsQ15::INPUTS1_Q15_ID,mgr);
338 dims.reload(UnaryTestsQ15::DIMSUNARY1_S16_ID,mgr);
339
340 ref.reload(UnaryTestsQ15::REFSCALE1_Q15_ID,mgr);
341
342 output.create(ref.nbSamples(),UnaryTestsQ15::OUT_Q15_ID,mgr);
343 a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsQ15::TMPA_Q15_ID,mgr);
344 break;
345
346 case TEST_MAT_TRANS_Q15_4:
347 input1.reload(UnaryTestsQ15::INPUTS1_Q15_ID,mgr);
348 dims.reload(UnaryTestsQ15::DIMSUNARY1_S16_ID,mgr);
349
350 ref.reload(UnaryTestsQ15::REFTRANS1_Q15_ID,mgr);
351
352 output.create(ref.nbSamples(),UnaryTestsQ15::OUT_Q15_ID,mgr);
353 a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsQ15::TMPA_Q15_ID,mgr);
354 break;
355
356 case TEST_MAT_VEC_MULT_Q15_5:
357 input1.reload(UnaryTestsQ15::INPUTS1_Q15_ID,mgr);
358 input2.reload(UnaryTestsQ15::INPUTVEC1_Q15_ID,mgr);
359 dims.reload(UnaryTestsQ15::DIMSUNARY1_S16_ID,mgr);
360
361 ref.reload(UnaryTestsQ15::REFVECMUL1_Q15_ID,mgr);
362
363 output.create(ref.nbSamples(),UnaryTestsQ15::OUT_Q15_ID,mgr);
364 a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsQ15::TMPA_Q15_ID,mgr);
365 b.create(MAXMATRIXDIM,UnaryTestsQ15::TMPB_Q15_ID,mgr);
366 break;
367
368 case TEST_MAT_CMPLX_TRANS_Q15_6:
369 input1.reload(UnaryTestsQ15::INPUTSC1_Q15_ID,mgr);
370 dims.reload(UnaryTestsQ15::DIMSUNARY1_S16_ID,mgr);
371
372 ref.reload(UnaryTestsQ15::REFTRANSC1_Q15_ID,mgr);
373
374 output.create(ref.nbSamples(),UnaryTestsQ15::OUT_Q15_ID,mgr);
375 a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsQ15::TMPA_Q15_ID,mgr);
376 break;
377
378
379 }
380
381
382
383 }
384
tearDown(Testing::testID_t id,Client::PatternMgr * mgr)385 void UnaryTestsQ15::tearDown(Testing::testID_t id,Client::PatternMgr *mgr)
386 {
387 (void)id;
388 output.dump(mgr);
389 }
390