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