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