1885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/*********************************************************************** 2885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgCopyright (c) 2006-2011, Skype Limited. All rights reserved. 3885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgRedistribution and use in source and binary forms, with or without 4885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgmodification, are permitted provided that the following conditions 5885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgare met: 6885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org- Redistributions of source code must retain the above copyright notice, 7885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgthis list of conditions and the following disclaimer. 8885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org- Redistributions in binary form must reproduce the above copyright 9885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgnotice, this list of conditions and the following disclaimer in the 10885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgdocumentation and/or other materials provided with the distribution. 11e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org- Neither the name of Internet Society, IETF or IETF Trust, nor the 12885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgnames of specific contributors, may be used to endorse or promote 13885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgproducts derived from this software without specific prior written 14885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgpermission. 15e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 19885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgPOSSIBILITY OF SUCH DAMAGE. 26885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org***********************************************************************/ 27885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 28885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifdef HAVE_CONFIG_H 29885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "config.h" 30885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif 31885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 32885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include <stdlib.h> 33885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "main_FLP.h" 34885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 35885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/************************************************/ 36885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* LPC analysis filter */ 37885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* NB! State is kept internally and the */ 38885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* filter always starts with zero state */ 39885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* first Order output samples are set to zero */ 40885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/************************************************/ 41885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 42885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* 16th order LPC analysis filter, does not write first 16 samples */ 433c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.comstatic OPUS_INLINE void silk_LPC_analysis_filter16_FLP( 44885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_float r_LPC[], /* O LPC residual signal */ 45885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_float PredCoef[], /* I LPC coefficients */ 46885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_float s[], /* I Input signal */ 47885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int length /* I Length of input signal */ 48885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org) 49885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{ 50885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int ix; 51885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_float LPC_pred; 52885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_float *s_ptr; 53885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 54885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for( ix = 16; ix < length; ix++ ) { 55885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr = &s[ix - 1]; 56885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 57885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org /* short-term prediction */ 58885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org LPC_pred = s_ptr[ 0 ] * PredCoef[ 0 ] + 59885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -1 ] * PredCoef[ 1 ] + 60885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -2 ] * PredCoef[ 2 ] + 61885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -3 ] * PredCoef[ 3 ] + 62885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -4 ] * PredCoef[ 4 ] + 63885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -5 ] * PredCoef[ 5 ] + 64885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -6 ] * PredCoef[ 6 ] + 65885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -7 ] * PredCoef[ 7 ] + 66885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -8 ] * PredCoef[ 8 ] + 67885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -9 ] * PredCoef[ 9 ] + 68885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -10 ] * PredCoef[ 10 ] + 69885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -11 ] * PredCoef[ 11 ] + 70885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -12 ] * PredCoef[ 12 ] + 71885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -13 ] * PredCoef[ 13 ] + 72885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -14 ] * PredCoef[ 14 ] + 73885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -15 ] * PredCoef[ 15 ]; 74885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 75885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org /* prediction error */ 76885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org r_LPC[ix] = s_ptr[ 1 ] - LPC_pred; 77885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 78885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org} 79885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 80885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* 12th order LPC analysis filter, does not write first 12 samples */ 813c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.comstatic OPUS_INLINE void silk_LPC_analysis_filter12_FLP( 82885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_float r_LPC[], /* O LPC residual signal */ 83885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_float PredCoef[], /* I LPC coefficients */ 84885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_float s[], /* I Input signal */ 85885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int length /* I Length of input signal */ 86885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org) 87885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{ 88885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int ix; 89885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_float LPC_pred; 90885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_float *s_ptr; 91885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 92885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for( ix = 12; ix < length; ix++ ) { 93885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr = &s[ix - 1]; 94885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 95885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org /* short-term prediction */ 96885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org LPC_pred = s_ptr[ 0 ] * PredCoef[ 0 ] + 97885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -1 ] * PredCoef[ 1 ] + 98885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -2 ] * PredCoef[ 2 ] + 99885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -3 ] * PredCoef[ 3 ] + 100885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -4 ] * PredCoef[ 4 ] + 101885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -5 ] * PredCoef[ 5 ] + 102885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -6 ] * PredCoef[ 6 ] + 103885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -7 ] * PredCoef[ 7 ] + 104885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -8 ] * PredCoef[ 8 ] + 105885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -9 ] * PredCoef[ 9 ] + 106885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -10 ] * PredCoef[ 10 ] + 107885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -11 ] * PredCoef[ 11 ]; 108885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 109885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org /* prediction error */ 110885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org r_LPC[ix] = s_ptr[ 1 ] - LPC_pred; 111885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 112885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org} 113885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 114885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* 10th order LPC analysis filter, does not write first 10 samples */ 1153c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.comstatic OPUS_INLINE void silk_LPC_analysis_filter10_FLP( 116885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_float r_LPC[], /* O LPC residual signal */ 117885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_float PredCoef[], /* I LPC coefficients */ 118885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_float s[], /* I Input signal */ 119885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int length /* I Length of input signal */ 120885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org) 121885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{ 122885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int ix; 123885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_float LPC_pred; 124885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_float *s_ptr; 125885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 126885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for( ix = 10; ix < length; ix++ ) { 127885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr = &s[ix - 1]; 128885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 129885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org /* short-term prediction */ 130885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org LPC_pred = s_ptr[ 0 ] * PredCoef[ 0 ] + 131885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -1 ] * PredCoef[ 1 ] + 132885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -2 ] * PredCoef[ 2 ] + 133885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -3 ] * PredCoef[ 3 ] + 134885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -4 ] * PredCoef[ 4 ] + 135885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -5 ] * PredCoef[ 5 ] + 136885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -6 ] * PredCoef[ 6 ] + 137885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -7 ] * PredCoef[ 7 ] + 138885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -8 ] * PredCoef[ 8 ] + 139885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -9 ] * PredCoef[ 9 ]; 140885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 141885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org /* prediction error */ 142885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org r_LPC[ix] = s_ptr[ 1 ] - LPC_pred; 143885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 144885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org} 145885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 146885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* 8th order LPC analysis filter, does not write first 8 samples */ 1473c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.comstatic OPUS_INLINE void silk_LPC_analysis_filter8_FLP( 148885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_float r_LPC[], /* O LPC residual signal */ 149885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_float PredCoef[], /* I LPC coefficients */ 150885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_float s[], /* I Input signal */ 151885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int length /* I Length of input signal */ 152885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org) 153885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{ 154885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int ix; 155885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_float LPC_pred; 156885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_float *s_ptr; 157885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 158885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for( ix = 8; ix < length; ix++ ) { 159885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr = &s[ix - 1]; 160885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 161885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org /* short-term prediction */ 162885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org LPC_pred = s_ptr[ 0 ] * PredCoef[ 0 ] + 163885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -1 ] * PredCoef[ 1 ] + 164885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -2 ] * PredCoef[ 2 ] + 165885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -3 ] * PredCoef[ 3 ] + 166885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -4 ] * PredCoef[ 4 ] + 167885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -5 ] * PredCoef[ 5 ] + 168885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -6 ] * PredCoef[ 6 ] + 169885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -7 ] * PredCoef[ 7 ]; 170885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 171885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org /* prediction error */ 172885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org r_LPC[ix] = s_ptr[ 1 ] - LPC_pred; 173885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 174885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org} 175885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 176885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* 6th order LPC analysis filter, does not write first 6 samples */ 1773c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.comstatic OPUS_INLINE void silk_LPC_analysis_filter6_FLP( 178885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_float r_LPC[], /* O LPC residual signal */ 179885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_float PredCoef[], /* I LPC coefficients */ 180885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_float s[], /* I Input signal */ 181885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int length /* I Length of input signal */ 182885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org) 183885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{ 184885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int ix; 185885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_float LPC_pred; 186885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_float *s_ptr; 187885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 188885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for( ix = 6; ix < length; ix++ ) { 189885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr = &s[ix - 1]; 190885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 191885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org /* short-term prediction */ 192885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org LPC_pred = s_ptr[ 0 ] * PredCoef[ 0 ] + 193885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -1 ] * PredCoef[ 1 ] + 194885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -2 ] * PredCoef[ 2 ] + 195885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -3 ] * PredCoef[ 3 ] + 196885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -4 ] * PredCoef[ 4 ] + 197885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org s_ptr[ -5 ] * PredCoef[ 5 ]; 198885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 199885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org /* prediction error */ 200885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org r_LPC[ix] = s_ptr[ 1 ] - LPC_pred; 201885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 202885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org} 203885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 204885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/************************************************/ 205885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* LPC analysis filter */ 206885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* NB! State is kept internally and the */ 207885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* filter always starts with zero state */ 208885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* first Order output samples are set to zero */ 209885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/************************************************/ 210885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_LPC_analysis_filter_FLP( 211885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_float r_LPC[], /* O LPC residual signal */ 212885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_float PredCoef[], /* I LPC coefficients */ 213885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_float s[], /* I Input signal */ 214885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int length, /* I Length of input signal */ 215885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int Order /* I LPC order */ 216885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org) 217885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{ 218885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_assert( Order <= length ); 219885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 220885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org switch( Order ) { 221885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org case 6: 222885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_LPC_analysis_filter6_FLP( r_LPC, PredCoef, s, length ); 223885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org break; 224885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 225885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org case 8: 226885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_LPC_analysis_filter8_FLP( r_LPC, PredCoef, s, length ); 227885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org break; 228885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 229885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org case 10: 230885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_LPC_analysis_filter10_FLP( r_LPC, PredCoef, s, length ); 231885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org break; 232885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 233885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org case 12: 234885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_LPC_analysis_filter12_FLP( r_LPC, PredCoef, s, length ); 235885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org break; 236885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 237885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org case 16: 238885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_LPC_analysis_filter16_FLP( r_LPC, PredCoef, s, length ); 239885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org break; 240885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 241885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org default: 242885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_assert( 0 ); 243885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org break; 244885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 245885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 246885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org /* Set first Order output samples to zero */ 247885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_memset( r_LPC, 0, Order * sizeof( silk_float ) ); 248885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org} 249885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 250