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 * This file contains the implementation of functions 13 * WebRtcSpl_MaxAbsValueW16() 14 * WebRtcSpl_MaxAbsIndexW16() 15 * WebRtcSpl_MaxAbsValueW32() 16 * WebRtcSpl_MaxValueW16() 17 * WebRtcSpl_MaxIndexW16() 18 * WebRtcSpl_MaxValueW32() 19 * WebRtcSpl_MaxIndexW32() 20 * WebRtcSpl_MinValueW16() 21 * WebRtcSpl_MinIndexW16() 22 * WebRtcSpl_MinValueW32() 23 * WebRtcSpl_MinIndexW32() 24 * 25 * The description header can be found in signal_processing_library.h. 26 * 27 */ 28 29 #include "signal_processing_library.h" 30 31 #if !(defined(WEBRTC_ANDROID) && defined(WEBRTC_ARCH_ARM_NEON)) 32 33 // Maximum absolute value of word16 vector. 34 WebRtc_Word16 WebRtcSpl_MaxAbsValueW16(const WebRtc_Word16 *vector, WebRtc_Word16 length) 35 { 36 WebRtc_Word32 tempMax = 0; 37 WebRtc_Word32 absVal; 38 WebRtc_Word16 totMax; 39 int i; 40 G_CONST WebRtc_Word16 *tmpvector = vector; 41 42 for (i = 0; i < length; i++) 43 { 44 absVal = WEBRTC_SPL_ABS_W32((*tmpvector)); 45 if (absVal > tempMax) 46 { 47 tempMax = absVal; 48 } 49 tmpvector++; 50 } 51 totMax = (WebRtc_Word16)WEBRTC_SPL_MIN(tempMax, WEBRTC_SPL_WORD16_MAX); 52 return totMax; 53 } 54 55 #endif 56 57 // Index of maximum absolute value in a word16 vector. 58 WebRtc_Word16 WebRtcSpl_MaxAbsIndexW16(G_CONST WebRtc_Word16* vector, WebRtc_Word16 length) 59 { 60 WebRtc_Word16 tempMax; 61 WebRtc_Word16 absTemp; 62 WebRtc_Word16 tempMaxIndex = 0; 63 WebRtc_Word16 i = 0; 64 G_CONST WebRtc_Word16 *tmpvector = vector; 65 66 tempMax = WEBRTC_SPL_ABS_W16(*tmpvector); 67 tmpvector++; 68 for (i = 1; i < length; i++) 69 { 70 absTemp = WEBRTC_SPL_ABS_W16(*tmpvector); 71 tmpvector++; 72 if (absTemp > tempMax) 73 { 74 tempMax = absTemp; 75 tempMaxIndex = i; 76 } 77 } 78 return tempMaxIndex; 79 } 80 81 // Maximum absolute value of word32 vector. 82 WebRtc_Word32 WebRtcSpl_MaxAbsValueW32(G_CONST WebRtc_Word32 *vector, WebRtc_Word16 length) 83 { 84 WebRtc_UWord32 tempMax = 0; 85 WebRtc_UWord32 absVal; 86 WebRtc_Word32 retval; 87 int i; 88 G_CONST WebRtc_Word32 *tmpvector = vector; 89 90 for (i = 0; i < length; i++) 91 { 92 absVal = WEBRTC_SPL_ABS_W32((*tmpvector)); 93 if (absVal > tempMax) 94 { 95 tempMax = absVal; 96 } 97 tmpvector++; 98 } 99 retval = (WebRtc_Word32)(WEBRTC_SPL_MIN(tempMax, WEBRTC_SPL_WORD32_MAX)); 100 return retval; 101 } 102 103 // Maximum value of word16 vector. 104 #ifndef XSCALE_OPT 105 WebRtc_Word16 WebRtcSpl_MaxValueW16(G_CONST WebRtc_Word16* vector, WebRtc_Word16 length) 106 { 107 WebRtc_Word16 tempMax; 108 WebRtc_Word16 i; 109 G_CONST WebRtc_Word16 *tmpvector = vector; 110 111 tempMax = *tmpvector++; 112 for (i = 1; i < length; i++) 113 { 114 if (*tmpvector++ > tempMax) 115 tempMax = vector[i]; 116 } 117 return tempMax; 118 } 119 #else 120 #pragma message(">> WebRtcSpl_MaxValueW16 is excluded from this build") 121 #endif 122 123 // Index of maximum value in a word16 vector. 124 WebRtc_Word16 WebRtcSpl_MaxIndexW16(G_CONST WebRtc_Word16 *vector, WebRtc_Word16 length) 125 { 126 WebRtc_Word16 tempMax; 127 WebRtc_Word16 tempMaxIndex = 0; 128 WebRtc_Word16 i = 0; 129 G_CONST WebRtc_Word16 *tmpvector = vector; 130 131 tempMax = *tmpvector++; 132 for (i = 1; i < length; i++) 133 { 134 if (*tmpvector++ > tempMax) 135 { 136 tempMax = vector[i]; 137 tempMaxIndex = i; 138 } 139 } 140 return tempMaxIndex; 141 } 142 143 // Maximum value of word32 vector. 144 #ifndef XSCALE_OPT 145 WebRtc_Word32 WebRtcSpl_MaxValueW32(G_CONST WebRtc_Word32* vector, WebRtc_Word16 length) 146 { 147 WebRtc_Word32 tempMax; 148 WebRtc_Word16 i; 149 G_CONST WebRtc_Word32 *tmpvector = vector; 150 151 tempMax = *tmpvector++; 152 for (i = 1; i < length; i++) 153 { 154 if (*tmpvector++ > tempMax) 155 tempMax = vector[i]; 156 } 157 return tempMax; 158 } 159 #else 160 #pragma message(">> WebRtcSpl_MaxValueW32 is excluded from this build") 161 #endif 162 163 // Index of maximum value in a word32 vector. 164 WebRtc_Word16 WebRtcSpl_MaxIndexW32(G_CONST WebRtc_Word32* vector, WebRtc_Word16 length) 165 { 166 WebRtc_Word32 tempMax; 167 WebRtc_Word16 tempMaxIndex = 0; 168 WebRtc_Word16 i = 0; 169 G_CONST WebRtc_Word32 *tmpvector = vector; 170 171 tempMax = *tmpvector++; 172 for (i = 1; i < length; i++) 173 { 174 if (*tmpvector++ > tempMax) 175 { 176 tempMax = vector[i]; 177 tempMaxIndex = i; 178 } 179 } 180 return tempMaxIndex; 181 } 182 183 // Minimum value of word16 vector. 184 WebRtc_Word16 WebRtcSpl_MinValueW16(G_CONST WebRtc_Word16 *vector, WebRtc_Word16 length) 185 { 186 WebRtc_Word16 tempMin; 187 WebRtc_Word16 i; 188 G_CONST WebRtc_Word16 *tmpvector = vector; 189 190 // Find the minimum value 191 tempMin = *tmpvector++; 192 for (i = 1; i < length; i++) 193 { 194 if (*tmpvector++ < tempMin) 195 tempMin = (vector[i]); 196 } 197 return tempMin; 198 } 199 200 // Index of minimum value in a word16 vector. 201 #ifndef XSCALE_OPT 202 WebRtc_Word16 WebRtcSpl_MinIndexW16(G_CONST WebRtc_Word16* vector, WebRtc_Word16 length) 203 { 204 WebRtc_Word16 tempMin; 205 WebRtc_Word16 tempMinIndex = 0; 206 WebRtc_Word16 i = 0; 207 G_CONST WebRtc_Word16* tmpvector = vector; 208 209 // Find index of smallest value 210 tempMin = *tmpvector++; 211 for (i = 1; i < length; i++) 212 { 213 if (*tmpvector++ < tempMin) 214 { 215 tempMin = vector[i]; 216 tempMinIndex = i; 217 } 218 } 219 return tempMinIndex; 220 } 221 #else 222 #pragma message(">> WebRtcSpl_MinIndexW16 is excluded from this build") 223 #endif 224 225 // Minimum value of word32 vector. 226 WebRtc_Word32 WebRtcSpl_MinValueW32(G_CONST WebRtc_Word32 *vector, WebRtc_Word16 length) 227 { 228 WebRtc_Word32 tempMin; 229 WebRtc_Word16 i; 230 G_CONST WebRtc_Word32 *tmpvector = vector; 231 232 // Find the minimum value 233 tempMin = *tmpvector++; 234 for (i = 1; i < length; i++) 235 { 236 if (*tmpvector++ < tempMin) 237 tempMin = (vector[i]); 238 } 239 return tempMin; 240 } 241 242 // Index of minimum value in a word32 vector. 243 #ifndef XSCALE_OPT 244 WebRtc_Word16 WebRtcSpl_MinIndexW32(G_CONST WebRtc_Word32* vector, WebRtc_Word16 length) 245 { 246 WebRtc_Word32 tempMin; 247 WebRtc_Word16 tempMinIndex = 0; 248 WebRtc_Word16 i = 0; 249 G_CONST WebRtc_Word32 *tmpvector = vector; 250 251 // Find index of smallest value 252 tempMin = *tmpvector++; 253 for (i = 1; i < length; i++) 254 { 255 if (*tmpvector++ < tempMin) 256 { 257 tempMin = vector[i]; 258 tempMinIndex = i; 259 } 260 } 261 return tempMinIndex; 262 } 263 #else 264 #pragma message(">> WebRtcSpl_MinIndexW32 is excluded from this build") 265 #endif 266