1 #include "BinaryTestsQ15.h"
2 #include <stdio.h>
3 #include "Error.h"
4
5 #define SNR_THRESHOLD 70
6 #define SNR_LOW_THRESHOLD 30
7
8 /*
9
10 Reference patterns are generated with
11 a double precision computation.
12
13 */
14 #define ABS_HIGH_ERROR_Q15 ((q15_t)2000)
15 #define ABS_ERROR_Q15 ((q15_t)1000)
16
17 #define ABS_ERROR_Q63 ((q63_t)(1<<16))
18
19 #define MULT_SNR_THRESHOLD 60
20
21 #define ONEHALF 0x4000
22
23 /* Upper bound of maximum matrix dimension used by Python */
24 #define MAXMATRIXDIM 40
25
checkInnerTail(q15_t * b)26 static void checkInnerTail(q15_t *b)
27 {
28 ASSERT_TRUE(b[0] == 0);
29 ASSERT_TRUE(b[1] == 0);
30 ASSERT_TRUE(b[2] == 0);
31 ASSERT_TRUE(b[3] == 0);
32 ASSERT_TRUE(b[4] == 0);
33 ASSERT_TRUE(b[5] == 0);
34 ASSERT_TRUE(b[6] == 0);
35 ASSERT_TRUE(b[7] == 0);
36 }
37
38
39
40 #define LOADDATA2() \
41 const q15_t *inp1=input1.ptr(); \
42 const q15_t *inp2=input2.ptr(); \
43 \
44 q15_t *ap=a.ptr(); \
45 q15_t *bp=b.ptr(); \
46 \
47 q15_t *outp=output.ptr(); \
48 q15_t *tmpPtr=tmp.ptr(); \
49 int16_t *dimsp = dims.ptr(); \
50 int nbMatrixes = dims.nbSamples() / 3;\
51 int rows,internal,columns; \
52 int i;
53
54
55 #define PREPAREDATA2C() \
56 in1.numRows=rows; \
57 in1.numCols=internal; \
58 memcpy((void*)ap,(const void*)inp1,2*sizeof(q15_t)*rows*internal);\
59 in1.pData = ap; \
60 \
61 in2.numRows=internal; \
62 in2.numCols=columns; \
63 memcpy((void*)bp,(const void*)inp2,2*sizeof(q15_t)*internal*columns);\
64 in2.pData = bp; \
65 \
66 out.numRows=rows; \
67 out.numCols=columns; \
68 out.pData = outp;
69
70 #define PREPAREDATA2R() \
71 in1.numRows=rows; \
72 in1.numCols=internal; \
73 memcpy((void*)ap,(const void*)inp1,sizeof(q15_t)*rows*internal);\
74 in1.pData = ap; \
75 \
76 in2.numRows=internal; \
77 in2.numCols=columns; \
78 memcpy((void*)bp,(const void*)inp2,sizeof(q15_t)*internal*columns);\
79 in2.pData = bp; \
80 \
81 out.numRows=rows; \
82 out.numCols=columns; \
83 out.pData = outp;
84
test_mat_mult_q15()85 void BinaryTestsQ15::test_mat_mult_q15()
86 {
87 LOADDATA2();
88 arm_status status;
89
90
91 for(i=0;i < nbMatrixes ; i ++)
92 {
93 rows = *dimsp++;
94 internal = *dimsp++;
95 columns = *dimsp++;
96
97
98 PREPAREDATA2R();
99 memset(tmpPtr,0,sizeof(q15_t)*internal*columns + 16);
100 status=arm_mat_mult_q15(&this->in1,&this->in2,&this->out,tmpPtr);
101 ASSERT_TRUE(status==ARM_MATH_SUCCESS);
102
103 outp += (rows * columns);
104 checkInnerTail(outp);
105 checkInnerTail(tmpPtr + internal * columns);
106
107 }
108
109
110 ASSERT_SNR(output,ref,(q15_t)SNR_LOW_THRESHOLD);
111
112 ASSERT_NEAR_EQ(output,ref,ABS_HIGH_ERROR_Q15);
113
114 }
115
116
117
118
test_mat_cmplx_mult_q15()119 void BinaryTestsQ15::test_mat_cmplx_mult_q15()
120 {
121 LOADDATA2();
122 arm_status status;
123
124 for(i=0;i < nbMatrixes ; i ++)
125 {
126 rows = *dimsp++;
127 internal = *dimsp++;
128 columns = *dimsp++;
129
130
131 PREPAREDATA2C();
132
133 status=arm_mat_cmplx_mult_q15(&this->in1,&this->in2,&this->out,tmpPtr);
134 ASSERT_TRUE(status==ARM_MATH_SUCCESS);
135
136 outp += (2*rows * columns);
137 checkInnerTail(outp);
138
139 }
140
141 ASSERT_SNR(output,ref,(q15_t)MULT_SNR_THRESHOLD);
142
143 ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q15);
144
145 }
146
147
setUp(Testing::testID_t id,std::vector<Testing::param_t> & params,Client::PatternMgr * mgr)148 void BinaryTestsQ15::setUp(Testing::testID_t id,std::vector<Testing::param_t>& params,Client::PatternMgr *mgr)
149 {
150
151
152 (void)params;
153 switch(id)
154 {
155 case TEST_MAT_MULT_Q15_1:
156 input1.reload(BinaryTestsQ15::INPUTS1_Q15_ID,mgr);
157 input2.reload(BinaryTestsQ15::INPUTS2_Q15_ID,mgr);
158 dims.reload(BinaryTestsQ15::DIMSBINARY1_S16_ID,mgr);
159
160 ref.reload(BinaryTestsQ15::REFMUL1_Q15_ID,mgr);
161
162 output.create(ref.nbSamples(),BinaryTestsQ15::OUT_Q15_ID,mgr);
163 a.create(MAXMATRIXDIM*MAXMATRIXDIM,BinaryTestsQ15::TMPA_Q15_ID,mgr);
164 b.create(MAXMATRIXDIM*MAXMATRIXDIM,BinaryTestsQ15::TMPB_Q15_ID,mgr);
165 tmp.create(MAXMATRIXDIM*MAXMATRIXDIM,BinaryTestsQ15::TMP_Q15_ID,mgr);
166 break;
167
168 case TEST_MAT_CMPLX_MULT_Q15_2:
169 input1.reload(BinaryTestsQ15::INPUTSC1_Q15_ID,mgr);
170 input2.reload(BinaryTestsQ15::INPUTSC2_Q15_ID,mgr);
171 dims.reload(BinaryTestsQ15::DIMSBINARY1_S16_ID,mgr);
172
173 ref.reload(BinaryTestsQ15::REFCMPLXMUL1_Q15_ID,mgr);
174
175 output.create(ref.nbSamples(),BinaryTestsQ15::OUT_Q15_ID,mgr);
176 a.create(2*MAXMATRIXDIM*MAXMATRIXDIM,BinaryTestsQ15::TMPA_Q15_ID,mgr);
177 b.create(2*MAXMATRIXDIM*MAXMATRIXDIM,BinaryTestsQ15::TMPB_Q15_ID,mgr);
178 tmp.create(2*MAXMATRIXDIM*MAXMATRIXDIM,BinaryTestsQ15::TMP_Q15_ID,mgr);
179 break;
180
181
182
183
184 }
185
186
187
188 }
189
tearDown(Testing::testID_t id,Client::PatternMgr * mgr)190 void BinaryTestsQ15::tearDown(Testing::testID_t id,Client::PatternMgr *mgr)
191 {
192 (void)id;
193 output.dump(mgr);
194 }
195