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