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