1e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*
2e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Copyright 2003-2010, VisualOn, Inc.
3e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
4e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Licensed under the Apache License, Version 2.0 (the "License");
5e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** you may not use this file except in compliance with the License.
6e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** You may obtain a copy of the License at
7e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
8e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **     http://www.apache.org/licenses/LICENSE-2.0
9e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
10e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Unless required by applicable law or agreed to in writing, software
11e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** distributed under the License is distributed on an "AS IS" BASIS,
12e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** See the License for the specific language governing permissions and
14e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** limitations under the License.
15e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard */
16e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
17e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/***********************************************************************
18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*      File: levinson.c                                                *
19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                      *
20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*      Description:LEVINSON-DURBIN algorithm in double precision       *
21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                      *
22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard************************************************************************/
23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*---------------------------------------------------------------------------*
24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *                         LEVINSON.C					     *
25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *---------------------------------------------------------------------------*
26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *                                                                           *
27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *      LEVINSON-DURBIN algorithm in double precision                        *
28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *                                                                           *
29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *                                                                           *
30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * Algorithm                                                                 *
31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *                                                                           *
32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *       R[i]    autocorrelations.                                           *
33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *       A[i]    filter coefficients.                                        *
34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *       K       reflection coefficients.                                    *
35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *       Alpha   prediction gain.                                            *
36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *                                                                           *
37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *       Initialization:                                                     *
38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *               A[0] = 1                                                    *
39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *               K    = -R[1]/R[0]                                           *
40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *               A[1] = K                                                    *
41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *               Alpha = R[0] * (1-K**2]                                     *
42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *                                                                           *
43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *       Do for  i = 2 to M                                                  *
44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *                                                                           *
45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *            S =  SUM ( R[j]*A[i-j] ,j=1,i-1 ) +  R[i]                      *
46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *                                                                           *
47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *            K = -S / Alpha                                                 *
48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *                                                                           *
49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *            An[j] = A[j] + K*A[i-j]   for j=1 to i-1                       *
50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *                                      where   An[i] = new A[i]             *
51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *            An[i]=K                                                        *
52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *                                                                           *
53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *            Alpha=Alpha * (1-K**2)                                         *
54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *                                                                           *
55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *       END                                                                 *
56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *                                                                           *
57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * Remarks on the dynamics of the calculations.                              *
58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *                                                                           *
59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *       The numbers used are in double precision in the following format :  *
60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *       A = AH <<16 + AL<<1.  AH and AL are 16 bit signed integers.         *
61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *       Since the LSB's also contain a sign bit, this format does not       *
62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *       correspond to standard 32 bit integers.  We use this format since   *
63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *       it allows fast execution of multiplications and divisions.          *
64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *                                                                           *
65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *       "DPF" will refer to this special format in the following text.      *
66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *       See oper_32b.c                                                      *
67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *                                                                           *
68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *       The R[i] were normalized in routine AUTO (hence, R[i] < 1.0).       *
69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *       The K[i] and Alpha are theoretically < 1.0.                         *
70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *       The A[i], for a sampling frequency of 8 kHz, are in practice        *
71e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *       always inferior to 16.0.                                            *
72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *                                                                           *
73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *       These characteristics allow straigthforward fixed-point             *
74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *       implementation.  We choose to represent the parameters as           *
75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *       follows :                                                           *
76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *                                                                           *
77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *               R[i]    Q31   +- .99..                                      *
78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *               K[i]    Q31   +- .99..                                      *
79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *               Alpha   Normalized -> mantissa in Q31 plus exponent         *
80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *               A[i]    Q27   +- 15.999..                                   *
81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *                                                                           *
82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *       The additions are performed in 32 bit.  For the summation used      *
83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *       to calculate the K[i], we multiply numbers in Q31 by numbers        *
84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *       in Q27, with the result of the multiplications in Q27,              *
85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *       resulting in a dynamic of +- 16.  This is sufficient to avoid       *
86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *       overflow, since the final result of the summation is                *
87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *       necessarily < 1.0 as both the K[i] and Alpha are                    *
88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *       theoretically < 1.0.                                                *
89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *___________________________________________________________________________*/
90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "typedef.h"
91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "basic_op.h"
92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "oper_32b.h"
93e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "acelp.h"
94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
95e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define M   16
96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define NC  (M/2)
97e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
98e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Init_Levinson(
99e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word16 * mem                          /* output  :static memory (18 words) */
100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		)
101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Set_zero(mem, 18);                     /* old_A[0..M-1] = 0, old_rc[0..1] = 0 */
103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return;
104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
107e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Levinson(
108e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word16 Rh[],                          /* (i)     : Rh[M+1] Vector of autocorrelations (msb) */
109e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word16 Rl[],                          /* (i)     : Rl[M+1] Vector of autocorrelations (lsb) */
110e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word16 A[],                           /* (o) Q12 : A[M]    LPC coefficients  (m = 16)       */
111e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word16 rc[],                          /* (o) Q15 : rc[M]   Reflection coefficients.         */
112e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word16 * mem                          /* (i/o)   :static memory (18 words)                  */
113e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	     )
114e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
115e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word32 i, j;
116e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 hi, lo;
117e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 Kh, Kl;                         /* reflection coefficient; hi and lo           */
118e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 alp_h, alp_l, alp_exp;          /* Prediction gain; hi lo and exponent         */
119e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 Ah[M + 1], Al[M + 1];           /* LPC coef. in double prec.                   */
120e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 Anh[M + 1], Anl[M + 1];         /* LPC coef.for next iteration in double prec. */
121e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word32 t0, t1, t2;                     /* temporary variable                          */
122e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 *old_A, *old_rc;
123e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
124e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* Last A(z) for case of unstable filter */
125b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	old_A = mem;
126b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	old_rc = mem + M;
127e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
128e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* K = A[1] = -R[1] / R[0] */
129e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
130e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	t1 = ((Rh[1] << 16) + (Rl[1] << 1));   /* R[1] in Q31 */
131e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	t2 = L_abs(t1);                        /* abs R[1]         */
132e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	t0 = Div_32(t2, Rh[0], Rl[0]);         /* R[1]/R[0] in Q31 */
133e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if (t1 > 0)
134e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		t0 = -t0;                          /* -R[1]/R[0]       */
135e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
136e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Kh = t0 >> 16;
137e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Kl = (t0 & 0xffff)>>1;
138b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	rc[0] = Kh;
139e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	t0 = (t0 >> 4);                        /* A[1] in Q27      */
140e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
141e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Ah[1] = t0 >> 16;
142e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Al[1] = (t0 & 0xffff)>>1;
143e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
144e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* Alpha = R[0] * (1-K**2) */
145e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	t0 = Mpy_32(Kh, Kl, Kh, Kl);           /* K*K      in Q31 */
146e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	t0 = L_abs(t0);                        /* Some case <0 !! */
147e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	t0 = vo_L_sub((Word32) 0x7fffffffL, t0);  /* 1 - K*K  in Q31 */
148e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
149e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	hi = t0 >> 16;
150e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	lo = (t0 & 0xffff)>>1;
151e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
152e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	t0 = Mpy_32(Rh[0], Rl[0], hi, lo);     /* Alpha in Q31    */
153e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
154e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* Normalize Alpha */
155e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	alp_exp = norm_l(t0);
156e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	t0 = (t0 << alp_exp);
157e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
158e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	alp_h = t0 >> 16;
159e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	alp_l = (t0 & 0xffff)>>1;
160e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/*--------------------------------------*
161e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * ITERATIONS  I=2 to M                 *
162e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *--------------------------------------*/
163e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for (i = 2; i <= M; i++)
164e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
165e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* t0 = SUM ( R[j]*A[i-j] ,j=1,i-1 ) +  R[i] */
166b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		t0 = 0;
167e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		for (j = 1; j < i; j++)
168e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			t0 = vo_L_add(t0, Mpy_32(Rh[j], Rl[j], Ah[i - j], Al[i - j]));
169e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
170e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		t0 = t0 << 4;                 /* result in Q27 -> convert to Q31 */
171e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* No overflow possible            */
172e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		t1 = ((Rh[i] << 16) + (Rl[i] << 1));
173e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		t0 = vo_L_add(t0, t1);                /* add R[i] in Q31                 */
174e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
175e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* K = -t0 / Alpha */
176e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		t1 = L_abs(t0);
177e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		t2 = Div_32(t1, alp_h, alp_l);     /* abs(t0)/Alpha                   */
178e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if (t0 > 0)
179e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			t2 = -t2;                   /* K =-t0/Alpha                    */
180e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		t2 = (t2 << alp_exp);           /* denormalize; compare to Alpha   */
181e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
182e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Kh = t2 >> 16;
183e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Kl = (t2 & 0xffff)>>1;
184e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
185b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		rc[i - 1] = Kh;
186e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* Test for unstable filter. If unstable keep old A(z) */
187e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if (abs_s(Kh) > 32750)
188e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
189e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			A[0] = 4096;                    /* Ai[0] not stored (always 1.0) */
190e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			for (j = 0; j < M; j++)
191e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
192b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard				A[j + 1] = old_A[j];
193e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
194e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			rc[0] = old_rc[0];             /* only two rc coefficients are needed */
195e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			rc[1] = old_rc[1];
196e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			return;
197e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
198e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/*------------------------------------------*
199e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *  Compute new LPC coeff. -> An[i]         *
200e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *  An[j]= A[j] + K*A[i-j]     , j=1 to i-1 *
201e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *  An[i]= K                                *
202e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *------------------------------------------*/
203e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		for (j = 1; j < i; j++)
204e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
205e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			t0 = Mpy_32(Kh, Kl, Ah[i - j], Al[i - j]);
206e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			t0 = vo_L_add(t0, ((Ah[j] << 16) + (Al[j] << 1)));
207e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Anh[j] = t0 >> 16;
208e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Anl[j] = (t0 & 0xffff)>>1;
209e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
210e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		t2 = (t2 >> 4);                 /* t2 = K in Q31 ->convert to Q27  */
211e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
212e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		VO_L_Extract(t2, &Anh[i], &Anl[i]);   /* An[i] in Q27                    */
213e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
214e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* Alpha = Alpha * (1-K**2) */
215e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		t0 = Mpy_32(Kh, Kl, Kh, Kl);               /* K*K      in Q31 */
216e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		t0 = L_abs(t0);                            /* Some case <0 !! */
217e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		t0 = vo_L_sub((Word32) 0x7fffffffL, t0);   /* 1 - K*K  in Q31 */
218e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		hi = t0 >> 16;
219e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		lo = (t0 & 0xffff)>>1;
220e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		t0 = Mpy_32(alp_h, alp_l, hi, lo); /* Alpha in Q31    */
221e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
222e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* Normalize Alpha */
223e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		j = norm_l(t0);
224e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		t0 = (t0 << j);
225e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		alp_h = t0 >> 16;
226e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		alp_l = (t0 & 0xffff)>>1;
227e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		alp_exp += j;         /* Add normalization to alp_exp */
228e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
229e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* A[j] = An[j] */
230e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		for (j = 1; j <= i; j++)
231e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
232b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			Ah[j] = Anh[j];
233b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			Al[j] = Anl[j];
234e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
235e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
236e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* Truncate A[i] in Q27 to Q12 with rounding */
237b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	A[0] = 4096;
238e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for (i = 1; i <= M; i++)
239e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
240e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		t0 = (Ah[i] << 16) + (Al[i] << 1);
241b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		old_A[i - 1] = A[i] = vo_round((t0 << 1));
242e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
243b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	old_rc[0] = rc[0];
244b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	old_rc[1] = rc[1];
245e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
246e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return;
247e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
248e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
249e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
250e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
251