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