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