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