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.
WebRtcSpl_MaxAbsValueW16(const WebRtc_Word16 * vector,WebRtc_Word16 length)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.
WebRtcSpl_MaxAbsIndexW16(G_CONST WebRtc_Word16 * vector,WebRtc_Word16 length)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.
WebRtcSpl_MaxAbsValueW32(G_CONST WebRtc_Word32 * vector,WebRtc_Word16 length)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
WebRtcSpl_MaxValueW16(G_CONST WebRtc_Word16 * vector,WebRtc_Word16 length)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.
WebRtcSpl_MaxIndexW16(G_CONST WebRtc_Word16 * vector,WebRtc_Word16 length)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
WebRtcSpl_MaxValueW32(G_CONST WebRtc_Word32 * vector,WebRtc_Word16 length)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.
WebRtcSpl_MaxIndexW32(G_CONST WebRtc_Word32 * vector,WebRtc_Word16 length)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.
WebRtcSpl_MinValueW16(G_CONST WebRtc_Word16 * vector,WebRtc_Word16 length)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
WebRtcSpl_MinIndexW16(G_CONST WebRtc_Word16 * vector,WebRtc_Word16 length)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.
WebRtcSpl_MinValueW32(G_CONST WebRtc_Word32 * vector,WebRtc_Word16 length)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
WebRtcSpl_MinIndexW32(G_CONST WebRtc_Word32 * vector,WebRtc_Word16 length)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