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