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 /*
13  * This file contains implementations of the iLBC specific functions
14  * WebRtcSpl_ReverseOrderMultArrayElements()
15  * WebRtcSpl_ElementwiseVectorMult()
16  * WebRtcSpl_AddVectorsAndShift()
17  * WebRtcSpl_AddAffineVectorToVector()
18  * WebRtcSpl_AffineTransformVector()
19  *
20  */
21 
22 #include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
23 
WebRtcSpl_ReverseOrderMultArrayElements(int16_t * out,const int16_t * in,const int16_t * win,size_t vector_length,int16_t right_shifts)24 void WebRtcSpl_ReverseOrderMultArrayElements(int16_t *out, const int16_t *in,
25                                              const int16_t *win,
26                                              size_t vector_length,
27                                              int16_t right_shifts)
28 {
29     size_t i;
30     int16_t *outptr = out;
31     const int16_t *inptr = in;
32     const int16_t *winptr = win;
33     for (i = 0; i < vector_length; i++)
34     {
35       *outptr++ = (int16_t)((*inptr++ * *winptr--) >> right_shifts);
36     }
37 }
38 
WebRtcSpl_ElementwiseVectorMult(int16_t * out,const int16_t * in,const int16_t * win,size_t vector_length,int16_t right_shifts)39 void WebRtcSpl_ElementwiseVectorMult(int16_t *out, const int16_t *in,
40                                      const int16_t *win, size_t vector_length,
41                                      int16_t right_shifts)
42 {
43     size_t i;
44     int16_t *outptr = out;
45     const int16_t *inptr = in;
46     const int16_t *winptr = win;
47     for (i = 0; i < vector_length; i++)
48     {
49       *outptr++ = (int16_t)((*inptr++ * *winptr++) >> right_shifts);
50     }
51 }
52 
WebRtcSpl_AddVectorsAndShift(int16_t * out,const int16_t * in1,const int16_t * in2,size_t vector_length,int16_t right_shifts)53 void WebRtcSpl_AddVectorsAndShift(int16_t *out, const int16_t *in1,
54                                   const int16_t *in2, size_t vector_length,
55                                   int16_t right_shifts)
56 {
57     size_t i;
58     int16_t *outptr = out;
59     const int16_t *in1ptr = in1;
60     const int16_t *in2ptr = in2;
61     for (i = vector_length; i > 0; i--)
62     {
63         (*outptr++) = (int16_t)(((*in1ptr++) + (*in2ptr++)) >> right_shifts);
64     }
65 }
66 
WebRtcSpl_AddAffineVectorToVector(int16_t * out,int16_t * in,int16_t gain,int32_t add_constant,int16_t right_shifts,size_t vector_length)67 void WebRtcSpl_AddAffineVectorToVector(int16_t *out, int16_t *in,
68                                        int16_t gain, int32_t add_constant,
69                                        int16_t right_shifts,
70                                        size_t vector_length)
71 {
72     size_t i;
73 
74     for (i = 0; i < vector_length; i++)
75     {
76       out[i] += (int16_t)((in[i] * gain + add_constant) >> right_shifts);
77     }
78 }
79 
WebRtcSpl_AffineTransformVector(int16_t * out,int16_t * in,int16_t gain,int32_t add_constant,int16_t right_shifts,size_t vector_length)80 void WebRtcSpl_AffineTransformVector(int16_t *out, int16_t *in,
81                                      int16_t gain, int32_t add_constant,
82                                      int16_t right_shifts, size_t vector_length)
83 {
84     size_t i;
85 
86     for (i = 0; i < vector_length; i++)
87     {
88       out[i] = (int16_t)((in[i] * gain + add_constant) >> right_shifts);
89     }
90 }
91