2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
11 #include "testing/gtest/include/gtest/gtest.h"
12 #include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
14 static const int kVector16Size = 9;
15 static const int16_t vector16[kVector16Size] = {1, -15511, 4323, 1963,
16 WEBRTC_SPL_WORD16_MAX, 0, WEBRTC_SPL_WORD16_MIN + 5, -3333, 345};
18 class SplTest : public testing::Test {
27 TEST_F(SplTest, MacroTest) {
28 // Macros with inputs.
32 int b = WEBRTC_SPL_WORD32_MAX;
36 EXPECT_EQ(10, WEBRTC_SPL_MIN(A, B));
37 EXPECT_EQ(21, WEBRTC_SPL_MAX(A, B));
39 EXPECT_EQ(3, WEBRTC_SPL_ABS_W16(a));
40 EXPECT_EQ(3, WEBRTC_SPL_ABS_W32(a));
41 EXPECT_EQ(0, WEBRTC_SPL_GET_BYTE(&B, nr));
42 WEBRTC_SPL_SET_BYTE(&d_ptr2, 1, nr);
43 EXPECT_EQ(65536, d_ptr2);
45 EXPECT_EQ(-63, WEBRTC_SPL_MUL(a, B));
46 EXPECT_EQ(-2147483645, WEBRTC_SPL_MUL(a, b));
47 EXPECT_EQ(2147483651u, WEBRTC_SPL_UMUL(a, b));
48 b = WEBRTC_SPL_WORD16_MAX >> 1;
49 EXPECT_EQ(1073627139u, WEBRTC_SPL_UMUL_16_16(a, b));
50 EXPECT_EQ(4294918147u, WEBRTC_SPL_UMUL_32_16(a, b));
51 EXPECT_EQ(-49149, WEBRTC_SPL_MUL_16_U16(a, b));
55 EXPECT_EQ(-5461, WEBRTC_SPL_DIV(a, b));
56 EXPECT_EQ(0u, WEBRTC_SPL_UDIV(a, b));
58 EXPECT_EQ(-1, WEBRTC_SPL_MUL_16_32_RSFT16(a, b));
59 EXPECT_EQ(-1, WEBRTC_SPL_MUL_16_32_RSFT15(a, b));
60 EXPECT_EQ(-3, WEBRTC_SPL_MUL_16_32_RSFT14(a, b));
61 EXPECT_EQ(-24, WEBRTC_SPL_MUL_16_32_RSFT11(a, b));
63 EXPECT_EQ(-12288, WEBRTC_SPL_MUL_16_16_RSFT(a, b, 2));
64 EXPECT_EQ(-12287, WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(a, b, 2));
66 EXPECT_EQ(16380, WEBRTC_SPL_ADD_SAT_W32(a, b));
67 EXPECT_EQ(21, WEBRTC_SPL_SAT(a, A, B));
68 EXPECT_EQ(21, WEBRTC_SPL_SAT(a, B, A));
69 EXPECT_EQ(-49149, WEBRTC_SPL_MUL_32_16(a, b));
71 EXPECT_EQ(16380, WEBRTC_SPL_ADD_SAT_W16(a, b));
73 // Shifting with negative numbers allowed
74 int shift_amount = 1; // Workaround compiler warning using variable here.
75 // Positive means left shift
76 EXPECT_EQ(32766, WEBRTC_SPL_SHIFT_W32(a, shift_amount));
78 // Shifting with negative numbers not allowed
79 // We cannot do casting here due to signed/unsigned problem
80 EXPECT_EQ(8191, WEBRTC_SPL_RSHIFT_W16(a, 1));
81 EXPECT_EQ(32766, WEBRTC_SPL_LSHIFT_W16(a, 1));
82 EXPECT_EQ(8191, WEBRTC_SPL_RSHIFT_W32(a, 1));
83 EXPECT_EQ(32766, WEBRTC_SPL_LSHIFT_W32(a, 1));
85 EXPECT_EQ(8191u, WEBRTC_SPL_RSHIFT_U32(a, 1));
86 EXPECT_EQ(32766u, WEBRTC_SPL_LSHIFT_U32(a, 1));
88 EXPECT_EQ(1470, WEBRTC_SPL_RAND(A));
90 EXPECT_EQ(-49149, WEBRTC_SPL_MUL_16_16(a, b));
91 EXPECT_EQ(1073676289, WEBRTC_SPL_MUL_16_16(WEBRTC_SPL_WORD16_MAX,
92 WEBRTC_SPL_WORD16_MAX));
93 EXPECT_EQ(1073709055, WEBRTC_SPL_MUL_16_32_RSFT16(WEBRTC_SPL_WORD16_MAX,
94 WEBRTC_SPL_WORD32_MAX));
95 EXPECT_EQ(1073741824, WEBRTC_SPL_MUL_16_32_RSFT16(WEBRTC_SPL_WORD16_MIN,
96 WEBRTC_SPL_WORD32_MIN));
97 #ifdef WEBRTC_ARCH_ARM_V7
98 EXPECT_EQ(-1073741824,
99 WEBRTC_SPL_MUL_16_32_RSFT16(WEBRTC_SPL_WORD16_MIN,
100 WEBRTC_SPL_WORD32_MAX));
102 EXPECT_EQ(-1073741823,
103 WEBRTC_SPL_MUL_16_32_RSFT16(WEBRTC_SPL_WORD16_MIN,
104 WEBRTC_SPL_WORD32_MAX));
108 TEST_F(SplTest, InlineTest) {
111 int32_t a32 = 111121;
115 EXPECT_EQ(17, WebRtcSpl_GetSizeInBits(a32));
117 EXPECT_EQ(0, WebRtcSpl_NormW32(0));
118 EXPECT_EQ(31, WebRtcSpl_NormW32(-1));
119 EXPECT_EQ(0, WebRtcSpl_NormW32(WEBRTC_SPL_WORD32_MIN));
120 EXPECT_EQ(14, WebRtcSpl_NormW32(a32));
122 EXPECT_EQ(0, WebRtcSpl_NormW16(0));
123 EXPECT_EQ(15, WebRtcSpl_NormW16(-1));
124 EXPECT_EQ(0, WebRtcSpl_NormW16(WEBRTC_SPL_WORD16_MIN));
125 EXPECT_EQ(4, WebRtcSpl_NormW16(b32));
127 EXPECT_EQ(0, WebRtcSpl_NormU32(0u));
128 EXPECT_EQ(0, WebRtcSpl_NormU32(0xffffffff));
129 EXPECT_EQ(15, WebRtcSpl_NormU32(static_cast<uint32_t>(a32)));
131 EXPECT_EQ(104, WebRtcSpl_AddSatW16(a16, b16));
132 EXPECT_EQ(138, WebRtcSpl_SubSatW16(a16, b16));
134 EXPECT_EQ(109410, WebRtcSpl_AddSatW32(a32, b32));
135 EXPECT_EQ(112832, WebRtcSpl_SubSatW32(a32, b32));
139 // Cast to signed int to avoid compiler complaint on gtest.h.
140 EXPECT_EQ(static_cast<int>(0x80000000), WebRtcSpl_AddSatW32(a32, b32));
143 EXPECT_EQ(0x7fffffff, WebRtcSpl_AddSatW32(a32, b32));
146 EXPECT_EQ(0x7fffffff, WebRtcSpl_SubSatW32(a32, b32));
149 EXPECT_EQ(0x7fffffff, WebRtcSpl_SubSatW32(a32, b32));
152 EXPECT_EQ(static_cast<int>(0x80000000), WebRtcSpl_SubSatW32(a32, b32));
154 EXPECT_EQ(0, WebRtcSpl_get_version(bVersion, 8));
157 TEST_F(SplTest, MathOperationsTest) {
162 EXPECT_EQ(33700, WebRtcSpl_Sqrt(A));
163 EXPECT_EQ(33683, WebRtcSpl_SqrtFloor(A));
166 EXPECT_EQ(-91772805, WebRtcSpl_DivResultInQ31(den, num));
167 EXPECT_EQ(-23, WebRtcSpl_DivW32W16ResW16(num, (int16_t)den));
168 EXPECT_EQ(-23, WebRtcSpl_DivW32W16(num, (int16_t)den));
169 EXPECT_EQ(23u, WebRtcSpl_DivU32U16(num, denU));
170 EXPECT_EQ(0, WebRtcSpl_DivW32HiLow(128, 0, 256));
173 TEST_F(SplTest, BasicArrayOperationsTest) {
174 const int kVectorSize = 4;
175 int B[] = {4, 12, 133, 1100};
176 uint8_t b8[kVectorSize];
177 int16_t b16[kVectorSize];
178 int32_t b32[kVectorSize];
180 uint8_t bTmp8[kVectorSize];
181 int16_t bTmp16[kVectorSize];
182 int32_t bTmp32[kVectorSize];
184 WebRtcSpl_MemSetW16(b16, 3, kVectorSize);
185 for (int kk = 0; kk < kVectorSize; ++kk) {
186 EXPECT_EQ(3, b16[kk]);
188 EXPECT_EQ(kVectorSize, WebRtcSpl_ZerosArrayW16(b16, kVectorSize));
189 for (int kk = 0; kk < kVectorSize; ++kk) {
190 EXPECT_EQ(0, b16[kk]);
192 EXPECT_EQ(kVectorSize, WebRtcSpl_OnesArrayW16(b16, kVectorSize));
193 for (int kk = 0; kk < kVectorSize; ++kk) {
194 EXPECT_EQ(1, b16[kk]);
196 WebRtcSpl_MemSetW32(b32, 3, kVectorSize);
197 for (int kk = 0; kk < kVectorSize; ++kk) {
198 EXPECT_EQ(3, b32[kk]);
200 EXPECT_EQ(kVectorSize, WebRtcSpl_ZerosArrayW32(b32, kVectorSize));
201 for (int kk = 0; kk < kVectorSize; ++kk) {
202 EXPECT_EQ(0, b32[kk]);
204 EXPECT_EQ(kVectorSize, WebRtcSpl_OnesArrayW32(b32, kVectorSize));
205 for (int kk = 0; kk < kVectorSize; ++kk) {
206 EXPECT_EQ(1, b32[kk]);
208 for (int kk = 0; kk < kVectorSize; ++kk) {
209 bTmp8[kk] = (int8_t)kk;
210 bTmp16[kk] = (int16_t)kk;
211 bTmp32[kk] = (int32_t)kk;
213 WEBRTC_SPL_MEMCPY_W8(b8, bTmp8, kVectorSize);
214 for (int kk = 0; kk < kVectorSize; ++kk) {
215 EXPECT_EQ(b8[kk], bTmp8[kk]);
217 WEBRTC_SPL_MEMCPY_W16(b16, bTmp16, kVectorSize);
218 for (int kk = 0; kk < kVectorSize; ++kk) {
219 EXPECT_EQ(b16[kk], bTmp16[kk]);
221 // WEBRTC_SPL_MEMCPY_W32(b32, bTmp32, kVectorSize);
222 // for (int kk = 0; kk < kVectorSize; ++kk) {
223 // EXPECT_EQ(b32[kk], bTmp32[kk]);
225 EXPECT_EQ(2, WebRtcSpl_CopyFromEndW16(b16, kVectorSize, 2, bTmp16));
226 for (int kk = 0; kk < 2; ++kk) {
227 EXPECT_EQ(kk+2, bTmp16[kk]);
230 for (int kk = 0; kk < kVectorSize; ++kk) {
232 b16[kk] = (int16_t)B[kk];
234 WebRtcSpl_VectorBitShiftW32ToW16(bTmp16, kVectorSize, b32, 1);
235 for (int kk = 0; kk < kVectorSize; ++kk) {
236 EXPECT_EQ((B[kk]>>1), bTmp16[kk]);
238 WebRtcSpl_VectorBitShiftW16(bTmp16, kVectorSize, b16, 1);
239 for (int kk = 0; kk < kVectorSize; ++kk) {
240 EXPECT_EQ((B[kk]>>1), bTmp16[kk]);
242 WebRtcSpl_VectorBitShiftW32(bTmp32, kVectorSize, b32, 1);
243 for (int kk = 0; kk < kVectorSize; ++kk) {
244 EXPECT_EQ((B[kk]>>1), bTmp32[kk]);
247 WebRtcSpl_MemCpyReversedOrder(&bTmp16[3], b16, kVectorSize);
248 for (int kk = 0; kk < kVectorSize; ++kk) {
249 EXPECT_EQ(b16[3-kk], bTmp16[kk]);
253 TEST_F(SplTest, ExeptionsHandlingMinMaxOperationsTest) {
254 // Test how the functions handle exceptional cases.
255 const int kVectorSize = 2;
256 int16_t vector16[kVectorSize] = {0};
257 int32_t vector32[kVectorSize] = {0};
259 EXPECT_EQ(-1, WebRtcSpl_MaxAbsValueW16(vector16, 0));
260 EXPECT_EQ(-1, WebRtcSpl_MaxAbsValueW16(NULL, kVectorSize));
261 EXPECT_EQ(WEBRTC_SPL_WORD16_MIN, WebRtcSpl_MaxValueW16(vector16, 0));
262 EXPECT_EQ(WEBRTC_SPL_WORD16_MIN, WebRtcSpl_MaxValueW16(NULL, kVectorSize));
263 EXPECT_EQ(WEBRTC_SPL_WORD16_MAX, WebRtcSpl_MinValueW16(vector16, 0));
264 EXPECT_EQ(WEBRTC_SPL_WORD16_MAX, WebRtcSpl_MinValueW16(NULL, kVectorSize));
265 EXPECT_EQ(-1, WebRtcSpl_MaxAbsValueW32(vector32, 0));
266 EXPECT_EQ(-1, WebRtcSpl_MaxAbsValueW32(NULL, kVectorSize));
267 EXPECT_EQ(WEBRTC_SPL_WORD32_MIN, WebRtcSpl_MaxValueW32(vector32, 0));
268 EXPECT_EQ(WEBRTC_SPL_WORD32_MIN, WebRtcSpl_MaxValueW32(NULL, kVectorSize));
269 EXPECT_EQ(WEBRTC_SPL_WORD32_MAX, WebRtcSpl_MinValueW32(vector32, 0));
270 EXPECT_EQ(WEBRTC_SPL_WORD32_MAX, WebRtcSpl_MinValueW32(NULL, kVectorSize));
271 EXPECT_EQ(-1, WebRtcSpl_MaxAbsIndexW16(vector16, 0));
272 EXPECT_EQ(-1, WebRtcSpl_MaxAbsIndexW16(NULL, kVectorSize));
273 EXPECT_EQ(-1, WebRtcSpl_MaxIndexW16(vector16, 0));
274 EXPECT_EQ(-1, WebRtcSpl_MaxIndexW16(NULL, kVectorSize));
275 EXPECT_EQ(-1, WebRtcSpl_MaxIndexW32(vector32, 0));
276 EXPECT_EQ(-1, WebRtcSpl_MaxIndexW32(NULL, kVectorSize));
277 EXPECT_EQ(-1, WebRtcSpl_MinIndexW16(vector16, 0));
278 EXPECT_EQ(-1, WebRtcSpl_MinIndexW16(NULL, kVectorSize));
279 EXPECT_EQ(-1, WebRtcSpl_MinIndexW32(vector32, 0));
280 EXPECT_EQ(-1, WebRtcSpl_MinIndexW32(NULL, kVectorSize));
283 TEST_F(SplTest, MinMaxOperationsTest) {
284 const int kVectorSize = 17;
286 // Vectors to test the cases where minimum values have to be caught
287 // outside of the unrolled loops in ARM-Neon.
288 int16_t vector16[kVectorSize] = {-1, 7485, 0, 3333,
289 -18283, 0, 12334, -29871, 988, -3333,
290 345, -456, 222, 999, 888, 8774, WEBRTC_SPL_WORD16_MIN};
291 int32_t vector32[kVectorSize] = {-1, 0, 283211, 3333,
292 8712345, 0, -3333, 89345, -374585456, 222, 999, 122345334,
293 -12389756, -987329871, 888, -2, WEBRTC_SPL_WORD32_MIN};
295 EXPECT_EQ(WEBRTC_SPL_WORD16_MIN,
296 WebRtcSpl_MinValueW16(vector16, kVectorSize));
297 EXPECT_EQ(WEBRTC_SPL_WORD32_MIN,
298 WebRtcSpl_MinValueW32(vector32, kVectorSize));
299 EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MinIndexW16(vector16, kVectorSize));
300 EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MinIndexW32(vector32, kVectorSize));
302 // Test the cases where maximum values have to be caught
303 // outside of the unrolled loops in ARM-Neon.
304 vector16[kVectorSize - 1] = WEBRTC_SPL_WORD16_MAX;
305 vector32[kVectorSize - 1] = WEBRTC_SPL_WORD32_MAX;
307 EXPECT_EQ(WEBRTC_SPL_WORD16_MAX,
308 WebRtcSpl_MaxAbsValueW16(vector16, kVectorSize));
309 EXPECT_EQ(WEBRTC_SPL_WORD16_MAX,
310 WebRtcSpl_MaxValueW16(vector16, kVectorSize));
311 EXPECT_EQ(WEBRTC_SPL_WORD32_MAX,
312 WebRtcSpl_MaxAbsValueW32(vector32, kVectorSize));
313 EXPECT_EQ(WEBRTC_SPL_WORD32_MAX,
314 WebRtcSpl_MaxValueW32(vector32, kVectorSize));
315 EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MaxAbsIndexW16(vector16, kVectorSize));
316 EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MaxIndexW16(vector16, kVectorSize));
317 EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MaxIndexW32(vector32, kVectorSize));
319 // Test the cases where multiple maximum and minimum values are present.
320 vector16[1] = WEBRTC_SPL_WORD16_MAX;
321 vector16[6] = WEBRTC_SPL_WORD16_MIN;
322 vector16[11] = WEBRTC_SPL_WORD16_MIN;
323 vector32[1] = WEBRTC_SPL_WORD32_MAX;
324 vector32[6] = WEBRTC_SPL_WORD32_MIN;
325 vector32[11] = WEBRTC_SPL_WORD32_MIN;
327 EXPECT_EQ(WEBRTC_SPL_WORD16_MAX,
328 WebRtcSpl_MaxAbsValueW16(vector16, kVectorSize));
329 EXPECT_EQ(WEBRTC_SPL_WORD16_MAX,
330 WebRtcSpl_MaxValueW16(vector16, kVectorSize));
331 EXPECT_EQ(WEBRTC_SPL_WORD16_MIN,
332 WebRtcSpl_MinValueW16(vector16, kVectorSize));
333 EXPECT_EQ(WEBRTC_SPL_WORD32_MAX,
334 WebRtcSpl_MaxAbsValueW32(vector32, kVectorSize));
335 EXPECT_EQ(WEBRTC_SPL_WORD32_MAX,
336 WebRtcSpl_MaxValueW32(vector32, kVectorSize));
337 EXPECT_EQ(WEBRTC_SPL_WORD32_MIN,
338 WebRtcSpl_MinValueW32(vector32, kVectorSize));
339 EXPECT_EQ(6, WebRtcSpl_MaxAbsIndexW16(vector16, kVectorSize));
340 EXPECT_EQ(1, WebRtcSpl_MaxIndexW16(vector16, kVectorSize));
341 EXPECT_EQ(1, WebRtcSpl_MaxIndexW32(vector32, kVectorSize));
342 EXPECT_EQ(6, WebRtcSpl_MinIndexW16(vector16, kVectorSize));
343 EXPECT_EQ(6, WebRtcSpl_MinIndexW32(vector32, kVectorSize));
346 TEST_F(SplTest, VectorOperationsTest) {
347 const int kVectorSize = 4;
348 int B[] = {4, 12, 133, 1100};
349 int16_t a16[kVectorSize];
350 int16_t b16[kVectorSize];
351 int16_t bTmp16[kVectorSize];
353 for (int kk = 0; kk < kVectorSize; ++kk) {
358 WebRtcSpl_AffineTransformVector(bTmp16, b16, 3, 7, 2, kVectorSize);
359 for (int kk = 0; kk < kVectorSize; ++kk) {
360 EXPECT_EQ((B[kk]*3+7)>>2, bTmp16[kk]);
362 WebRtcSpl_ScaleAndAddVectorsWithRound(b16, 3, b16, 2, 2, bTmp16, kVectorSize);
363 for (int kk = 0; kk < kVectorSize; ++kk) {
364 EXPECT_EQ((B[kk]*3+B[kk]*2+2)>>2, bTmp16[kk]);
367 WebRtcSpl_AddAffineVectorToVector(bTmp16, b16, 3, 7, 2, kVectorSize);
368 for (int kk = 0; kk < kVectorSize; ++kk) {
369 EXPECT_EQ(((B[kk]*3+B[kk]*2+2)>>2)+((b16[kk]*3+7)>>2), bTmp16[kk]);
372 WebRtcSpl_ScaleVector(b16, bTmp16, 13, kVectorSize, 2);
373 for (int kk = 0; kk < kVectorSize; ++kk) {
374 EXPECT_EQ((b16[kk]*13)>>2, bTmp16[kk]);
376 WebRtcSpl_ScaleVectorWithSat(b16, bTmp16, 13, kVectorSize, 2);
377 for (int kk = 0; kk < kVectorSize; ++kk) {
378 EXPECT_EQ((b16[kk]*13)>>2, bTmp16[kk]);
380 WebRtcSpl_ScaleAndAddVectors(a16, 13, 2, b16, 7, 2, bTmp16, kVectorSize);
381 for (int kk = 0; kk < kVectorSize; ++kk) {
382 EXPECT_EQ(((a16[kk]*13)>>2)+((b16[kk]*7)>>2), bTmp16[kk]);
385 WebRtcSpl_AddVectorsAndShift(bTmp16, a16, b16, kVectorSize, 2);
386 for (int kk = 0; kk < kVectorSize; ++kk) {
387 EXPECT_EQ(B[kk] >> 1, bTmp16[kk]);
389 WebRtcSpl_ReverseOrderMultArrayElements(bTmp16, a16, &b16[3], kVectorSize, 2);
390 for (int kk = 0; kk < kVectorSize; ++kk) {
391 EXPECT_EQ((a16[kk]*b16[3-kk])>>2, bTmp16[kk]);
393 WebRtcSpl_ElementwiseVectorMult(bTmp16, a16, b16, kVectorSize, 6);
394 for (int kk = 0; kk < kVectorSize; ++kk) {
395 EXPECT_EQ((a16[kk]*b16[kk])>>6, bTmp16[kk]);
398 WebRtcSpl_SqrtOfOneMinusXSquared(b16, kVectorSize, bTmp16);
399 for (int kk = 0; kk < kVectorSize - 1; ++kk) {
400 EXPECT_EQ(32767, bTmp16[kk]);
402 EXPECT_EQ(32749, bTmp16[kVectorSize - 1]);
404 EXPECT_EQ(0, WebRtcSpl_GetScalingSquare(b16, kVectorSize, 1));
407 TEST_F(SplTest, EstimatorsTest) {
408 const int kVectorSize = 4;
409 int B[] = {4, 12, 133, 1100};
410 int16_t b16[kVectorSize];
411 int32_t b32[kVectorSize];
412 int16_t bTmp16[kVectorSize];
414 for (int kk = 0; kk < kVectorSize; ++kk) {
419 EXPECT_EQ(0, WebRtcSpl_LevinsonDurbin(b32, b16, bTmp16, 2));
422 TEST_F(SplTest, FilterTest) {
423 const int kVectorSize = 4;
424 const int kFilterOrder = 3;
425 int16_t A[] = {1, 2, 33, 100};
426 int16_t A5[] = {1, 2, 33, 100, -5};
427 int16_t B[] = {4, 12, 133, 110};
428 int16_t data_in[kVectorSize];
429 int16_t data_out[kVectorSize];
430 int16_t bTmp16Low[kVectorSize];
431 int16_t bState[kVectorSize];
432 int16_t bStateLow[kVectorSize];
434 WebRtcSpl_ZerosArrayW16(bState, kVectorSize);
435 WebRtcSpl_ZerosArrayW16(bStateLow, kVectorSize);
437 for (int kk = 0; kk < kVectorSize; ++kk) {
443 // Note that the input data has |kFilterOrder| states before the actual
444 // data (one sample).
445 WebRtcSpl_FilterMAFastQ12(&data_in[kFilterOrder], data_out, B,
446 kFilterOrder + 1, 1);
447 EXPECT_EQ(0, data_out[0]);
449 // Note that the output data has |kFilterOrder| states before the actual
450 // data (one sample).
451 WebRtcSpl_FilterARFastQ12(data_in, &data_out[kFilterOrder], A,
452 kFilterOrder + 1, 1);
453 EXPECT_EQ(0, data_out[kFilterOrder]);
455 EXPECT_EQ(kVectorSize, WebRtcSpl_FilterAR(A5,
468 TEST_F(SplTest, RandTest) {
469 const int kVectorSize = 4;
470 int16_t BU[] = {3653, 12446, 8525, 30691};
471 int16_t b16[kVectorSize];
472 uint32_t bSeed = 100000;
474 EXPECT_EQ(7086, WebRtcSpl_RandU(&bSeed));
475 EXPECT_EQ(31565, WebRtcSpl_RandU(&bSeed));
476 EXPECT_EQ(-9786, WebRtcSpl_RandN(&bSeed));
477 EXPECT_EQ(kVectorSize, WebRtcSpl_RandUArray(b16, kVectorSize, &bSeed));
478 for (int kk = 0; kk < kVectorSize; ++kk) {
479 EXPECT_EQ(BU[kk], b16[kk]);
483 TEST_F(SplTest, DotProductWithScaleTest) {
484 EXPECT_EQ(605362796, WebRtcSpl_DotProductWithScale(vector16,
485 vector16, kVector16Size, 2));
488 TEST_F(SplTest, CrossCorrelationTest) {
489 // Note the function arguments relation specificed by API.
490 const int kCrossCorrelationDimension = 3;
491 const int kShift = 2;
493 const int kSeqDimension = 6;
495 const int16_t kVector16[kVector16Size] = {1, 4323, 1963,
496 WEBRTC_SPL_WORD16_MAX, WEBRTC_SPL_WORD16_MIN + 5, -3333, -876, 8483, 142};
497 int32_t vector32[kCrossCorrelationDimension] = {0};
499 WebRtcSpl_CrossCorrelation(vector32, vector16, kVector16, kSeqDimension,
500 kCrossCorrelationDimension, kShift, kStep);
502 // WebRtcSpl_CrossCorrelationC() and WebRtcSpl_CrossCorrelationNeon()
503 // are not bit-exact.
504 const int32_t kExpected[kCrossCorrelationDimension] =
505 {-266947903, -15579555, -171282001};
506 const int32_t* expected = kExpected;
507 #if !defined(MIPS32_LE)
508 const int32_t kExpectedNeon[kCrossCorrelationDimension] =
509 {-266947901, -15579553, -171281999};
510 if (WebRtcSpl_CrossCorrelation != WebRtcSpl_CrossCorrelationC) {
511 expected = kExpectedNeon;
514 for (int i = 0; i < kCrossCorrelationDimension; ++i) {
515 EXPECT_EQ(expected[i], vector32[i]);
519 TEST_F(SplTest, AutoCorrelationTest) {
521 int32_t vector32[kVector16Size];
522 const int32_t expected[kVector16Size] = {302681398, 14223410, -121705063,
523 -85221647, -17104971, 61806945, 6644603, -669329, 43};
525 EXPECT_EQ(-1, WebRtcSpl_AutoCorrelation(vector16,
526 kVector16Size, kVector16Size + 1, vector32, &scale));
527 EXPECT_EQ(kVector16Size, WebRtcSpl_AutoCorrelation(vector16,
528 kVector16Size, kVector16Size - 1, vector32, &scale));
530 for (int i = 0; i < kVector16Size; ++i) {
531 EXPECT_EQ(expected[i], vector32[i]);
535 TEST_F(SplTest, SignalProcessingTest) {
536 const int kVectorSize = 4;
537 int A[] = {1, 2, 33, 100};
538 const int16_t kHanning[4] = { 2399, 8192, 13985, 16384 };
539 int16_t b16[kVectorSize];
541 int16_t bTmp16[kVectorSize];
545 for (int kk = 0; kk < kVectorSize; ++kk) {
549 // TODO(bjornv): Activate the Reflection Coefficient tests when refactoring.
550 // WebRtcSpl_ReflCoefToLpc(b16, kVectorSize, bTmp16);
551 //// for (int kk = 0; kk < kVectorSize; ++kk) {
552 //// EXPECT_EQ(aTmp16[kk], bTmp16[kk]);
554 // WebRtcSpl_LpcToReflCoef(bTmp16, kVectorSize, b16);
555 //// for (int kk = 0; kk < kVectorSize; ++kk) {
556 //// EXPECT_EQ(a16[kk], b16[kk]);
558 // WebRtcSpl_AutoCorrToReflCoef(b32, kVectorSize, bTmp16);
559 //// for (int kk = 0; kk < kVectorSize; ++kk) {
560 //// EXPECT_EQ(aTmp16[kk], bTmp16[kk]);
563 WebRtcSpl_GetHanningWindow(bTmp16, kVectorSize);
564 for (int kk = 0; kk < kVectorSize; ++kk) {
565 EXPECT_EQ(kHanning[kk], bTmp16[kk]);
568 for (int kk = 0; kk < kVectorSize; ++kk) {
571 EXPECT_EQ(11094 , WebRtcSpl_Energy(b16, kVectorSize, &bScale));
572 EXPECT_EQ(0, bScale);
575 TEST_F(SplTest, FFTTest) {
576 int16_t B[] = {1, 2, 33, 100,
581 EXPECT_EQ(0, WebRtcSpl_ComplexFFT(B, 3, 1));
582 // for (int kk = 0; kk < 16; ++kk) {
583 // EXPECT_EQ(A[kk], B[kk]);
585 EXPECT_EQ(0, WebRtcSpl_ComplexIFFT(B, 3, 1));
586 // for (int kk = 0; kk < 16; ++kk) {
587 // EXPECT_EQ(A[kk], B[kk]);
589 WebRtcSpl_ComplexBitReverse(B, 3);
590 for (int kk = 0; kk < 16; ++kk) {
591 //EXPECT_EQ(A[kk], B[kk]);
595 TEST_F(SplTest, Resample48WithSaturationTest) {
596 // The test resamples 3*kBlockSize number of samples to 2*kBlockSize number
598 const int kBlockSize = 16;
600 // Saturated input vector of 48 samples.
601 const int32_t kVectorSaturated[3 * kBlockSize + 7] = {
602 -32768, -32768, -32768, -32768, -32768, -32768, -32768, -32768,
603 -32768, -32768, -32768, -32768, -32768, -32768, -32768, -32768,
604 -32768, -32768, -32768, -32768, -32768, -32768, -32768, -32768,
605 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
606 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
607 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
608 32767, 32767, 32767, 32767, 32767, 32767, 32767
611 // All values in |out_vector| should be |kRefValue32kHz|.
612 const int32_t kRefValue32kHz1 = -1077493760;
613 const int32_t kRefValue32kHz2 = 1077493645;
615 // After bit shift with saturation, |out_vector_w16| is saturated.
617 const int16_t kRefValue16kHz1 = -32768;
618 const int16_t kRefValue16kHz2 = 32767;
619 // Vector for storing output.
620 int32_t out_vector[2 * kBlockSize];
621 int16_t out_vector_w16[2 * kBlockSize];
623 WebRtcSpl_Resample48khzTo32khz(kVectorSaturated, out_vector, kBlockSize);
624 WebRtcSpl_VectorBitShiftW32ToW16(out_vector_w16, 2 * kBlockSize, out_vector,
627 // Comparing output values against references. The values at position
628 // 12-15 are skipped to account for the filter lag.
629 for (int i = 0; i < 12; ++i) {
630 EXPECT_EQ(kRefValue32kHz1, out_vector[i]);
631 EXPECT_EQ(kRefValue16kHz1, out_vector_w16[i]);
633 for (int i = 16; i < 2 * kBlockSize; ++i) {
634 EXPECT_EQ(kRefValue32kHz2, out_vector[i]);
635 EXPECT_EQ(kRefValue16kHz2, out_vector_w16[i]);