1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * This file contains the resampling functions between 48, 44, 32 and 24 kHz.
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * The description headers can be found in signal_processing_library.h
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
18f24ac5923cbe5e806fac59a0d15e32567553ce8epbos@webrtc.org#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// interpolation coefficients
21c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgstatic const int16_t kCoefficients48To32[2][8] = {
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {778, -2050, 1087, 23285, 12903, -3783, 441, 222},
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {222, 441, -3783, 12903, 23285, 1087, -2050, 778}
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
26c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgstatic const int16_t kCoefficients32To24[3][8] = {
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {767, -2362, 2434, 24406, 10620, -3838, 721, 90},
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {386, -381, -2646, 19062, 19062, -2646, -381, 386},
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {90, 721, -3838, 10620, 24406, 2434, -2362, 767}
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
32c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgstatic const int16_t kCoefficients44To32[4][9] = {
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {117, -669, 2245, -6183, 26267, 13529, -3245, 845, -138},
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {-101, 612, -2283, 8532, 29790, -5138, 1789, -524, 91},
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {50, -292, 1016, -3064, 32010, 3933, -1147, 315, -53},
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {-156, 974, -3863, 18603, 21691, -6246, 2353, -712, 126}
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//   Resampling ratio: 2/3
40c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// input:  int32_t (normalized, not saturated) :: size 3 * K
41c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// output: int32_t (shifted 15 positions to the left, + offset 16384) :: size 2 * K
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      K: number of blocks
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
44c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_Resample48khzTo32khz(const int32_t *In, int32_t *Out,
45d10d6e1f2ca710f9c1d443ed5715985e41efb8dfpbos@webrtc.org                                    int32_t K)
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    /////////////////////////////////////////////////////////////
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Filter operation:
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Perform resampling (3 input samples -> 2 output samples);
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // process in sub blocks of size 3 samples.
52c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org    int32_t tmp;
53c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org    int32_t m;
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    for (m = 0; m < K; m++)
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp = 1 << 14;
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients48To32[0][0] * In[0];
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients48To32[0][1] * In[1];
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients48To32[0][2] * In[2];
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients48To32[0][3] * In[3];
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients48To32[0][4] * In[4];
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients48To32[0][5] * In[5];
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients48To32[0][6] * In[6];
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients48To32[0][7] * In[7];
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        Out[0] = tmp;
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp = 1 << 14;
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients48To32[1][0] * In[1];
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients48To32[1][1] * In[2];
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients48To32[1][2] * In[3];
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients48To32[1][3] * In[4];
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients48To32[1][4] * In[5];
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients48To32[1][5] * In[6];
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients48To32[1][6] * In[7];
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients48To32[1][7] * In[8];
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        Out[1] = tmp;
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // update pointers
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        In += 3;
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        Out += 2;
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//   Resampling ratio: 3/4
86c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// input:  int32_t (normalized, not saturated) :: size 4 * K
87c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// output: int32_t (shifted 15 positions to the left, + offset 16384) :: size 3 * K
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      K: number of blocks
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
90c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_Resample32khzTo24khz(const int32_t *In, int32_t *Out,
91d10d6e1f2ca710f9c1d443ed5715985e41efb8dfpbos@webrtc.org                                    int32_t K)
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    /////////////////////////////////////////////////////////////
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Filter operation:
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Perform resampling (4 input samples -> 3 output samples);
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // process in sub blocks of size 4 samples.
98c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org    int32_t m;
99c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org    int32_t tmp;
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    for (m = 0; m < K; m++)
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp = 1 << 14;
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients32To24[0][0] * In[0];
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients32To24[0][1] * In[1];
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients32To24[0][2] * In[2];
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients32To24[0][3] * In[3];
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients32To24[0][4] * In[4];
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients32To24[0][5] * In[5];
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients32To24[0][6] * In[6];
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients32To24[0][7] * In[7];
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        Out[0] = tmp;
113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp = 1 << 14;
115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients32To24[1][0] * In[1];
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients32To24[1][1] * In[2];
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients32To24[1][2] * In[3];
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients32To24[1][3] * In[4];
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients32To24[1][4] * In[5];
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients32To24[1][5] * In[6];
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients32To24[1][6] * In[7];
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients32To24[1][7] * In[8];
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        Out[1] = tmp;
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp = 1 << 14;
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients32To24[2][0] * In[2];
127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients32To24[2][1] * In[3];
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients32To24[2][2] * In[4];
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients32To24[2][3] * In[5];
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients32To24[2][4] * In[6];
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients32To24[2][5] * In[7];
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients32To24[2][6] * In[8];
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients32To24[2][7] * In[9];
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        Out[2] = tmp;
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // update pointers
137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        In += 4;
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        Out += 3;
139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// fractional resampling filters
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//   Fout = 11/16 * Fin
145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//   Fout =  8/11 * Fin
146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// compute two inner-products and store them to output array
149c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgstatic void WebRtcSpl_ResampDotProduct(const int32_t *in1, const int32_t *in2,
150c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                       const int16_t *coef_ptr, int32_t *out1,
151c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org                                       int32_t *out2)
152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
153c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org    int32_t tmp1 = 16384;
154c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org    int32_t tmp2 = 16384;
155c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org    int16_t coef;
156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    coef = coef_ptr[0];
158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    tmp1 += coef * in1[0];
159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    tmp2 += coef * in2[-0];
160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    coef = coef_ptr[1];
162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    tmp1 += coef * in1[1];
163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    tmp2 += coef * in2[-1];
164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    coef = coef_ptr[2];
166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    tmp1 += coef * in1[2];
167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    tmp2 += coef * in2[-2];
168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    coef = coef_ptr[3];
170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    tmp1 += coef * in1[3];
171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    tmp2 += coef * in2[-3];
172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    coef = coef_ptr[4];
174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    tmp1 += coef * in1[4];
175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    tmp2 += coef * in2[-4];
176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    coef = coef_ptr[5];
178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    tmp1 += coef * in1[5];
179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    tmp2 += coef * in2[-5];
180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    coef = coef_ptr[6];
182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    tmp1 += coef * in1[6];
183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    tmp2 += coef * in2[-6];
184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    coef = coef_ptr[7];
186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    tmp1 += coef * in1[7];
187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    tmp2 += coef * in2[-7];
188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    coef = coef_ptr[8];
190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    *out1 = tmp1 + coef * in1[8];
191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    *out2 = tmp2 + coef * in2[-8];
192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//   Resampling ratio: 8/11
195c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// input:  int32_t (normalized, not saturated) :: size 11 * K
196c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org// output: int32_t (shifted 15 positions to the left, + offset 16384) :: size  8 * K
197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//      K: number of blocks
198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
199c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.orgvoid WebRtcSpl_Resample44khzTo32khz(const int32_t *In, int32_t *Out,
200d10d6e1f2ca710f9c1d443ed5715985e41efb8dfpbos@webrtc.org                                    int32_t K)
201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    /////////////////////////////////////////////////////////////
203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Filter operation:
204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //
205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Perform resampling (11 input samples -> 8 output samples);
206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // process in sub blocks of size 11 samples.
207c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org    int32_t tmp;
208c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org    int32_t m;
209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    for (m = 0; m < K; m++)
211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp = 1 << 14;
213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // first output sample
215c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org        Out[0] = ((int32_t)In[3] << 15) + tmp;
216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // sum and accumulate filter coefficients and input samples
218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients44To32[3][0] * In[5];
219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients44To32[3][1] * In[6];
220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients44To32[3][2] * In[7];
221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients44To32[3][3] * In[8];
222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients44To32[3][4] * In[9];
223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients44To32[3][5] * In[10];
224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients44To32[3][6] * In[11];
225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients44To32[3][7] * In[12];
226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tmp += kCoefficients44To32[3][8] * In[13];
227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        Out[4] = tmp;
228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // sum and accumulate filter coefficients and input samples
230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WebRtcSpl_ResampDotProduct(&In[0], &In[17], kCoefficients44To32[0], &Out[1], &Out[7]);
231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // sum and accumulate filter coefficients and input samples
233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WebRtcSpl_ResampDotProduct(&In[2], &In[15], kCoefficients44To32[1], &Out[2], &Out[6]);
234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // sum and accumulate filter coefficients and input samples
236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        WebRtcSpl_ResampDotProduct(&In[3], &In[14], kCoefficients44To32[2], &Out[3], &Out[5]);
237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // update pointers
239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        In += 11;
240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        Out += 8;
241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
243