1 #include "UnaryTestsQ31.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)2)
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() >> 1;\
40       int rows,columns;                      \
41       int i;
42 
43 #define LOADDATA1()                          \
44       const q31_t *inp1=input1.ptr();    \
45                                              \
46       q31_t *ap=a.ptr();                 \
47                                              \
48       q31_t *outp=output.ptr();          \
49       int16_t *dimsp = dims.ptr();           \
50       int nbMatrixes = dims.nbSamples() >> 1;\
51       int rows,columns;                      \
52       int i;
53 
54 #define PREPAREDATA2()                                                   \
55       in1.numRows=rows;                                                  \
56       in1.numCols=columns;                                               \
57       memcpy((void*)ap,(const void*)inp1,sizeof(q31_t)*rows*columns);\
58       in1.pData = ap;                                                    \
59                                                                          \
60       in2.numRows=rows;                                                  \
61       in2.numCols=columns;                                               \
62       memcpy((void*)bp,(const void*)inp2,sizeof(q31_t)*rows*columns);\
63       in2.pData = bp;                                                    \
64                                                                          \
65       out.numRows=rows;                                                  \
66       out.numCols=columns;                                               \
67       out.pData = outp;
68 
69 #define PREPAREDATA1(TRANSPOSED)                                         \
70       in1.numRows=rows;                                                  \
71       in1.numCols=columns;                                               \
72       memcpy((void*)ap,(const void*)inp1,sizeof(q31_t)*rows*columns);\
73       in1.pData = ap;                                                    \
74                                                                          \
75       if (TRANSPOSED)                                                    \
76       {                                                                  \
77          out.numRows=columns;                                            \
78          out.numCols=rows;                                               \
79       }                                                                  \
80       else                                                               \
81       {                                                                  \
82       out.numRows=rows;                                                  \
83       out.numCols=columns;                                               \
84       }                                                                  \
85       out.pData = outp;
86 
87 #define PREPAREDATA1C(TRANSPOSED)                                         \
88       in1.numRows=rows;                                                  \
89       in1.numCols=columns;                                               \
90       memcpy((void*)ap,(const void*)inp1,2*sizeof(q31_t)*rows*columns);\
91       in1.pData = ap;                                                    \
92                                                                          \
93       if (TRANSPOSED)                                                    \
94       {                                                                  \
95          out.numRows=columns;                                            \
96          out.numCols=rows;                                               \
97       }                                                                  \
98       else                                                               \
99       {                                                                  \
100       out.numRows=rows;                                                  \
101       out.numCols=columns;                                               \
102       }                                                                  \
103       out.pData = outp;
104 
105 #define LOADVECDATA2()                          \
106       const q31_t *inp1=input1.ptr();    \
107       const q31_t *inp2=input2.ptr();    \
108                                              \
109       q31_t *ap=a.ptr();                 \
110       q31_t *bp=b.ptr();                 \
111                                              \
112       q31_t *outp=output.ptr();          \
113       int16_t *dimsp = dims.ptr();           \
114       int nbMatrixes = dims.nbSamples() / 2;\
115       int rows,internal;                      \
116       int i;
117 
118 #define PREPAREVECDATA2()                                             \
119       in1.numRows=rows;                                               \
120       in1.numCols=internal;                                           \
121       memcpy((void*)ap,(const void*)inp1,sizeof(q31_t)*rows*internal);\
122       in1.pData = ap;                                                 \
123                                                                       \
124       memcpy((void*)bp,(const void*)inp2,sizeof(q31_t)*internal);
125 
126 
test_mat_vec_mult_q31()127     void UnaryTestsQ31::test_mat_vec_mult_q31()
128     {
129       LOADVECDATA2();
130 
131       for(i=0;i < nbMatrixes ; i ++)
132       {
133           rows = *dimsp++;
134           internal = *dimsp++;
135 
136           PREPAREVECDATA2();
137 
138           arm_mat_vec_mult_q31(&this->in1, bp, outp);
139 
140           outp += rows ;
141           checkInnerTail(outp);
142 
143       }
144 
145       ASSERT_EMPTY_TAIL(output);
146 
147       ASSERT_SNR(output,ref,(q31_t)SNR_THRESHOLD);
148 
149       ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q31);
150 
151     }
152 
test_mat_add_q31()153     void UnaryTestsQ31::test_mat_add_q31()
154     {
155       LOADDATA2();
156       arm_status status;
157 
158       for(i=0;i < nbMatrixes ; i ++)
159       {
160           rows = *dimsp++;
161           columns = *dimsp++;
162 
163           PREPAREDATA2();
164 
165           status=arm_mat_add_q31(&this->in1,&this->in2,&this->out);
166           ASSERT_TRUE(status==ARM_MATH_SUCCESS);
167 
168           outp += (rows * columns);
169           checkInnerTail(outp);
170 
171       }
172 
173       ASSERT_EMPTY_TAIL(output);
174 
175       ASSERT_SNR(output,ref,(q31_t)SNR_THRESHOLD);
176 
177       ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q31);
178 
179     }
180 
test_mat_sub_q31()181 void UnaryTestsQ31::test_mat_sub_q31()
182     {
183       LOADDATA2();
184       arm_status status;
185 
186       for(i=0;i < nbMatrixes ; i ++)
187       {
188           rows = *dimsp++;
189           columns = *dimsp++;
190 
191           PREPAREDATA2();
192 
193           status=arm_mat_sub_q31(&this->in1,&this->in2,&this->out);
194           ASSERT_TRUE(status==ARM_MATH_SUCCESS);
195 
196           outp += (rows * columns);
197           checkInnerTail(outp);
198 
199       }
200 
201       ASSERT_EMPTY_TAIL(output);
202 
203       ASSERT_SNR(output,ref,(q31_t)SNR_THRESHOLD);
204 
205       ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q31);
206 
207     }
208 
test_mat_scale_q31()209 void UnaryTestsQ31::test_mat_scale_q31()
210     {
211       LOADDATA1();
212       arm_status status;
213 
214       for(i=0;i < nbMatrixes ; i ++)
215       {
216           rows = *dimsp++;
217           columns = *dimsp++;
218 
219           PREPAREDATA1(false);
220 
221           status=arm_mat_scale_q31(&this->in1,ONEHALF,0,&this->out);
222           ASSERT_TRUE(status==ARM_MATH_SUCCESS);
223 
224           outp += (rows * columns);
225           checkInnerTail(outp);
226 
227       }
228 
229       ASSERT_EMPTY_TAIL(output);
230 
231       ASSERT_SNR(output,ref,(q31_t)SNR_THRESHOLD);
232 
233       ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q31);
234 
235     }
236 
test_mat_trans_q31()237 void UnaryTestsQ31::test_mat_trans_q31()
238     {
239       LOADDATA1();
240       arm_status status;
241 
242       for(i=0;i < nbMatrixes ; i ++)
243       {
244           rows = *dimsp++;
245           columns = *dimsp++;
246 
247           PREPAREDATA1(true);
248 
249           status=arm_mat_trans_q31(&this->in1,&this->out);
250           ASSERT_TRUE(status==ARM_MATH_SUCCESS);
251 
252           outp += (rows * columns);
253           checkInnerTail(outp);
254 
255       }
256 
257       ASSERT_EMPTY_TAIL(output);
258 
259       ASSERT_SNR(output,ref,(q31_t)SNR_THRESHOLD);
260 
261       ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q31);
262 
263     }
264 
test_mat_cmplx_trans_q31()265 void UnaryTestsQ31::test_mat_cmplx_trans_q31()
266     {
267       LOADDATA1();
268       arm_status status;
269 
270       for(i=0;i < nbMatrixes ; i ++)
271       {
272           rows = *dimsp++;
273           columns = *dimsp++;
274 
275           PREPAREDATA1C(true);
276 
277           status=arm_mat_cmplx_trans_q31(&this->in1,&this->out);
278           ASSERT_TRUE(status==ARM_MATH_SUCCESS);
279 
280           outp += 2*(rows * columns);
281           checkInnerTail(outp);
282 
283       }
284 
285       ASSERT_EMPTY_TAIL(output);
286 
287       ASSERT_SNR(output,ref,(q31_t)SNR_THRESHOLD);
288 
289       ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q31);
290 
291     }
292 
293 
setUp(Testing::testID_t id,std::vector<Testing::param_t> & params,Client::PatternMgr * mgr)294     void UnaryTestsQ31::setUp(Testing::testID_t id,std::vector<Testing::param_t>& params,Client::PatternMgr *mgr)
295     {
296 
297 
298       (void)params;
299       switch(id)
300       {
301          case TEST_MAT_ADD_Q31_1:
302             input1.reload(UnaryTestsQ31::INPUTS1_Q31_ID,mgr);
303             input2.reload(UnaryTestsQ31::INPUTS2_Q31_ID,mgr);
304             dims.reload(UnaryTestsQ31::DIMSUNARY1_S16_ID,mgr);
305 
306             ref.reload(UnaryTestsQ31::REFADD1_Q31_ID,mgr);
307 
308             output.create(ref.nbSamples(),UnaryTestsQ31::OUT_Q31_ID,mgr);
309             a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsQ31::TMPA_Q31_ID,mgr);
310             b.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsQ31::TMPB_Q31_ID,mgr);
311          break;
312 
313          case TEST_MAT_SUB_Q31_2:
314             input1.reload(UnaryTestsQ31::INPUTS1_Q31_ID,mgr);
315             input2.reload(UnaryTestsQ31::INPUTS2_Q31_ID,mgr);
316             dims.reload(UnaryTestsQ31::DIMSUNARY1_S16_ID,mgr);
317 
318             ref.reload(UnaryTestsQ31::REFSUB1_Q31_ID,mgr);
319 
320             output.create(ref.nbSamples(),UnaryTestsQ31::OUT_Q31_ID,mgr);
321             a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsQ31::TMPA_Q31_ID,mgr);
322             b.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsQ31::TMPB_Q31_ID,mgr);
323          break;
324 
325          case TEST_MAT_SCALE_Q31_3:
326             input1.reload(UnaryTestsQ31::INPUTS1_Q31_ID,mgr);
327             dims.reload(UnaryTestsQ31::DIMSUNARY1_S16_ID,mgr);
328 
329             ref.reload(UnaryTestsQ31::REFSCALE1_Q31_ID,mgr);
330 
331             output.create(ref.nbSamples(),UnaryTestsQ31::OUT_Q31_ID,mgr);
332             a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsQ31::TMPA_Q31_ID,mgr);
333          break;
334 
335          case TEST_MAT_TRANS_Q31_4:
336             input1.reload(UnaryTestsQ31::INPUTS1_Q31_ID,mgr);
337             dims.reload(UnaryTestsQ31::DIMSUNARY1_S16_ID,mgr);
338 
339             ref.reload(UnaryTestsQ31::REFTRANS1_Q31_ID,mgr);
340 
341             output.create(ref.nbSamples(),UnaryTestsQ31::OUT_Q31_ID,mgr);
342             a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsQ31::TMPA_Q31_ID,mgr);
343          break;
344 
345          case TEST_MAT_VEC_MULT_Q31_5:
346             input1.reload(UnaryTestsQ31::INPUTS1_Q31_ID,mgr);
347             input2.reload(UnaryTestsQ31::INPUTVEC1_Q31_ID,mgr);
348             dims.reload(UnaryTestsQ31::DIMSUNARY1_S16_ID,mgr);
349 
350             ref.reload(UnaryTestsQ31::REFVECMUL1_Q31_ID,mgr);
351 
352             output.create(ref.nbSamples(),UnaryTestsQ31::OUT_Q31_ID,mgr);
353             a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsQ31::TMPA_Q31_ID,mgr);
354             b.create(MAXMATRIXDIM,UnaryTestsQ31::TMPB_Q31_ID,mgr);
355          break;
356 
357          case TEST_MAT_CMPLX_TRANS_Q31_6:
358             input1.reload(UnaryTestsQ31::INPUTSC1_Q31_ID,mgr);
359             dims.reload(UnaryTestsQ31::DIMSUNARY1_S16_ID,mgr);
360 
361             ref.reload(UnaryTestsQ31::REFTRANSC1_Q31_ID,mgr);
362 
363             output.create(ref.nbSamples(),UnaryTestsQ31::OUT_Q31_ID,mgr);
364             a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsQ31::TMPA_Q31_ID,mgr);
365          break;
366 
367 
368       }
369 
370 
371 
372     }
373 
tearDown(Testing::testID_t id,Client::PatternMgr * mgr)374     void UnaryTestsQ31::tearDown(Testing::testID_t id,Client::PatternMgr *mgr)
375     {
376        (void)id;
377        output.dump(mgr);
378     }
379