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 /*
13 * This file contains implementations of the iLBC specific functions
14 * WebRtcSpl_ScaleAndAddVectorsWithRound()
15 * WebRtcSpl_ReverseOrderMultArrayElements()
16 * WebRtcSpl_ElementwiseVectorMult()
17 * WebRtcSpl_AddVectorsAndShift()
18 * WebRtcSpl_AddAffineVectorToVector()
19 * WebRtcSpl_AffineTransformVector()
20 *
21 * The description header can be found in signal_processing_library.h
22 *
23 */
24
25 #include "signal_processing_library.h"
26
WebRtcSpl_ScaleAndAddVectorsWithRound(WebRtc_Word16 * vector1,WebRtc_Word16 scale1,WebRtc_Word16 * vector2,WebRtc_Word16 scale2,WebRtc_Word16 right_shifts,WebRtc_Word16 * out,WebRtc_Word16 vector_length)27 void WebRtcSpl_ScaleAndAddVectorsWithRound(WebRtc_Word16 *vector1, WebRtc_Word16 scale1,
28 WebRtc_Word16 *vector2, WebRtc_Word16 scale2,
29 WebRtc_Word16 right_shifts, WebRtc_Word16 *out,
30 WebRtc_Word16 vector_length)
31 {
32 int i;
33 WebRtc_Word16 roundVal;
34 roundVal = 1 << right_shifts;
35 roundVal = roundVal >> 1;
36 for (i = 0; i < vector_length; i++)
37 {
38 out[i] = (WebRtc_Word16)((WEBRTC_SPL_MUL_16_16(vector1[i], scale1)
39 + WEBRTC_SPL_MUL_16_16(vector2[i], scale2) + roundVal) >> right_shifts);
40 }
41 }
42
WebRtcSpl_ReverseOrderMultArrayElements(WebRtc_Word16 * out,G_CONST WebRtc_Word16 * in,G_CONST WebRtc_Word16 * win,WebRtc_Word16 vector_length,WebRtc_Word16 right_shifts)43 void WebRtcSpl_ReverseOrderMultArrayElements(WebRtc_Word16 *out, G_CONST WebRtc_Word16 *in,
44 G_CONST WebRtc_Word16 *win,
45 WebRtc_Word16 vector_length,
46 WebRtc_Word16 right_shifts)
47 {
48 int i;
49 WebRtc_Word16 *outptr = out;
50 G_CONST WebRtc_Word16 *inptr = in;
51 G_CONST WebRtc_Word16 *winptr = win;
52 for (i = 0; i < vector_length; i++)
53 {
54 (*outptr++) = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(*inptr++,
55 *winptr--, right_shifts);
56 }
57 }
58
WebRtcSpl_ElementwiseVectorMult(WebRtc_Word16 * out,G_CONST WebRtc_Word16 * in,G_CONST WebRtc_Word16 * win,WebRtc_Word16 vector_length,WebRtc_Word16 right_shifts)59 void WebRtcSpl_ElementwiseVectorMult(WebRtc_Word16 *out, G_CONST WebRtc_Word16 *in,
60 G_CONST WebRtc_Word16 *win, WebRtc_Word16 vector_length,
61 WebRtc_Word16 right_shifts)
62 {
63 int i;
64 WebRtc_Word16 *outptr = out;
65 G_CONST WebRtc_Word16 *inptr = in;
66 G_CONST WebRtc_Word16 *winptr = win;
67 for (i = 0; i < vector_length; i++)
68 {
69 (*outptr++) = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(*inptr++,
70 *winptr++, right_shifts);
71 }
72 }
73
WebRtcSpl_AddVectorsAndShift(WebRtc_Word16 * out,G_CONST WebRtc_Word16 * in1,G_CONST WebRtc_Word16 * in2,WebRtc_Word16 vector_length,WebRtc_Word16 right_shifts)74 void WebRtcSpl_AddVectorsAndShift(WebRtc_Word16 *out, G_CONST WebRtc_Word16 *in1,
75 G_CONST WebRtc_Word16 *in2, WebRtc_Word16 vector_length,
76 WebRtc_Word16 right_shifts)
77 {
78 int i;
79 WebRtc_Word16 *outptr = out;
80 G_CONST WebRtc_Word16 *in1ptr = in1;
81 G_CONST WebRtc_Word16 *in2ptr = in2;
82 for (i = vector_length; i > 0; i--)
83 {
84 (*outptr++) = (WebRtc_Word16)(((*in1ptr++) + (*in2ptr++)) >> right_shifts);
85 }
86 }
87
WebRtcSpl_AddAffineVectorToVector(WebRtc_Word16 * out,WebRtc_Word16 * in,WebRtc_Word16 gain,WebRtc_Word32 add_constant,WebRtc_Word16 right_shifts,int vector_length)88 void WebRtcSpl_AddAffineVectorToVector(WebRtc_Word16 *out, WebRtc_Word16 *in,
89 WebRtc_Word16 gain, WebRtc_Word32 add_constant,
90 WebRtc_Word16 right_shifts, int vector_length)
91 {
92 WebRtc_Word16 *inPtr;
93 WebRtc_Word16 *outPtr;
94 int i;
95
96 inPtr = in;
97 outPtr = out;
98 for (i = 0; i < vector_length; i++)
99 {
100 (*outPtr++) += (WebRtc_Word16)((WEBRTC_SPL_MUL_16_16((*inPtr++), gain)
101 + (WebRtc_Word32)add_constant) >> right_shifts);
102 }
103 }
104
WebRtcSpl_AffineTransformVector(WebRtc_Word16 * out,WebRtc_Word16 * in,WebRtc_Word16 gain,WebRtc_Word32 add_constant,WebRtc_Word16 right_shifts,int vector_length)105 void WebRtcSpl_AffineTransformVector(WebRtc_Word16 *out, WebRtc_Word16 *in,
106 WebRtc_Word16 gain, WebRtc_Word32 add_constant,
107 WebRtc_Word16 right_shifts, int vector_length)
108 {
109 WebRtc_Word16 *inPtr;
110 WebRtc_Word16 *outPtr;
111 int i;
112
113 inPtr = in;
114 outPtr = out;
115 for (i = 0; i < vector_length; i++)
116 {
117 (*outPtr++) = (WebRtc_Word16)((WEBRTC_SPL_MUL_16_16((*inPtr++), gain)
118 + (WebRtc_Word32)add_constant) >> right_shifts);
119 }
120 }
121