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