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: p_med_ol.c * 19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Description: Compute the open loop pitch lag * 21b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard* output: open loop pitch lag * 22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard************************************************************************/ 23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "typedef.h" 25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "basic_op.h" 26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "acelp.h" 27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "oper_32b.h" 28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "math_op.h" 29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "p_med_ol.tab" 30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 31e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 Pitch_med_ol( 32b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard Word16 wsp[], /* i: signal used to compute the open loop pitch*/ 33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* wsp[-pit_max] to wsp[-1] should be known */ 34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Coder_State *st, /* i/o: codec global structure */ 35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 L_frame /* i: length of frame to compute pitch */ 36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ) 37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 Tm; 39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 hi, lo; 40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 *ww, *we, *hp_wsp; 41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 exp_R0, exp_R1, exp_R2; 42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 i, j, max, R0, R1, R2; 43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 *p1, *p2; 44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 L_min = 17; /* minimum pitch lag: PIT_MIN / OPL_DECIM */ 45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 L_max = 115; /* maximum pitch lag: PIT_MAX / OPL_DECIM */ 46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 L_0 = st->old_T0_med; /* old open-loop pitch */ 47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 *gain = &(st->ol_gain); /* normalize correlation of hp_wsp for the lag */ 48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 *hp_wsp_mem = st->hp_wsp_mem; /* memory of the hypass filter for hp_wsp[] (lg = 9)*/ 49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 *old_hp_wsp = st->old_hp_wsp; /* hypass wsp[] */ 50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 wght_flg = st->ol_wght_flg; /* is weighting function used */ 51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ww = &corrweight[198]; 53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard we = &corrweight[98 + L_max - L_0]; 54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 55b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard max = MIN_32; 56b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard Tm = 0; 57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = L_max; i > L_min; i--) 58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* Compute the correlation */ 60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard R0 = 0; 61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard p1 = wsp; 62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard p2 = &wsp[-i]; 63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (j = 0; j < L_frame; j+=4) 64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard R0 += vo_L_mult((*p1++), (*p2++)); 66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard R0 += vo_L_mult((*p1++), (*p2++)); 67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard R0 += vo_L_mult((*p1++), (*p2++)); 68b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard R0 += vo_L_mult((*p1++), (*p2++)); 69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* Weighting of the correlation function. */ 71e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hi = R0>>16; 72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard lo = (R0 & 0xffff)>>1; 73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard R0 = Mpy_32_16(hi, lo, *ww); 75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ww--; 76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if ((L_0 > 0) && (wght_flg > 0)) 78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* Weight the neighbourhood of the old lag. */ 80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hi = R0>>16; 81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard lo = (R0 & 0xffff)>>1; 82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard R0 = Mpy_32_16(hi, lo, *we); 83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard we--; 84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(R0 >= max) 86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard max = R0; 88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Tm = i; 89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* Hypass the wsp[] vector */ 93b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard hp_wsp = old_hp_wsp + L_max; 94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Hp_wsp(wsp, hp_wsp, L_frame, hp_wsp_mem); 95e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* Compute normalize correlation at delay Tm */ 97b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard R0 = 0; 98b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard R1 = 0; 99b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard R2 = 0; 100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard p1 = hp_wsp; 101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard p2 = hp_wsp - Tm; 102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (j = 0; j < L_frame; j+=4) 103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard R2 += vo_mult32(*p1, *p1); 105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard R1 += vo_mult32(*p2, *p2); 106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard R0 += vo_mult32(*p1++, *p2++); 107e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard R2 += vo_mult32(*p1, *p1); 108e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard R1 += vo_mult32(*p2, *p2); 109e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard R0 += vo_mult32(*p1++, *p2++); 110e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard R2 += vo_mult32(*p1, *p1); 111e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard R1 += vo_mult32(*p2, *p2); 112e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard R0 += vo_mult32(*p1++, *p2++); 113e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard R2 += vo_mult32(*p1, *p1); 114e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard R1 += vo_mult32(*p2, *p2); 115e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard R0 += vo_mult32(*p1++, *p2++); 116e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 117e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard R0 = R0 <<1; 118e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard R1 = (R1 <<1) + 1L; 119e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard R2 = (R2 <<1) + 1L; 120e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* gain = R0/ sqrt(R1*R2) */ 121e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 122e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard exp_R0 = norm_l(R0); 123e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard R0 = (R0 << exp_R0); 124e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 125e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard exp_R1 = norm_l(R1); 126e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard R1 = (R1 << exp_R1); 127e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 128e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard exp_R2 = norm_l(R2); 129e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard R2 = (R2 << exp_R2); 130e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 131e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 132e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard R1 = vo_L_mult(vo_round(R1), vo_round(R2)); 133e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 134e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard i = norm_l(R1); 135e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard R1 = (R1 << i); 136e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 137e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard exp_R1 += exp_R2; 138e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard exp_R1 += i; 139e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard exp_R1 = 62 - exp_R1; 140e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 141e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Isqrt_n(&R1, &exp_R1); 142e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 143e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard R0 = vo_L_mult(voround(R0), voround(R1)); 144e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard exp_R0 = 31 - exp_R0; 145e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard exp_R0 += exp_R1; 146e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 147e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *gain = vo_round(L_shl(R0, exp_R0)); 148e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 149e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* Shitf hp_wsp[] for next frame */ 150e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 151e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < L_max; i++) 152e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 153e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard old_hp_wsp[i] = old_hp_wsp[i + L_frame]; 154e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 155e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 156e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (Tm); 157e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 158e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 159e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/************************************************************************ 160e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Function: median5 * 161e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 162e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Returns the median of the set {X[-2], X[-1],..., X[2]}, * 163e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* whose elements are 16-bit integers. * 164e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 165e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Input: * 166e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* X[-2:2] 16-bit integers. * 167e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 168e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Return: * 169e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* The median of {X[-2], X[-1],..., X[2]}. * 170e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard************************************************************************/ 171e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 172e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 median5(Word16 x[]) 173e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 174e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 x1, x2, x3, x4, x5; 175e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 tmp; 176e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 177b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard x1 = x[-2]; 178b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard x2 = x[-1]; 179b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard x3 = x[0]; 180b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard x4 = x[1]; 181b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard x5 = x[2]; 182e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 183e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (x2 < x1) 184e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 185e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard tmp = x1; 186e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard x1 = x2; 187b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard x2 = tmp; 188e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 189e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (x3 < x1) 190e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 191e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard tmp = x1; 192e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard x1 = x3; 193b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard x3 = tmp; 194e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 195e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (x4 < x1) 196e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 197e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard tmp = x1; 198e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard x1 = x4; 199b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard x4 = tmp; 200e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 201e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (x5 < x1) 202e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 203b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard x5 = x1; 204e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 205e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (x3 < x2) 206e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 207e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard tmp = x2; 208e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard x2 = x3; 209b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard x3 = tmp; 210e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 211e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (x4 < x2) 212e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 213e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard tmp = x2; 214e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard x2 = x4; 215b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard x4 = tmp; 216e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 217e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (x5 < x2) 218e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 219b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard x5 = x2; 220e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 221e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (x4 < x3) 222e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 223b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard x3 = x4; 224e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 225e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (x5 < x3) 226e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 227b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard x3 = x5; 228e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 229e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (x3); 230e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 231e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 232e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 233e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 Med_olag( /* output : median of 5 previous open-loop lags */ 234e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 prev_ol_lag, /* input : previous open-loop lag */ 235e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 old_ol_lag[5] 236e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ) 237e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 238e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 i; 239e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 240e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* Use median of 5 previous open-loop lags as old lag */ 241e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 242e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 4; i > 0; i--) 243e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 244b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard old_ol_lag[i] = old_ol_lag[i - 1]; 245e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 246e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 247b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard old_ol_lag[0] = prev_ol_lag; 248e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 249e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard i = median5(&old_ol_lag[2]); 250e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 251e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return i; 252e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 253e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 254e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 255e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 256e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 257