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