webrtcvad 0.1.0 → 0.2.3

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