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