1 #include "ComplexTestsQ15.h"
2 #include <stdio.h>
3 #include "Error.h"
4 
5 #define SNR_THRESHOLD 60
6 #define SNR_MAG_THRESHOLD 80
7 #define SNR_MAG_FAST_THRESHOLD 60
8 
9 /*
10 
11 Reference patterns are generated with
12 a double precision computation.
13 
14 */
15 #define MAG_ERROR_Q15 ((q15_t)1)
16 #define MAG_FAST_ERROR_Q15 ((q15_t)50)
17 
18 #define ABS_ERROR_Q15 ((q15_t)5)
19 #define ABS_ERROR_Q31 ((q31_t)550)
20 
test_cmplx_conj_q15()21     void ComplexTestsQ15::test_cmplx_conj_q15()
22     {
23         const q15_t *inp1=input1.ptr();
24         q15_t *outp=output.ptr();
25 
26         arm_cmplx_conj_q15(inp1,outp,input1.nbSamples() >> 1  );
27 
28         ASSERT_EMPTY_TAIL(output);
29 
30 
31         ASSERT_SNR(output,ref,(float32_t)SNR_THRESHOLD);
32 
33         ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q15);
34 
35     }
36 
37 
test_cmplx_dot_prod_q15()38     void ComplexTestsQ15::test_cmplx_dot_prod_q15()
39     {
40         q31_t re,im;
41 
42         const q15_t *inp1=input1.ptr();
43         const q15_t *inp2=input2.ptr();
44         q31_t *outp=dotOutput.ptr();
45 
46         arm_cmplx_dot_prod_q15(inp1,inp2,input1.nbSamples() >> 1  ,&re,&im);
47 
48         outp[0] = re;
49         outp[1] = im;
50 
51         ASSERT_SNR(dotOutput,dotRef,(float32_t)SNR_THRESHOLD);
52 
53         ASSERT_NEAR_EQ(dotOutput,dotRef,ABS_ERROR_Q31);
54 
55         ASSERT_EMPTY_TAIL(dotOutput);
56 
57 
58     }
59 
test_cmplx_mag_q15()60     void ComplexTestsQ15::test_cmplx_mag_q15()
61     {
62         const q15_t *inp1=input1.ptr();
63         q15_t *outp=output.ptr();
64 
65         arm_cmplx_mag_q15(inp1,outp,input1.nbSamples()  >> 1 );
66 
67         ASSERT_EMPTY_TAIL(output);
68 
69         ASSERT_SNR(output,ref,(float32_t)SNR_MAG_THRESHOLD);
70 
71         ASSERT_NEAR_EQ(output,ref,MAG_ERROR_Q15);
72 
73     }
74 
test_cmplx_mag_fast_q15()75     void ComplexTestsQ15::test_cmplx_mag_fast_q15()
76     {
77         const q15_t *inp1=input1.ptr();
78         q15_t *outp=output.ptr();
79 
80         arm_cmplx_mag_fast_q15(inp1,outp,input1.nbSamples()  >> 1 );
81 
82         ASSERT_EMPTY_TAIL(output);
83 
84         ASSERT_SNR(output,ref,(float32_t)SNR_MAG_FAST_THRESHOLD);
85 
86         ASSERT_NEAR_EQ(output,ref,MAG_FAST_ERROR_Q15);
87 
88     }
89 
test_cmplx_mag_squared_q15()90     void ComplexTestsQ15::test_cmplx_mag_squared_q15()
91     {
92         const q15_t *inp1=input1.ptr();
93         q15_t *outp=output.ptr();
94 
95         arm_cmplx_mag_squared_q15(inp1,outp,input1.nbSamples()  >> 1 );
96 
97         ASSERT_EMPTY_TAIL(output);
98 
99 
100         ASSERT_SNR(output,ref,(float32_t)SNR_THRESHOLD);
101 
102         ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q15);
103 
104     }
105 
test_cmplx_mult_cmplx_q15()106     void ComplexTestsQ15::test_cmplx_mult_cmplx_q15()
107     {
108         const q15_t *inp1=input1.ptr();
109         const q15_t *inp2=input2.ptr();
110         q15_t *outp=output.ptr();
111 
112         arm_cmplx_mult_cmplx_q15(inp1,inp2,outp,input1.nbSamples()  >> 1 );
113 
114         ASSERT_EMPTY_TAIL(output);
115 
116 
117         ASSERT_SNR(output,ref,(float32_t)SNR_THRESHOLD);
118 
119         ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q15);
120 
121     }
122 
test_cmplx_mult_real_q15()123     void ComplexTestsQ15::test_cmplx_mult_real_q15()
124     {
125         const q15_t *inp1=input1.ptr();
126         const q15_t *inp2=input2.ptr();
127         q15_t *outp=output.ptr();
128 
129         arm_cmplx_mult_real_q15(inp1,inp2,outp,input1.nbSamples()  >> 1 );
130 
131         ASSERT_EMPTY_TAIL(output);
132 
133 
134         ASSERT_SNR(output,ref,(float32_t)SNR_THRESHOLD);
135 
136         ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q15);
137 
138     }
139 
setUp(Testing::testID_t id,std::vector<Testing::param_t> & params,Client::PatternMgr * mgr)140     void ComplexTestsQ15::setUp(Testing::testID_t id,std::vector<Testing::param_t>& params,Client::PatternMgr *mgr)
141     {
142 
143        (void)params;
144        Testing::nbSamples_t nb=MAX_NB_SAMPLES;
145 
146 
147        switch(id)
148        {
149         case ComplexTestsQ15::TEST_CMPLX_CONJ_Q15_1:
150           nb = 7;
151           ref.reload(ComplexTestsQ15::REF_CONJ_Q15_ID,mgr,nb << 1);
152           input1.reload(ComplexTestsQ15::INPUT1_Q15_ID,mgr,nb << 1);
153 
154           output.create(ref.nbSamples(),ComplexTestsQ15::OUT_SAMPLES_Q15_ID,mgr);
155           break;
156         case ComplexTestsQ15::TEST_CMPLX_CONJ_Q15_2:
157           nb = 16;
158           ref.reload(ComplexTestsQ15::REF_CONJ_Q15_ID,mgr,nb << 1);
159           input1.reload(ComplexTestsQ15::INPUT1_Q15_ID,mgr,nb << 1);
160 
161           output.create(ref.nbSamples(),ComplexTestsQ15::OUT_SAMPLES_Q15_ID,mgr);
162           break;
163         case ComplexTestsQ15::TEST_CMPLX_CONJ_Q15_3:
164           nb = 23;
165           ref.reload(ComplexTestsQ15::REF_CONJ_Q15_ID,mgr,nb << 1);
166           input1.reload(ComplexTestsQ15::INPUT1_Q15_ID,mgr,nb << 1);
167 
168           output.create(ref.nbSamples(),ComplexTestsQ15::OUT_SAMPLES_Q15_ID,mgr);
169           break;
170         case ComplexTestsQ15::TEST_CMPLX_DOT_PROD_Q15_4:
171           nb = 7;
172           dotRef.reload(ComplexTestsQ15::REF_DOT_PROD_3_Q15_ID,mgr);
173           input1.reload(ComplexTestsQ15::INPUT1_Q15_ID,mgr,nb << 1);
174           input2.reload(ComplexTestsQ15::INPUT2_Q15_ID,mgr,nb << 1);
175 
176           dotOutput.create(dotRef.nbSamples(),ComplexTestsQ15::OUT_SAMPLES_Q15_ID,mgr);
177           break;
178 
179         case ComplexTestsQ15::TEST_CMPLX_DOT_PROD_Q15_5:
180           nb = 16;
181           dotRef.reload(ComplexTestsQ15::REF_DOT_PROD_4N_Q15_ID,mgr);
182           input1.reload(ComplexTestsQ15::INPUT1_Q15_ID,mgr,nb << 1);
183           input2.reload(ComplexTestsQ15::INPUT2_Q15_ID,mgr,nb << 1);
184 
185           dotOutput.create(dotRef.nbSamples(),ComplexTestsQ15::OUT_SAMPLES_Q15_ID,mgr);
186           break;
187 
188         case ComplexTestsQ15::TEST_CMPLX_DOT_PROD_Q15_6:
189           nb = 23;
190           dotRef.reload(ComplexTestsQ15::REF_DOT_PROD_4N1_Q15_ID,mgr);
191           input1.reload(ComplexTestsQ15::INPUT1_Q15_ID,mgr,nb << 1);
192           input2.reload(ComplexTestsQ15::INPUT2_Q15_ID,mgr,nb << 1);
193 
194           dotOutput.create(dotRef.nbSamples(),ComplexTestsQ15::OUT_SAMPLES_Q15_ID,mgr);
195           break;
196         case ComplexTestsQ15::TEST_CMPLX_MAG_Q15_7:
197           nb = 7;
198           ref.reload(ComplexTestsQ15::REF_MAG_Q15_ID,mgr,nb);
199           input1.reload(ComplexTestsQ15::INPUT1_Q15_ID,mgr,nb << 1);
200 
201           output.create(ref.nbSamples(),ComplexTestsQ15::OUT_SAMPLES_Q15_ID,mgr);
202           break;
203         case ComplexTestsQ15::TEST_CMPLX_MAG_Q15_8:
204           nb = 16;
205           ref.reload(ComplexTestsQ15::REF_MAG_Q15_ID,mgr,nb);
206           input1.reload(ComplexTestsQ15::INPUT1_Q15_ID,mgr,nb << 1);
207 
208           output.create(ref.nbSamples(),ComplexTestsQ15::OUT_SAMPLES_Q15_ID,mgr);
209           break;
210         case ComplexTestsQ15::TEST_CMPLX_MAG_Q15_9:
211           nb = 23;
212           ref.reload(ComplexTestsQ15::REF_MAG_Q15_ID,mgr,nb);
213           input1.reload(ComplexTestsQ15::INPUT1_Q15_ID,mgr,nb << 1);
214 
215           output.create(ref.nbSamples(),ComplexTestsQ15::OUT_SAMPLES_Q15_ID,mgr);
216           break;
217         case ComplexTestsQ15::TEST_CMPLX_MAG_SQUARED_Q15_10:
218           nb = 7;
219           ref.reload(ComplexTestsQ15::REF_MAG_SQUARED_Q15_ID,mgr,nb);
220           input1.reload(ComplexTestsQ15::INPUT1_Q15_ID,mgr,nb << 1);
221 
222           output.create(ref.nbSamples(),ComplexTestsQ15::OUT_SAMPLES_Q15_ID,mgr);
223           break;
224         case ComplexTestsQ15::TEST_CMPLX_MAG_SQUARED_Q15_11:
225           nb = 16;
226           ref.reload(ComplexTestsQ15::REF_MAG_SQUARED_Q15_ID,mgr,nb);
227           input1.reload(ComplexTestsQ15::INPUT1_Q15_ID,mgr,nb << 1);
228 
229           output.create(ref.nbSamples(),ComplexTestsQ15::OUT_SAMPLES_Q15_ID,mgr);
230           break;
231         case ComplexTestsQ15::TEST_CMPLX_MAG_SQUARED_Q15_12:
232           nb = 23;
233           ref.reload(ComplexTestsQ15::REF_MAG_SQUARED_Q15_ID,mgr,nb);
234           input1.reload(ComplexTestsQ15::INPUT1_Q15_ID,mgr,nb << 1);
235 
236           output.create(ref.nbSamples(),ComplexTestsQ15::OUT_SAMPLES_Q15_ID,mgr);
237           break;
238         case ComplexTestsQ15::TEST_CMPLX_MULT_CMPLX_Q15_13:
239           nb = 7;
240           ref.reload(ComplexTestsQ15::REF_CMPLX_MULT_CMPLX_Q15_ID,mgr,nb << 1);
241           input1.reload(ComplexTestsQ15::INPUT1_Q15_ID,mgr,nb << 1);
242           input2.reload(ComplexTestsQ15::INPUT2_Q15_ID,mgr,nb << 1);
243 
244           output.create(ref.nbSamples(),ComplexTestsQ15::OUT_SAMPLES_Q15_ID,mgr);
245           break;
246         case ComplexTestsQ15::TEST_CMPLX_MULT_CMPLX_Q15_14:
247           nb = 16;
248           ref.reload(ComplexTestsQ15::REF_CMPLX_MULT_CMPLX_Q15_ID,mgr,nb << 1);
249           input1.reload(ComplexTestsQ15::INPUT1_Q15_ID,mgr,nb << 1);
250           input2.reload(ComplexTestsQ15::INPUT2_Q15_ID,mgr,nb << 1);
251 
252           output.create(ref.nbSamples(),ComplexTestsQ15::OUT_SAMPLES_Q15_ID,mgr);
253           break;
254         case ComplexTestsQ15::TEST_CMPLX_MULT_CMPLX_Q15_15:
255           nb = 23;
256           ref.reload(ComplexTestsQ15::REF_CMPLX_MULT_CMPLX_Q15_ID,mgr,nb << 1);
257           input1.reload(ComplexTestsQ15::INPUT1_Q15_ID,mgr,nb << 1);
258           input2.reload(ComplexTestsQ15::INPUT2_Q15_ID,mgr,nb << 1);
259 
260           output.create(ref.nbSamples(),ComplexTestsQ15::OUT_SAMPLES_Q15_ID,mgr);
261           break;
262         case ComplexTestsQ15::TEST_CMPLX_MULT_REAL_Q15_16:
263           nb = 7;
264           ref.reload(ComplexTestsQ15::REF_CMPLX_MULT_REAL_Q15_ID,mgr,nb << 1);
265           input1.reload(ComplexTestsQ15::INPUT1_Q15_ID,mgr,nb << 1);
266           input2.reload(ComplexTestsQ15::INPUT3_Q15_ID,mgr,nb);
267 
268           output.create(ref.nbSamples(),ComplexTestsQ15::OUT_SAMPLES_Q15_ID,mgr);
269           break;
270         case ComplexTestsQ15::TEST_CMPLX_MULT_REAL_Q15_17:
271           nb = 16;
272           ref.reload(ComplexTestsQ15::REF_CMPLX_MULT_REAL_Q15_ID,mgr,nb << 1);
273           input1.reload(ComplexTestsQ15::INPUT1_Q15_ID,mgr,nb << 1);
274           input2.reload(ComplexTestsQ15::INPUT3_Q15_ID,mgr,nb);
275 
276           output.create(ref.nbSamples(),ComplexTestsQ15::OUT_SAMPLES_Q15_ID,mgr);
277           break;
278         case ComplexTestsQ15::TEST_CMPLX_MULT_REAL_Q15_18:
279           nb = 23;
280           ref.reload(ComplexTestsQ15::REF_CMPLX_MULT_REAL_Q15_ID,mgr,nb << 1);
281           input1.reload(ComplexTestsQ15::INPUT1_Q15_ID,mgr,nb << 1);
282           input2.reload(ComplexTestsQ15::INPUT3_Q15_ID,mgr,nb);
283 
284           output.create(ref.nbSamples(),ComplexTestsQ15::OUT_SAMPLES_Q15_ID,mgr);
285           break;
286 
287         case ComplexTestsQ15::TEST_CMPLX_CONJ_Q15_19:
288           nb = 256;
289           ref.reload(ComplexTestsQ15::REF_CONJ_Q15_ID,mgr,nb << 1);
290           input1.reload(ComplexTestsQ15::INPUT1_Q15_ID,mgr,nb << 1);
291 
292           output.create(ref.nbSamples(),ComplexTestsQ15::OUT_SAMPLES_Q15_ID,mgr);
293         break;
294 
295         case ComplexTestsQ15::TEST_CMPLX_MAG_Q15_20:
296           nb = 256;
297           ref.reload(ComplexTestsQ15::REF_MAG_Q15_ID,mgr,nb);
298           input1.reload(ComplexTestsQ15::INPUT1_Q15_ID,mgr,nb << 1);
299 
300           output.create(ref.nbSamples(),ComplexTestsQ15::OUT_SAMPLES_Q15_ID,mgr);
301         break;
302 
303         case ComplexTestsQ15::TEST_CMPLX_MAG_SQUARED_Q15_21:
304           nb = 256;
305           ref.reload(ComplexTestsQ15::REF_MAG_SQUARED_Q15_ID,mgr,nb);
306           input1.reload(ComplexTestsQ15::INPUT1_Q15_ID,mgr,nb << 1);
307 
308           output.create(ref.nbSamples(),ComplexTestsQ15::OUT_SAMPLES_Q15_ID,mgr);
309         break;
310 
311         case ComplexTestsQ15::TEST_CMPLX_MULT_CMPLX_Q15_22:
312           nb = 256;
313           ref.reload(ComplexTestsQ15::REF_CMPLX_MULT_CMPLX_Q15_ID,mgr,nb << 1);
314           input1.reload(ComplexTestsQ15::INPUT1_Q15_ID,mgr,nb << 1);
315           input2.reload(ComplexTestsQ15::INPUT2_Q15_ID,mgr,nb << 1);
316 
317           output.create(ref.nbSamples(),ComplexTestsQ15::OUT_SAMPLES_Q15_ID,mgr);
318         break;
319 
320         case ComplexTestsQ15::TEST_CMPLX_MULT_REAL_Q15_23:
321           nb = 256;
322           ref.reload(ComplexTestsQ15::REF_CMPLX_MULT_REAL_Q15_ID,mgr,nb << 1);
323           input1.reload(ComplexTestsQ15::INPUT1_Q15_ID,mgr,nb << 1);
324           input2.reload(ComplexTestsQ15::INPUT3_Q15_ID,mgr,nb);
325 
326           output.create(ref.nbSamples(),ComplexTestsQ15::OUT_SAMPLES_Q15_ID,mgr);
327         break;
328 
329         case ComplexTestsQ15::TEST_CMPLX_MAG_FAST_Q15_24:
330           nb = 7;
331           ref.reload(ComplexTestsQ15::REF_MAG_Q15_ID,mgr,nb);
332           input1.reload(ComplexTestsQ15::INPUT1_Q15_ID,mgr,nb << 1);
333 
334           output.create(ref.nbSamples(),ComplexTestsQ15::OUT_SAMPLES_Q15_ID,mgr);
335           break;
336         case ComplexTestsQ15::TEST_CMPLX_MAG_FAST_Q15_25:
337           nb = 16;
338           ref.reload(ComplexTestsQ15::REF_MAG_Q15_ID,mgr,nb);
339           input1.reload(ComplexTestsQ15::INPUT1_Q15_ID,mgr,nb << 1);
340 
341           output.create(ref.nbSamples(),ComplexTestsQ15::OUT_SAMPLES_Q15_ID,mgr);
342           break;
343         case ComplexTestsQ15::TEST_CMPLX_MAG_FAST_Q15_26:
344           nb = 23;
345           ref.reload(ComplexTestsQ15::REF_MAG_Q15_ID,mgr,nb);
346           input1.reload(ComplexTestsQ15::INPUT1_Q15_ID,mgr,nb << 1);
347 
348           output.create(ref.nbSamples(),ComplexTestsQ15::OUT_SAMPLES_Q15_ID,mgr);
349           break;
350         case ComplexTestsQ15::TEST_CMPLX_MAG_FAST_Q15_27:
351           nb = 256;
352           ref.reload(ComplexTestsQ15::REF_MAG_Q15_ID,mgr,nb);
353           input1.reload(ComplexTestsQ15::INPUT1_Q15_ID,mgr,nb << 1);
354 
355           output.create(ref.nbSamples(),ComplexTestsQ15::OUT_SAMPLES_Q15_ID,mgr);
356         break;
357        }
358 
359 
360 
361     }
362 
tearDown(Testing::testID_t id,Client::PatternMgr * mgr)363     void ComplexTestsQ15::tearDown(Testing::testID_t id,Client::PatternMgr *mgr)
364     {
365        switch(id)
366        {
367          case ComplexTestsQ15::TEST_CMPLX_DOT_PROD_Q15_4:
368          case ComplexTestsQ15::TEST_CMPLX_DOT_PROD_Q15_5:
369          case ComplexTestsQ15::TEST_CMPLX_DOT_PROD_Q15_6:
370             dotOutput.dump(mgr);
371          break;
372 
373          default:
374             output.dump(mgr);
375        }
376     }
377