1 /* 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include "testing/gtest/include/gtest/gtest.h" 12 #include "webrtc/common_audio/signal_processing/include/signal_processing_library.h" 13 14 static const int kVector16Size = 9; 15 static const int16_t vector16[kVector16Size] = {1, -15511, 4323, 1963, 16 WEBRTC_SPL_WORD16_MAX, 0, WEBRTC_SPL_WORD16_MIN + 5, -3333, 345}; 17 18 class SplTest : public testing::Test { 19 protected: 20 SplTest() { 21 WebRtcSpl_Init(); 22 } 23 virtual ~SplTest() { 24 } 25 }; 26 27 TEST_F(SplTest, MacroTest) { 28 // Macros with inputs. 29 int A = 10; 30 int B = 21; 31 int a = -3; 32 int b = WEBRTC_SPL_WORD32_MAX; 33 34 EXPECT_EQ(10, WEBRTC_SPL_MIN(A, B)); 35 EXPECT_EQ(21, WEBRTC_SPL_MAX(A, B)); 36 37 EXPECT_EQ(3, WEBRTC_SPL_ABS_W16(a)); 38 EXPECT_EQ(3, WEBRTC_SPL_ABS_W32(a)); 39 40 EXPECT_EQ(-63, WEBRTC_SPL_MUL(a, B)); 41 EXPECT_EQ(-2147483645, WEBRTC_SPL_MUL(a, b)); 42 EXPECT_EQ(2147483651u, WEBRTC_SPL_UMUL(a, b)); 43 b = WEBRTC_SPL_WORD16_MAX >> 1; 44 EXPECT_EQ(1073627139u, WEBRTC_SPL_UMUL_16_16(a, b)); 45 EXPECT_EQ(4294918147u, WEBRTC_SPL_UMUL_32_16(a, b)); 46 EXPECT_EQ(-49149, WEBRTC_SPL_MUL_16_U16(a, b)); 47 48 a = b; 49 b = -3; 50 51 EXPECT_EQ(-1, WEBRTC_SPL_MUL_16_32_RSFT16(a, b)); 52 EXPECT_EQ(-1, WEBRTC_SPL_MUL_16_32_RSFT15(a, b)); 53 EXPECT_EQ(-3, WEBRTC_SPL_MUL_16_32_RSFT14(a, b)); 54 EXPECT_EQ(-24, WEBRTC_SPL_MUL_16_32_RSFT11(a, b)); 55 56 EXPECT_EQ(-12288, WEBRTC_SPL_MUL_16_16_RSFT(a, b, 2)); 57 EXPECT_EQ(-12287, WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(a, b, 2)); 58 59 EXPECT_EQ(21, WEBRTC_SPL_SAT(a, A, B)); 60 EXPECT_EQ(21, WEBRTC_SPL_SAT(a, B, A)); 61 62 // Shifting with negative numbers allowed 63 int shift_amount = 1; // Workaround compiler warning using variable here. 64 // Positive means left shift 65 EXPECT_EQ(32766, WEBRTC_SPL_SHIFT_W32(a, shift_amount)); 66 67 // Shifting with negative numbers not allowed 68 // We cannot do casting here due to signed/unsigned problem 69 EXPECT_EQ(8191, WEBRTC_SPL_RSHIFT_W16(a, 1)); 70 EXPECT_EQ(32766, WEBRTC_SPL_LSHIFT_W16(a, 1)); 71 EXPECT_EQ(8191, WEBRTC_SPL_RSHIFT_W32(a, 1)); 72 EXPECT_EQ(32766, WEBRTC_SPL_LSHIFT_W32(a, 1)); 73 74 EXPECT_EQ(8191u, WEBRTC_SPL_RSHIFT_U32(a, 1)); 75 EXPECT_EQ(32766u, WEBRTC_SPL_LSHIFT_U32(a, 1)); 76 77 EXPECT_EQ(1470, WEBRTC_SPL_RAND(A)); 78 79 EXPECT_EQ(-49149, WEBRTC_SPL_MUL_16_16(a, b)); 80 EXPECT_EQ(1073676289, WEBRTC_SPL_MUL_16_16(WEBRTC_SPL_WORD16_MAX, 81 WEBRTC_SPL_WORD16_MAX)); 82 EXPECT_EQ(1073709055, WEBRTC_SPL_MUL_16_32_RSFT16(WEBRTC_SPL_WORD16_MAX, 83 WEBRTC_SPL_WORD32_MAX)); 84 EXPECT_EQ(1073741824, WEBRTC_SPL_MUL_16_32_RSFT16(WEBRTC_SPL_WORD16_MIN, 85 WEBRTC_SPL_WORD32_MIN)); 86 #ifdef WEBRTC_ARCH_ARM_V7 87 EXPECT_EQ(-1073741824, 88 WEBRTC_SPL_MUL_16_32_RSFT16(WEBRTC_SPL_WORD16_MIN, 89 WEBRTC_SPL_WORD32_MAX)); 90 #else 91 EXPECT_EQ(-1073741823, 92 WEBRTC_SPL_MUL_16_32_RSFT16(WEBRTC_SPL_WORD16_MIN, 93 WEBRTC_SPL_WORD32_MAX)); 94 #endif 95 } 96 97 TEST_F(SplTest, InlineTest) { 98 int16_t a16 = 121; 99 int16_t b16 = -17; 100 int32_t a32 = 111121; 101 int32_t b32 = -1711; 102 char bVersion[8]; 103 104 EXPECT_EQ(17, WebRtcSpl_GetSizeInBits(a32)); 105 106 EXPECT_EQ(0, WebRtcSpl_NormW32(0)); 107 EXPECT_EQ(31, WebRtcSpl_NormW32(-1)); 108 EXPECT_EQ(0, WebRtcSpl_NormW32(WEBRTC_SPL_WORD32_MIN)); 109 EXPECT_EQ(14, WebRtcSpl_NormW32(a32)); 110 111 EXPECT_EQ(0, WebRtcSpl_NormW16(0)); 112 EXPECT_EQ(15, WebRtcSpl_NormW16(-1)); 113 EXPECT_EQ(0, WebRtcSpl_NormW16(WEBRTC_SPL_WORD16_MIN)); 114 EXPECT_EQ(4, WebRtcSpl_NormW16(b32)); 115 116 EXPECT_EQ(0, WebRtcSpl_NormU32(0u)); 117 EXPECT_EQ(0, WebRtcSpl_NormU32(0xffffffff)); 118 EXPECT_EQ(15, WebRtcSpl_NormU32(static_cast<uint32_t>(a32))); 119 120 EXPECT_EQ(104, WebRtcSpl_AddSatW16(a16, b16)); 121 EXPECT_EQ(138, WebRtcSpl_SubSatW16(a16, b16)); 122 123 EXPECT_EQ(109410, WebRtcSpl_AddSatW32(a32, b32)); 124 EXPECT_EQ(112832, WebRtcSpl_SubSatW32(a32, b32)); 125 126 a32 = 0x80000000; 127 b32 = 0x80000000; 128 // Cast to signed int to avoid compiler complaint on gtest.h. 129 EXPECT_EQ(static_cast<int>(0x80000000), WebRtcSpl_AddSatW32(a32, b32)); 130 a32 = 0x7fffffff; 131 b32 = 0x7fffffff; 132 EXPECT_EQ(0x7fffffff, WebRtcSpl_AddSatW32(a32, b32)); 133 a32 = 0; 134 b32 = 0x80000000; 135 EXPECT_EQ(0x7fffffff, WebRtcSpl_SubSatW32(a32, b32)); 136 a32 = 0x7fffffff; 137 b32 = 0x80000000; 138 EXPECT_EQ(0x7fffffff, WebRtcSpl_SubSatW32(a32, b32)); 139 a32 = 0x80000000; 140 b32 = 0x7fffffff; 141 EXPECT_EQ(static_cast<int>(0x80000000), WebRtcSpl_SubSatW32(a32, b32)); 142 143 EXPECT_EQ(0, WebRtcSpl_get_version(bVersion, 8)); 144 } 145 146 TEST_F(SplTest, MathOperationsTest) { 147 int A = 1134567892; 148 int32_t num = 117; 149 int32_t den = -5; 150 uint16_t denU = 5; 151 EXPECT_EQ(33700, WebRtcSpl_Sqrt(A)); 152 EXPECT_EQ(33683, WebRtcSpl_SqrtFloor(A)); 153 154 155 EXPECT_EQ(-91772805, WebRtcSpl_DivResultInQ31(den, num)); 156 EXPECT_EQ(-23, WebRtcSpl_DivW32W16ResW16(num, (int16_t)den)); 157 EXPECT_EQ(-23, WebRtcSpl_DivW32W16(num, (int16_t)den)); 158 EXPECT_EQ(23u, WebRtcSpl_DivU32U16(num, denU)); 159 EXPECT_EQ(0, WebRtcSpl_DivW32HiLow(128, 0, 256)); 160 } 161 162 TEST_F(SplTest, BasicArrayOperationsTest) { 163 const int kVectorSize = 4; 164 int B[] = {4, 12, 133, 1100}; 165 int16_t b16[kVectorSize]; 166 int32_t b32[kVectorSize]; 167 168 int16_t bTmp16[kVectorSize]; 169 int32_t bTmp32[kVectorSize]; 170 171 WebRtcSpl_MemSetW16(b16, 3, kVectorSize); 172 for (int kk = 0; kk < kVectorSize; ++kk) { 173 EXPECT_EQ(3, b16[kk]); 174 } 175 WebRtcSpl_ZerosArrayW16(b16, kVectorSize); 176 for (int kk = 0; kk < kVectorSize; ++kk) { 177 EXPECT_EQ(0, b16[kk]); 178 } 179 WebRtcSpl_MemSetW32(b32, 3, kVectorSize); 180 for (int kk = 0; kk < kVectorSize; ++kk) { 181 EXPECT_EQ(3, b32[kk]); 182 } 183 WebRtcSpl_ZerosArrayW32(b32, kVectorSize); 184 for (int kk = 0; kk < kVectorSize; ++kk) { 185 EXPECT_EQ(0, b32[kk]); 186 } 187 for (int kk = 0; kk < kVectorSize; ++kk) { 188 bTmp16[kk] = (int16_t)kk; 189 bTmp32[kk] = (int32_t)kk; 190 } 191 WEBRTC_SPL_MEMCPY_W16(b16, bTmp16, kVectorSize); 192 for (int kk = 0; kk < kVectorSize; ++kk) { 193 EXPECT_EQ(b16[kk], bTmp16[kk]); 194 } 195 // WEBRTC_SPL_MEMCPY_W32(b32, bTmp32, kVectorSize); 196 // for (int kk = 0; kk < kVectorSize; ++kk) { 197 // EXPECT_EQ(b32[kk], bTmp32[kk]); 198 // } 199 WebRtcSpl_CopyFromEndW16(b16, kVectorSize, 2, bTmp16); 200 for (int kk = 0; kk < 2; ++kk) { 201 EXPECT_EQ(kk+2, bTmp16[kk]); 202 } 203 204 for (int kk = 0; kk < kVectorSize; ++kk) { 205 b32[kk] = B[kk]; 206 b16[kk] = (int16_t)B[kk]; 207 } 208 WebRtcSpl_VectorBitShiftW32ToW16(bTmp16, kVectorSize, b32, 1); 209 for (int kk = 0; kk < kVectorSize; ++kk) { 210 EXPECT_EQ((B[kk]>>1), bTmp16[kk]); 211 } 212 WebRtcSpl_VectorBitShiftW16(bTmp16, kVectorSize, b16, 1); 213 for (int kk = 0; kk < kVectorSize; ++kk) { 214 EXPECT_EQ((B[kk]>>1), bTmp16[kk]); 215 } 216 WebRtcSpl_VectorBitShiftW32(bTmp32, kVectorSize, b32, 1); 217 for (int kk = 0; kk < kVectorSize; ++kk) { 218 EXPECT_EQ((B[kk]>>1), bTmp32[kk]); 219 } 220 221 WebRtcSpl_MemCpyReversedOrder(&bTmp16[3], b16, kVectorSize); 222 for (int kk = 0; kk < kVectorSize; ++kk) { 223 EXPECT_EQ(b16[3-kk], bTmp16[kk]); 224 } 225 } 226 227 TEST_F(SplTest, ExeptionsHandlingMinMaxOperationsTest) { 228 // Test how the functions handle exceptional cases. 229 const int kVectorSize = 2; 230 int16_t vector16[kVectorSize] = {0}; 231 int32_t vector32[kVectorSize] = {0}; 232 233 EXPECT_EQ(-1, WebRtcSpl_MaxAbsValueW16(vector16, 0)); 234 EXPECT_EQ(-1, WebRtcSpl_MaxAbsValueW16(NULL, kVectorSize)); 235 EXPECT_EQ(WEBRTC_SPL_WORD16_MIN, WebRtcSpl_MaxValueW16(vector16, 0)); 236 EXPECT_EQ(WEBRTC_SPL_WORD16_MIN, WebRtcSpl_MaxValueW16(NULL, kVectorSize)); 237 EXPECT_EQ(WEBRTC_SPL_WORD16_MAX, WebRtcSpl_MinValueW16(vector16, 0)); 238 EXPECT_EQ(WEBRTC_SPL_WORD16_MAX, WebRtcSpl_MinValueW16(NULL, kVectorSize)); 239 EXPECT_EQ(-1, WebRtcSpl_MaxAbsValueW32(vector32, 0)); 240 EXPECT_EQ(-1, WebRtcSpl_MaxAbsValueW32(NULL, kVectorSize)); 241 EXPECT_EQ(WEBRTC_SPL_WORD32_MIN, WebRtcSpl_MaxValueW32(vector32, 0)); 242 EXPECT_EQ(WEBRTC_SPL_WORD32_MIN, WebRtcSpl_MaxValueW32(NULL, kVectorSize)); 243 EXPECT_EQ(WEBRTC_SPL_WORD32_MAX, WebRtcSpl_MinValueW32(vector32, 0)); 244 EXPECT_EQ(WEBRTC_SPL_WORD32_MAX, WebRtcSpl_MinValueW32(NULL, kVectorSize)); 245 EXPECT_EQ(-1, WebRtcSpl_MaxAbsIndexW16(vector16, 0)); 246 EXPECT_EQ(-1, WebRtcSpl_MaxAbsIndexW16(NULL, kVectorSize)); 247 EXPECT_EQ(-1, WebRtcSpl_MaxIndexW16(vector16, 0)); 248 EXPECT_EQ(-1, WebRtcSpl_MaxIndexW16(NULL, kVectorSize)); 249 EXPECT_EQ(-1, WebRtcSpl_MaxIndexW32(vector32, 0)); 250 EXPECT_EQ(-1, WebRtcSpl_MaxIndexW32(NULL, kVectorSize)); 251 EXPECT_EQ(-1, WebRtcSpl_MinIndexW16(vector16, 0)); 252 EXPECT_EQ(-1, WebRtcSpl_MinIndexW16(NULL, kVectorSize)); 253 EXPECT_EQ(-1, WebRtcSpl_MinIndexW32(vector32, 0)); 254 EXPECT_EQ(-1, WebRtcSpl_MinIndexW32(NULL, kVectorSize)); 255 } 256 257 TEST_F(SplTest, MinMaxOperationsTest) { 258 const int kVectorSize = 17; 259 260 // Vectors to test the cases where minimum values have to be caught 261 // outside of the unrolled loops in ARM-Neon. 262 int16_t vector16[kVectorSize] = {-1, 7485, 0, 3333, 263 -18283, 0, 12334, -29871, 988, -3333, 264 345, -456, 222, 999, 888, 8774, WEBRTC_SPL_WORD16_MIN}; 265 int32_t vector32[kVectorSize] = {-1, 0, 283211, 3333, 266 8712345, 0, -3333, 89345, -374585456, 222, 999, 122345334, 267 -12389756, -987329871, 888, -2, WEBRTC_SPL_WORD32_MIN}; 268 269 EXPECT_EQ(WEBRTC_SPL_WORD16_MIN, 270 WebRtcSpl_MinValueW16(vector16, kVectorSize)); 271 EXPECT_EQ(WEBRTC_SPL_WORD32_MIN, 272 WebRtcSpl_MinValueW32(vector32, kVectorSize)); 273 EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MinIndexW16(vector16, kVectorSize)); 274 EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MinIndexW32(vector32, kVectorSize)); 275 276 // Test the cases where maximum values have to be caught 277 // outside of the unrolled loops in ARM-Neon. 278 vector16[kVectorSize - 1] = WEBRTC_SPL_WORD16_MAX; 279 vector32[kVectorSize - 1] = WEBRTC_SPL_WORD32_MAX; 280 281 EXPECT_EQ(WEBRTC_SPL_WORD16_MAX, 282 WebRtcSpl_MaxAbsValueW16(vector16, kVectorSize)); 283 EXPECT_EQ(WEBRTC_SPL_WORD16_MAX, 284 WebRtcSpl_MaxValueW16(vector16, kVectorSize)); 285 EXPECT_EQ(WEBRTC_SPL_WORD32_MAX, 286 WebRtcSpl_MaxAbsValueW32(vector32, kVectorSize)); 287 EXPECT_EQ(WEBRTC_SPL_WORD32_MAX, 288 WebRtcSpl_MaxValueW32(vector32, kVectorSize)); 289 EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MaxAbsIndexW16(vector16, kVectorSize)); 290 EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MaxIndexW16(vector16, kVectorSize)); 291 EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MaxIndexW32(vector32, kVectorSize)); 292 293 // Test the cases where multiple maximum and minimum values are present. 294 vector16[1] = WEBRTC_SPL_WORD16_MAX; 295 vector16[6] = WEBRTC_SPL_WORD16_MIN; 296 vector16[11] = WEBRTC_SPL_WORD16_MIN; 297 vector32[1] = WEBRTC_SPL_WORD32_MAX; 298 vector32[6] = WEBRTC_SPL_WORD32_MIN; 299 vector32[11] = WEBRTC_SPL_WORD32_MIN; 300 301 EXPECT_EQ(WEBRTC_SPL_WORD16_MAX, 302 WebRtcSpl_MaxAbsValueW16(vector16, kVectorSize)); 303 EXPECT_EQ(WEBRTC_SPL_WORD16_MAX, 304 WebRtcSpl_MaxValueW16(vector16, kVectorSize)); 305 EXPECT_EQ(WEBRTC_SPL_WORD16_MIN, 306 WebRtcSpl_MinValueW16(vector16, kVectorSize)); 307 EXPECT_EQ(WEBRTC_SPL_WORD32_MAX, 308 WebRtcSpl_MaxAbsValueW32(vector32, kVectorSize)); 309 EXPECT_EQ(WEBRTC_SPL_WORD32_MAX, 310 WebRtcSpl_MaxValueW32(vector32, kVectorSize)); 311 EXPECT_EQ(WEBRTC_SPL_WORD32_MIN, 312 WebRtcSpl_MinValueW32(vector32, kVectorSize)); 313 EXPECT_EQ(6, WebRtcSpl_MaxAbsIndexW16(vector16, kVectorSize)); 314 EXPECT_EQ(1, WebRtcSpl_MaxIndexW16(vector16, kVectorSize)); 315 EXPECT_EQ(1, WebRtcSpl_MaxIndexW32(vector32, kVectorSize)); 316 EXPECT_EQ(6, WebRtcSpl_MinIndexW16(vector16, kVectorSize)); 317 EXPECT_EQ(6, WebRtcSpl_MinIndexW32(vector32, kVectorSize)); 318 } 319 320 TEST_F(SplTest, VectorOperationsTest) { 321 const int kVectorSize = 4; 322 int B[] = {4, 12, 133, 1100}; 323 int16_t a16[kVectorSize]; 324 int16_t b16[kVectorSize]; 325 int16_t bTmp16[kVectorSize]; 326 327 for (int kk = 0; kk < kVectorSize; ++kk) { 328 a16[kk] = B[kk]; 329 b16[kk] = B[kk]; 330 } 331 332 WebRtcSpl_AffineTransformVector(bTmp16, b16, 3, 7, 2, kVectorSize); 333 for (int kk = 0; kk < kVectorSize; ++kk) { 334 EXPECT_EQ((B[kk]*3+7)>>2, bTmp16[kk]); 335 } 336 WebRtcSpl_ScaleAndAddVectorsWithRound(b16, 3, b16, 2, 2, bTmp16, kVectorSize); 337 for (int kk = 0; kk < kVectorSize; ++kk) { 338 EXPECT_EQ((B[kk]*3+B[kk]*2+2)>>2, bTmp16[kk]); 339 } 340 341 WebRtcSpl_AddAffineVectorToVector(bTmp16, b16, 3, 7, 2, kVectorSize); 342 for (int kk = 0; kk < kVectorSize; ++kk) { 343 EXPECT_EQ(((B[kk]*3+B[kk]*2+2)>>2)+((b16[kk]*3+7)>>2), bTmp16[kk]); 344 } 345 346 WebRtcSpl_ScaleVector(b16, bTmp16, 13, kVectorSize, 2); 347 for (int kk = 0; kk < kVectorSize; ++kk) { 348 EXPECT_EQ((b16[kk]*13)>>2, bTmp16[kk]); 349 } 350 WebRtcSpl_ScaleVectorWithSat(b16, bTmp16, 13, kVectorSize, 2); 351 for (int kk = 0; kk < kVectorSize; ++kk) { 352 EXPECT_EQ((b16[kk]*13)>>2, bTmp16[kk]); 353 } 354 WebRtcSpl_ScaleAndAddVectors(a16, 13, 2, b16, 7, 2, bTmp16, kVectorSize); 355 for (int kk = 0; kk < kVectorSize; ++kk) { 356 EXPECT_EQ(((a16[kk]*13)>>2)+((b16[kk]*7)>>2), bTmp16[kk]); 357 } 358 359 WebRtcSpl_AddVectorsAndShift(bTmp16, a16, b16, kVectorSize, 2); 360 for (int kk = 0; kk < kVectorSize; ++kk) { 361 EXPECT_EQ(B[kk] >> 1, bTmp16[kk]); 362 } 363 WebRtcSpl_ReverseOrderMultArrayElements(bTmp16, a16, &b16[3], kVectorSize, 2); 364 for (int kk = 0; kk < kVectorSize; ++kk) { 365 EXPECT_EQ((a16[kk]*b16[3-kk])>>2, bTmp16[kk]); 366 } 367 WebRtcSpl_ElementwiseVectorMult(bTmp16, a16, b16, kVectorSize, 6); 368 for (int kk = 0; kk < kVectorSize; ++kk) { 369 EXPECT_EQ((a16[kk]*b16[kk])>>6, bTmp16[kk]); 370 } 371 372 WebRtcSpl_SqrtOfOneMinusXSquared(b16, kVectorSize, bTmp16); 373 for (int kk = 0; kk < kVectorSize - 1; ++kk) { 374 EXPECT_EQ(32767, bTmp16[kk]); 375 } 376 EXPECT_EQ(32749, bTmp16[kVectorSize - 1]); 377 378 EXPECT_EQ(0, WebRtcSpl_GetScalingSquare(b16, kVectorSize, 1)); 379 } 380 381 TEST_F(SplTest, EstimatorsTest) { 382 const int kVectorSize = 4; 383 int B[] = {4, 12, 133, 1100}; 384 int16_t b16[kVectorSize]; 385 int32_t b32[kVectorSize]; 386 int16_t bTmp16[kVectorSize]; 387 388 for (int kk = 0; kk < kVectorSize; ++kk) { 389 b16[kk] = B[kk]; 390 b32[kk] = B[kk]; 391 } 392 393 EXPECT_EQ(0, WebRtcSpl_LevinsonDurbin(b32, b16, bTmp16, 2)); 394 } 395 396 TEST_F(SplTest, FilterTest) { 397 const int kVectorSize = 4; 398 const int kFilterOrder = 3; 399 int16_t A[] = {1, 2, 33, 100}; 400 int16_t A5[] = {1, 2, 33, 100, -5}; 401 int16_t B[] = {4, 12, 133, 110}; 402 int16_t data_in[kVectorSize]; 403 int16_t data_out[kVectorSize]; 404 int16_t bTmp16Low[kVectorSize]; 405 int16_t bState[kVectorSize]; 406 int16_t bStateLow[kVectorSize]; 407 408 WebRtcSpl_ZerosArrayW16(bState, kVectorSize); 409 WebRtcSpl_ZerosArrayW16(bStateLow, kVectorSize); 410 411 for (int kk = 0; kk < kVectorSize; ++kk) { 412 data_in[kk] = A[kk]; 413 data_out[kk] = 0; 414 } 415 416 // MA filters. 417 // Note that the input data has |kFilterOrder| states before the actual 418 // data (one sample). 419 WebRtcSpl_FilterMAFastQ12(&data_in[kFilterOrder], data_out, B, 420 kFilterOrder + 1, 1); 421 EXPECT_EQ(0, data_out[0]); 422 // AR filters. 423 // Note that the output data has |kFilterOrder| states before the actual 424 // data (one sample). 425 WebRtcSpl_FilterARFastQ12(data_in, &data_out[kFilterOrder], A, 426 kFilterOrder + 1, 1); 427 EXPECT_EQ(0, data_out[kFilterOrder]); 428 429 EXPECT_EQ(kVectorSize, WebRtcSpl_FilterAR(A5, 430 5, 431 data_in, 432 kVectorSize, 433 bState, 434 kVectorSize, 435 bStateLow, 436 kVectorSize, 437 data_out, 438 bTmp16Low, 439 kVectorSize)); 440 } 441 442 TEST_F(SplTest, RandTest) { 443 const int kVectorSize = 4; 444 int16_t BU[] = {3653, 12446, 8525, 30691}; 445 int16_t b16[kVectorSize]; 446 uint32_t bSeed = 100000; 447 448 EXPECT_EQ(7086, WebRtcSpl_RandU(&bSeed)); 449 EXPECT_EQ(31565, WebRtcSpl_RandU(&bSeed)); 450 EXPECT_EQ(-9786, WebRtcSpl_RandN(&bSeed)); 451 EXPECT_EQ(kVectorSize, WebRtcSpl_RandUArray(b16, kVectorSize, &bSeed)); 452 for (int kk = 0; kk < kVectorSize; ++kk) { 453 EXPECT_EQ(BU[kk], b16[kk]); 454 } 455 } 456 457 TEST_F(SplTest, DotProductWithScaleTest) { 458 EXPECT_EQ(605362796, WebRtcSpl_DotProductWithScale(vector16, 459 vector16, kVector16Size, 2)); 460 } 461 462 TEST_F(SplTest, CrossCorrelationTest) { 463 // Note the function arguments relation specificed by API. 464 const int kCrossCorrelationDimension = 3; 465 const int kShift = 2; 466 const int kStep = 1; 467 const int kSeqDimension = 6; 468 469 const int16_t kVector16[kVector16Size] = {1, 4323, 1963, 470 WEBRTC_SPL_WORD16_MAX, WEBRTC_SPL_WORD16_MIN + 5, -3333, -876, 8483, 142}; 471 int32_t vector32[kCrossCorrelationDimension] = {0}; 472 473 WebRtcSpl_CrossCorrelation(vector32, vector16, kVector16, kSeqDimension, 474 kCrossCorrelationDimension, kShift, kStep); 475 476 // WebRtcSpl_CrossCorrelationC() and WebRtcSpl_CrossCorrelationNeon() 477 // are not bit-exact. 478 const int32_t kExpected[kCrossCorrelationDimension] = 479 {-266947903, -15579555, -171282001}; 480 const int32_t* expected = kExpected; 481 #if !defined(MIPS32_LE) 482 const int32_t kExpectedNeon[kCrossCorrelationDimension] = 483 {-266947901, -15579553, -171281999}; 484 if (WebRtcSpl_CrossCorrelation != WebRtcSpl_CrossCorrelationC) { 485 expected = kExpectedNeon; 486 } 487 #endif 488 for (int i = 0; i < kCrossCorrelationDimension; ++i) { 489 EXPECT_EQ(expected[i], vector32[i]); 490 } 491 } 492 493 TEST_F(SplTest, AutoCorrelationTest) { 494 int scale = 0; 495 int32_t vector32[kVector16Size]; 496 const int32_t expected[kVector16Size] = {302681398, 14223410, -121705063, 497 -85221647, -17104971, 61806945, 6644603, -669329, 43}; 498 499 EXPECT_EQ(-1, WebRtcSpl_AutoCorrelation(vector16, 500 kVector16Size, kVector16Size + 1, vector32, &scale)); 501 EXPECT_EQ(kVector16Size, WebRtcSpl_AutoCorrelation(vector16, 502 kVector16Size, kVector16Size - 1, vector32, &scale)); 503 EXPECT_EQ(3, scale); 504 for (int i = 0; i < kVector16Size; ++i) { 505 EXPECT_EQ(expected[i], vector32[i]); 506 } 507 } 508 509 TEST_F(SplTest, SignalProcessingTest) { 510 const int kVectorSize = 4; 511 int A[] = {1, 2, 33, 100}; 512 const int16_t kHanning[4] = { 2399, 8192, 13985, 16384 }; 513 int16_t b16[kVectorSize]; 514 515 int16_t bTmp16[kVectorSize]; 516 517 int bScale = 0; 518 519 for (int kk = 0; kk < kVectorSize; ++kk) { 520 b16[kk] = A[kk]; 521 } 522 523 // TODO(bjornv): Activate the Reflection Coefficient tests when refactoring. 524 // WebRtcSpl_ReflCoefToLpc(b16, kVectorSize, bTmp16); 525 //// for (int kk = 0; kk < kVectorSize; ++kk) { 526 //// EXPECT_EQ(aTmp16[kk], bTmp16[kk]); 527 //// } 528 // WebRtcSpl_LpcToReflCoef(bTmp16, kVectorSize, b16); 529 //// for (int kk = 0; kk < kVectorSize; ++kk) { 530 //// EXPECT_EQ(a16[kk], b16[kk]); 531 //// } 532 // WebRtcSpl_AutoCorrToReflCoef(b32, kVectorSize, bTmp16); 533 //// for (int kk = 0; kk < kVectorSize; ++kk) { 534 //// EXPECT_EQ(aTmp16[kk], bTmp16[kk]); 535 //// } 536 537 WebRtcSpl_GetHanningWindow(bTmp16, kVectorSize); 538 for (int kk = 0; kk < kVectorSize; ++kk) { 539 EXPECT_EQ(kHanning[kk], bTmp16[kk]); 540 } 541 542 for (int kk = 0; kk < kVectorSize; ++kk) { 543 b16[kk] = A[kk]; 544 } 545 EXPECT_EQ(11094 , WebRtcSpl_Energy(b16, kVectorSize, &bScale)); 546 EXPECT_EQ(0, bScale); 547 } 548 549 TEST_F(SplTest, FFTTest) { 550 int16_t B[] = {1, 2, 33, 100, 551 2, 3, 34, 101, 552 3, 4, 35, 102, 553 4, 5, 36, 103}; 554 555 EXPECT_EQ(0, WebRtcSpl_ComplexFFT(B, 3, 1)); 556 // for (int kk = 0; kk < 16; ++kk) { 557 // EXPECT_EQ(A[kk], B[kk]); 558 // } 559 EXPECT_EQ(0, WebRtcSpl_ComplexIFFT(B, 3, 1)); 560 // for (int kk = 0; kk < 16; ++kk) { 561 // EXPECT_EQ(A[kk], B[kk]); 562 // } 563 WebRtcSpl_ComplexBitReverse(B, 3); 564 for (int kk = 0; kk < 16; ++kk) { 565 //EXPECT_EQ(A[kk], B[kk]); 566 } 567 } 568 569 TEST_F(SplTest, Resample48WithSaturationTest) { 570 // The test resamples 3*kBlockSize number of samples to 2*kBlockSize number 571 // of samples. 572 const int kBlockSize = 16; 573 574 // Saturated input vector of 48 samples. 575 const int32_t kVectorSaturated[3 * kBlockSize + 7] = { 576 -32768, -32768, -32768, -32768, -32768, -32768, -32768, -32768, 577 -32768, -32768, -32768, -32768, -32768, -32768, -32768, -32768, 578 -32768, -32768, -32768, -32768, -32768, -32768, -32768, -32768, 579 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 580 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 581 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 582 32767, 32767, 32767, 32767, 32767, 32767, 32767 583 }; 584 585 // All values in |out_vector| should be |kRefValue32kHz|. 586 const int32_t kRefValue32kHz1 = -1077493760; 587 const int32_t kRefValue32kHz2 = 1077493645; 588 589 // After bit shift with saturation, |out_vector_w16| is saturated. 590 591 const int16_t kRefValue16kHz1 = -32768; 592 const int16_t kRefValue16kHz2 = 32767; 593 // Vector for storing output. 594 int32_t out_vector[2 * kBlockSize]; 595 int16_t out_vector_w16[2 * kBlockSize]; 596 597 WebRtcSpl_Resample48khzTo32khz(kVectorSaturated, out_vector, kBlockSize); 598 WebRtcSpl_VectorBitShiftW32ToW16(out_vector_w16, 2 * kBlockSize, out_vector, 599 15); 600 601 // Comparing output values against references. The values at position 602 // 12-15 are skipped to account for the filter lag. 603 for (int i = 0; i < 12; ++i) { 604 EXPECT_EQ(kRefValue32kHz1, out_vector[i]); 605 EXPECT_EQ(kRefValue16kHz1, out_vector_w16[i]); 606 } 607 for (int i = 16; i < 2 * kBlockSize; ++i) { 608 EXPECT_EQ(kRefValue32kHz2, out_vector[i]); 609 EXPECT_EQ(kRefValue16kHz2, out_vector_w16[i]); 610 } 611 } 612