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
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * This header file includes all of the fix point signal processing library (SPL) function
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * descriptions and declarations.
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * For specific function calls, see bottom of file.
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_SPL_SIGNAL_PROCESSING_LIBRARY_H_
19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_SPL_SIGNAL_PROCESSING_LIBRARY_H_
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <string.h>
22bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org#include "webrtc/typedefs.h"
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Macros specific for the fixed point implementation
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_SPL_WORD16_MAX       32767
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_SPL_WORD16_MIN       -32768
27c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org#define WEBRTC_SPL_WORD32_MAX       (int32_t)0x7fffffff
28c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org#define WEBRTC_SPL_WORD32_MIN       (int32_t)0x80000000
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_SPL_MAX_LPC_ORDER    14
30bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org#define WEBRTC_SPL_MIN(A, B)        (A < B ? A : B)  // Get min value
31bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org#define WEBRTC_SPL_MAX(A, B)        (A > B ? A : B)  // Get max value
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// TODO(kma/bjorn): For the next two macros, investigate how to correct the code
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// for inputs of a = WEBRTC_SPL_WORD16_MIN or WEBRTC_SPL_WORD32_MIN.
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_SPL_ABS_W16(a) \
35c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org    (((int16_t)a >= 0) ? ((int16_t)a) : -((int16_t)a))
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_SPL_ABS_W32(a) \
37c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org    (((int32_t)a >= 0) ? ((int32_t)a) : -((int32_t)a))
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_SPL_MUL(a, b) \
40c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org    ((int32_t) ((int32_t)(a) * (int32_t)(b)))
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_SPL_UMUL(a, b) \
42c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org    ((uint32_t) ((uint32_t)(a) * (uint32_t)(b)))
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_SPL_UMUL_16_16(a, b) \
44c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org    ((uint32_t) (uint16_t)(a) * (uint16_t)(b))
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_SPL_UMUL_32_16(a, b) \
46c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org    ((uint32_t) ((uint32_t)(a) * (uint16_t)(b)))
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_SPL_MUL_16_U16(a, b) \
48c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org    ((int32_t)(int16_t)(a) * (uint16_t)(b))
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_ARCH_ARM_V7
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// For ARMv7 platforms, these are inline functions in spl_inl_armv7.h
52c61a170086121bb18950bc478c9fc71175d32db8andrew@webrtc.org#ifndef MIPS32_LE
53c61a170086121bb18950bc478c9fc71175d32db8andrew@webrtc.org// For MIPS platforms, these are inline functions in spl_inl_mips.h
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_SPL_MUL_16_16(a, b) \
55c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org    ((int32_t) (((int16_t)(a)) * ((int16_t)(b))))
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_SPL_MUL_16_32_RSFT16(a, b) \
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    (WEBRTC_SPL_MUL_16_16(a, b >> 16) \
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org     + ((WEBRTC_SPL_MUL_16_16(a, (b & 0xffff) >> 1) + 0x4000) >> 15))
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
60c61a170086121bb18950bc478c9fc71175d32db8andrew@webrtc.org#endif
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_SPL_MUL_16_32_RSFT11(a, b) \
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ((WEBRTC_SPL_MUL_16_16(a, (b) >> 16) << 5) \
64c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org    + (((WEBRTC_SPL_MUL_16_U16(a, (uint16_t)(b)) >> 1) + 0x0200) >> 10))
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_SPL_MUL_16_32_RSFT14(a, b) \
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ((WEBRTC_SPL_MUL_16_16(a, (b) >> 16) << 2) \
67c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org    + (((WEBRTC_SPL_MUL_16_U16(a, (uint16_t)(b)) >> 1) + 0x1000) >> 13))
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_SPL_MUL_16_32_RSFT15(a, b) \
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ((WEBRTC_SPL_MUL_16_16(a, (b) >> 16) << 1) \
70c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org    + (((WEBRTC_SPL_MUL_16_U16(a, (uint16_t)(b)) >> 1) + 0x2000) >> 14))
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_SPL_MUL_16_16_RSFT(a, b, c) \
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    (WEBRTC_SPL_MUL_16_16(a, b) >> (c))
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(a, b, c) \
76c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org    ((WEBRTC_SPL_MUL_16_16(a, b) + ((int32_t) \
77c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                  (((int32_t)1) << ((c) - 1)))) >> (c))
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// C + the 32 most significant bits of A * B
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_SPL_SCALEDIFF32(A, B, C) \
81c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org    (C + (B >> 16) * A + (((uint32_t)(0x0000FFFF & B) * A) >> 16))
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_SPL_SAT(a, b, c)         (b > a ? a : b < c ? c : b)
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Shifting with negative numbers allowed
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Positive means left shift
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_SPL_SHIFT_W32(x, c) \
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    (((c) >= 0) ? ((x) << (c)) : ((x) >> (-(c))))
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Shifting with negative numbers not allowed
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// We cannot do casting here due to signed/unsigned problem
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_SPL_RSHIFT_W16(x, c)     ((x) >> (c))
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_SPL_LSHIFT_W16(x, c)     ((x) << (c))
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_SPL_RSHIFT_W32(x, c)     ((x) >> (c))
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_SPL_LSHIFT_W32(x, c)     ((x) << (c))
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
97c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org#define WEBRTC_SPL_RSHIFT_U32(x, c)     ((uint32_t)(x) >> (c))
98c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org#define WEBRTC_SPL_LSHIFT_U32(x, c)     ((uint32_t)(x) << (c))
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_SPL_RAND(a) \
101c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org    ((int16_t)(WEBRTC_SPL_MUL_16_16_RSFT((a), 18816, 7) & 0x00007fff))
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef __cplusplus
10489bd726f4fd6e8fe612b29e5727a0ba0092e63a6andrew@webrtc.orgextern "C" {
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_SPL_MEMCPY_W16(v1, v2, length) \
108c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org  memcpy(v1, v2, (length) * sizeof(int16_t))
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// inline functions:
111bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org#include "webrtc/common_audio/signal_processing/include/spl_inl.h"
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Initialize SPL. Currently it contains only function pointer initialization.
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// If the underlying platform is known to be ARM-Neon (WEBRTC_ARCH_ARM_NEON
115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// defined), the pointers will be assigned to code optimized for Neon; otherwise
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// if run-time Neon detection (WEBRTC_DETECT_ARM_NEON) is enabled, the pointers
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// will be assigned to either Neon code or generic C code; otherwise, generic C
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// code will be assigned.
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Note that this function MUST be called in any application that uses SPL
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// functions.
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid WebRtcSpl_Init();
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Get SPL Version
124c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgint16_t WebRtcSpl_get_version(char* version, int16_t length_in_bytes);
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1261f53a8f5c9591dd9e9896b2bb1e5456dbff6cb96bjornv@webrtc.orgint16_t WebRtcSpl_GetScalingSquare(int16_t* in_vector,
1271f53a8f5c9591dd9e9896b2bb1e5456dbff6cb96bjornv@webrtc.org                                   int in_vector_length,
1281f53a8f5c9591dd9e9896b2bb1e5456dbff6cb96bjornv@webrtc.org                                   int times);
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Copy and set operations. Implementation in copy_set_operations.c.
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Descriptions at bottom of file.
132c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_MemSetW16(int16_t* vector,
133c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                         int16_t set_value,
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                         int vector_length);
135c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_MemSetW32(int32_t* vector,
136c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                         int32_t set_value,
137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                         int vector_length);
138c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_MemCpyReversedOrder(int16_t* out_vector,
139c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                   int16_t* in_vector,
140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                   int vector_length);
1411f53a8f5c9591dd9e9896b2bb1e5456dbff6cb96bjornv@webrtc.orgvoid WebRtcSpl_CopyFromEndW16(const int16_t* in_vector,
1421f53a8f5c9591dd9e9896b2bb1e5456dbff6cb96bjornv@webrtc.org                              int in_vector_length,
1431f53a8f5c9591dd9e9896b2bb1e5456dbff6cb96bjornv@webrtc.org                              int samples,
1441f53a8f5c9591dd9e9896b2bb1e5456dbff6cb96bjornv@webrtc.org                              int16_t* out_vector);
1451f53a8f5c9591dd9e9896b2bb1e5456dbff6cb96bjornv@webrtc.orgvoid WebRtcSpl_ZerosArrayW16(int16_t* vector,
1461f53a8f5c9591dd9e9896b2bb1e5456dbff6cb96bjornv@webrtc.org                             int vector_length);
1471f53a8f5c9591dd9e9896b2bb1e5456dbff6cb96bjornv@webrtc.orgvoid WebRtcSpl_ZerosArrayW32(int32_t* vector,
1481f53a8f5c9591dd9e9896b2bb1e5456dbff6cb96bjornv@webrtc.org                             int vector_length);
149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// End: Copy and set operations.
150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Minimum and maximum operation functions and their pointers.
153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Implementation in min_max_operations.c.
154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Returns the largest absolute value in a signed 16-bit vector.
156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector : 16-bit input vector.
159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - length : Number of samples in vector.
160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value  : Maximum absolute value in vector;
162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                 or -1, if (vector == NULL || length <= 0).
163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtypedef int16_t (*MaxAbsValueW16)(const int16_t* vector, int length);
164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgextern MaxAbsValueW16 WebRtcSpl_MaxAbsValueW16;
165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint16_t WebRtcSpl_MaxAbsValueW16C(const int16_t* vector, int length);
166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if (defined WEBRTC_DETECT_ARM_NEON) || (defined WEBRTC_ARCH_ARM_NEON)
167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint16_t WebRtcSpl_MaxAbsValueW16Neon(const int16_t* vector, int length);
168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
16989bd726f4fd6e8fe612b29e5727a0ba0092e63a6andrew@webrtc.org#if defined(MIPS32_LE)
17089bd726f4fd6e8fe612b29e5727a0ba0092e63a6andrew@webrtc.orgint16_t WebRtcSpl_MaxAbsValueW16_mips(const int16_t* vector, int length);
17189bd726f4fd6e8fe612b29e5727a0ba0092e63a6andrew@webrtc.org#endif
172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Returns the largest absolute value in a signed 32-bit vector.
174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector : 32-bit input vector.
177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - length : Number of samples in vector.
178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value  : Maximum absolute value in vector;
180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                 or -1, if (vector == NULL || length <= 0).
181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtypedef int32_t (*MaxAbsValueW32)(const int32_t* vector, int length);
182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgextern MaxAbsValueW32 WebRtcSpl_MaxAbsValueW32;
183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint32_t WebRtcSpl_MaxAbsValueW32C(const int32_t* vector, int length);
184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if (defined WEBRTC_DETECT_ARM_NEON) || (defined WEBRTC_ARCH_ARM_NEON)
185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint32_t WebRtcSpl_MaxAbsValueW32Neon(const int32_t* vector, int length);
186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
18789bd726f4fd6e8fe612b29e5727a0ba0092e63a6andrew@webrtc.org#if defined(MIPS_DSP_R1_LE)
18889bd726f4fd6e8fe612b29e5727a0ba0092e63a6andrew@webrtc.orgint32_t WebRtcSpl_MaxAbsValueW32_mips(const int32_t* vector, int length);
18989bd726f4fd6e8fe612b29e5727a0ba0092e63a6andrew@webrtc.org#endif
190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Returns the maximum value of a 16-bit vector.
192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector : 16-bit input vector.
195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - length : Number of samples in vector.
196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value  : Maximum sample value in |vector|.
198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                 If (vector == NULL || length <= 0) WEBRTC_SPL_WORD16_MIN
199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                 is returned. Note that WEBRTC_SPL_WORD16_MIN is a feasible
200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                 value and we can't catch errors purely based on it.
201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtypedef int16_t (*MaxValueW16)(const int16_t* vector, int length);
202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgextern MaxValueW16 WebRtcSpl_MaxValueW16;
203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint16_t WebRtcSpl_MaxValueW16C(const int16_t* vector, int length);
204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if (defined WEBRTC_DETECT_ARM_NEON) || (defined WEBRTC_ARCH_ARM_NEON)
205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint16_t WebRtcSpl_MaxValueW16Neon(const int16_t* vector, int length);
206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
20789bd726f4fd6e8fe612b29e5727a0ba0092e63a6andrew@webrtc.org#if defined(MIPS32_LE)
20889bd726f4fd6e8fe612b29e5727a0ba0092e63a6andrew@webrtc.orgint16_t WebRtcSpl_MaxValueW16_mips(const int16_t* vector, int length);
20989bd726f4fd6e8fe612b29e5727a0ba0092e63a6andrew@webrtc.org#endif
210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Returns the maximum value of a 32-bit vector.
212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector : 32-bit input vector.
215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - length : Number of samples in vector.
216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value  : Maximum sample value in |vector|.
218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                 If (vector == NULL || length <= 0) WEBRTC_SPL_WORD32_MIN
219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                 is returned. Note that WEBRTC_SPL_WORD32_MIN is a feasible
220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                 value and we can't catch errors purely based on it.
221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtypedef int32_t (*MaxValueW32)(const int32_t* vector, int length);
222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgextern MaxValueW32 WebRtcSpl_MaxValueW32;
223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint32_t WebRtcSpl_MaxValueW32C(const int32_t* vector, int length);
224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if (defined WEBRTC_DETECT_ARM_NEON) || (defined WEBRTC_ARCH_ARM_NEON)
225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint32_t WebRtcSpl_MaxValueW32Neon(const int32_t* vector, int length);
226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
22789bd726f4fd6e8fe612b29e5727a0ba0092e63a6andrew@webrtc.org#if defined(MIPS32_LE)
22889bd726f4fd6e8fe612b29e5727a0ba0092e63a6andrew@webrtc.orgint32_t WebRtcSpl_MaxValueW32_mips(const int32_t* vector, int length);
22989bd726f4fd6e8fe612b29e5727a0ba0092e63a6andrew@webrtc.org#endif
230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Returns the minimum value of a 16-bit vector.
232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector : 16-bit input vector.
235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - length : Number of samples in vector.
236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value  : Minimum sample value in |vector|.
238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                 If (vector == NULL || length <= 0) WEBRTC_SPL_WORD16_MAX
239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                 is returned. Note that WEBRTC_SPL_WORD16_MAX is a feasible
240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                 value and we can't catch errors purely based on it.
241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtypedef int16_t (*MinValueW16)(const int16_t* vector, int length);
242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgextern MinValueW16 WebRtcSpl_MinValueW16;
243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint16_t WebRtcSpl_MinValueW16C(const int16_t* vector, int length);
244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if (defined WEBRTC_DETECT_ARM_NEON) || (defined WEBRTC_ARCH_ARM_NEON)
245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint16_t WebRtcSpl_MinValueW16Neon(const int16_t* vector, int length);
246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
24789bd726f4fd6e8fe612b29e5727a0ba0092e63a6andrew@webrtc.org#if defined(MIPS32_LE)
24889bd726f4fd6e8fe612b29e5727a0ba0092e63a6andrew@webrtc.orgint16_t WebRtcSpl_MinValueW16_mips(const int16_t* vector, int length);
24989bd726f4fd6e8fe612b29e5727a0ba0092e63a6andrew@webrtc.org#endif
250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Returns the minimum value of a 32-bit vector.
252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector : 32-bit input vector.
255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - length : Number of samples in vector.
256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value  : Minimum sample value in |vector|.
258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                 If (vector == NULL || length <= 0) WEBRTC_SPL_WORD32_MAX
259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                 is returned. Note that WEBRTC_SPL_WORD32_MAX is a feasible
260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                 value and we can't catch errors purely based on it.
261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtypedef int32_t (*MinValueW32)(const int32_t* vector, int length);
262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgextern MinValueW32 WebRtcSpl_MinValueW32;
263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint32_t WebRtcSpl_MinValueW32C(const int32_t* vector, int length);
264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if (defined WEBRTC_DETECT_ARM_NEON) || (defined WEBRTC_ARCH_ARM_NEON)
265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint32_t WebRtcSpl_MinValueW32Neon(const int32_t* vector, int length);
266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
26789bd726f4fd6e8fe612b29e5727a0ba0092e63a6andrew@webrtc.org#if defined(MIPS32_LE)
26889bd726f4fd6e8fe612b29e5727a0ba0092e63a6andrew@webrtc.orgint32_t WebRtcSpl_MinValueW32_mips(const int32_t* vector, int length);
26989bd726f4fd6e8fe612b29e5727a0ba0092e63a6andrew@webrtc.org#endif
270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Returns the vector index to the largest absolute value of a 16-bit vector.
272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
274b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector : 16-bit input vector.
275b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - length : Number of samples in vector.
276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value  : Index to the maximum absolute value in vector, or -1,
278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                 if (vector == NULL || length <= 0).
279b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                 If there are multiple equal maxima, return the index of the
280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                 first. -32768 will always have precedence over 32767 (despite
281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                 -32768 presenting an int16 absolute value of 32767);
282b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint WebRtcSpl_MaxAbsIndexW16(const int16_t* vector, int length);
283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Returns the vector index to the maximum sample value of a 16-bit vector.
285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
286b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector : 16-bit input vector.
288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - length : Number of samples in vector.
289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
290b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value  : Index to the maximum value in vector (if multiple
291b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                 indexes have the maximum, return the first);
292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                 or -1, if (vector == NULL || length <= 0).
293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint WebRtcSpl_MaxIndexW16(const int16_t* vector, int length);
294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Returns the vector index to the maximum sample value of a 32-bit vector.
296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector : 32-bit input vector.
299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - length : Number of samples in vector.
300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value  : Index to the maximum value in vector (if multiple
302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                 indexes have the maximum, return the first);
303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                 or -1, if (vector == NULL || length <= 0).
304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint WebRtcSpl_MaxIndexW32(const int32_t* vector, int length);
305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Returns the vector index to the minimum sample value of a 16-bit vector.
307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector : 16-bit input vector.
310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - length : Number of samples in vector.
311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value  : Index to the mimimum value in vector  (if multiple
313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                 indexes have the minimum, return the first);
314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                 or -1, if (vector == NULL || length <= 0).
315b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint WebRtcSpl_MinIndexW16(const int16_t* vector, int length);
316b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Returns the vector index to the minimum sample value of a 32-bit vector.
318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
319b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
320b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector : 32-bit input vector.
321b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - length : Number of samples in vector.
322b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
323b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value  : Index to the mimimum value in vector  (if multiple
324b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                 indexes have the minimum, return the first);
325b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                 or -1, if (vector == NULL || length <= 0).
326b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint WebRtcSpl_MinIndexW32(const int32_t* vector, int length);
327b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
328b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// End: Minimum and maximum operations.
329b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
330b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
331b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Vector scaling operations. Implementation in vector_scaling_operations.c.
332b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Description at bottom of file.
333c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_VectorBitShiftW16(int16_t* out_vector,
334c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                 int16_t vector_length,
33545a3434299d78b2084a2d765c51c76c165b410cepbos@webrtc.org                                 const int16_t* in_vector,
336c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                 int16_t right_shifts);
337c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_VectorBitShiftW32(int32_t* out_vector,
338c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                 int16_t vector_length,
33945a3434299d78b2084a2d765c51c76c165b410cepbos@webrtc.org                                 const int32_t* in_vector,
340c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                 int16_t right_shifts);
341a049d6ebe5dacfef278c0d9086d1522854c56b39tina.legrand@webrtc.orgvoid WebRtcSpl_VectorBitShiftW32ToW16(int16_t* out_vector,
342a049d6ebe5dacfef278c0d9086d1522854c56b39tina.legrand@webrtc.org                                      int vector_length,
343a049d6ebe5dacfef278c0d9086d1522854c56b39tina.legrand@webrtc.org                                      const int32_t* in_vector,
344a049d6ebe5dacfef278c0d9086d1522854c56b39tina.legrand@webrtc.org                                      int right_shifts);
34545a3434299d78b2084a2d765c51c76c165b410cepbos@webrtc.orgvoid WebRtcSpl_ScaleVector(const int16_t* in_vector,
346c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                           int16_t* out_vector,
347c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                           int16_t gain,
348c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                           int16_t vector_length,
349c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                           int16_t right_shifts);
35045a3434299d78b2084a2d765c51c76c165b410cepbos@webrtc.orgvoid WebRtcSpl_ScaleVectorWithSat(const int16_t* in_vector,
351c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                  int16_t* out_vector,
352c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                  int16_t gain,
353c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                  int16_t vector_length,
354c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                  int16_t right_shifts);
35545a3434299d78b2084a2d765c51c76c165b410cepbos@webrtc.orgvoid WebRtcSpl_ScaleAndAddVectors(const int16_t* in_vector1,
356c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                  int16_t gain1, int right_shifts1,
35745a3434299d78b2084a2d765c51c76c165b410cepbos@webrtc.org                                  const int16_t* in_vector2,
358c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                  int16_t gain2, int right_shifts2,
359c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                  int16_t* out_vector,
360b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                  int vector_length);
361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
362b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// The functions (with related pointer) perform the vector operation:
363b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//   out_vector[k] = ((scale1 * in_vector1[k]) + (scale2 * in_vector2[k])
364b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//        + round_value) >> right_shifts,
365b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//   where  round_value = (1 << right_shifts) >> 1.
366b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
367b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
368b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - in_vector1       : Input vector 1
369b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - in_vector1_scale : Gain to be used for vector 1
370b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - in_vector2       : Input vector 2
371b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - in_vector2_scale : Gain to be used for vector 2
372b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - right_shifts     : Number of right bit shifts to be applied
373b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - length           : Number of elements in the input vectors
374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
375b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
376b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - out_vector       : Output vector
377b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value            : 0 if OK, -1 if (in_vector1 == NULL
378b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                           || in_vector2 == NULL || out_vector == NULL
379b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                           || length <= 0 || right_shift < 0).
380b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtypedef int (*ScaleAndAddVectorsWithRound)(const int16_t* in_vector1,
381b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           int16_t in_vector1_scale,
382b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           const int16_t* in_vector2,
383b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           int16_t in_vector2_scale,
384b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           int right_shifts,
385b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           int16_t* out_vector,
386b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           int length);
387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgextern ScaleAndAddVectorsWithRound WebRtcSpl_ScaleAndAddVectorsWithRound;
388b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint WebRtcSpl_ScaleAndAddVectorsWithRoundC(const int16_t* in_vector1,
389b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           int16_t in_vector1_scale,
390b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           const int16_t* in_vector2,
391b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           int16_t in_vector2_scale,
392b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           int right_shifts,
393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           int16_t* out_vector,
394b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           int length);
395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if (defined WEBRTC_DETECT_ARM_NEON) || (defined WEBRTC_ARCH_ARM_NEON)
396b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint WebRtcSpl_ScaleAndAddVectorsWithRoundNeon(const int16_t* in_vector1,
397b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                              int16_t in_vector1_scale,
398b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                              const int16_t* in_vector2,
399b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                              int16_t in_vector2_scale,
400b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                              int right_shifts,
401b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                              int16_t* out_vector,
402b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                              int length);
403b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
404c61a170086121bb18950bc478c9fc71175d32db8andrew@webrtc.org#if defined(MIPS_DSP_R1_LE)
405c61a170086121bb18950bc478c9fc71175d32db8andrew@webrtc.orgint WebRtcSpl_ScaleAndAddVectorsWithRound_mips(const int16_t* in_vector1,
406c61a170086121bb18950bc478c9fc71175d32db8andrew@webrtc.org                                               int16_t in_vector1_scale,
407c61a170086121bb18950bc478c9fc71175d32db8andrew@webrtc.org                                               const int16_t* in_vector2,
408c61a170086121bb18950bc478c9fc71175d32db8andrew@webrtc.org                                               int16_t in_vector2_scale,
409c61a170086121bb18950bc478c9fc71175d32db8andrew@webrtc.org                                               int right_shifts,
410c61a170086121bb18950bc478c9fc71175d32db8andrew@webrtc.org                                               int16_t* out_vector,
411c61a170086121bb18950bc478c9fc71175d32db8andrew@webrtc.org                                               int length);
412c61a170086121bb18950bc478c9fc71175d32db8andrew@webrtc.org#endif
413b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// End: Vector scaling operations.
414b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
415b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// iLBC specific functions. Implementations in ilbc_specific_functions.c.
416b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Description at bottom of file.
417c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_ReverseOrderMultArrayElements(int16_t* out_vector,
41845a3434299d78b2084a2d765c51c76c165b410cepbos@webrtc.org                                             const int16_t* in_vector,
41945a3434299d78b2084a2d765c51c76c165b410cepbos@webrtc.org                                             const int16_t* window,
420c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                             int16_t vector_length,
421c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                             int16_t right_shifts);
422c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_ElementwiseVectorMult(int16_t* out_vector,
42345a3434299d78b2084a2d765c51c76c165b410cepbos@webrtc.org                                     const int16_t* in_vector,
42445a3434299d78b2084a2d765c51c76c165b410cepbos@webrtc.org                                     const int16_t* window,
425c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                     int16_t vector_length,
426c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                     int16_t right_shifts);
427c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_AddVectorsAndShift(int16_t* out_vector,
42845a3434299d78b2084a2d765c51c76c165b410cepbos@webrtc.org                                  const int16_t* in_vector1,
42945a3434299d78b2084a2d765c51c76c165b410cepbos@webrtc.org                                  const int16_t* in_vector2,
430c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                  int16_t vector_length,
431c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                  int16_t right_shifts);
432c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_AddAffineVectorToVector(int16_t* out_vector,
433c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                       int16_t* in_vector,
434c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                       int16_t gain,
435c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                       int32_t add_constant,
436c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                       int16_t right_shifts,
437b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                       int vector_length);
438c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_AffineTransformVector(int16_t* out_vector,
439c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                     int16_t* in_vector,
440c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                     int16_t gain,
441c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                     int32_t add_constant,
442c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                     int16_t right_shifts,
443b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                     int vector_length);
444b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// End: iLBC specific functions.
445b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
446b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Signal processing operations.
447b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
448b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// A 32-bit fix-point implementation of auto-correlation computation
449b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
450b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
451b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - in_vector        : Vector to calculate autocorrelation upon
452b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - in_vector_length : Length (in samples) of |vector|
453b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - order            : The order up to which the autocorrelation should be
454b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                           calculated
455b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
456b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
457b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - result           : auto-correlation values (values should be seen
458b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                           relative to each other since the absolute values
459b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                           might have been down shifted to avoid overflow)
460b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
461b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - scale            : The number of left shifts required to obtain the
462b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                           auto-correlation in Q0
463b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
464b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value            :
465b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - -1, if |order| > |in_vector_length|;
466b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - Number of samples in |result|, i.e. (order+1), otherwise.
467b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint WebRtcSpl_AutoCorrelation(const int16_t* in_vector,
468b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                              int in_vector_length,
469b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                              int order,
470b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                              int32_t* result,
471b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                              int* scale);
472b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
473b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// A 32-bit fix-point implementation of the Levinson-Durbin algorithm that
474b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// does NOT use the 64 bit class
475b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
476b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
477b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - auto_corr : Vector with autocorrelation values of length >=
478b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    |use_order|+1
479b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - use_order : The LPC filter order (support up to order 20)
480b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
481b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
482b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - lpc_coef  : lpc_coef[0..use_order] LPC coefficients in Q12
483b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - refl_coef : refl_coef[0...use_order-1]| Reflection coefficients in
484b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    Q15
485b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
486b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value     : 1 for stable 0 for unstable
487c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgint16_t WebRtcSpl_LevinsonDurbin(int32_t* auto_corr,
488c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                 int16_t* lpc_coef,
489c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                 int16_t* refl_coef,
490c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                 int16_t order);
491b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
492b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Converts reflection coefficients |refl_coef| to LPC coefficients |lpc_coef|.
493b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// This version is a 16 bit operation.
494b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
495b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// NOTE: The 16 bit refl_coef -> lpc_coef conversion might result in a
496b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// "slightly unstable" filter (i.e., a pole just outside the unit circle) in
497b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// "rare" cases even if the reflection coefficients are stable.
498b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
499b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
500b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - refl_coef : Reflection coefficients in Q15 that should be converted
501b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    to LPC coefficients
502b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - use_order : Number of coefficients in |refl_coef|
503b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
504b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
505b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - lpc_coef  : LPC coefficients in Q12
50645a3434299d78b2084a2d765c51c76c165b410cepbos@webrtc.orgvoid WebRtcSpl_ReflCoefToLpc(const int16_t* refl_coef,
507b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                             int use_order,
508c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                             int16_t* lpc_coef);
509b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
510b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Converts LPC coefficients |lpc_coef| to reflection coefficients |refl_coef|.
511b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// This version is a 16 bit operation.
512b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// The conversion is implemented by the step-down algorithm.
513b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
514b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
515b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - lpc_coef  : LPC coefficients in Q12, that should be converted to
516b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    reflection coefficients
517b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - use_order : Number of coefficients in |lpc_coef|
518b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
519b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
520b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - refl_coef : Reflection coefficients in Q15.
521c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_LpcToReflCoef(int16_t* lpc_coef,
522b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                             int use_order,
523c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                             int16_t* refl_coef);
524b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
525b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Calculates reflection coefficients (16 bit) from auto-correlation values
526b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
527b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
528b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - auto_corr : Auto-correlation values
529b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - use_order : Number of coefficients wanted be calculated
530b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
531b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
532b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - refl_coef : Reflection coefficients in Q15.
53345a3434299d78b2084a2d765c51c76c165b410cepbos@webrtc.orgvoid WebRtcSpl_AutoCorrToReflCoef(const int32_t* auto_corr,
534b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                  int use_order,
535c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                  int16_t* refl_coef);
536b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
537b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// The functions (with related pointer) calculate the cross-correlation between
538b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// two sequences |seq1| and |seq2|.
539b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// |seq1| is fixed and |seq2| slides as the pointer is increased with the
540b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// amount |step_seq2|. Note the arguments should obey the relationship:
541b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// |dim_seq| - 1 + |step_seq2| * (|dim_cross_correlation| - 1) <
542b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      buffer size of |seq2|
543b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
544b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
545b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - seq1           : First sequence (fixed throughout the correlation)
546b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - seq2           : Second sequence (slides |step_vector2| for each
547b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                            new correlation)
548b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - dim_seq        : Number of samples to use in the cross-correlation
549b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - dim_cross_correlation : Number of cross-correlations to calculate (the
550b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                            start position for |vector2| is updated for each
551b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                            new one)
552b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - right_shifts   : Number of right bit shifts to use. This will
553b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                            become the output Q-domain.
554b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - step_seq2      : How many (positive or negative) steps the
555b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                            |vector2| pointer should be updated for each new
556b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                            cross-correlation value.
557b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
558b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
559b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - cross_correlation : The cross-correlation in Q(-right_shifts)
560b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtypedef void (*CrossCorrelation)(int32_t* cross_correlation,
561b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                 const int16_t* seq1,
562b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                 const int16_t* seq2,
563b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                 int16_t dim_seq,
564b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                 int16_t dim_cross_correlation,
565b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                 int16_t right_shifts,
566b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                 int16_t step_seq2);
567b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgextern CrossCorrelation WebRtcSpl_CrossCorrelation;
568b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid WebRtcSpl_CrossCorrelationC(int32_t* cross_correlation,
569b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                 const int16_t* seq1,
570b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                 const int16_t* seq2,
571b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                 int16_t dim_seq,
572b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                 int16_t dim_cross_correlation,
573b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                 int16_t right_shifts,
574b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                 int16_t step_seq2);
575b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if (defined WEBRTC_DETECT_ARM_NEON) || (defined WEBRTC_ARCH_ARM_NEON)
576b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid WebRtcSpl_CrossCorrelationNeon(int32_t* cross_correlation,
577b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                    const int16_t* seq1,
578b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                    const int16_t* seq2,
579b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                    int16_t dim_seq,
580b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                    int16_t dim_cross_correlation,
581b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                    int16_t right_shifts,
582b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                    int16_t step_seq2);
583b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
584c61a170086121bb18950bc478c9fc71175d32db8andrew@webrtc.org#if defined(MIPS32_LE)
585c61a170086121bb18950bc478c9fc71175d32db8andrew@webrtc.orgvoid WebRtcSpl_CrossCorrelation_mips(int32_t* cross_correlation,
586c61a170086121bb18950bc478c9fc71175d32db8andrew@webrtc.org                                     const int16_t* seq1,
587c61a170086121bb18950bc478c9fc71175d32db8andrew@webrtc.org                                     const int16_t* seq2,
588c61a170086121bb18950bc478c9fc71175d32db8andrew@webrtc.org                                     int16_t dim_seq,
589c61a170086121bb18950bc478c9fc71175d32db8andrew@webrtc.org                                     int16_t dim_cross_correlation,
590c61a170086121bb18950bc478c9fc71175d32db8andrew@webrtc.org                                     int16_t right_shifts,
591c61a170086121bb18950bc478c9fc71175d32db8andrew@webrtc.org                                     int16_t step_seq2);
592c61a170086121bb18950bc478c9fc71175d32db8andrew@webrtc.org#endif
593b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
594b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Creates (the first half of) a Hanning window. Size must be at least 1 and
595b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// at most 512.
596b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
597b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
598b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - size      : Length of the requested Hanning window (1 to 512)
599b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
600b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
601b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - window    : Hanning vector in Q14.
602c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_GetHanningWindow(int16_t* window, int16_t size);
603b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
604b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Calculates y[k] = sqrt(1 - x[k]^2) for each element of the input vector
605b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// |in_vector|. Input and output values are in Q15.
606b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
607b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Inputs:
608b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - in_vector     : Values to calculate sqrt(1 - x^2) of
609b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector_length : Length of vector |in_vector|
610b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
611b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
612b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - out_vector    : Output values in Q15
613c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_SqrtOfOneMinusXSquared(int16_t* in_vector,
614b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                      int vector_length,
615c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                      int16_t* out_vector);
616b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// End: Signal processing operations.
617b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
618bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org// Randomization functions. Implementations collected in
619bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org// randomization_functions.c and descriptions at bottom of this file.
620c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgint16_t WebRtcSpl_RandU(uint32_t* seed);
621c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgint16_t WebRtcSpl_RandN(uint32_t* seed);
622c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgint16_t WebRtcSpl_RandUArray(int16_t* vector,
623c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                             int16_t vector_length,
624c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                             uint32_t* seed);
625b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// End: Randomization functions.
626b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
627b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Math functions
628c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgint32_t WebRtcSpl_Sqrt(int32_t value);
629c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgint32_t WebRtcSpl_SqrtFloor(int32_t value);
630b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
631b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Divisions. Implementations collected in division_operations.c and
632b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// descriptions at bottom of this file.
633c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orguint32_t WebRtcSpl_DivU32U16(uint32_t num, uint16_t den);
634c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgint32_t WebRtcSpl_DivW32W16(int32_t num, int16_t den);
635c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgint16_t WebRtcSpl_DivW32W16ResW16(int32_t num, int16_t den);
636c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgint32_t WebRtcSpl_DivResultInQ31(int32_t num, int32_t den);
637c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgint32_t WebRtcSpl_DivW32HiLow(int32_t num, int16_t den_hi, int16_t den_low);
638b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// End: Divisions.
639b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
640c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgint32_t WebRtcSpl_Energy(int16_t* vector, int vector_length, int* scale_factor);
641b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
642c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// Calculates the dot product between two (int16_t) vectors.
643b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
644b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
645b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector1       : Vector 1
646b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector2       : Vector 2
647b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector_length : Number of samples used in the dot product
648b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - scaling       : The number of right bit shifts to apply on each term
649b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                        during calculation to avoid overflow, i.e., the
650b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                        output will be in Q(-|scaling|)
651b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
652b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value         : The dot product in Q(-scaling)
653b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint32_t WebRtcSpl_DotProductWithScale(const int16_t* vector1,
654b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                      const int16_t* vector2,
655b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                      int length,
656b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                      int scaling);
657b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
658b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Filter operations.
65945a3434299d78b2084a2d765c51c76c165b410cepbos@webrtc.orgint WebRtcSpl_FilterAR(const int16_t* ar_coef,
660bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org                       int ar_coef_length,
66145a3434299d78b2084a2d765c51c76c165b410cepbos@webrtc.org                       const int16_t* in_vector,
662bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org                       int in_vector_length,
663c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                       int16_t* filter_state,
664bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org                       int filter_state_length,
665c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                       int16_t* filter_state_low,
666bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org                       int filter_state_low_length,
667c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                       int16_t* out_vector,
668c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                       int16_t* out_vector_low,
669bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org                       int out_vector_low_length);
670b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
671c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_FilterMAFastQ12(int16_t* in_vector,
672c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                               int16_t* out_vector,
673c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                               int16_t* ma_coef,
674c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                               int16_t ma_coef_length,
675c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                               int16_t vector_length);
676b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
677b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Performs a AR filtering on a vector in Q12
678b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
679b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - data_in            : Input samples
680b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - data_out           : State information in positions
681b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                               data_out[-order] .. data_out[-1]
682b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - coefficients       : Filter coefficients (in Q12)
683b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - coefficients_length: Number of coefficients (order+1)
684b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - data_length        : Number of samples to be filtered
685b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
686b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - data_out           : Filtered samples
687b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid WebRtcSpl_FilterARFastQ12(const int16_t* data_in,
688b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               int16_t* data_out,
689b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               const int16_t* __restrict coefficients,
690b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               int coefficients_length,
691b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               int data_length);
692b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
693b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// The functions (with related pointer) perform a MA down sampling filter
694b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// on a vector.
695b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
696b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - data_in            : Input samples (state in positions
697b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                               data_in[-order] .. data_in[-1])
698b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - data_in_length     : Number of samples in |data_in| to be filtered.
699b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                               This must be at least
700b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                               |delay| + |factor|*(|out_vector_length|-1) + 1)
701b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - data_out_length    : Number of down sampled samples desired
702b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - coefficients       : Filter coefficients (in Q12)
703b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - coefficients_length: Number of coefficients (order+1)
704b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - factor             : Decimation factor
705b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - delay              : Delay of filter (compensated for in out_vector)
706b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
707b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - data_out           : Filtered samples
708b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value              : 0 if OK, -1 if |in_vector| is too short
709b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtypedef int (*DownsampleFast)(const int16_t* data_in,
710b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                              int data_in_length,
711b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                              int16_t* data_out,
712b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                              int data_out_length,
713b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                              const int16_t* __restrict coefficients,
714b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                              int coefficients_length,
715b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                              int factor,
716b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                              int delay);
717b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgextern DownsampleFast WebRtcSpl_DownsampleFast;
718b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint WebRtcSpl_DownsampleFastC(const int16_t* data_in,
719b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                              int data_in_length,
720b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                              int16_t* data_out,
721b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                              int data_out_length,
722b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                              const int16_t* __restrict coefficients,
723b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                              int coefficients_length,
724b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                              int factor,
725b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                              int delay);
726b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if (defined WEBRTC_DETECT_ARM_NEON) || (defined WEBRTC_ARCH_ARM_NEON)
727b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint WebRtcSpl_DownsampleFastNeon(const int16_t* data_in,
728b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                 int data_in_length,
729b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                 int16_t* data_out,
730b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                 int data_out_length,
731b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                 const int16_t* __restrict coefficients,
732b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                 int coefficients_length,
733b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                 int factor,
734b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                 int delay);
735b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
7361aa406c729cf075f59b5381d9fa632014f4824b9andrew@webrtc.org#if defined(MIPS32_LE)
7371aa406c729cf075f59b5381d9fa632014f4824b9andrew@webrtc.orgint WebRtcSpl_DownsampleFast_mips(const int16_t* data_in,
7381aa406c729cf075f59b5381d9fa632014f4824b9andrew@webrtc.org                                  int data_in_length,
7391aa406c729cf075f59b5381d9fa632014f4824b9andrew@webrtc.org                                  int16_t* data_out,
7401aa406c729cf075f59b5381d9fa632014f4824b9andrew@webrtc.org                                  int data_out_length,
7411aa406c729cf075f59b5381d9fa632014f4824b9andrew@webrtc.org                                  const int16_t* __restrict coefficients,
7421aa406c729cf075f59b5381d9fa632014f4824b9andrew@webrtc.org                                  int coefficients_length,
7431aa406c729cf075f59b5381d9fa632014f4824b9andrew@webrtc.org                                  int factor,
7441aa406c729cf075f59b5381d9fa632014f4824b9andrew@webrtc.org                                  int delay);
7451aa406c729cf075f59b5381d9fa632014f4824b9andrew@webrtc.org#endif
746b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
747b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// End: Filter operations.
748b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
749b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// FFT operations
750b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
751c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgint WebRtcSpl_ComplexFFT(int16_t vector[], int stages, int mode);
752c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgint WebRtcSpl_ComplexIFFT(int16_t vector[], int stages, int mode);
753b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
754b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Treat a 16-bit complex data buffer |complex_data| as an array of 32-bit
755b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// values, and swap elements whose indexes are bit-reverses of each other.
756b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
757b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
758b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - complex_data  : Complex data buffer containing 2^|stages| real
759b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                        elements interleaved with 2^|stages| imaginary
760b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                        elements: [Re Im Re Im Re Im....]
761b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - stages        : Number of FFT stages. Must be at least 3 and at most
762b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                        10, since the table WebRtcSpl_kSinTable1024[] is 1024
763b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                        elements long.
764b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
765b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
766b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - complex_data  : The complex data buffer.
767b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
768b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid WebRtcSpl_ComplexBitReverse(int16_t* __restrict complex_data, int stages);
769b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
770b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// End: FFT operations
771b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
772b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/************************************************************
773b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
774b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * RESAMPLING FUNCTIONS AND THEIR STRUCTS ARE DEFINED BELOW
775b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
776b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ************************************************************/
777b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
778b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*******************************************************************
779b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * resample.c
780b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
781b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Includes the following resampling combinations
782b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 22 kHz -> 16 kHz
783b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 16 kHz -> 22 kHz
784b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 22 kHz ->  8 kHz
785b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  8 kHz -> 22 kHz
786b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
787b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ******************************************************************/
788b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
789b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// state structure for 22 -> 16 resampler
790bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.orgtypedef struct {
791c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org  int32_t S_22_44[8];
792c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org  int32_t S_44_32[8];
793c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org  int32_t S_32_16[8];
794b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} WebRtcSpl_State22khzTo16khz;
795b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
796c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_Resample22khzTo16khz(const int16_t* in,
797c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                    int16_t* out,
798b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                    WebRtcSpl_State22khzTo16khz* state,
799c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                    int32_t* tmpmem);
800b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
801b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid WebRtcSpl_ResetResample22khzTo16khz(WebRtcSpl_State22khzTo16khz* state);
802b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
803b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// state structure for 16 -> 22 resampler
804bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.orgtypedef struct {
805c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org  int32_t S_16_32[8];
806c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org  int32_t S_32_22[8];
807b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} WebRtcSpl_State16khzTo22khz;
808b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
809c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_Resample16khzTo22khz(const int16_t* in,
810c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                    int16_t* out,
811b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                    WebRtcSpl_State16khzTo22khz* state,
812c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                    int32_t* tmpmem);
813b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
814b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid WebRtcSpl_ResetResample16khzTo22khz(WebRtcSpl_State16khzTo22khz* state);
815b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
816b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// state structure for 22 -> 8 resampler
817bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.orgtypedef struct {
818c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org  int32_t S_22_22[16];
819c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org  int32_t S_22_16[8];
820c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org  int32_t S_16_8[8];
821b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} WebRtcSpl_State22khzTo8khz;
822b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
823c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_Resample22khzTo8khz(const int16_t* in, int16_t* out,
824b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                   WebRtcSpl_State22khzTo8khz* state,
825c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                   int32_t* tmpmem);
826b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
827b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid WebRtcSpl_ResetResample22khzTo8khz(WebRtcSpl_State22khzTo8khz* state);
828b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
829b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// state structure for 8 -> 22 resampler
830bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.orgtypedef struct {
831c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org  int32_t S_8_16[8];
832c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org  int32_t S_16_11[8];
833c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org  int32_t S_11_22[8];
834b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} WebRtcSpl_State8khzTo22khz;
835b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
836c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_Resample8khzTo22khz(const int16_t* in, int16_t* out,
837b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                   WebRtcSpl_State8khzTo22khz* state,
838c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                   int32_t* tmpmem);
839b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
840b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid WebRtcSpl_ResetResample8khzTo22khz(WebRtcSpl_State8khzTo22khz* state);
841b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
842b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*******************************************************************
843b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * resample_fractional.c
844b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Functions for internal use in the other resample functions
845b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
846b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Includes the following resampling combinations
847b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 48 kHz -> 32 kHz
848b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 32 kHz -> 24 kHz
849b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 44 kHz -> 32 kHz
850b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
851b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ******************************************************************/
852b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
853c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_Resample48khzTo32khz(const int32_t* In, int32_t* Out,
854d10d6e1f2ca710f9c1d443ed5715985e41efb8dfpbos@webrtc.org                                    int32_t K);
855b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
856c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_Resample32khzTo24khz(const int32_t* In, int32_t* Out,
857d10d6e1f2ca710f9c1d443ed5715985e41efb8dfpbos@webrtc.org                                    int32_t K);
858b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
859c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_Resample44khzTo32khz(const int32_t* In, int32_t* Out,
860d10d6e1f2ca710f9c1d443ed5715985e41efb8dfpbos@webrtc.org                                    int32_t K);
861b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
862b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*******************************************************************
863b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * resample_48khz.c
864b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
865b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Includes the following resampling combinations
866b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 48 kHz -> 16 kHz
867b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 16 kHz -> 48 kHz
868b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 48 kHz ->  8 kHz
869b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  8 kHz -> 48 kHz
870b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
871b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ******************************************************************/
872b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
873bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.orgtypedef struct {
874c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org  int32_t S_48_48[16];
875c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org  int32_t S_48_32[8];
876c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org  int32_t S_32_16[8];
877b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} WebRtcSpl_State48khzTo16khz;
878b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
879c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_Resample48khzTo16khz(const int16_t* in, int16_t* out,
880b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                    WebRtcSpl_State48khzTo16khz* state,
881c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                    int32_t* tmpmem);
882b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
883b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid WebRtcSpl_ResetResample48khzTo16khz(WebRtcSpl_State48khzTo16khz* state);
884b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
885bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.orgtypedef struct {
886c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org  int32_t S_16_32[8];
887c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org  int32_t S_32_24[8];
888c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org  int32_t S_24_48[8];
889b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} WebRtcSpl_State16khzTo48khz;
890b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
891c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_Resample16khzTo48khz(const int16_t* in, int16_t* out,
892b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                    WebRtcSpl_State16khzTo48khz* state,
893c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                    int32_t* tmpmem);
894b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
895b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid WebRtcSpl_ResetResample16khzTo48khz(WebRtcSpl_State16khzTo48khz* state);
896b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
897bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.orgtypedef struct {
898c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org  int32_t S_48_24[8];
899c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org  int32_t S_24_24[16];
900c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org  int32_t S_24_16[8];
901c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org  int32_t S_16_8[8];
902b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} WebRtcSpl_State48khzTo8khz;
903b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
904c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_Resample48khzTo8khz(const int16_t* in, int16_t* out,
905b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                   WebRtcSpl_State48khzTo8khz* state,
906c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                   int32_t* tmpmem);
907b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
908b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid WebRtcSpl_ResetResample48khzTo8khz(WebRtcSpl_State48khzTo8khz* state);
909b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
910bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.orgtypedef struct {
911c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org  int32_t S_8_16[8];
912c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org  int32_t S_16_12[8];
913c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org  int32_t S_12_24[8];
914c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org  int32_t S_24_48[8];
915b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} WebRtcSpl_State8khzTo48khz;
916b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
917c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_Resample8khzTo48khz(const int16_t* in, int16_t* out,
918b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                   WebRtcSpl_State8khzTo48khz* state,
919c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                   int32_t* tmpmem);
920b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
921b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid WebRtcSpl_ResetResample8khzTo48khz(WebRtcSpl_State8khzTo48khz* state);
922b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
923b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*******************************************************************
924b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * resample_by_2.c
925b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
926b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Includes down and up sampling by a factor of two.
927b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
928b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ******************************************************************/
929b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
9301f53a8f5c9591dd9e9896b2bb1e5456dbff6cb96bjornv@webrtc.orgvoid WebRtcSpl_DownsampleBy2(const int16_t* in, int len,
931c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                             int16_t* out, int32_t* filtState);
932b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
9331f53a8f5c9591dd9e9896b2bb1e5456dbff6cb96bjornv@webrtc.orgvoid WebRtcSpl_UpsampleBy2(const int16_t* in, int len,
934c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                           int16_t* out, int32_t* filtState);
935b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
936b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/************************************************************
937b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * END OF RESAMPLING FUNCTIONS
938b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ************************************************************/
939c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_AnalysisQMF(const int16_t* in_data,
940e95dc25b14845cbf00ae363e88459c44e2341c47andrew@webrtc.org                           int in_data_length,
941c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                           int16_t* low_band,
942c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                           int16_t* high_band,
943c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                           int32_t* filter_state1,
944c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                           int32_t* filter_state2);
945c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_SynthesisQMF(const int16_t* low_band,
946c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                            const int16_t* high_band,
947e95dc25b14845cbf00ae363e88459c44e2341c47andrew@webrtc.org                            int band_length,
948c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                            int16_t* out_data,
949c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                            int32_t* filter_state1,
950c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                            int32_t* filter_state2);
951b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
952b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef __cplusplus
953b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
954bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org#endif  // __cplusplus
955bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org#endif  // WEBRTC_SPL_SIGNAL_PROCESSING_LIBRARY_H_
956b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
957b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
958b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_AddSatW16(...)
959b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_AddSatW32(...)
960b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
961b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Returns the result of a saturated 16-bit, respectively 32-bit, addition of
962b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// the numbers specified by the |var1| and |var2| parameters.
963b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
964b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
965b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - var1      : Input variable 1
966b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - var2      : Input variable 2
967b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
968b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value     : Added and saturated value
969b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
970b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
971b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
972b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_SubSatW16(...)
973b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_SubSatW32(...)
974b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
975b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Returns the result of a saturated 16-bit, respectively 32-bit, subtraction
976b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// of the numbers specified by the |var1| and |var2| parameters.
977b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
978b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
979b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - var1      : Input variable 1
980b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - var2      : Input variable 2
981b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
982b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Returned value   : Subtracted and saturated value
983b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
984b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
985b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
986b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_GetSizeInBits(...)
987b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
988b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Returns the # of bits that are needed at the most to represent the number
989b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// specified by the |value| parameter.
990b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
991b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
992b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - value     : Input value
993b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
994b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value     : Number of bits needed to represent |value|
995b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
996b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
997b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
998b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_NormW32(...)
999b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1000b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Norm returns the # of left shifts required to 32-bit normalize the 32-bit
1001b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// signed number specified by the |value| parameter.
1002b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1003b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1004b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - value     : Input value
1005b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1006b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value     : Number of bit shifts needed to 32-bit normalize |value|
1007b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1008b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1009b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1010b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_NormW16(...)
1011b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1012b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Norm returns the # of left shifts required to 16-bit normalize the 16-bit
1013b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// signed number specified by the |value| parameter.
1014b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1015b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1016b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - value     : Input value
1017b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1018b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value     : Number of bit shifts needed to 32-bit normalize |value|
1019b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1020b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1021b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1022b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_NormU32(...)
1023b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1024b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Norm returns the # of left shifts required to 32-bit normalize the unsigned
1025b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// 32-bit number specified by the |value| parameter.
1026b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1027b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1028b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - value     : Input value
1029b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1030b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value     : Number of bit shifts needed to 32-bit normalize |value|
1031b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1032b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1033b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1034b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_GetScalingSquare(...)
1035b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1036b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Returns the # of bits required to scale the samples specified in the
1037b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// |in_vector| parameter so that, if the squares of the samples are added the
1038b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// # of times specified by the |times| parameter, the 32-bit addition will not
1039c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// overflow (result in int32_t).
1040b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1041b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1042b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - in_vector         : Input vector to check scaling on
1043b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - in_vector_length  : Samples in |in_vector|
1044b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - times             : Number of additions to be performed
1045b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1046b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value             : Number of right bit shifts needed to avoid
1047b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                            overflow in the addition calculation
1048b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1049b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1050b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1051b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_MemSetW16(...)
1052b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1053c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// Sets all the values in the int16_t vector |vector| of length
1054b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// |vector_length| to the specified value |set_value|
1055b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1056b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1057c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org//      - vector        : Pointer to the int16_t vector
1058b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - set_value     : Value specified
1059b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector_length : Length of vector
1060b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1061b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1062b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1063b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_MemSetW32(...)
1064b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1065c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// Sets all the values in the int32_t vector |vector| of length
1066b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// |vector_length| to the specified value |set_value|
1067b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1068b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1069c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org//      - vector        : Pointer to the int16_t vector
1070b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - set_value     : Value specified
1071b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector_length : Length of vector
1072b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1073b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1074b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1075b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_MemCpyReversedOrder(...)
1076b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1077c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// Copies all the values from the source int16_t vector |in_vector| to a
1078c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// destination int16_t vector |out_vector|. It is done in reversed order,
1079b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// meaning that the first sample of |in_vector| is copied to the last sample of
1080b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// the |out_vector|. The procedure continues until the last sample of
1081b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// |in_vector| has been copied to the first sample of |out_vector|. This
1082b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// creates a reversed vector. Used in e.g. prediction in iLBC.
1083b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1084b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1085c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org//      - in_vector     : Pointer to the first sample in a int16_t vector
1086b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                        of length |length|
1087b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector_length : Number of elements to copy
1088b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1089b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
1090c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org//      - out_vector    : Pointer to the last sample in a int16_t vector
1091b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                        of length |length|
1092b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1093b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1094b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1095b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_CopyFromEndW16(...)
1096b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1097b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Copies the rightmost |samples| of |in_vector| (of length |in_vector_length|)
1098b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// to the vector |out_vector|.
1099b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - in_vector         : Input vector
1102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - in_vector_length  : Number of samples in |in_vector|
1103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - samples           : Number of samples to extract (from right side)
1104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                            from |in_vector|
1105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
1107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - out_vector        : Vector with the requested samples
1108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_ZerosArrayW16(...)
1112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_ZerosArrayW32(...)
1113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Inserts the value "zero" in all positions of a w16 and a w32 vector
1115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// respectively.
1116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector_length : Number of samples in vector
1119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
1121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector        : Vector containing all zeros
1122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_VectorBitShiftW16(...)
1126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_VectorBitShiftW32(...)
1127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Bit shifts all the values in a vector up or downwards. Different calls for
1129c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// int16_t and int32_t vectors respectively.
1130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector_length : Length of vector
1133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - in_vector     : Pointer to the vector that should be bit shifted
1134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - right_shifts  : Number of right bit shifts (negative value gives left
1135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                        shifts)
1136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
1138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - out_vector    : Pointer to the result vector (can be the same as
1139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                        |in_vector|)
1140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_VectorBitShiftW32ToW16(...)
1144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1145c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// Bit shifts all the values in a int32_t vector up or downwards and
1146a049d6ebe5dacfef278c0d9086d1522854c56b39tina.legrand@webrtc.org// stores the result as an int16_t vector. The function will saturate the
1147a049d6ebe5dacfef278c0d9086d1522854c56b39tina.legrand@webrtc.org// signal if needed, before storing in the output vector.
1148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector_length : Length of vector
1151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - in_vector     : Pointer to the vector that should be bit shifted
1152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - right_shifts  : Number of right bit shifts (negative value gives left
1153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                        shifts)
1154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
1156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - out_vector    : Pointer to the result vector (can be the same as
1157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                        |in_vector|)
1158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_ScaleVector(...)
1162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Performs the vector operation:
1164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  out_vector[k] = (gain*in_vector[k])>>right_shifts
1165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - in_vector     : Input vector
1168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - gain          : Scaling gain
1169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector_length : Elements in the |in_vector|
1170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - right_shifts  : Number of right bit shifts applied
1171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
1173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - out_vector    : Output vector (can be the same as |in_vector|)
1174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_ScaleVectorWithSat(...)
1178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Performs the vector operation:
1180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  out_vector[k] = SATURATE( (gain*in_vector[k])>>right_shifts )
1181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - in_vector     : Input vector
1184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - gain          : Scaling gain
1185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector_length : Elements in the |in_vector|
1186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - right_shifts  : Number of right bit shifts applied
1187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
1189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - out_vector    : Output vector (can be the same as |in_vector|)
1190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_ScaleAndAddVectors(...)
1194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Performs the vector operation:
1196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  out_vector[k] = (gain1*in_vector1[k])>>right_shifts1
1197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                  + (gain2*in_vector2[k])>>right_shifts2
1198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - in_vector1    : Input vector 1
1201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - gain1         : Gain to be used for vector 1
1202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - right_shifts1 : Right bit shift to be used for vector 1
1203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - in_vector2    : Input vector 2
1204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - gain2         : Gain to be used for vector 2
1205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - right_shifts2 : Right bit shift to be used for vector 2
1206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector_length : Elements in the input vectors
1207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
1209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - out_vector    : Output vector
1210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_ReverseOrderMultArrayElements(...)
1214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Performs the vector operation:
1216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  out_vector[n] = (in_vector[n]*window[-n])>>right_shifts
1217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - in_vector     : Input vector
1220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - window        : Window vector (should be reversed). The pointer
1221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                        should be set to the last value in the vector
1222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - right_shifts  : Number of right bit shift to be applied after the
1223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                        multiplication
1224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector_length : Number of elements in |in_vector|
1225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
1227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - out_vector    : Output vector (can be same as |in_vector|)
1228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_ElementwiseVectorMult(...)
1232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Performs the vector operation:
1234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  out_vector[n] = (in_vector[n]*window[n])>>right_shifts
1235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - in_vector     : Input vector
1238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - window        : Window vector.
1239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - right_shifts  : Number of right bit shift to be applied after the
1240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                        multiplication
1241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector_length : Number of elements in |in_vector|
1242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
1244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - out_vector    : Output vector (can be same as |in_vector|)
1245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_AddVectorsAndShift(...)
1249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Performs the vector operation:
1251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  out_vector[k] = (in_vector1[k] + in_vector2[k])>>right_shifts
1252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - in_vector1    : Input vector 1
1255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - in_vector2    : Input vector 2
1256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - right_shifts  : Number of right bit shift to be applied after the
1257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                        multiplication
1258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector_length : Number of elements in |in_vector1| and |in_vector2|
1259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
1261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - out_vector    : Output vector (can be same as |in_vector1|)
1262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_AddAffineVectorToVector(...)
1266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Adds an affine transformed vector to another vector |out_vector|, i.e,
1268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// performs
1269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  out_vector[k] += (in_vector[k]*gain+add_constant)>>right_shifts
1270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - in_vector     : Input vector
1273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - gain          : Gain value, used to multiply the in vector with
1274b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - add_constant  : Constant value to add (usually 1<<(right_shifts-1),
1275b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                        but others can be used as well
1276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - right_shifts  : Number of right bit shifts (0-16)
1277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector_length : Number of samples in |in_vector| and |out_vector|
1278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1279b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
1280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - out_vector    : Vector with the output
1281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1282b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_AffineTransformVector(...)
1285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1286b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Affine transforms a vector, i.e, performs
1287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  out_vector[k] = (in_vector[k]*gain+add_constant)>>right_shifts
1288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1290b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - in_vector     : Input vector
1291b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - gain          : Gain value, used to multiply the in vector with
1292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - add_constant  : Constant value to add (usually 1<<(right_shifts-1),
1293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                        but others can be used as well
1294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - right_shifts  : Number of right bit shifts (0-16)
1295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector_length : Number of samples in |in_vector| and |out_vector|
1296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
1298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - out_vector    : Vector with the output
1299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_IncreaseSeed(...)
1303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Increases the seed (and returns the new value)
1305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - seed      : Seed for random calculation
1308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
1310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - seed      : Updated seed value
1311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value     : The new seed value
1313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1315b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1316b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_RandU(...)
1317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1318c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// Produces a uniformly distributed value in the int16_t range
1319b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1320b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1321b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - seed      : Seed for random calculation
1322b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1323b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
1324b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - seed      : Updated seed value
1325b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1326b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value     : Uniformly distributed value in the range
1327b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    [Word16_MIN...Word16_MAX]
1328b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1329b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1330b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1331b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_RandN(...)
1332b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1333c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// Produces a normal distributed value in the int16_t range
1334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1335b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1336b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - seed      : Seed for random calculation
1337b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1338b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
1339b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - seed      : Updated seed value
1340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1341b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value     : N(0,1) value in the Q13 domain
1342b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1344b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1345b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_RandUArray(...)
1346b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1347c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// Produces a uniformly distributed vector with elements in the int16_t
1348b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// range
1349b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1350b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1351b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector_length : Samples wanted in the vector
1352b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - seed          : Seed for random calculation
1353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1354b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
1355b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector        : Vector with the uniform values
1356b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - seed          : Updated seed value
1357b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1358b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value         : Number of samples in vector, i.e., |vector_length|
1359b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1360b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1362b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_Sqrt(...)
1363b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1364b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Returns the square root of the input value |value|. The precision of this
1365b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// function is integer precision, i.e., sqrt(8) gives 2 as answer.
1366b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// If |value| is a negative number then 0 is returned.
1367b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1368b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Algorithm:
1369b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1370b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// A sixth order Taylor Series expansion is used here to compute the square
1371b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// root of a number y^0.5 = (1+x)^0.5
1372b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// where
1373b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// x = y-1
1374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//   = 1+(x/2)-0.5*((x/2)^2+0.5*((x/2)^3-0.625*((x/2)^4+0.875*((x/2)^5)
1375b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// 0.5 <= x < 1
1376b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1377b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1378b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - value     : Value to calculate sqrt of
1379b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1380b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value     : Result of the sqrt calculation
1381b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1382b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1383b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1384b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_SqrtFloor(...)
1385b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1386b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Returns the square root of the input value |value|. The precision of this
1387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// function is rounding down integer precision, i.e., sqrt(8) gives 2 as answer.
1388b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// If |value| is a negative number then 0 is returned.
1389b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1390b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Algorithm:
1391b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1392b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// An iterative 4 cylce/bit routine
1393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1394b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - value     : Value to calculate sqrt of
1396b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1397b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value     : Result of the sqrt calculation
1398b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1399b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1400b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1401b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_DivU32U16(...)
1402b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1403c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// Divides a uint32_t |num| by a uint16_t |den|.
1404b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1405c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// If |den|==0, (uint32_t)0xFFFFFFFF is returned.
1406b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1407b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1408b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - num       : Numerator
1409b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - den       : Denominator
1410b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1411c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// Return value     : Result of the division (as a uint32_t), i.e., the
1412b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    integer part of num/den.
1413b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1414b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1415b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1416b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_DivW32W16(...)
1417b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1418c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// Divides a int32_t |num| by a int16_t |den|.
1419b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1420c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// If |den|==0, (int32_t)0x7FFFFFFF is returned.
1421b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1422b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1423b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - num       : Numerator
1424b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - den       : Denominator
1425b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1426c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// Return value     : Result of the division (as a int32_t), i.e., the
1427b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    integer part of num/den.
1428b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1429b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1430b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1431b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_DivW32W16ResW16(...)
1432b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1433c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// Divides a int32_t |num| by a int16_t |den|, assuming that the
1434b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// result is less than 32768, otherwise an unpredictable result will occur.
1435b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1436c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// If |den|==0, (int16_t)0x7FFF is returned.
1437b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1438b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1439b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - num       : Numerator
1440b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - den       : Denominator
1441b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1442c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// Return value     : Result of the division (as a int16_t), i.e., the
1443b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    integer part of num/den.
1444b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1445b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1446b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1447b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_DivResultInQ31(...)
1448b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1449c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// Divides a int32_t |num| by a int16_t |den|, assuming that the
1450b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// absolute value of the denominator is larger than the numerator, otherwise
1451b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// an unpredictable result will occur.
1452b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1453b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1454b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - num       : Numerator
1455b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - den       : Denominator
1456b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1457b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value     : Result of the division in Q31.
1458b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1459b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1460b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1461b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_DivW32HiLow(...)
1462b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1463c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// Divides a int32_t |num| by a denominator in hi, low format. The
1464b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// absolute value of the denominator has to be larger (or equal to) the
1465b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// numerator.
1466b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1467b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1468b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - num       : Numerator
1469b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - den_hi    : High part of denominator
1470b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - den_low   : Low part of denominator
1471b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1472b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value     : Divided value in Q31
1473b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1474b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1475b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1476b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_Energy(...)
1477b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1478b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Calculates the energy of a vector
1479b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1480b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1481b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector        : Vector which the energy should be calculated on
1482b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector_length : Number of samples in vector
1483b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1484b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
1485b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - scale_factor  : Number of left bit shifts needed to get the physical
1486b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                        energy value, i.e, to get the Q0 value
1487b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1488b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value         : Energy value in Q(-|scale_factor|)
1489b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1490b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1491b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1492b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_FilterAR(...)
1493b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1494b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Performs a 32-bit AR filtering on a vector in Q12
1495b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1496b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1497b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  - ar_coef                   : AR-coefficient vector (values in Q12),
1498b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                                ar_coef[0] must be 4096.
1499b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  - ar_coef_length            : Number of coefficients in |ar_coef|.
1500b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  - in_vector                 : Vector to be filtered.
1501b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  - in_vector_length          : Number of samples in |in_vector|.
1502b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  - filter_state              : Current state (higher part) of the filter.
1503b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  - filter_state_length       : Length (in samples) of |filter_state|.
1504b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  - filter_state_low          : Current state (lower part) of the filter.
1505b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  - filter_state_low_length   : Length (in samples) of |filter_state_low|.
1506b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  - out_vector_low_length     : Maximum length (in samples) of
1507b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                                |out_vector_low|.
1508b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1509b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
1510b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  - filter_state              : Updated state (upper part) vector.
1511b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  - filter_state_low          : Updated state (lower part) vector.
1512b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  - out_vector                : Vector containing the upper part of the
1513b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                                filtered values.
1514b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  - out_vector_low            : Vector containing the lower part of the
1515b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                                filtered values.
1516b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1517b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value                 : Number of samples in the |out_vector|.
1518b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1519b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1520b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1521b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_FilterMAFastQ12(...)
1522b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1523b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Performs a MA filtering on a vector in Q12
1524b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1525b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1526b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - in_vector         : Input samples (state in positions
1527b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                            in_vector[-order] .. in_vector[-1])
1528b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - ma_coef           : Filter coefficients (in Q12)
1529b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - ma_coef_length    : Number of B coefficients (order+1)
1530b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector_length     : Number of samples to be filtered
1531b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1532b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
1533b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - out_vector        : Filtered samples
1534b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1535b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1536b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1537b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_ComplexIFFT(...)
1538b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1539b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Complex Inverse FFT
1540b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1541b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Computes an inverse complex 2^|stages|-point FFT on the input vector, which
1542b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// is in bit-reversed order. The original content of the vector is destroyed in
1543b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// the process, since the input is overwritten by the output, normal-ordered,
1544b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// FFT vector. With X as the input complex vector, y as the output complex
1545b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// vector and with M = 2^|stages|, the following is computed:
1546b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1547b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//        M-1
1548b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// y(k) = sum[X(i)*[cos(2*pi*i*k/M) + j*sin(2*pi*i*k/M)]]
1549b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//        i=0
1550b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1551b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// The implementations are optimized for speed, not for code size. It uses the
1552b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// decimation-in-time algorithm with radix-2 butterfly technique.
1553b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1554b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1555b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector    : In pointer to complex vector containing 2^|stages|
1556b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    real elements interleaved with 2^|stages| imaginary
1557b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    elements.
1558b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    [ReImReImReIm....]
1559b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    The elements are in Q(-scale) domain, see more on Return
1560b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    Value below.
1561b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1562b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - stages    : Number of FFT stages. Must be at least 3 and at most 10,
1563b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    since the table WebRtcSpl_kSinTable1024[] is 1024
1564b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    elements long.
1565b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1566b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - mode      : This parameter gives the user to choose how the FFT
1567b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    should work.
1568b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    mode==0: Low-complexity and Low-accuracy mode
1569b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    mode==1: High-complexity and High-accuracy mode
1570b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1571b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
1572b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector    : Out pointer to the FFT vector (the same as input).
1573b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1574b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return Value     : The scale value that tells the number of left bit shifts
1575b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    that the elements in the |vector| should be shifted with
1576b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    in order to get Q0 values, i.e. the physically correct
1577b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    values. The scale parameter is always 0 or positive,
1578b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    except if N>1024 (|stages|>10), which returns a scale
1579b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    value of -1, indicating error.
1580b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1581b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1582b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1583b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_ComplexFFT(...)
1584b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1585b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Complex FFT
1586b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1587b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Computes a complex 2^|stages|-point FFT on the input vector, which is in
1588b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// bit-reversed order. The original content of the vector is destroyed in
1589b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// the process, since the input is overwritten by the output, normal-ordered,
1590b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// FFT vector. With x as the input complex vector, Y as the output complex
1591b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// vector and with M = 2^|stages|, the following is computed:
1592b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1593b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//              M-1
1594b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Y(k) = 1/M * sum[x(i)*[cos(2*pi*i*k/M) + j*sin(2*pi*i*k/M)]]
1595b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//              i=0
1596b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1597b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// The implementations are optimized for speed, not for code size. It uses the
1598b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// decimation-in-time algorithm with radix-2 butterfly technique.
1599b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1600b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// This routine prevents overflow by scaling by 2 before each FFT stage. This is
1601b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// a fixed scaling, for proper normalization - there will be log2(n) passes, so
1602b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// this results in an overall factor of 1/n, distributed to maximize arithmetic
1603b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// accuracy.
1604b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1605b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1606b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector    : In pointer to complex vector containing 2^|stages| real
1607b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    elements interleaved with 2^|stages| imaginary elements.
1608b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    [ReImReImReIm....]
1609b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    The output is in the Q0 domain.
1610b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1611b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - stages    : Number of FFT stages. Must be at least 3 and at most 10,
1612b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    since the table WebRtcSpl_kSinTable1024[] is 1024
1613b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    elements long.
1614b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1615b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - mode      : This parameter gives the user to choose how the FFT
1616b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    should work.
1617b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    mode==0: Low-complexity and Low-accuracy mode
1618b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    mode==1: High-complexity and High-accuracy mode
1619b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1620b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
1621b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - vector    : The output FFT vector is in the Q0 domain.
1622b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1623b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return value     : The scale parameter is always 0, except if N>1024,
1624b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                    which returns a scale value of -1, indicating error.
1625b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1626b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1627b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1628b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_AnalysisQMF(...)
1629b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1630b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Splits a 0-2*F Hz signal into two sub bands: 0-F Hz and F-2*F Hz. The
1631b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// current version has F = 8000, therefore, a super-wideband audio signal is
1632b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// split to lower-band 0-8 kHz and upper-band 8-16 kHz.
1633b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1634b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1635b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - in_data       : Wide band speech signal, 320 samples (10 ms)
1636b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1637b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input & Output:
1638b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - filter_state1 : Filter state for first All-pass filter
1639b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - filter_state2 : Filter state for second All-pass filter
1640b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1641b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
1642b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - low_band      : Lower-band signal 0-8 kHz band, 160 samples (10 ms)
1643b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - high_band     : Upper-band signal 8-16 kHz band (flipped in frequency
1644b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//                        domain), 160 samples (10 ms)
1645b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1646b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1647b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1648b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// WebRtcSpl_SynthesisQMF(...)
1649b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1650b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Combines the two sub bands (0-F and F-2*F Hz) into a signal of 0-2*F
1651b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Hz, (current version has F = 8000 Hz). So the filter combines lower-band
1652b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// (0-8 kHz) and upper-band (8-16 kHz) channels to obtain super-wideband 0-16
1653b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// kHz audio.
1654b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1655b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1656b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - low_band      : The signal with the 0-8 kHz band, 160 samples (10 ms)
1657b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - high_band     : The signal with the 8-16 kHz band, 160 samples (10 ms)
1658b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1659b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input & Output:
1660b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - filter_state1 : Filter state for first All-pass filter
1661b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - filter_state2 : Filter state for second All-pass filter
1662b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1663b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
1664b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - out_data      : Super-wideband speech signal, 0-16 kHz
1665b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1666b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1667c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// int16_t WebRtcSpl_SatW32ToW16(...)
1668b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1669b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// This function saturates a 32-bit word into a 16-bit word.
1670b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1671b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1672b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - value32   : The value of a 32-bit word.
1673b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1674b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
1675b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - out16     : the saturated 16-bit word.
1676b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1677b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1678b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// int32_t WebRtc_MulAccumW16(...)
1679b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1680b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// This function multiply a 16-bit word by a 16-bit word, and accumulate this
1681b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// value to a 32-bit integer.
1682b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1683b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1684b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - a    : The value of the first 16-bit word.
1685b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - b    : The value of the second 16-bit word.
1686b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      - c    : The value of an 32-bit integer.
1687b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1688b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Return Value: The value of a * b + c.
1689b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1690b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1691c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// int16_t WebRtcSpl_get_version(...)
1692b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1693b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// This function gives the version string of the Signal Processing Library.
1694b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1695b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Input:
1696bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org//      - length_in_bytes : The size of Allocated space (in Bytes) where
1697bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org//                          the version number is written to (in string format).
1698b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1699b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Output:
1700bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org//      - version         : Pointer to a buffer where the version number is
1701bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org//                          written to.
1702b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
1703