webrtcvad 0.1.0 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ //