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