/* * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ /* * This file contains the implementation of functions * WebRtcSpl_MaxAbsValueW16() * WebRtcSpl_MaxAbsIndexW16() * WebRtcSpl_MaxAbsValueW32() * WebRtcSpl_MaxValueW16() * WebRtcSpl_MaxIndexW16() * WebRtcSpl_MaxValueW32() * WebRtcSpl_MaxIndexW32() * WebRtcSpl_MinValueW16() * WebRtcSpl_MinIndexW16() * WebRtcSpl_MinValueW32() * WebRtcSpl_MinIndexW32() * * The description header can be found in signal_processing_library.h. * */ #include "signal_processing_library.h" #if !(defined(WEBRTC_ANDROID) && defined(WEBRTC_ARCH_ARM_NEON)) // Maximum absolute value of word16 vector. WebRtc_Word16 WebRtcSpl_MaxAbsValueW16(const WebRtc_Word16 *vector, WebRtc_Word16 length) { WebRtc_Word32 tempMax = 0; WebRtc_Word32 absVal; WebRtc_Word16 totMax; int i; G_CONST WebRtc_Word16 *tmpvector = vector; for (i = 0; i < length; i++) { absVal = WEBRTC_SPL_ABS_W32((*tmpvector)); if (absVal > tempMax) { tempMax = absVal; } tmpvector++; } totMax = (WebRtc_Word16)WEBRTC_SPL_MIN(tempMax, WEBRTC_SPL_WORD16_MAX); return totMax; } #endif // Index of maximum absolute value in a word16 vector. WebRtc_Word16 WebRtcSpl_MaxAbsIndexW16(G_CONST WebRtc_Word16* vector, WebRtc_Word16 length) { WebRtc_Word16 tempMax; WebRtc_Word16 absTemp; WebRtc_Word16 tempMaxIndex = 0; WebRtc_Word16 i = 0; G_CONST WebRtc_Word16 *tmpvector = vector; tempMax = WEBRTC_SPL_ABS_W16(*tmpvector); tmpvector++; for (i = 1; i < length; i++) { absTemp = WEBRTC_SPL_ABS_W16(*tmpvector); tmpvector++; if (absTemp > tempMax) { tempMax = absTemp; tempMaxIndex = i; } } return tempMaxIndex; } // Maximum absolute value of word32 vector. WebRtc_Word32 WebRtcSpl_MaxAbsValueW32(G_CONST WebRtc_Word32 *vector, WebRtc_Word16 length) { WebRtc_UWord32 tempMax = 0; WebRtc_UWord32 absVal; WebRtc_Word32 retval; int i; G_CONST WebRtc_Word32 *tmpvector = vector; for (i = 0; i < length; i++) { absVal = WEBRTC_SPL_ABS_W32((*tmpvector)); if (absVal > tempMax) { tempMax = absVal; } tmpvector++; } retval = (WebRtc_Word32)(WEBRTC_SPL_MIN(tempMax, WEBRTC_SPL_WORD32_MAX)); return retval; } // Maximum value of word16 vector. #ifndef XSCALE_OPT WebRtc_Word16 WebRtcSpl_MaxValueW16(G_CONST WebRtc_Word16* vector, WebRtc_Word16 length) { WebRtc_Word16 tempMax; WebRtc_Word16 i; G_CONST WebRtc_Word16 *tmpvector = vector; tempMax = *tmpvector++; for (i = 1; i < length; i++) { if (*tmpvector++ > tempMax) tempMax = vector[i]; } return tempMax; } #else #pragma message(">> WebRtcSpl_MaxValueW16 is excluded from this build") #endif // Index of maximum value in a word16 vector. WebRtc_Word16 WebRtcSpl_MaxIndexW16(G_CONST WebRtc_Word16 *vector, WebRtc_Word16 length) { WebRtc_Word16 tempMax; WebRtc_Word16 tempMaxIndex = 0; WebRtc_Word16 i = 0; G_CONST WebRtc_Word16 *tmpvector = vector; tempMax = *tmpvector++; for (i = 1; i < length; i++) { if (*tmpvector++ > tempMax) { tempMax = vector[i]; tempMaxIndex = i; } } return tempMaxIndex; } // Maximum value of word32 vector. #ifndef XSCALE_OPT WebRtc_Word32 WebRtcSpl_MaxValueW32(G_CONST WebRtc_Word32* vector, WebRtc_Word16 length) { WebRtc_Word32 tempMax; WebRtc_Word16 i; G_CONST WebRtc_Word32 *tmpvector = vector; tempMax = *tmpvector++; for (i = 1; i < length; i++) { if (*tmpvector++ > tempMax) tempMax = vector[i]; } return tempMax; } #else #pragma message(">> WebRtcSpl_MaxValueW32 is excluded from this build") #endif // Index of maximum value in a word32 vector. WebRtc_Word16 WebRtcSpl_MaxIndexW32(G_CONST WebRtc_Word32* vector, WebRtc_Word16 length) { WebRtc_Word32 tempMax; WebRtc_Word16 tempMaxIndex = 0; WebRtc_Word16 i = 0; G_CONST WebRtc_Word32 *tmpvector = vector; tempMax = *tmpvector++; for (i = 1; i < length; i++) { if (*tmpvector++ > tempMax) { tempMax = vector[i]; tempMaxIndex = i; } } return tempMaxIndex; } // Minimum value of word16 vector. WebRtc_Word16 WebRtcSpl_MinValueW16(G_CONST WebRtc_Word16 *vector, WebRtc_Word16 length) { WebRtc_Word16 tempMin; WebRtc_Word16 i; G_CONST WebRtc_Word16 *tmpvector = vector; // Find the minimum value tempMin = *tmpvector++; for (i = 1; i < length; i++) { if (*tmpvector++ < tempMin) tempMin = (vector[i]); } return tempMin; } // Index of minimum value in a word16 vector. #ifndef XSCALE_OPT WebRtc_Word16 WebRtcSpl_MinIndexW16(G_CONST WebRtc_Word16* vector, WebRtc_Word16 length) { WebRtc_Word16 tempMin; WebRtc_Word16 tempMinIndex = 0; WebRtc_Word16 i = 0; G_CONST WebRtc_Word16* tmpvector = vector; // Find index of smallest value tempMin = *tmpvector++; for (i = 1; i < length; i++) { if (*tmpvector++ < tempMin) { tempMin = vector[i]; tempMinIndex = i; } } return tempMinIndex; } #else #pragma message(">> WebRtcSpl_MinIndexW16 is excluded from this build") #endif // Minimum value of word32 vector. WebRtc_Word32 WebRtcSpl_MinValueW32(G_CONST WebRtc_Word32 *vector, WebRtc_Word16 length) { WebRtc_Word32 tempMin; WebRtc_Word16 i; G_CONST WebRtc_Word32 *tmpvector = vector; // Find the minimum value tempMin = *tmpvector++; for (i = 1; i < length; i++) { if (*tmpvector++ < tempMin) tempMin = (vector[i]); } return tempMin; } // Index of minimum value in a word32 vector. #ifndef XSCALE_OPT WebRtc_Word16 WebRtcSpl_MinIndexW32(G_CONST WebRtc_Word32* vector, WebRtc_Word16 length) { WebRtc_Word32 tempMin; WebRtc_Word16 tempMinIndex = 0; WebRtc_Word16 i = 0; G_CONST WebRtc_Word32 *tmpvector = vector; // Find index of smallest value tempMin = *tmpvector++; for (i = 1; i < length; i++) { if (*tmpvector++ < tempMin) { tempMin = vector[i]; tempMinIndex = i; } } return tempMinIndex; } #else #pragma message(">> WebRtcSpl_MinIndexW32 is excluded from this build") #endif