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: isp_az.c * 19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Description:Compute the LPC coefficients from isp (order=M) * 21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard************************************************************************/ 23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "typedef.h" 25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "basic_op.h" 26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "oper_32b.h" 27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "cnst.h" 28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define NC (M/2) 30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define NC16k (M16k/2) 31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* local function */ 33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic void Get_isp_pol(Word16 * isp, Word32 * f, Word16 n); 35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic void Get_isp_pol_16kHz(Word16 * isp, Word32 * f, Word16 n); 36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Isp_Az( 38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 isp[], /* (i) Q15 : Immittance spectral pairs */ 39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 a[], /* (o) Q12 : predictor coefficients (order = M) */ 40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 m, 41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 adaptive_scaling /* (i) 0 : adaptive scaling disabled */ 42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* 1 : adaptive scaling enabled */ 43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ) 44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 45b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard Word32 i, j; 46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 hi, lo; 47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 f1[NC16k + 1], f2[NC16k]; 48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 nc; 49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 t0; 50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 q, q_sug; 51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 tmax; 52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard nc = (m >> 1); 54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(nc > 8) 55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Get_isp_pol_16kHz(&isp[0], f1, nc); 57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i <= nc; i++) 58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard f1[i] = f1[i] << 2; 60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } else 62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Get_isp_pol(&isp[0], f1, nc); 63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (nc > 8) 65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Get_isp_pol_16kHz(&isp[1], f2, (nc - 1)); 67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i <= nc - 1; i++) 68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard f2[i] = f2[i] << 2; 70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 71e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } else 72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Get_isp_pol(&isp[1], f2, (nc - 1)); 73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /*-----------------------------------------------------* 75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * Multiply F2(z) by (1 - z^-2) * 76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *-----------------------------------------------------*/ 77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = (nc - 1); i > 1; i--) 79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard f2[i] = vo_L_sub(f2[i], f2[i - 2]); /* f2[i] -= f2[i-2]; */ 81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /*----------------------------------------------------------* 84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * Scale F1(z) by (1+isp[m-1]) and F2(z) by (1-isp[m-1]) * 85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *----------------------------------------------------------*/ 86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < nc; i++) 88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* f1[i] *= (1.0 + isp[M-1]); */ 90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hi = f1[i] >> 16; 92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard lo = (f1[i] & 0xffff)>>1; 93e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard t0 = Mpy_32_16(hi, lo, isp[m - 1]); 95b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard f1[i] = vo_L_add(f1[i], t0); 96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 97e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* f2[i] *= (1.0 - isp[M-1]); */ 98e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 99e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hi = f2[i] >> 16; 100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard lo = (f2[i] & 0xffff)>>1; 101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard t0 = Mpy_32_16(hi, lo, isp[m - 1]); 102b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard f2[i] = vo_L_sub(f2[i], t0); 103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /*-----------------------------------------------------* 106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * A(z) = (F1(z)+F2(z))/2 * 107e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * F1(z) is symmetric and F2(z) is antisymmetric * 108e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *-----------------------------------------------------*/ 109e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 110e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* a[0] = 1.0; */ 111b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard a[0] = 4096; 112b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard tmax = 1; 113e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 1, j = m - 1; i < nc; i++, j--) 114e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 115e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* a[i] = 0.5*(f1[i] + f2[i]); */ 116e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 117e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard t0 = vo_L_add(f1[i], f2[i]); /* f1[i] + f2[i] */ 118b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard tmax |= L_abs(t0); 119e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard a[i] = (Word16)(vo_L_shr_r(t0, 12)); /* from Q23 to Q12 and * 0.5 */ 120e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 121e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* a[j] = 0.5*(f1[i] - f2[i]); */ 122e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 123e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard t0 = vo_L_sub(f1[i], f2[i]); /* f1[i] - f2[i] */ 124b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard tmax |= L_abs(t0); 125e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard a[j] = (Word16)(vo_L_shr_r(t0, 12)); /* from Q23 to Q12 and * 0.5 */ 126e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 127e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 128e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* rescale data if overflow has occured and reprocess the loop */ 129e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(adaptive_scaling == 1) 130e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard q = 4 - norm_l(tmax); /* adaptive scaling enabled */ 131e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 132e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard q = 0; /* adaptive scaling disabled */ 133e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 134e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (q > 0) 135e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 136e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard q_sug = (12 + q); 137e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 1, j = m - 1; i < nc; i++, j--) 138e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 139e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* a[i] = 0.5*(f1[i] + f2[i]); */ 140e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard t0 = vo_L_add(f1[i], f2[i]); /* f1[i] + f2[i] */ 141e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard a[i] = (Word16)(vo_L_shr_r(t0, q_sug)); /* from Q23 to Q12 and * 0.5 */ 142e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 143e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* a[j] = 0.5*(f1[i] - f2[i]); */ 144e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard t0 = vo_L_sub(f1[i], f2[i]); /* f1[i] - f2[i] */ 145e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard a[j] = (Word16)(vo_L_shr_r(t0, q_sug)); /* from Q23 to Q12 and * 0.5 */ 146e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 147b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard a[0] = shr(a[0], q); 148e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 149e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 150e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 151b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard q_sug = 12; 152b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard q = 0; 153e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 154e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* a[NC] = 0.5*f1[NC]*(1.0 + isp[M-1]); */ 155e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hi = f1[nc] >> 16; 156e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard lo = (f1[nc] & 0xffff)>>1; 157e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard t0 = Mpy_32_16(hi, lo, isp[m - 1]); 158e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard t0 = vo_L_add(f1[nc], t0); 159e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard a[nc] = (Word16)(L_shr_r(t0, q_sug)); /* from Q23 to Q12 and * 0.5 */ 160e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* a[m] = isp[m-1]; */ 161e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 162e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard a[m] = vo_shr_r(isp[m - 1], (3 + q)); /* from Q15 to Q12 */ 163e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return; 164e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 165e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 166e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*-----------------------------------------------------------* 167e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* procedure Get_isp_pol: * 168e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* ~~~~~~~~~~~ * 169e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Find the polynomial F1(z) or F2(z) from the ISPs. * 170e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* This is performed by expanding the product polynomials: * 171e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 172e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* F1(z) = product ( 1 - 2 isp_i z^-1 + z^-2 ) * 173e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* i=0,2,4,6,8 * 174e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* F2(z) = product ( 1 - 2 isp_i z^-1 + z^-2 ) * 175e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* i=1,3,5,7 * 176e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 177e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* where isp_i are the ISPs in the cosine domain. * 178e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*-----------------------------------------------------------* 179e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 180e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Parameters: * 181e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* isp[] : isp vector (cosine domaine) in Q15 * 182e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* f[] : the coefficients of F1 or F2 in Q23 * 183e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* n : == NC for F1(z); == NC-1 for F2(z) * 184e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*-----------------------------------------------------------*/ 185e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 186e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic void Get_isp_pol(Word16 * isp, Word32 * f, Word16 n) 187e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 188e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 hi, lo; 189e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 i, j, t0; 190e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* All computation in Q23 */ 191e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 192e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard f[0] = vo_L_mult(4096, 1024); /* f[0] = 1.0; in Q23 */ 193e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard f[1] = vo_L_mult(isp[0], -256); /* f[1] = -2.0*isp[0] in Q23 */ 194e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 195e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard f += 2; /* Advance f pointer */ 196e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard isp += 2; /* Advance isp pointer */ 197e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 2; i <= n; i++) 198e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 199b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard *f = f[-2]; 200e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (j = 1; j < i; j++, f--) 201e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 202e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hi = f[-1]>>16; 203e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard lo = (f[-1] & 0xffff)>>1; 204e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 205e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard t0 = Mpy_32_16(hi, lo, *isp); /* t0 = f[-1] * isp */ 206e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard t0 = t0 << 1; 207e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *f = vo_L_sub(*f, t0); /* *f -= t0 */ 208e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *f = vo_L_add(*f, f[-2]); /* *f += f[-2] */ 209e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 210e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *f -= (*isp << 9); /* *f -= isp<<8 */ 211e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard f += i; /* Advance f pointer */ 212e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard isp += 2; /* Advance isp pointer */ 213e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 214e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return; 215e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 216e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 217e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic void Get_isp_pol_16kHz(Word16 * isp, Word32 * f, Word16 n) 218e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 219e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 hi, lo; 220e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 i, j, t0; 221e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 222e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* All computation in Q23 */ 223e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard f[0] = L_mult(4096, 256); /* f[0] = 1.0; in Q23 */ 224e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard f[1] = L_mult(isp[0], -64); /* f[1] = -2.0*isp[0] in Q23 */ 225e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 226e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard f += 2; /* Advance f pointer */ 227e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard isp += 2; /* Advance isp pointer */ 228e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 229e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 2; i <= n; i++) 230e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 231b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard *f = f[-2]; 232e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (j = 1; j < i; j++, f--) 233e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 234e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VO_L_Extract(f[-1], &hi, &lo); 235e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard t0 = Mpy_32_16(hi, lo, *isp); /* t0 = f[-1] * isp */ 236e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard t0 = L_shl2(t0, 1); 237e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *f = L_sub(*f, t0); /* *f -= t0 */ 238e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *f = L_add(*f, f[-2]); /* *f += f[-2] */ 239e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 240e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *f = L_msu(*f, *isp, 64); /* *f -= isp<<8 */ 241e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard f += i; /* Advance f pointer */ 242e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard isp += 2; /* Advance isp pointer */ 243e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 244e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return; 245e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 246e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 247e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 248