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