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