1 #include "arm_vec_math.h" 2 3 #include "MISCQ7.h" 4 #include <stdio.h> 5 #include "Error.h" 6 #include "Test.h" 7 8 #define SNR_THRESHOLD 15 9 /* 10 11 Reference patterns are generated with 12 a double precision computation. 13 14 */ 15 #define ABS_ERROR_Q7 ((q7_t)5) 16 #define ABS_ERROR_FAST_Q7 ((q7_t)5) 17 test_correlate_q7()18 void MISCQ7::test_correlate_q7() 19 { 20 const q7_t *inpA=inputA.ptr(); 21 const q7_t *inpB=inputB.ptr(); 22 q7_t *outp=output.ptr(); 23 24 arm_correlate_q7(inpA, inputA.nbSamples(), 25 inpB, inputB.nbSamples(), 26 outp); 27 28 ASSERT_SNR(ref,output,(q7_t)SNR_THRESHOLD); 29 ASSERT_NEAR_EQ(ref,output,ABS_ERROR_Q7); 30 31 } 32 test_conv_q7()33 void MISCQ7::test_conv_q7() 34 { 35 const q7_t *inpA=inputA.ptr(); 36 const q7_t *inpB=inputB.ptr(); 37 q7_t *outp=output.ptr(); 38 39 arm_conv_q7(inpA, inputA.nbSamples(), 40 inpB, inputB.nbSamples(), 41 outp); 42 43 ASSERT_EMPTY_TAIL(output); 44 ASSERT_SNR(ref,output,(q7_t)SNR_THRESHOLD); 45 ASSERT_NEAR_EQ(ref,output,ABS_ERROR_Q7); 46 47 } 48 49 // This value must be coherent with the Python script 50 // generating the test patterns 51 #define NBPOINTS 4 52 test_conv_partial_q7()53 void MISCQ7::test_conv_partial_q7() 54 { 55 const q7_t *inpA=inputA.ptr(); 56 const q7_t *inpB=inputB.ptr(); 57 q7_t *outp=output.ptr(); 58 q7_t *tmpp=tmp.ptr(); 59 60 61 arm_status status=arm_conv_partial_q7(inpA, inputA.nbSamples(), 62 inpB, inputB.nbSamples(), 63 outp, 64 this->first, 65 NBPOINTS); 66 67 68 69 memcpy((void*)tmpp,(void*)&outp[this->first],NBPOINTS*sizeof(q7_t)); 70 ASSERT_TRUE(status==ARM_MATH_SUCCESS); 71 ASSERT_SNR(ref,tmp,(q7_t)SNR_THRESHOLD); 72 ASSERT_NEAR_EQ(ref,tmp,ABS_ERROR_Q7); 73 74 } 75 test_conv_partial_opt_q7()76 void MISCQ7::test_conv_partial_opt_q7() 77 { 78 const q7_t *inpA=inputA.ptr(); 79 const q7_t *inpB=inputB.ptr(); 80 q7_t *outp=output.ptr(); 81 q7_t *tmpp=tmp.ptr(); 82 83 q15_t *scratchAp=scratchA.ptr(); 84 q15_t *scratchBp=scratchB.ptr(); 85 86 87 arm_status status=arm_conv_partial_opt_q7(inpA, inputA.nbSamples(), 88 inpB, inputB.nbSamples(), 89 outp, 90 this->first, 91 NBPOINTS, 92 scratchAp, 93 scratchBp 94 ); 95 96 97 98 memcpy((void*)tmpp,(void*)&outp[this->first],NBPOINTS*sizeof(q7_t)); 99 ASSERT_TRUE(status==ARM_MATH_SUCCESS); 100 ASSERT_SNR(ref,tmp,(q7_t)SNR_THRESHOLD); 101 ASSERT_NEAR_EQ(ref,tmp,ABS_ERROR_FAST_Q7); 102 103 } 104 105 106 setUp(Testing::testID_t id,std::vector<Testing::param_t> & paramsArgs,Client::PatternMgr * mgr)107 void MISCQ7::setUp(Testing::testID_t id,std::vector<Testing::param_t>& paramsArgs,Client::PatternMgr *mgr) 108 { 109 (void)paramsArgs; 110 switch(id) 111 { 112 113 114 case MISCQ7::TEST_CORRELATE_Q7_1: 115 { 116 this->nba = 30; 117 this->nbb = 31; 118 ref.reload(MISCQ7::REF1_Q7_ID,mgr); 119 } 120 break; 121 122 case MISCQ7::TEST_CORRELATE_Q7_2: 123 { 124 this->nba = 30; 125 this->nbb = 32; 126 ref.reload(MISCQ7::REF2_Q7_ID,mgr); 127 } 128 break; 129 130 case MISCQ7::TEST_CORRELATE_Q7_3: 131 { 132 this->nba = 30; 133 this->nbb = 33; 134 ref.reload(MISCQ7::REF3_Q7_ID,mgr); 135 } 136 break; 137 138 case MISCQ7::TEST_CORRELATE_Q7_4: 139 { 140 this->nba = 30; 141 this->nbb = 34; 142 ref.reload(MISCQ7::REF4_Q7_ID,mgr); 143 } 144 break; 145 146 case MISCQ7::TEST_CORRELATE_Q7_5: 147 { 148 this->nba = 30; 149 this->nbb = 49; 150 ref.reload(MISCQ7::REF5_Q7_ID,mgr); 151 } 152 break; 153 154 case MISCQ7::TEST_CORRELATE_Q7_6: 155 { 156 this->nba = 31; 157 this->nbb = 31; 158 ref.reload(MISCQ7::REF6_Q7_ID,mgr); 159 } 160 break; 161 162 case MISCQ7::TEST_CORRELATE_Q7_7: 163 { 164 this->nba = 31; 165 this->nbb = 32; 166 ref.reload(MISCQ7::REF7_Q7_ID,mgr); 167 } 168 break; 169 170 case MISCQ7::TEST_CORRELATE_Q7_8: 171 { 172 this->nba = 31; 173 this->nbb = 33; 174 ref.reload(MISCQ7::REF8_Q7_ID,mgr); 175 } 176 break; 177 178 case MISCQ7::TEST_CORRELATE_Q7_9: 179 { 180 this->nba = 31; 181 this->nbb = 34; 182 ref.reload(MISCQ7::REF9_Q7_ID,mgr); 183 } 184 break; 185 186 case MISCQ7::TEST_CORRELATE_Q7_10: 187 { 188 this->nba = 31; 189 this->nbb = 49; 190 ref.reload(MISCQ7::REF10_Q7_ID,mgr); 191 } 192 break; 193 194 case MISCQ7::TEST_CORRELATE_Q7_11: 195 { 196 this->nba = 32; 197 this->nbb = 31; 198 ref.reload(MISCQ7::REF11_Q7_ID,mgr); 199 } 200 break; 201 202 case MISCQ7::TEST_CORRELATE_Q7_12: 203 { 204 this->nba = 32; 205 this->nbb = 32; 206 ref.reload(MISCQ7::REF12_Q7_ID,mgr); 207 } 208 break; 209 210 case MISCQ7::TEST_CORRELATE_Q7_13: 211 { 212 this->nba = 32; 213 this->nbb = 33; 214 ref.reload(MISCQ7::REF13_Q7_ID,mgr); 215 } 216 break; 217 218 case MISCQ7::TEST_CORRELATE_Q7_14: 219 { 220 this->nba = 32; 221 this->nbb = 34; 222 ref.reload(MISCQ7::REF14_Q7_ID,mgr); 223 } 224 break; 225 226 case MISCQ7::TEST_CORRELATE_Q7_15: 227 { 228 this->nba = 32; 229 this->nbb = 49; 230 ref.reload(MISCQ7::REF15_Q7_ID,mgr); 231 } 232 break; 233 234 case MISCQ7::TEST_CORRELATE_Q7_16: 235 { 236 this->nba = 33; 237 this->nbb = 31; 238 ref.reload(MISCQ7::REF16_Q7_ID,mgr); 239 } 240 break; 241 242 case MISCQ7::TEST_CORRELATE_Q7_17: 243 { 244 this->nba = 33; 245 this->nbb = 32; 246 ref.reload(MISCQ7::REF17_Q7_ID,mgr); 247 } 248 break; 249 250 case MISCQ7::TEST_CORRELATE_Q7_18: 251 { 252 this->nba = 33; 253 this->nbb = 33; 254 ref.reload(MISCQ7::REF18_Q7_ID,mgr); 255 } 256 break; 257 258 case MISCQ7::TEST_CORRELATE_Q7_19: 259 { 260 this->nba = 33; 261 this->nbb = 34; 262 ref.reload(MISCQ7::REF19_Q7_ID,mgr); 263 } 264 break; 265 266 case MISCQ7::TEST_CORRELATE_Q7_20: 267 { 268 this->nba = 33; 269 this->nbb = 49; 270 ref.reload(MISCQ7::REF20_Q7_ID,mgr); 271 } 272 break; 273 274 case MISCQ7::TEST_CORRELATE_Q7_21: 275 { 276 this->nba = 48; 277 this->nbb = 31; 278 ref.reload(MISCQ7::REF21_Q7_ID,mgr); 279 } 280 break; 281 282 case MISCQ7::TEST_CORRELATE_Q7_22: 283 { 284 this->nba = 48; 285 this->nbb = 32; 286 ref.reload(MISCQ7::REF22_Q7_ID,mgr); 287 } 288 break; 289 290 case MISCQ7::TEST_CORRELATE_Q7_23: 291 { 292 this->nba = 48; 293 this->nbb = 33; 294 ref.reload(MISCQ7::REF23_Q7_ID,mgr); 295 } 296 break; 297 298 case MISCQ7::TEST_CORRELATE_Q7_24: 299 { 300 this->nba = 48; 301 this->nbb = 34; 302 ref.reload(MISCQ7::REF24_Q7_ID,mgr); 303 } 304 break; 305 306 case MISCQ7::TEST_CORRELATE_Q7_25: 307 { 308 this->nba = 48; 309 this->nbb = 49; 310 ref.reload(MISCQ7::REF25_Q7_ID,mgr); 311 } 312 break; 313 314 case MISCQ7::TEST_CONV_Q7_26: 315 { 316 this->nba = 30; 317 this->nbb = 31; 318 ref.reload(MISCQ7::REF26_Q7_ID,mgr); 319 } 320 break; 321 322 case MISCQ7::TEST_CONV_Q7_27: 323 { 324 this->nba = 30; 325 this->nbb = 32; 326 ref.reload(MISCQ7::REF27_Q7_ID,mgr); 327 } 328 break; 329 330 case MISCQ7::TEST_CONV_Q7_28: 331 { 332 this->nba = 30; 333 this->nbb = 33; 334 ref.reload(MISCQ7::REF28_Q7_ID,mgr); 335 } 336 break; 337 338 case MISCQ7::TEST_CONV_Q7_29: 339 { 340 this->nba = 30; 341 this->nbb = 34; 342 ref.reload(MISCQ7::REF29_Q7_ID,mgr); 343 } 344 break; 345 346 case MISCQ7::TEST_CONV_Q7_30: 347 { 348 this->nba = 30; 349 this->nbb = 49; 350 ref.reload(MISCQ7::REF30_Q7_ID,mgr); 351 } 352 break; 353 354 case MISCQ7::TEST_CONV_Q7_31: 355 { 356 this->nba = 31; 357 this->nbb = 31; 358 ref.reload(MISCQ7::REF31_Q7_ID,mgr); 359 } 360 break; 361 362 case MISCQ7::TEST_CONV_Q7_32: 363 { 364 this->nba = 31; 365 this->nbb = 32; 366 ref.reload(MISCQ7::REF32_Q7_ID,mgr); 367 } 368 break; 369 370 case MISCQ7::TEST_CONV_Q7_33: 371 { 372 this->nba = 31; 373 this->nbb = 33; 374 ref.reload(MISCQ7::REF33_Q7_ID,mgr); 375 } 376 break; 377 378 case MISCQ7::TEST_CONV_Q7_34: 379 { 380 this->nba = 31; 381 this->nbb = 34; 382 ref.reload(MISCQ7::REF34_Q7_ID,mgr); 383 } 384 break; 385 386 case MISCQ7::TEST_CONV_Q7_35: 387 { 388 this->nba = 31; 389 this->nbb = 49; 390 ref.reload(MISCQ7::REF35_Q7_ID,mgr); 391 } 392 break; 393 394 case MISCQ7::TEST_CONV_Q7_36: 395 { 396 this->nba = 32; 397 this->nbb = 31; 398 ref.reload(MISCQ7::REF36_Q7_ID,mgr); 399 } 400 break; 401 402 case MISCQ7::TEST_CONV_Q7_37: 403 { 404 this->nba = 32; 405 this->nbb = 32; 406 ref.reload(MISCQ7::REF37_Q7_ID,mgr); 407 } 408 break; 409 410 case MISCQ7::TEST_CONV_Q7_38: 411 { 412 this->nba = 32; 413 this->nbb = 33; 414 ref.reload(MISCQ7::REF38_Q7_ID,mgr); 415 } 416 break; 417 418 case MISCQ7::TEST_CONV_Q7_39: 419 { 420 this->nba = 32; 421 this->nbb = 34; 422 ref.reload(MISCQ7::REF39_Q7_ID,mgr); 423 } 424 break; 425 426 case MISCQ7::TEST_CONV_Q7_40: 427 { 428 this->nba = 32; 429 this->nbb = 49; 430 ref.reload(MISCQ7::REF40_Q7_ID,mgr); 431 } 432 break; 433 434 case MISCQ7::TEST_CONV_Q7_41: 435 { 436 this->nba = 33; 437 this->nbb = 31; 438 ref.reload(MISCQ7::REF41_Q7_ID,mgr); 439 } 440 break; 441 442 case MISCQ7::TEST_CONV_Q7_42: 443 { 444 this->nba = 33; 445 this->nbb = 32; 446 ref.reload(MISCQ7::REF42_Q7_ID,mgr); 447 } 448 break; 449 450 case MISCQ7::TEST_CONV_Q7_43: 451 { 452 this->nba = 33; 453 this->nbb = 33; 454 ref.reload(MISCQ7::REF43_Q7_ID,mgr); 455 } 456 break; 457 458 case MISCQ7::TEST_CONV_Q7_44: 459 { 460 this->nba = 33; 461 this->nbb = 34; 462 ref.reload(MISCQ7::REF44_Q7_ID,mgr); 463 } 464 break; 465 466 case MISCQ7::TEST_CONV_Q7_45: 467 { 468 this->nba = 33; 469 this->nbb = 49; 470 ref.reload(MISCQ7::REF45_Q7_ID,mgr); 471 } 472 break; 473 474 case MISCQ7::TEST_CONV_Q7_46: 475 { 476 this->nba = 48; 477 this->nbb = 31; 478 ref.reload(MISCQ7::REF46_Q7_ID,mgr); 479 } 480 break; 481 482 case MISCQ7::TEST_CONV_Q7_47: 483 { 484 this->nba = 48; 485 this->nbb = 32; 486 ref.reload(MISCQ7::REF47_Q7_ID,mgr); 487 } 488 break; 489 490 case MISCQ7::TEST_CONV_Q7_48: 491 { 492 this->nba = 48; 493 this->nbb = 33; 494 ref.reload(MISCQ7::REF48_Q7_ID,mgr); 495 } 496 break; 497 498 case MISCQ7::TEST_CONV_Q7_49: 499 { 500 this->nba = 48; 501 this->nbb = 34; 502 ref.reload(MISCQ7::REF49_Q7_ID,mgr); 503 } 504 break; 505 506 case MISCQ7::TEST_CONV_Q7_50: 507 { 508 this->nba = 48; 509 this->nbb = 49; 510 ref.reload(MISCQ7::REF50_Q7_ID,mgr); 511 } 512 break; 513 514 case MISCQ7::TEST_CONV_PARTIAL_Q7_51: 515 case MISCQ7::TEST_CONV_PARTIAL_OPT_Q7_54: 516 { 517 this->first=3; 518 this->nba = 6; 519 this->nbb = 8; 520 ref.reload(MISCQ7::REF54_Q7_ID,mgr); 521 tmp.create(ref.nbSamples(),MISCQ7::TMP_Q7_ID,mgr); 522 523 // Oversized and not used except in opt case 524 scratchA.create(24,MISCQ7::SCRATCH1_Q15_ID,mgr); 525 scratchB.create(24,MISCQ7::SCRATCH2_Q15_ID,mgr); 526 } 527 break; 528 529 case MISCQ7::TEST_CONV_PARTIAL_Q7_52: 530 case MISCQ7::TEST_CONV_PARTIAL_OPT_Q7_55: 531 { 532 this->first=9; 533 this->nba = 6; 534 this->nbb = 8; 535 ref.reload(MISCQ7::REF55_Q7_ID,mgr); 536 tmp.create(ref.nbSamples(),MISCQ7::TMP_Q7_ID,mgr); 537 538 // Oversized and not used except in opt case 539 scratchA.create(24,MISCQ7::SCRATCH1_Q15_ID,mgr); 540 scratchB.create(24,MISCQ7::SCRATCH2_Q15_ID,mgr); 541 542 } 543 break; 544 545 case MISCQ7::TEST_CONV_PARTIAL_Q7_53: 546 case MISCQ7::TEST_CONV_PARTIAL_OPT_Q7_56: 547 { 548 this->first=7; 549 this->nba = 6; 550 this->nbb = 8; 551 ref.reload(MISCQ7::REF56_Q7_ID,mgr); 552 tmp.create(ref.nbSamples(),MISCQ7::TMP_Q7_ID,mgr); 553 554 // Oversized and not used except in opt case 555 scratchA.create(24,MISCQ7::SCRATCH1_Q15_ID,mgr); 556 scratchB.create(24,MISCQ7::SCRATCH2_Q15_ID,mgr); 557 558 } 559 break; 560 561 562 } 563 564 if (id >= MISCQ7::TEST_CONV_PARTIAL_Q7_51) 565 { 566 inputA.reload(MISCQ7::INPUTA2_Q7_ID,mgr,nba); 567 inputB.reload(MISCQ7::INPUTB2_Q7_ID,mgr,nbb); 568 } 569 else 570 { 571 inputA.reload(MISCQ7::INPUTA_Q7_ID,mgr,nba); 572 inputB.reload(MISCQ7::INPUTB_Q7_ID,mgr,nbb); 573 } 574 575 output.create(ref.nbSamples(),MISCQ7::OUT_Q7_ID,mgr); 576 577 } 578 tearDown(Testing::testID_t id,Client::PatternMgr * mgr)579 void MISCQ7::tearDown(Testing::testID_t id,Client::PatternMgr *mgr) 580 { 581 (void)id; 582 output.dump(mgr); 583 584 } 585