1 #include "arm_vec_math.h"
2 
3 #include "MISCQ15.h"
4 #include <stdio.h>
5 #include "Error.h"
6 #include "Test.h"
7 
8 #define SNR_THRESHOLD 65
9 /*
10 
11 Reference patterns are generated with
12 a double precision computation.
13 
14 */
15 #define ABS_ERROR_Q15 ((q15_t)10)
16 
17 #define ABS_ERROR_FAST_Q15 ((q15_t)20)
18 
19 
test_correlate_q15()20     void MISCQ15::test_correlate_q15()
21     {
22         const q15_t *inpA=inputA.ptr();
23         const q15_t *inpB=inputB.ptr();
24         q15_t *outp=output.ptr();
25 
26         arm_correlate_q15(inpA, inputA.nbSamples(),
27           inpB, inputB.nbSamples(),
28           outp);
29 
30         ASSERT_SNR(ref,output,(q15_t)SNR_THRESHOLD);
31         ASSERT_NEAR_EQ(ref,output,ABS_ERROR_Q15);
32 
33     }
34 
test_conv_q15()35     void MISCQ15::test_conv_q15()
36     {
37         const q15_t *inpA=inputA.ptr();
38         const q15_t *inpB=inputB.ptr();
39         q15_t *outp=output.ptr();
40 
41         arm_conv_q15(inpA, inputA.nbSamples(),
42           inpB, inputB.nbSamples(),
43           outp);
44 
45         ASSERT_EMPTY_TAIL(output);
46         ASSERT_SNR(ref,output,(q15_t)SNR_THRESHOLD);
47         ASSERT_NEAR_EQ(ref,output,ABS_ERROR_Q15);
48 
49     }
50 
51     // This value must be coherent with the Python script
52     // generating the test patterns
53     #define NBPOINTS 4
54 
test_conv_partial_q15()55     void MISCQ15::test_conv_partial_q15()
56     {
57         const q15_t *inpA=inputA.ptr();
58         const q15_t *inpB=inputB.ptr();
59         q15_t *outp=output.ptr();
60         q15_t *tmpp=tmp.ptr();
61 
62 
63         arm_status status=arm_conv_partial_q15(inpA, inputA.nbSamples(),
64           inpB, inputB.nbSamples(),
65           outp,
66           this->first,
67           NBPOINTS);
68 
69 
70 
71         memcpy((void*)tmpp,(void*)&outp[this->first],NBPOINTS*sizeof(q15_t));
72         ASSERT_TRUE(status==ARM_MATH_SUCCESS);
73         ASSERT_SNR(ref,tmp,(q15_t)SNR_THRESHOLD);
74         ASSERT_NEAR_EQ(ref,tmp,ABS_ERROR_Q15);
75 
76     }
77 
test_conv_partial_fast_q15()78     void MISCQ15::test_conv_partial_fast_q15()
79     {
80         const q15_t *inpA=inputA.ptr();
81         const q15_t *inpB=inputB.ptr();
82         q15_t *outp=output.ptr();
83         q15_t *tmpp=tmp.ptr();
84 
85 
86         arm_status status=arm_conv_partial_fast_q15(inpA, inputA.nbSamples(),
87           inpB, inputB.nbSamples(),
88           outp,
89           this->first,
90           NBPOINTS);
91 
92 
93 
94         memcpy((void*)tmpp,(void*)&outp[this->first],NBPOINTS*sizeof(q15_t));
95         ASSERT_TRUE(status==ARM_MATH_SUCCESS);
96         ASSERT_SNR(ref,tmp,(q15_t)SNR_THRESHOLD);
97         ASSERT_NEAR_EQ(ref,tmp,ABS_ERROR_FAST_Q15);
98 
99     }
100 
test_conv_partial_opt_q15()101     void MISCQ15::test_conv_partial_opt_q15()
102     {
103         const q15_t *inpA=inputA.ptr();
104         const q15_t *inpB=inputB.ptr();
105         q15_t *outp=output.ptr();
106         q15_t *tmpp=tmp.ptr();
107 
108         q15_t *scratchAp=scratchA.ptr();
109         q15_t *scratchBp=scratchB.ptr();
110 
111 
112         arm_status status=arm_conv_partial_opt_q15(inpA, inputA.nbSamples(),
113           inpB, inputB.nbSamples(),
114           outp,
115           this->first,
116           NBPOINTS,
117           scratchAp,
118           scratchBp
119           );
120 
121 
122 
123         memcpy((void*)tmpp,(void*)&outp[this->first],NBPOINTS*sizeof(q15_t));
124         ASSERT_TRUE(status==ARM_MATH_SUCCESS);
125         ASSERT_SNR(ref,tmp,(q15_t)SNR_THRESHOLD);
126         ASSERT_NEAR_EQ(ref,tmp,ABS_ERROR_FAST_Q15);
127 
128     }
129 
test_conv_partial_fast_opt_q15()130     void MISCQ15::test_conv_partial_fast_opt_q15()
131     {
132         const q15_t *inpA=inputA.ptr();
133         const q15_t *inpB=inputB.ptr();
134         q15_t *outp=output.ptr();
135         q15_t *tmpp=tmp.ptr();
136 
137         q15_t *scratchAp=scratchA.ptr();
138         q15_t *scratchBp=scratchB.ptr();
139 
140 
141 
142         arm_status status=arm_conv_partial_fast_opt_q15(inpA, inputA.nbSamples(),
143           inpB, inputB.nbSamples(),
144           outp,
145           this->first,
146           NBPOINTS,
147           scratchAp,
148           scratchBp);
149 
150 
151 
152         memcpy((void*)tmpp,(void*)&outp[this->first],NBPOINTS*sizeof(q15_t));
153         ASSERT_TRUE(status==ARM_MATH_SUCCESS);
154         ASSERT_SNR(ref,tmp,(q15_t)SNR_THRESHOLD);
155         ASSERT_NEAR_EQ(ref,tmp,ABS_ERROR_FAST_Q15);
156 
157     }
158 
159 
160 
setUp(Testing::testID_t id,std::vector<Testing::param_t> & paramsArgs,Client::PatternMgr * mgr)161     void MISCQ15::setUp(Testing::testID_t id,std::vector<Testing::param_t>& paramsArgs,Client::PatternMgr *mgr)
162     {
163         (void)paramsArgs;
164         switch(id)
165         {
166 
167             case MISCQ15::TEST_CORRELATE_Q15_1:
168             {
169                        this->nba = 14;
170                        this->nbb = 15;
171                        ref.reload(MISCQ15::REF1_Q15_ID,mgr);
172             }
173             break;
174 
175             case MISCQ15::TEST_CORRELATE_Q15_2:
176             {
177                        this->nba = 14;
178                        this->nbb = 16;
179                        ref.reload(MISCQ15::REF2_Q15_ID,mgr);
180             }
181             break;
182 
183             case MISCQ15::TEST_CORRELATE_Q15_3:
184             {
185                        this->nba = 14;
186                        this->nbb = 17;
187                        ref.reload(MISCQ15::REF3_Q15_ID,mgr);
188             }
189             break;
190 
191             case MISCQ15::TEST_CORRELATE_Q15_4:
192             {
193                        this->nba = 14;
194                        this->nbb = 18;
195                        ref.reload(MISCQ15::REF4_Q15_ID,mgr);
196             }
197             break;
198 
199             case MISCQ15::TEST_CORRELATE_Q15_5:
200             {
201                        this->nba = 14;
202                        this->nbb = 33;
203                        ref.reload(MISCQ15::REF5_Q15_ID,mgr);
204             }
205             break;
206 
207             case MISCQ15::TEST_CORRELATE_Q15_6:
208             {
209                        this->nba = 15;
210                        this->nbb = 15;
211                        ref.reload(MISCQ15::REF6_Q15_ID,mgr);
212             }
213             break;
214 
215             case MISCQ15::TEST_CORRELATE_Q15_7:
216             {
217                        this->nba = 15;
218                        this->nbb = 16;
219                        ref.reload(MISCQ15::REF7_Q15_ID,mgr);
220             }
221             break;
222 
223             case MISCQ15::TEST_CORRELATE_Q15_8:
224             {
225                        this->nba = 15;
226                        this->nbb = 17;
227                        ref.reload(MISCQ15::REF8_Q15_ID,mgr);
228             }
229             break;
230 
231             case MISCQ15::TEST_CORRELATE_Q15_9:
232             {
233                        this->nba = 15;
234                        this->nbb = 18;
235                        ref.reload(MISCQ15::REF9_Q15_ID,mgr);
236             }
237             break;
238 
239             case MISCQ15::TEST_CORRELATE_Q15_10:
240             {
241                        this->nba = 15;
242                        this->nbb = 33;
243                        ref.reload(MISCQ15::REF10_Q15_ID,mgr);
244             }
245             break;
246 
247             case MISCQ15::TEST_CORRELATE_Q15_11:
248             {
249                        this->nba = 16;
250                        this->nbb = 15;
251                        ref.reload(MISCQ15::REF11_Q15_ID,mgr);
252             }
253             break;
254 
255             case MISCQ15::TEST_CORRELATE_Q15_12:
256             {
257                        this->nba = 16;
258                        this->nbb = 16;
259                        ref.reload(MISCQ15::REF12_Q15_ID,mgr);
260             }
261             break;
262 
263             case MISCQ15::TEST_CORRELATE_Q15_13:
264             {
265                        this->nba = 16;
266                        this->nbb = 17;
267                        ref.reload(MISCQ15::REF13_Q15_ID,mgr);
268             }
269             break;
270 
271             case MISCQ15::TEST_CORRELATE_Q15_14:
272             {
273                        this->nba = 16;
274                        this->nbb = 18;
275                        ref.reload(MISCQ15::REF14_Q15_ID,mgr);
276             }
277             break;
278 
279             case MISCQ15::TEST_CORRELATE_Q15_15:
280             {
281                        this->nba = 16;
282                        this->nbb = 33;
283                        ref.reload(MISCQ15::REF15_Q15_ID,mgr);
284             }
285             break;
286 
287             case MISCQ15::TEST_CORRELATE_Q15_16:
288             {
289                        this->nba = 17;
290                        this->nbb = 15;
291                        ref.reload(MISCQ15::REF16_Q15_ID,mgr);
292             }
293             break;
294 
295             case MISCQ15::TEST_CORRELATE_Q15_17:
296             {
297                        this->nba = 17;
298                        this->nbb = 16;
299                        ref.reload(MISCQ15::REF17_Q15_ID,mgr);
300             }
301             break;
302 
303             case MISCQ15::TEST_CORRELATE_Q15_18:
304             {
305                        this->nba = 17;
306                        this->nbb = 17;
307                        ref.reload(MISCQ15::REF18_Q15_ID,mgr);
308             }
309             break;
310 
311             case MISCQ15::TEST_CORRELATE_Q15_19:
312             {
313                        this->nba = 17;
314                        this->nbb = 18;
315                        ref.reload(MISCQ15::REF19_Q15_ID,mgr);
316             }
317             break;
318 
319             case MISCQ15::TEST_CORRELATE_Q15_20:
320             {
321                        this->nba = 17;
322                        this->nbb = 33;
323                        ref.reload(MISCQ15::REF20_Q15_ID,mgr);
324             }
325             break;
326 
327             case MISCQ15::TEST_CORRELATE_Q15_21:
328             {
329                        this->nba = 32;
330                        this->nbb = 15;
331                        ref.reload(MISCQ15::REF21_Q15_ID,mgr);
332             }
333             break;
334 
335             case MISCQ15::TEST_CORRELATE_Q15_22:
336             {
337                        this->nba = 32;
338                        this->nbb = 16;
339                        ref.reload(MISCQ15::REF22_Q15_ID,mgr);
340             }
341             break;
342 
343             case MISCQ15::TEST_CORRELATE_Q15_23:
344             {
345                        this->nba = 32;
346                        this->nbb = 17;
347                        ref.reload(MISCQ15::REF23_Q15_ID,mgr);
348             }
349             break;
350 
351             case MISCQ15::TEST_CORRELATE_Q15_24:
352             {
353                        this->nba = 32;
354                        this->nbb = 18;
355                        ref.reload(MISCQ15::REF24_Q15_ID,mgr);
356             }
357             break;
358 
359             case MISCQ15::TEST_CORRELATE_Q15_25:
360             {
361                        this->nba = 32;
362                        this->nbb = 33;
363                        ref.reload(MISCQ15::REF25_Q15_ID,mgr);
364             }
365             break;
366 
367             case MISCQ15::TEST_CONV_Q15_26:
368             {
369                        this->nba = 14;
370                        this->nbb = 15;
371                        ref.reload(MISCQ15::REF26_Q15_ID,mgr);
372             }
373             break;
374 
375             case MISCQ15::TEST_CONV_Q15_27:
376             {
377                        this->nba = 14;
378                        this->nbb = 16;
379                        ref.reload(MISCQ15::REF27_Q15_ID,mgr);
380             }
381             break;
382 
383             case MISCQ15::TEST_CONV_Q15_28:
384             {
385                        this->nba = 14;
386                        this->nbb = 17;
387                        ref.reload(MISCQ15::REF28_Q15_ID,mgr);
388             }
389             break;
390 
391             case MISCQ15::TEST_CONV_Q15_29:
392             {
393                        this->nba = 14;
394                        this->nbb = 18;
395                        ref.reload(MISCQ15::REF29_Q15_ID,mgr);
396             }
397             break;
398 
399             case MISCQ15::TEST_CONV_Q15_30:
400             {
401                        this->nba = 14;
402                        this->nbb = 33;
403                        ref.reload(MISCQ15::REF30_Q15_ID,mgr);
404             }
405             break;
406 
407             case MISCQ15::TEST_CONV_Q15_31:
408             {
409                        this->nba = 15;
410                        this->nbb = 15;
411                        ref.reload(MISCQ15::REF31_Q15_ID,mgr);
412             }
413             break;
414 
415             case MISCQ15::TEST_CONV_Q15_32:
416             {
417                        this->nba = 15;
418                        this->nbb = 16;
419                        ref.reload(MISCQ15::REF32_Q15_ID,mgr);
420             }
421             break;
422 
423             case MISCQ15::TEST_CONV_Q15_33:
424             {
425                        this->nba = 15;
426                        this->nbb = 17;
427                        ref.reload(MISCQ15::REF33_Q15_ID,mgr);
428             }
429             break;
430 
431             case MISCQ15::TEST_CONV_Q15_34:
432             {
433                        this->nba = 15;
434                        this->nbb = 18;
435                        ref.reload(MISCQ15::REF34_Q15_ID,mgr);
436             }
437             break;
438 
439             case MISCQ15::TEST_CONV_Q15_35:
440             {
441                        this->nba = 15;
442                        this->nbb = 33;
443                        ref.reload(MISCQ15::REF35_Q15_ID,mgr);
444             }
445             break;
446 
447             case MISCQ15::TEST_CONV_Q15_36:
448             {
449                        this->nba = 16;
450                        this->nbb = 15;
451                        ref.reload(MISCQ15::REF36_Q15_ID,mgr);
452             }
453             break;
454 
455             case MISCQ15::TEST_CONV_Q15_37:
456             {
457                        this->nba = 16;
458                        this->nbb = 16;
459                        ref.reload(MISCQ15::REF37_Q15_ID,mgr);
460             }
461             break;
462 
463             case MISCQ15::TEST_CONV_Q15_38:
464             {
465                        this->nba = 16;
466                        this->nbb = 17;
467                        ref.reload(MISCQ15::REF38_Q15_ID,mgr);
468             }
469             break;
470 
471             case MISCQ15::TEST_CONV_Q15_39:
472             {
473                        this->nba = 16;
474                        this->nbb = 18;
475                        ref.reload(MISCQ15::REF39_Q15_ID,mgr);
476             }
477             break;
478 
479             case MISCQ15::TEST_CONV_Q15_40:
480             {
481                        this->nba = 16;
482                        this->nbb = 33;
483                        ref.reload(MISCQ15::REF40_Q15_ID,mgr);
484             }
485             break;
486 
487             case MISCQ15::TEST_CONV_Q15_41:
488             {
489                        this->nba = 17;
490                        this->nbb = 15;
491                        ref.reload(MISCQ15::REF41_Q15_ID,mgr);
492             }
493             break;
494 
495             case MISCQ15::TEST_CONV_Q15_42:
496             {
497                        this->nba = 17;
498                        this->nbb = 16;
499                        ref.reload(MISCQ15::REF42_Q15_ID,mgr);
500             }
501             break;
502 
503             case MISCQ15::TEST_CONV_Q15_43:
504             {
505                        this->nba = 17;
506                        this->nbb = 17;
507                        ref.reload(MISCQ15::REF43_Q15_ID,mgr);
508             }
509             break;
510 
511             case MISCQ15::TEST_CONV_Q15_44:
512             {
513                        this->nba = 17;
514                        this->nbb = 18;
515                        ref.reload(MISCQ15::REF44_Q15_ID,mgr);
516             }
517             break;
518 
519             case MISCQ15::TEST_CONV_Q15_45:
520             {
521                        this->nba = 17;
522                        this->nbb = 33;
523                        ref.reload(MISCQ15::REF45_Q15_ID,mgr);
524             }
525             break;
526 
527             case MISCQ15::TEST_CONV_Q15_46:
528             {
529                        this->nba = 32;
530                        this->nbb = 15;
531                        ref.reload(MISCQ15::REF46_Q15_ID,mgr);
532             }
533             break;
534 
535             case MISCQ15::TEST_CONV_Q15_47:
536             {
537                        this->nba = 32;
538                        this->nbb = 16;
539                        ref.reload(MISCQ15::REF47_Q15_ID,mgr);
540             }
541             break;
542 
543             case MISCQ15::TEST_CONV_Q15_48:
544             {
545                        this->nba = 32;
546                        this->nbb = 17;
547                        ref.reload(MISCQ15::REF48_Q15_ID,mgr);
548             }
549             break;
550 
551             case MISCQ15::TEST_CONV_Q15_49:
552             {
553                        this->nba = 32;
554                        this->nbb = 18;
555                        ref.reload(MISCQ15::REF49_Q15_ID,mgr);
556             }
557             break;
558 
559             case MISCQ15::TEST_CONV_Q15_50:
560             {
561                        this->nba = 32;
562                        this->nbb = 33;
563                        ref.reload(MISCQ15::REF50_Q15_ID,mgr);
564             }
565             break;
566 
567             case MISCQ15::TEST_CONV_PARTIAL_Q15_51:
568             case MISCQ15::TEST_CONV_PARTIAL_FAST_Q15_54:
569             case MISCQ15::TEST_CONV_PARTIAL_OPT_Q15_57:
570             case MISCQ15::TEST_CONV_PARTIAL_FAST_OPT_Q15_60:
571             {
572               this->first=3;
573               this->nba = 6;
574               this->nbb = 8;
575               ref.reload(MISCQ15::REF54_Q15_ID,mgr);
576               tmp.create(ref.nbSamples(),MISCQ15::TMP_Q15_ID,mgr);
577 
578               // Oversized and not used except in opt case
579               scratchA.create(24,MISCQ15::SCRATCH1_Q15_ID,mgr);
580               scratchB.create(24,MISCQ15::SCRATCH2_Q15_ID,mgr);
581             }
582             break;
583 
584             case MISCQ15::TEST_CONV_PARTIAL_Q15_52:
585             case MISCQ15::TEST_CONV_PARTIAL_FAST_Q15_55:
586             case MISCQ15::TEST_CONV_PARTIAL_OPT_Q15_58:
587             case MISCQ15::TEST_CONV_PARTIAL_FAST_OPT_Q15_61:
588             {
589               this->first=9;
590               this->nba = 6;
591               this->nbb = 8;
592               ref.reload(MISCQ15::REF55_Q15_ID,mgr);
593               tmp.create(ref.nbSamples(),MISCQ15::TMP_Q15_ID,mgr);
594 
595               // Oversized and not used except in opt case
596               scratchA.create(24,MISCQ15::SCRATCH1_Q15_ID,mgr);
597               scratchB.create(24,MISCQ15::SCRATCH2_Q15_ID,mgr);
598 
599             }
600             break;
601 
602             case MISCQ15::TEST_CONV_PARTIAL_Q15_53:
603             case MISCQ15::TEST_CONV_PARTIAL_FAST_Q15_56:
604             case MISCQ15::TEST_CONV_PARTIAL_OPT_Q15_59:
605             case MISCQ15::TEST_CONV_PARTIAL_FAST_OPT_Q15_62:
606             {
607               this->first=7;
608               this->nba = 6;
609               this->nbb = 8;
610               ref.reload(MISCQ15::REF56_Q15_ID,mgr);
611               tmp.create(ref.nbSamples(),MISCQ15::TMP_Q15_ID,mgr);
612 
613               // Oversized and not used except in opt case
614               scratchA.create(24,MISCQ15::SCRATCH1_Q15_ID,mgr);
615               scratchB.create(24,MISCQ15::SCRATCH2_Q15_ID,mgr);
616 
617             }
618             break;
619 
620 
621         }
622 
623        if (id >= MISCQ15::TEST_CONV_PARTIAL_Q15_51)
624        {
625           inputA.reload(MISCQ15::INPUTA2_Q15_ID,mgr,nba);
626           inputB.reload(MISCQ15::INPUTB2_Q15_ID,mgr,nbb);
627        }
628        else
629        {
630           inputA.reload(MISCQ15::INPUTA_Q15_ID,mgr,nba);
631           inputB.reload(MISCQ15::INPUTB_Q15_ID,mgr,nbb);
632        }
633 
634        output.create(ref.nbSamples(),MISCQ15::OUT_Q15_ID,mgr);
635 
636     }
637 
tearDown(Testing::testID_t id,Client::PatternMgr * mgr)638     void MISCQ15::tearDown(Testing::testID_t id,Client::PatternMgr *mgr)
639     {
640       (void)id;
641       output.dump(mgr);
642 
643     }
644