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 * 215d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen* 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( 325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 wsp[], /* i: signal used to compute the open loop pitch*/ 33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* wsp[-pit_max] to wsp[-1] should be known */ 345d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Coder_State *st, /* i/o: codec global structure */ 355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 L_frame /* i: length of frame to compute pitch */ 365d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ) 37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 Tm; 395d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 hi, lo; 405d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 *ww, *we, *hp_wsp; 415d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 exp_R0, exp_R1, exp_R2; 425d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 i, j, max, R0, R1, R2; 435d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 *p1, *p2; 445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 L_min = 17; /* minimum pitch lag: PIT_MIN / OPL_DECIM */ 455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 L_max = 115; /* maximum pitch lag: PIT_MAX / OPL_DECIM */ 465d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 L_0 = st->old_T0_med; /* old open-loop pitch */ 475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 *gain = &(st->ol_gain); /* normalize correlation of hp_wsp for the lag */ 485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 *hp_wsp_mem = st->hp_wsp_mem; /* memory of the hypass filter for hp_wsp[] (lg = 9)*/ 495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 *old_hp_wsp = st->old_hp_wsp; /* hypass wsp[] */ 505d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 wght_flg = st->ol_wght_flg; /* is weighting function used */ 515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 525d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ww = &corrweight[198]; 535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen we = &corrweight[98 + L_max - L_0]; 545d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 555d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen max = MIN_32; 565d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Tm = 0; 575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = L_max; i > L_min; i--) 585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen /* Compute the correlation */ 605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R0 = 0; 615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen p1 = wsp; 625d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen p2 = &wsp[-i]; 635d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (j = 0; j < L_frame; j+=4) 645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R0 += vo_L_mult((*p1++), (*p2++)); 665d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R0 += vo_L_mult((*p1++), (*p2++)); 675d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R0 += vo_L_mult((*p1++), (*p2++)); 685d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R0 += vo_L_mult((*p1++), (*p2++)); 695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 705d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen /* Weighting of the correlation function. */ 715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen hi = R0>>16; 725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen lo = (R0 & 0xffff)>>1; 735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R0 = Mpy_32_16(hi, lo, *ww); 755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ww--; 765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if ((L_0 > 0) && (wght_flg > 0)) 785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen /* Weight the neighbourhood of the old lag. */ 805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen hi = R0>>16; 815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen lo = (R0 & 0xffff)>>1; 825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R0 = Mpy_32_16(hi, lo, *we); 835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen we--; 845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if(R0 >= max) 865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen max = R0; 885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Tm = i; 895d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen /* Hypass the wsp[] vector */ 935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen hp_wsp = old_hp_wsp + L_max; 945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Hp_wsp(wsp, hp_wsp, L_frame, hp_wsp_mem); 955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen /* Compute normalize correlation at delay Tm */ 975d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R0 = 0; 985d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R1 = 0; 995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R2 = 0; 1005d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen p1 = hp_wsp; 1015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen p2 = hp_wsp - Tm; 1025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (j = 0; j < L_frame; j+=4) 1035d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 1045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R2 += vo_mult32(*p1, *p1); 1055d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R1 += vo_mult32(*p2, *p2); 1065d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R0 += vo_mult32(*p1++, *p2++); 1075d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R2 += vo_mult32(*p1, *p1); 1085d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R1 += vo_mult32(*p2, *p2); 1095d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R0 += vo_mult32(*p1++, *p2++); 1105d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R2 += vo_mult32(*p1, *p1); 1115d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R1 += vo_mult32(*p2, *p2); 1125d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R0 += vo_mult32(*p1++, *p2++); 1135d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R2 += vo_mult32(*p1, *p1); 1145d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R1 += vo_mult32(*p2, *p2); 1155d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R0 += vo_mult32(*p1++, *p2++); 1165d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 1175d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R0 = R0 <<1; 1185d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R1 = (R1 <<1) + 1L; 1195d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R2 = (R2 <<1) + 1L; 1205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen /* gain = R0/ sqrt(R1*R2) */ 1215d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen exp_R0 = norm_l(R0); 1235d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R0 = (R0 << exp_R0); 1245d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1255d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen exp_R1 = norm_l(R1); 1265d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R1 = (R1 << exp_R1); 1275d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1285d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen exp_R2 = norm_l(R2); 1295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R2 = (R2 << exp_R2); 1305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 13258996b6fa078bde4b8a68891962b43383848c190Marco Nelissen R1 = vo_L_mult(voround(R1), voround(R2)); 1335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1345d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen i = norm_l(R1); 1355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R1 = (R1 << i); 1365d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen exp_R1 += exp_R2; 1385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen exp_R1 += i; 1395d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen exp_R1 = 62 - exp_R1; 1405d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1415d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Isqrt_n(&R1, &exp_R1); 1425d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1435d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen R0 = vo_L_mult(voround(R0), voround(R1)); 1445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen exp_R0 = 31 - exp_R0; 1455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen exp_R0 += exp_R1; 1465d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen *gain = vo_round(L_shl(R0, exp_R0)); 1485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen /* Shitf hp_wsp[] for next frame */ 1505d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < L_max; i++) 1525d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 1535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen old_hp_wsp[i] = old_hp_wsp[i + L_frame]; 1545d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 1555d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1565d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 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{ 1745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 x1, x2, x3, x4, x5; 1755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 tmp; 1765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen x1 = x[-2]; 1785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen x2 = x[-1]; 1795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen x3 = x[0]; 1805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen x4 = x[1]; 1815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen x5 = x[2]; 1825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (x2 < x1) 1845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 1855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen tmp = x1; 1865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen x1 = x2; 1875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen x2 = tmp; 1885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 1895d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (x3 < x1) 1905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 1915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen tmp = x1; 1925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen x1 = x3; 1935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen x3 = tmp; 1945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 1955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (x4 < x1) 1965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 1975d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen tmp = x1; 1985d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen x1 = x4; 1995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen x4 = tmp; 2005d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 2015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (x5 < x1) 2025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 2035d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen x5 = x1; 2045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 2055d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (x3 < x2) 2065d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 2075d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen tmp = x2; 2085d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen x2 = x3; 2095d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen x3 = tmp; 2105d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 2115d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (x4 < x2) 2125d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 2135d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen tmp = x2; 2145d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen x2 = x4; 2155d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen x4 = tmp; 2165d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 2175d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (x5 < x2) 2185d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 2195d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen x5 = x2; 2205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 2215d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (x4 < x3) 2225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 2235d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen x3 = x4; 2245d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 2255d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (x5 < x3) 2265d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 2275d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen x3 = x5; 2285d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 2295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return (x3); 230e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 231e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 232e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 233e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 Med_olag( /* output : median of 5 previous open-loop lags */ 2345d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 prev_ol_lag, /* input : previous open-loop lag */ 2355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 old_ol_lag[5] 2365d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ) 237e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 2385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 i; 239e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 2405d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen /* Use median of 5 previous open-loop lags as old lag */ 241e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 2425d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 4; i > 0; i--) 2435d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 2445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen old_ol_lag[i] = old_ol_lag[i - 1]; 2455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 246e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 2475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen old_ol_lag[0] = prev_ol_lag; 248e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 2495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen i = median5(&old_ol_lag[2]); 250e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 2515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return i; 252e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 253e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 254e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 255e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 256e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 257