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 function WebRtcSpl_FilterAR(). 14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * The description header 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 2045a3434299d78b2084a2d765c51c76c165b410cepbos@webrtc.orgint WebRtcSpl_FilterAR(const int16_t* a, 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int a_length, 2245a3434299d78b2084a2d765c51c76c165b410cepbos@webrtc.org const int16_t* x, 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int x_length, 24c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org int16_t* state, 25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int state_length, 26c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org int16_t* state_low, 27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int state_low_length, 28c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org int16_t* filtered, 29c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org int16_t* filtered_low, 30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int filtered_low_length) 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 32c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org int32_t o; 33c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org int32_t oLOW; 34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int i, j, stop; 3545a3434299d78b2084a2d765c51c76c165b410cepbos@webrtc.org const int16_t* x_ptr = &x[0]; 36c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org int16_t* filteredFINAL_ptr = filtered; 37c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org int16_t* filteredFINAL_LOW_ptr = filtered_low; 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (i = 0; i < x_length; i++) 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Calculate filtered[i] and filtered_low[i] 4245a3434299d78b2084a2d765c51c76c165b410cepbos@webrtc.org const int16_t* a_ptr = &a[1]; 43c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org int16_t* filtered_ptr = &filtered[i - 1]; 44c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org int16_t* filtered_low_ptr = &filtered_low[i - 1]; 45c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org int16_t* state_ptr = &state[state_length - 1]; 46c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org int16_t* state_low_ptr = &state_low[state_length - 1]; 47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 48c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org o = (int32_t)(*x_ptr++) << 12; 49c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org oLOW = (int32_t)0; 50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org stop = (i < a_length) ? i + 1 : a_length; 52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (j = 1; j < stop; j++) 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org o -= WEBRTC_SPL_MUL_16_16(*a_ptr, *filtered_ptr--); 55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org oLOW -= WEBRTC_SPL_MUL_16_16(*a_ptr++, *filtered_low_ptr--); 56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (j = i + 1; j < a_length; j++) 58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org o -= WEBRTC_SPL_MUL_16_16(*a_ptr, *state_ptr--); 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org oLOW -= WEBRTC_SPL_MUL_16_16(*a_ptr++, *state_low_ptr--); 61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org o += (oLOW >> 12); 64c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org *filteredFINAL_ptr = (int16_t)((o + (int32_t)2048) >> 12); 65c49ec1327c1d956c6c889cf1f32a7f9920d76149pbos@webrtc.org *filteredFINAL_LOW_ptr++ = (int16_t)(o - ((int32_t)(*filteredFINAL_ptr++) 66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org << 12)); 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Save the filter state 70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (x_length >= state_length) 71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WebRtcSpl_CopyFromEndW16(filtered, x_length, a_length - 1, state); 73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WebRtcSpl_CopyFromEndW16(filtered_low, x_length, a_length - 1, state_low); 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } else 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (i = 0; i < state_length - x_length; i++) 77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org state[i] = state[i + x_length]; 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org state_low[i] = state_low[i + x_length]; 80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (i = 0; i < x_length; i++) 82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org state[state_length - x_length + i] = filtered[i]; 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org state[state_length - x_length + i] = filtered_low[i]; 85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return x_length; 89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 90