OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 /* | 11 /* |
12 * This file contains the implementation of functions | 12 * This file contains the implementation of functions |
13 * WebRtcSpl_MaxAbsValueW16C() | 13 * WebRtcSpl_MaxAbsValueW16C() |
14 * WebRtcSpl_MaxAbsValueW32C() | 14 * WebRtcSpl_MaxAbsValueW32C() |
15 * WebRtcSpl_MaxValueW16C() | 15 * WebRtcSpl_MaxValueW16C() |
16 * WebRtcSpl_MaxValueW32C() | 16 * WebRtcSpl_MaxValueW32C() |
17 * WebRtcSpl_MinValueW16C() | 17 * WebRtcSpl_MinValueW16C() |
18 * WebRtcSpl_MinValueW32C() | 18 * WebRtcSpl_MinValueW32C() |
19 * WebRtcSpl_MaxAbsIndexW16() | 19 * WebRtcSpl_MaxAbsIndexW16() |
20 * WebRtcSpl_MaxIndexW16() | 20 * WebRtcSpl_MaxIndexW16() |
21 * WebRtcSpl_MaxIndexW32() | 21 * WebRtcSpl_MaxIndexW32() |
22 * WebRtcSpl_MinIndexW16() | 22 * WebRtcSpl_MinIndexW16() |
23 * WebRtcSpl_MinIndexW32() | 23 * WebRtcSpl_MinIndexW32() |
24 * | 24 * |
25 */ | 25 */ |
26 | 26 |
| 27 #include <assert.h> |
| 28 #include <stdlib.h> |
| 29 |
27 #include "webrtc/common_audio/signal_processing/include/signal_processing_librar
y.h" | 30 #include "webrtc/common_audio/signal_processing/include/signal_processing_librar
y.h" |
28 | 31 |
29 #include <stdlib.h> | |
30 | |
31 // TODO(bjorn/kma): Consolidate function pairs (e.g. combine | 32 // TODO(bjorn/kma): Consolidate function pairs (e.g. combine |
32 // WebRtcSpl_MaxAbsValueW16C and WebRtcSpl_MaxAbsIndexW16 into a single one.) | 33 // WebRtcSpl_MaxAbsValueW16C and WebRtcSpl_MaxAbsIndexW16 into a single one.) |
33 // TODO(kma): Move the next six functions into min_max_operations_c.c. | 34 // TODO(kma): Move the next six functions into min_max_operations_c.c. |
34 | 35 |
35 // Maximum absolute value of word16 vector. C version for generic platforms. | 36 // Maximum absolute value of word16 vector. C version for generic platforms. |
36 int16_t WebRtcSpl_MaxAbsValueW16C(const int16_t* vector, size_t length) { | 37 int16_t WebRtcSpl_MaxAbsValueW16C(const int16_t* vector, size_t length) { |
37 size_t i = 0; | 38 size_t i = 0; |
38 int absolute = 0, maximum = 0; | 39 int absolute = 0, maximum = 0; |
39 | 40 |
40 if (vector == NULL || length == 0) { | 41 assert(length > 0); |
41 return -1; | |
42 } | |
43 | 42 |
44 for (i = 0; i < length; i++) { | 43 for (i = 0; i < length; i++) { |
45 absolute = abs((int)vector[i]); | 44 absolute = abs((int)vector[i]); |
46 | 45 |
47 if (absolute > maximum) { | 46 if (absolute > maximum) { |
48 maximum = absolute; | 47 maximum = absolute; |
49 } | 48 } |
50 } | 49 } |
51 | 50 |
52 // Guard the case for abs(-32768). | 51 // Guard the case for abs(-32768). |
53 if (maximum > WEBRTC_SPL_WORD16_MAX) { | 52 if (maximum > WEBRTC_SPL_WORD16_MAX) { |
54 maximum = WEBRTC_SPL_WORD16_MAX; | 53 maximum = WEBRTC_SPL_WORD16_MAX; |
55 } | 54 } |
56 | 55 |
57 return (int16_t)maximum; | 56 return (int16_t)maximum; |
58 } | 57 } |
59 | 58 |
60 // Maximum absolute value of word32 vector. C version for generic platforms. | 59 // Maximum absolute value of word32 vector. C version for generic platforms. |
61 int32_t WebRtcSpl_MaxAbsValueW32C(const int32_t* vector, size_t length) { | 60 int32_t WebRtcSpl_MaxAbsValueW32C(const int32_t* vector, size_t length) { |
62 // Use uint32_t for the local variables, to accommodate the return value | 61 // Use uint32_t for the local variables, to accommodate the return value |
63 // of abs(0x80000000), which is 0x80000000. | 62 // of abs(0x80000000), which is 0x80000000. |
64 | 63 |
65 uint32_t absolute = 0, maximum = 0; | 64 uint32_t absolute = 0, maximum = 0; |
66 size_t i = 0; | 65 size_t i = 0; |
67 | 66 |
68 if (vector == NULL || length == 0) { | 67 assert(length > 0); |
69 return -1; | |
70 } | |
71 | 68 |
72 for (i = 0; i < length; i++) { | 69 for (i = 0; i < length; i++) { |
73 absolute = abs((int)vector[i]); | 70 absolute = abs((int)vector[i]); |
74 if (absolute > maximum) { | 71 if (absolute > maximum) { |
75 maximum = absolute; | 72 maximum = absolute; |
76 } | 73 } |
77 } | 74 } |
78 | 75 |
79 maximum = WEBRTC_SPL_MIN(maximum, WEBRTC_SPL_WORD32_MAX); | 76 maximum = WEBRTC_SPL_MIN(maximum, WEBRTC_SPL_WORD32_MAX); |
80 | 77 |
81 return (int32_t)maximum; | 78 return (int32_t)maximum; |
82 } | 79 } |
83 | 80 |
84 // Maximum value of word16 vector. C version for generic platforms. | 81 // Maximum value of word16 vector. C version for generic platforms. |
85 int16_t WebRtcSpl_MaxValueW16C(const int16_t* vector, size_t length) { | 82 int16_t WebRtcSpl_MaxValueW16C(const int16_t* vector, size_t length) { |
86 int16_t maximum = WEBRTC_SPL_WORD16_MIN; | 83 int16_t maximum = WEBRTC_SPL_WORD16_MIN; |
87 size_t i = 0; | 84 size_t i = 0; |
88 | 85 |
89 if (vector == NULL || length == 0) { | 86 assert(length > 0); |
90 return maximum; | |
91 } | |
92 | 87 |
93 for (i = 0; i < length; i++) { | 88 for (i = 0; i < length; i++) { |
94 if (vector[i] > maximum) | 89 if (vector[i] > maximum) |
95 maximum = vector[i]; | 90 maximum = vector[i]; |
96 } | 91 } |
97 return maximum; | 92 return maximum; |
98 } | 93 } |
99 | 94 |
100 // Maximum value of word32 vector. C version for generic platforms. | 95 // Maximum value of word32 vector. C version for generic platforms. |
101 int32_t WebRtcSpl_MaxValueW32C(const int32_t* vector, size_t length) { | 96 int32_t WebRtcSpl_MaxValueW32C(const int32_t* vector, size_t length) { |
102 int32_t maximum = WEBRTC_SPL_WORD32_MIN; | 97 int32_t maximum = WEBRTC_SPL_WORD32_MIN; |
103 size_t i = 0; | 98 size_t i = 0; |
104 | 99 |
105 if (vector == NULL || length == 0) { | 100 assert(length > 0); |
106 return maximum; | |
107 } | |
108 | 101 |
109 for (i = 0; i < length; i++) { | 102 for (i = 0; i < length; i++) { |
110 if (vector[i] > maximum) | 103 if (vector[i] > maximum) |
111 maximum = vector[i]; | 104 maximum = vector[i]; |
112 } | 105 } |
113 return maximum; | 106 return maximum; |
114 } | 107 } |
115 | 108 |
116 // Minimum value of word16 vector. C version for generic platforms. | 109 // Minimum value of word16 vector. C version for generic platforms. |
117 int16_t WebRtcSpl_MinValueW16C(const int16_t* vector, size_t length) { | 110 int16_t WebRtcSpl_MinValueW16C(const int16_t* vector, size_t length) { |
118 int16_t minimum = WEBRTC_SPL_WORD16_MAX; | 111 int16_t minimum = WEBRTC_SPL_WORD16_MAX; |
119 size_t i = 0; | 112 size_t i = 0; |
120 | 113 |
121 if (vector == NULL || length == 0) { | 114 assert(length > 0); |
122 return minimum; | |
123 } | |
124 | 115 |
125 for (i = 0; i < length; i++) { | 116 for (i = 0; i < length; i++) { |
126 if (vector[i] < minimum) | 117 if (vector[i] < minimum) |
127 minimum = vector[i]; | 118 minimum = vector[i]; |
128 } | 119 } |
129 return minimum; | 120 return minimum; |
130 } | 121 } |
131 | 122 |
132 // Minimum value of word32 vector. C version for generic platforms. | 123 // Minimum value of word32 vector. C version for generic platforms. |
133 int32_t WebRtcSpl_MinValueW32C(const int32_t* vector, size_t length) { | 124 int32_t WebRtcSpl_MinValueW32C(const int32_t* vector, size_t length) { |
134 int32_t minimum = WEBRTC_SPL_WORD32_MAX; | 125 int32_t minimum = WEBRTC_SPL_WORD32_MAX; |
135 size_t i = 0; | 126 size_t i = 0; |
136 | 127 |
137 if (vector == NULL || length == 0) { | 128 assert(length > 0); |
138 return minimum; | |
139 } | |
140 | 129 |
141 for (i = 0; i < length; i++) { | 130 for (i = 0; i < length; i++) { |
142 if (vector[i] < minimum) | 131 if (vector[i] < minimum) |
143 minimum = vector[i]; | 132 minimum = vector[i]; |
144 } | 133 } |
145 return minimum; | 134 return minimum; |
146 } | 135 } |
147 | 136 |
148 // Index of maximum absolute value in a word16 vector. | 137 // Index of maximum absolute value in a word16 vector. |
149 int WebRtcSpl_MaxAbsIndexW16(const int16_t* vector, size_t length) { | 138 size_t WebRtcSpl_MaxAbsIndexW16(const int16_t* vector, size_t length) { |
150 // Use type int for local variables, to accomodate the value of abs(-32768). | 139 // Use type int for local variables, to accomodate the value of abs(-32768). |
151 | 140 |
152 size_t i = 0, index = 0; | 141 size_t i = 0, index = 0; |
153 int absolute = 0, maximum = 0; | 142 int absolute = 0, maximum = 0; |
154 | 143 |
155 if (vector == NULL || length == 0) { | 144 assert(length > 0); |
156 return -1; | |
157 } | |
158 | 145 |
159 for (i = 0; i < length; i++) { | 146 for (i = 0; i < length; i++) { |
160 absolute = abs((int)vector[i]); | 147 absolute = abs((int)vector[i]); |
161 | 148 |
162 if (absolute > maximum) { | 149 if (absolute > maximum) { |
163 maximum = absolute; | 150 maximum = absolute; |
164 index = i; | 151 index = i; |
165 } | 152 } |
166 } | 153 } |
167 | 154 |
168 return (int)index; | 155 return index; |
169 } | 156 } |
170 | 157 |
171 // Index of maximum value in a word16 vector. | 158 // Index of maximum value in a word16 vector. |
172 int WebRtcSpl_MaxIndexW16(const int16_t* vector, size_t length) { | 159 size_t WebRtcSpl_MaxIndexW16(const int16_t* vector, size_t length) { |
173 size_t i = 0, index = 0; | 160 size_t i = 0, index = 0; |
174 int16_t maximum = WEBRTC_SPL_WORD16_MIN; | 161 int16_t maximum = WEBRTC_SPL_WORD16_MIN; |
175 | 162 |
176 if (vector == NULL || length == 0) { | 163 assert(length > 0); |
177 return -1; | |
178 } | |
179 | 164 |
180 for (i = 0; i < length; i++) { | 165 for (i = 0; i < length; i++) { |
181 if (vector[i] > maximum) { | 166 if (vector[i] > maximum) { |
182 maximum = vector[i]; | 167 maximum = vector[i]; |
183 index = i; | 168 index = i; |
184 } | 169 } |
185 } | 170 } |
186 | 171 |
187 return (int)index; | 172 return index; |
188 } | 173 } |
189 | 174 |
190 // Index of maximum value in a word32 vector. | 175 // Index of maximum value in a word32 vector. |
191 int WebRtcSpl_MaxIndexW32(const int32_t* vector, size_t length) { | 176 size_t WebRtcSpl_MaxIndexW32(const int32_t* vector, size_t length) { |
192 size_t i = 0, index = 0; | 177 size_t i = 0, index = 0; |
193 int32_t maximum = WEBRTC_SPL_WORD32_MIN; | 178 int32_t maximum = WEBRTC_SPL_WORD32_MIN; |
194 | 179 |
195 if (vector == NULL || length == 0) { | 180 assert(length > 0); |
196 return -1; | |
197 } | |
198 | 181 |
199 for (i = 0; i < length; i++) { | 182 for (i = 0; i < length; i++) { |
200 if (vector[i] > maximum) { | 183 if (vector[i] > maximum) { |
201 maximum = vector[i]; | 184 maximum = vector[i]; |
202 index = i; | 185 index = i; |
203 } | 186 } |
204 } | 187 } |
205 | 188 |
206 return (int)index; | 189 return index; |
207 } | 190 } |
208 | 191 |
209 // Index of minimum value in a word16 vector. | 192 // Index of minimum value in a word16 vector. |
210 int WebRtcSpl_MinIndexW16(const int16_t* vector, size_t length) { | 193 size_t WebRtcSpl_MinIndexW16(const int16_t* vector, size_t length) { |
211 size_t i = 0, index = 0; | 194 size_t i = 0, index = 0; |
212 int16_t minimum = WEBRTC_SPL_WORD16_MAX; | 195 int16_t minimum = WEBRTC_SPL_WORD16_MAX; |
213 | 196 |
214 if (vector == NULL || length == 0) { | 197 assert(length > 0); |
215 return -1; | |
216 } | |
217 | 198 |
218 for (i = 0; i < length; i++) { | 199 for (i = 0; i < length; i++) { |
219 if (vector[i] < minimum) { | 200 if (vector[i] < minimum) { |
220 minimum = vector[i]; | 201 minimum = vector[i]; |
221 index = i; | 202 index = i; |
222 } | 203 } |
223 } | 204 } |
224 | 205 |
225 return (int)index; | 206 return index; |
226 } | 207 } |
227 | 208 |
228 // Index of minimum value in a word32 vector. | 209 // Index of minimum value in a word32 vector. |
229 int WebRtcSpl_MinIndexW32(const int32_t* vector, size_t length) { | 210 size_t WebRtcSpl_MinIndexW32(const int32_t* vector, size_t length) { |
230 size_t i = 0, index = 0; | 211 size_t i = 0, index = 0; |
231 int32_t minimum = WEBRTC_SPL_WORD32_MAX; | 212 int32_t minimum = WEBRTC_SPL_WORD32_MAX; |
232 | 213 |
233 if (vector == NULL || length == 0) { | 214 assert(length > 0); |
234 return -1; | |
235 } | |
236 | 215 |
237 for (i = 0; i < length; i++) { | 216 for (i = 0; i < length; i++) { |
238 if (vector[i] < minimum) { | 217 if (vector[i] < minimum) { |
239 minimum = vector[i]; | 218 minimum = vector[i]; |
240 index = i; | 219 index = i; |
241 } | 220 } |
242 } | 221 } |
243 | 222 |
244 return (int)index; | 223 return index; |
245 } | 224 } |
OLD | NEW |