vad1.cpp revision 4f1efc098cb5791c3e9f483f2af84aef70d2d0a0
14f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/* ------------------------------------------------------------------
24f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Copyright (C) 1998-2009 PacketVideo
34f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *
44f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
54f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * you may not use this file except in compliance with the License.
64f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * You may obtain a copy of the License at
74f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *
84f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
94f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *
104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Unless required by applicable law or agreed to in writing, software
114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * express or implied.
144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * See the License for the specific language governing permissions
154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * and limitations under the License.
164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * -------------------------------------------------------------------
174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber */
184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/****************************************************************************************
194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas HuberPortions of this file are derived from the following 3GPP standard:
204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    3GPP TS 26.073
224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Available from http://www.3gpp.org
244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas HuberPermission to distribute, modify and use this file under the standard license
274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberterms listed above has been obtained from the copyright holder.
284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber****************************************************************************************/
294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Pathname: ./audio/gsm-amr/c/src/vad1.c
314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Functions:
324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REVISION HISTORY
354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Description: Updated template used to PV coding template.
374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Changed to accept the pOverflow flag for EPOC compatibility.
384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Description: Made changes per review comments
404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber (1) Removed include of "count.h"
414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber (2) Replaced "basic_op.h" with individual include files
424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber (3) Removed some unnecessary instances of sub().
434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Description:  Replaced OSCL mem type functions and eliminated include
454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               files that now are chosen by OSCL definitions
464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Description:  Replaced "int" and/or "char" with OSCL defined types.
484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Description: Changed round function name to pv_round to avoid conflict with
504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              round function in C standard library.
514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Who:                           Date:
534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Description:
544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber MODULE DESCRIPTION
574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*----------------------------------------------------------------------------
634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; INCLUDES
644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber----------------------------------------------------------------------------*/
654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include <stdlib.h>
674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include <string.h>
684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "vad.h"
704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "typedef.h"
714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "shr.h"
724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "basic_op.h"
734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "cnst_vad.h"
744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*----------------------------------------------------------------------------
764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; MACROS
774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; Define module specific macros here
784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber----------------------------------------------------------------------------*/
794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*----------------------------------------------------------------------------
814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; DEFINES
824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; Include all pre-processor statements here. Include conditional
834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; compile variables also.
844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber----------------------------------------------------------------------------*/
854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*----------------------------------------------------------------------------
874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; LOCAL FUNCTION DEFINITIONS
884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; Function Prototype declaration
894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber----------------------------------------------------------------------------*/
904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*----------------------------------------------------------------------------
924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; LOCAL VARIABLE DEFINITIONS
934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; Variable declaration - defined here and used outside this module
944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber----------------------------------------------------------------------------*/
954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: first_filter_stage
994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
1004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
1014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
1034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    data -- array of type Word16 -- filter memory
1044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    in   -- array of type Word16 -- input signal
1054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
1074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    data -- array of type Word16 -- filter memory
1084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    out  -- array of type Word16 -- output values, every other
1094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                    output is low-pass part and
1104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                    other is high-pass part every
1114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicator
1134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
1154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
1164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
1184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
1194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
1214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
1224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
1244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
1254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Purpose      : Scale input down by one bit. Calculate 5th order
1274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                half-band lowpass/highpass filter pair with
1284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                decimation.
1294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
1304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
1314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
1334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
1354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
1364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
1384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
1404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
1414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
1444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
1454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
1474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
1484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
1504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
1524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
1544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
1554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
1564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
1574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
1584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
1604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
1614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
1624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
1644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
1654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberstatic void first_filter_stage(
1674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 in[],      /* i   : input signal                  */
1684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 out[],     /* o   : output values, every other    */
1694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*       output is low-pass part and   */
1704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*       other is high-pass part every */
1714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 data[],    /* i/o : filter memory                 */
1724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Flag  *pOverflow  /* o : Flag set when overflow occurs   */
1734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber)
1744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
1754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 temp0;
1764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 temp1;
1774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 temp2;
1784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 temp3;
1794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 i;
1804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 data0;
1814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 data1;
1824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    data0 = data[0];
1844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    data1 = data[1];
1854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = 0; i < FRAME_LEN / 4; i++)
1874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
1884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp0 = mult(COEFF5_1, data0, pOverflow);
1894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp1 = shr(in[4*i+0], 2, pOverflow);
1904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp0 = sub(temp1, temp0, pOverflow);
1914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp1 = mult(COEFF5_1, temp0, pOverflow);
1934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp1 = add(data0, temp1, pOverflow);
1944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp3 = mult(COEFF5_2, data1, pOverflow);
1964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp2 = shr(in[4*i+1], 2, pOverflow);
1974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp3 = sub(temp2, temp3, pOverflow);
1994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp2 = mult(COEFF5_2, temp3, pOverflow);
2014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp2 = add(data1, temp2, pOverflow);
2024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        out[4*i+0] = add(temp1, temp2, pOverflow);
2044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        out[4*i+1] = sub(temp1, temp2, pOverflow);
2054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp1 = mult(COEFF5_1, temp0, pOverflow);
2074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp2 = shr(in[4*i+2], 2, pOverflow);
2084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        data0 = sub(temp2, temp1, pOverflow);
2094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp1 = mult(COEFF5_1, data0, pOverflow);
2114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp1 = add(temp0, temp1, pOverflow);
2124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        data1 = mult(COEFF5_2, temp3, pOverflow);
2144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp2 = shr(in[4*i+3], 2, pOverflow);
2154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        data1 = sub(temp2, data1, pOverflow);
2164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp2 = mult(COEFF5_2, data1, pOverflow);
2184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp2 = add(temp3, temp2, pOverflow);
2194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        out[4*i+2] = add(temp1, temp2, pOverflow);
2214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        out[4*i+3] = sub(temp1, temp2, pOverflow);
2224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
2234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    data[0] = data0;
2254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    data[1] = data1;
2264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
2274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
2304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
2314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: filter5
2324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
2334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
2344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
2364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    in0 -- array of type Word16 -- input values; output low-pass part
2374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    in1 -- array of type Word16 -- input values; output high-pass part
2384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    data -- array of type Word16 -- updated filter memory
2394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
2414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    in0 -- array of type Word16 -- input values; output low-pass part
2424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    in1 -- array of type Word16 -- input values; output high-pass part
2434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    data -- array of type Word16 -- updated filter memory
2444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicator
2454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
2474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
2484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
2504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
2514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
2534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
2544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
2564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
2574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Purpose      : Fifth-order half-band lowpass/highpass filter pair with
2594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                decimation.
2604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
2614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
2624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
2644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
2664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
2674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
2694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
2714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
2724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
2754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
2764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
2784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
2794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
2814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
2834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
2854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
2864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
2874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
2884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
2894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
2914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
2924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
2934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
2954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
2964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberstatic void filter5(Word16 *in0,    /* i/o : input values; output low-pass part  */
2984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    Word16 *in1,    /* i/o : input values; output high-pass part */
2994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    Word16 data[],  /* i/o : updated filter memory               */
3004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    Flag  *pOverflow  /* o : Flag set when overflow occurs       */
3014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                   )
3024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
3034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 temp0;
3044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 temp1;
3054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 temp2;
3064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    temp0 = mult(COEFF5_1, data[0], pOverflow);
3084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    temp0 = sub(*in0, temp0, pOverflow);
3094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    temp1 = mult(COEFF5_1, temp0, pOverflow);
3114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    temp1 = add(data[0], temp1, pOverflow);
3124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    data[0] = temp0;
3134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    temp0 = mult(COEFF5_2, data[1], pOverflow);
3154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    temp0 = sub(*in1, temp0, pOverflow);
3164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    temp2 = mult(COEFF5_2, temp0, pOverflow);
3184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    temp2 = add(data[1], temp2, pOverflow);
3194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    data[1] = temp0;
3214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    temp0 = add(temp1, temp2, pOverflow);
3234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    *in0 = shr(temp0, 1, pOverflow);
3244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    temp0 = sub(temp1, temp2, pOverflow);
3264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    *in1 = shr(temp0, 1, pOverflow);
3274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
3284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
3334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
3344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: filter3
3354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
3364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
3374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
3404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    in0 -- array of type Word16 -- input values; output low-pass part
3414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    in1 -- array of type Word16 -- input values; output high-pass part
3424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    data -- array of type Word16 -- updated filter memory
3434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
3454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    in0 -- array of type Word16 -- input values; output low-pass part
3464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    in1 -- array of type Word16 -- input values; output high-pass part
3474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    data -- array of type Word16 -- updated filter memory
3484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicator
3494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
3514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
3524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
3544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
3554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
3574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
3584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
3604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
3614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Purpose      : Third-order half-band lowpass/highpass filter pair with
3634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                decimation.
3644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
3654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
3664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
3684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
3704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
3714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
3734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
3754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
3764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
3794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
3804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
3824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
3834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
3854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
3874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
3894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
3904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
3914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
3924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
3934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
3954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
3964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
3974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
3994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
4004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberstatic void filter3(
4024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 *in0,      /* i/o : input values; output low-pass part  */
4034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 *in1,      /* i/o : input values; output high-pass part */
4044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 *data,     /* i/o : updated filter memory               */
4054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Flag  *pOverflow  /* o : Flag set when overflow occurs         */
4064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber)
4074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
4084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 temp1;
4094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 temp2;
4104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    temp1 = mult(COEFF3, *data, pOverflow);
4124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    temp1 = sub(*in1, temp1, pOverflow);
4134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    temp2 = mult(COEFF3, temp1, pOverflow);
4154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    temp2 = add(*data, temp2, pOverflow);
4164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    *data = temp1;
4184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    temp1 = sub(*in0, temp2, pOverflow);
4204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    *in1 = shr(temp1, 1, pOverflow);
4224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    temp1 = add(*in0, temp2, pOverflow);
4244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    *in0 = shr(temp1, 1, pOverflow);
4264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
4274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
4324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
4334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: level_calculation
4344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
4354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
4364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
4384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    data -- array of type Word16 -- signal buffer
4394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    sub_level -- pointer to type Word16 -- level calculated at the end of
4404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                           the previous frame
4414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    count1 -- Word16 -- number of samples to be counted
4434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    count2 -- Word16 -- number of samples to be counted
4444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    ind_m  -- Word16 -- step size for the index of the data buffer
4454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    ind_a  -- Word16 -- starting index of the data buffer
4464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    scale  -- Word16 -- scaling for the level calculation
4474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
4494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    sub_level -- pointer to tyep Word16 -- level of signal calculated from the
4504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                           last (count2 - count1) samples.
4514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicator
4524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
4544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    signal level
4554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
4574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
4604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
4614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
4634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
4644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Purpose      : Calculate signal level in a sub-band. Level is calculated
4664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                by summing absolute values of the input data.
4674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
4694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
4704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
4724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
4744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
4754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
4774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
4794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
4804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
4834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
4844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
4864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
4874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
4894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
4914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
4934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
4944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
4954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
4964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
4974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
4994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
5004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
5014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
5034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
5044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberstatic Word16 level_calculation(
5064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 data[],     /* i   : signal buffer                                */
5074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 *sub_level, /* i   : level calculate at the end of                */
5084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*       the previous frame                           */
5094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* o   : level of signal calculated from the last     */
5104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*       (count2 - count1) samples                    */
5114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 count1,     /* i   : number of samples to be counted              */
5124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 count2,     /* i   : number of samples to be counted              */
5134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 ind_m,      /* i   : step size for the index of the data buffer   */
5144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 ind_a,      /* i   : starting index of the data buffer            */
5154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 scale,      /* i   : scaling for the level calculation            */
5164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Flag  *pOverflow   /* o : Flag set when overflow occurs                  */
5174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber)
5184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
5194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word32 l_temp1;
5204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word32 l_temp2;
5214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 level;
5224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 i;
5234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    l_temp1 = 0L;
5254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = count1; i < count2; i++)
5274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
5284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        l_temp1 = L_mac(l_temp1, 1, abs_s(data[ind_m*i+ind_a]), pOverflow);
5294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
5304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    l_temp2 = L_add(l_temp1, L_shl(*sub_level, sub(16, scale, pOverflow), pOverflow), pOverflow);
5324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    *sub_level = extract_h(L_shl(l_temp1, scale, pOverflow));
5334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = 0; i < count1; i++)
5354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
5364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        l_temp2 = L_mac(l_temp2, 1, abs_s(data[ind_m*i+ind_a]), pOverflow);
5374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
5384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    level = extract_h(L_shl(l_temp2, scale, pOverflow));
5394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    return level;
5414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
5424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
5474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
5484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: filter_bank
5494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
5504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
5514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
5534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st -- pointer to type vadState1 --  State struct
5544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    in -- array of type Word16 -- input frame
5554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
5574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    level -- array of type Word16 -- signal levels at each band
5584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st -- pointer to type vadState1 --  State struct
5594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicator
5604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
5624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
5634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
5654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
5664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
5684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
5694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
5714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
5724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Purpose      : Divides input signal into 9-bands and calculas level of
5744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                the signal in each band
5754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
5774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
5784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
5804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
5824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
5834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
5854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
5874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
5884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
5914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
5924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
5944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
5954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
5974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
5994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
6014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
6024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
6034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
6044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
6054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
6074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
6084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
6094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
6114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
6124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberstatic void filter_bank(
6144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    vadState1 *st,    /* i/o : State struct                    */
6154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 in[],      /* i   : input frame                     */
6164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 level[],   /* 0   : signal levels at each band      */
6174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Flag  *pOverflow  /* o   : Flag set when overflow occurs   */
6184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber)
6194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
6204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 i;
6214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 tmp_buf[FRAME_LEN];
6224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* calculate the filter bank */
6244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    first_filter_stage(in, tmp_buf, st->a_data5[0], pOverflow);
6264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = 0; i < FRAME_LEN / 4; i++)
6284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
6294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        filter5(&tmp_buf[4*i], &tmp_buf[4*i+2], st->a_data5[1], pOverflow);
6304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        filter5(&tmp_buf[4*i+1], &tmp_buf[4*i+3], st->a_data5[2], pOverflow);
6314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
6324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = 0; i < FRAME_LEN / 8; i++)
6334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
6344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        filter3(&tmp_buf[8*i+0], &tmp_buf[8*i+4], &st->a_data3[0], pOverflow);
6354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        filter3(&tmp_buf[8*i+2], &tmp_buf[8*i+6], &st->a_data3[1], pOverflow);
6364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        filter3(&tmp_buf[8*i+3], &tmp_buf[8*i+7], &st->a_data3[4], pOverflow);
6374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
6384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = 0; i < FRAME_LEN / 16; i++)
6404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
6414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        filter3(&tmp_buf[16*i+0], &tmp_buf[16*i+8], &st->a_data3[2], pOverflow);
6424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        filter3(&tmp_buf[16*i+4], &tmp_buf[16*i+12], &st->a_data3[3], pOverflow);
6434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
6444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* calculate levels in each frequency band */
6464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* 3000 - 4000 Hz*/
6484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    level[8] = level_calculation(tmp_buf, &st->sub_level[8], FRAME_LEN / 4 - 8,
6494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                 FRAME_LEN / 4, 4, 1, 15, pOverflow);
6504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* 2500 - 3000 Hz*/
6514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    level[7] = level_calculation(tmp_buf, &st->sub_level[7], FRAME_LEN / 8 - 4,
6524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                 FRAME_LEN / 8, 8, 7, 16, pOverflow);
6534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* 2000 - 2500 Hz*/
6544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    level[6] = level_calculation(tmp_buf, &st->sub_level[6], FRAME_LEN / 8 - 4,
6554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                 FRAME_LEN / 8, 8, 3, 16, pOverflow);
6564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* 1500 - 2000 Hz*/
6574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    level[5] = level_calculation(tmp_buf, &st->sub_level[5], FRAME_LEN / 8 - 4,
6584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                 FRAME_LEN / 8, 8, 2, 16, pOverflow);
6594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* 1000 - 1500 Hz*/
6604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    level[4] = level_calculation(tmp_buf, &st->sub_level[4], FRAME_LEN / 8 - 4,
6614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                 FRAME_LEN / 8, 8, 6, 16, pOverflow);
6624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* 750 - 1000 Hz*/
6634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    level[3] = level_calculation(tmp_buf, &st->sub_level[3], FRAME_LEN / 16 - 2,
6644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                 FRAME_LEN / 16, 16, 4, 16, pOverflow);
6654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* 500 - 750 Hz*/
6664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    level[2] = level_calculation(tmp_buf, &st->sub_level[2], FRAME_LEN / 16 - 2,
6674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                 FRAME_LEN / 16, 16, 12, 16, pOverflow);
6684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* 250 - 500 Hz*/
6694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    level[1] = level_calculation(tmp_buf, &st->sub_level[1], FRAME_LEN / 16 - 2,
6704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                 FRAME_LEN / 16, 16, 8, 16, pOverflow);
6714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* 0 - 250 Hz*/
6724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    level[0] = level_calculation(tmp_buf, &st->sub_level[0], FRAME_LEN / 16 - 2,
6734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                 FRAME_LEN / 16, 16, 0, 16, pOverflow);
6744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
6754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
6794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
6804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: update_cntrl
6814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
6824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
6834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
6854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st -- pointer to type vadState1 --  State struct
6864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    level -- array of type Word16 -- sub-band levels of the input frame
6874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
6894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st -- pointer to type vadState1 --  State struct
6904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicator
6914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
6934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
6944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
6964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
6974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
6994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
7004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
7024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
7034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Purpose    : Control update of the background noise estimate.
7054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs     : pitch:      flags for pitch detection
7064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              stat_count: stationary counter
7074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              tone:       flags indicating presence of a tone
7084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              complex:      flags for complex  detection
7094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              vadreg:     intermediate VAD flags
7104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Output     : stat_count: stationary counter
7114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
7144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
7154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
7174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
7194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
7204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
7224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
7244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
7254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
7284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
7294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
7314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
7324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
7344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
7364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
7384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
7394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
7404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
7414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
7424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
7444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
7454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
7464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
7484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
7494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberstatic void update_cntrl(
7514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    vadState1 *st,   /* i/o : State struct                       */
7524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 level[],  /* i   : sub-band levels of the input frame */
7534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Flag  *pOverflow /* o   : Flag set when overflow occurs      */
7544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber)
7554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
7564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 i;
7574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 temp;
7584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 stat_rat;
7594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 exp;
7604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 num;
7614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 denom;
7624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 alpha;
7634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* handle highband complex signal input  separately       */
7654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* if ther has been highband correlation for some time    */
7664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* make sure that the VAD update speed is low for a while */
7674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (st->complex_warning != 0)
7684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
7694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (st->stat_count < CAD_MIN_STAT_COUNT)
7704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
7714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->stat_count = CAD_MIN_STAT_COUNT;
7724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
7734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
7744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* NB stat_count is allowed to be decreased by one below again  */
7754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* deadlock in speech is not possible unless the signal is very */
7764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* complex and need a high rate                                 */
7774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* if fullband pitch or tone have been detected for a while, initialize stat_count */
7794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (((Word16)(st->pitch & 0x6000) == 0x6000) ||
7804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            ((Word16)(st->tone & 0x7c00) == 0x7c00))
7814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
7824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->stat_count = STAT_COUNT;
7834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
7844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else
7854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
7864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* if 8 last vad-decisions have been "0", reinitialize stat_count */
7874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if ((st->vadreg & 0x7f80) == 0)
7884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
7894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->stat_count = STAT_COUNT;
7904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
7914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else
7924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
7934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            stat_rat = 0;
7944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            for (i = 0; i < COMPLEN; i++)
7954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
7964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                if (level[i] > st->ave_level[i])
7974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                {
7984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    num = level[i];
7994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    denom = st->ave_level[i];
8004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                }
8014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                else
8024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                {
8034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    num = st->ave_level[i];
8044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    denom = level[i];
8054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                }
8064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                /* Limit nimimum value of num and denom to STAT_THR_LEVEL */
8074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                if (num < STAT_THR_LEVEL)
8084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                {
8094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    num = STAT_THR_LEVEL;
8104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                }
8114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                if (denom < STAT_THR_LEVEL)
8124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                {
8134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    denom = STAT_THR_LEVEL;
8144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                }
8154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                exp = norm_s(denom);
8174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                denom = shl(denom, exp, pOverflow);
8194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                /* stat_rat = num/denom * 64 */
8214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                temp = shr(num, 1, pOverflow);
8224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                temp = div_s(temp, denom);
8234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                stat_rat = add(stat_rat, shr(temp, sub(8, exp, pOverflow), pOverflow), pOverflow);
8254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
8264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            /* compare stat_rat with a threshold and update stat_count */
8284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (stat_rat > STAT_THR)
8294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
8304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->stat_count = STAT_COUNT;
8314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
8324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            else
8334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
8344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                if ((st->vadreg & 0x4000) != 0)
8354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                {
8364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    if (st->stat_count != 0)
8374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    {
8384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        st->stat_count = sub(st->stat_count, 1, pOverflow);
8394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    }
8404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                }
8414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
8424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
8434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
8444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Update average amplitude estimate for stationarity estimation */
8464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    alpha = ALPHA4;
8474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (st->stat_count == STAT_COUNT)
8484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
8494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        alpha = 32767;
8504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
8514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else if ((st->vadreg & 0x4000) == 0)
8524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
8534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        alpha = ALPHA5;
8544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
8554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = 0; i < COMPLEN; i++)
8574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
8584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = sub(level[i], st->ave_level[i], pOverflow);
8594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = mult_r(alpha, temp, pOverflow);
8604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->ave_level[i] =
8624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            add(
8634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->ave_level[i],
8644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                temp,
8654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pOverflow);
8664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
8674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
8684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
8724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
8734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: hangover_addition
8744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
8754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
8764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
8784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    noise_level -- Word16 -- average level of the noise estimates
8794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    low_power   -- Word16 -- flag power of the input frame
8804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
8824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st -- pointer to type vadState1 --  State struct
8834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicato
8844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
8864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    VAD_flag indicating final VAD decision (Word16)
8874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
8894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
8904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
8924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
8934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
8954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
8964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Function     : hangover_addition
8984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Purpose      : Add hangover for complex signal or after speech bursts
8994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs       : burst_count:  counter for the length of speech bursts
9004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                hang_count:   hangover counter
9014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                vadreg:       intermediate VAD decision
9024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs      : burst_count:  counter for the length of speech bursts
9034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                hang_count:   hangover counter
9044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Return value : VAD_flag indicating final VAD decision
9054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
9084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
9094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
9114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
9134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
9144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
9164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
9184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
9194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
9224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
9234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
9254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
9264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
9284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
9304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
9324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
9334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
9344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
9354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
9364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
9384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
9394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
9404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
9424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
9434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberstatic Word16 hangover_addition(
9454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    vadState1 *st,      /* i/o : State struct                     */
9464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 noise_level, /* i   : average level of the noise       */
9474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*       estimates                        */
9484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 low_power,   /* i   : flag power of the input frame    */
9494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Flag  *pOverflow    /* o   : Flag set when overflow occurs    */
9504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber)
9514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
9524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 hang_len;
9534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 burst_len;
9544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*
9564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       Calculate burst_len and hang_len
9574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       burst_len: number of consecutive intermediate vad flags with "1"-decision
9584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                  required for hangover addition
9594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       hang_len:  length of the hangover
9604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       */
9614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (noise_level > HANG_NOISE_THR)
9634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
9644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        burst_len = BURST_LEN_HIGH_NOISE;
9654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        hang_len = HANG_LEN_HIGH_NOISE;
9664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
9674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else
9684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
9694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        burst_len = BURST_LEN_LOW_NOISE;
9704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        hang_len = HANG_LEN_LOW_NOISE;
9714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
9724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* if the input power (pow_sum) is lower than a threshold, clear
9744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       counters and set VAD_flag to "0"  "fast exit"                 */
9754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (low_power != 0)
9764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
9774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->burst_count = 0;
9784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->hang_count = 0;
9794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->complex_hang_count = 0;
9804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->complex_hang_timer = 0;
9814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        return 0;
9824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
9834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (st->complex_hang_timer > CVAD_HANG_LIMIT)
9854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
9864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (st->complex_hang_count < CVAD_HANG_LENGTH)
9874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
9884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->complex_hang_count = CVAD_HANG_LENGTH;
9894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
9904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
9914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* long time very complex signal override VAD output function */
9934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (st->complex_hang_count != 0)
9944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
9954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->burst_count = BURST_LEN_HIGH_NOISE;
9964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->complex_hang_count = sub(st->complex_hang_count, 1, pOverflow);
9974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        return 1;
9984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
9994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else
10004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
10014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* let hp_corr work in from a noise_period indicated by the VAD */
10024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (((st->vadreg & 0x3ff0) == 0) &&
10034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                (st->corr_hp_fast > CVAD_THRESH_IN_NOISE))
10044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
10054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            return 1;
10064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
10074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
10084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* update the counters (hang_count, burst_count) */
10104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if ((st->vadreg & 0x4000) != 0)
10114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
10124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->burst_count = add(st->burst_count, 1, pOverflow);
10134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (st->burst_count >= burst_len)
10154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
10164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->hang_count = hang_len;
10174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
10184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        return 1;
10194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
10204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else
10214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
10224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->burst_count = 0;
10234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (st->hang_count > 0)
10244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
10254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->hang_count = sub(st->hang_count, 1, pOverflow);
10264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            return 1;
10274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
10284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
10294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    return 0;
10304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
10314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
10354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
10364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: noise_estimate_update
10374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
10384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
10394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
10414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st -- pointer to type vadState1 --  State struct
10424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    level -- array of type Word16 -- sub-band levels of the input frame
10434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
10454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st -- pointer to type vadState1 --  State struct
10464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicator
10474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
10494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
10504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
10524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
10534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
10554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
10564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
10584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
10594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Purpose    : Update of background noise estimate
10614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs     : bckr_est:   background noise estimate
10624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              pitch:      flags for pitch detection
10634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              stat_count: stationary counter
10644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs    : bckr_est:   background noise estimate
10654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
10674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
10684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
10704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
10724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
10734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
10754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
10774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
10784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
10814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
10824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
10844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
10854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
10874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
10894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
10914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
10924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
10934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
10944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
10954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
10974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
10984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
10994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
11014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
11024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberstatic void noise_estimate_update(
11044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    vadState1 *st,    /* i/o : State struct                       */
11054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 level[],   /* i   : sub-band levels of the input frame */
11064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Flag  *pOverflow  /* o : Flag set when overflow occurs        */
11074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber)
11084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
11094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 i;
11104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 alpha_up;
11114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 alpha_down;
11124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 bckr_add;
11134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Control update of bckr_est[] */
11154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    update_cntrl(st, level, pOverflow);
11164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Choose update speed */
11184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    bckr_add = 2;
11194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (((0x7800 & st->vadreg) == 0) &&
11214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            ((st->pitch & 0x7800) == 0)
11224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            && (st->complex_hang_count == 0))
11234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
11244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        alpha_up = ALPHA_UP1;
11254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        alpha_down = ALPHA_DOWN1;
11264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
11274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else
11284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
11294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if ((st->stat_count == 0)
11304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                && (st->complex_hang_count == 0))
11314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
11324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            alpha_up = ALPHA_UP2;
11334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            alpha_down = ALPHA_DOWN2;
11344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
11354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else
11364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
11374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            alpha_up = 0;
11384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            alpha_down = ALPHA3;
11394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            bckr_add = 0;
11404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
11414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
11424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Update noise estimate (bckr_est) */
11444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = 0; i < COMPLEN; i++)
11454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
11464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        Word16 temp;
11474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = sub(st->old_level[i], st->bckr_est[i], pOverflow);
11494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (temp < 0)
11514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        { /* update downwards*/
11524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            temp = mult_r(alpha_down, temp, pOverflow);
11534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            temp = add(st->bckr_est[i], temp, pOverflow);
11544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->bckr_est[i] = add(-2, temp, pOverflow);
11564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            /* limit minimum value of the noise estimate to NOISE_MIN */
11584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (st->bckr_est[i] < NOISE_MIN)
11594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
11604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->bckr_est[i] = NOISE_MIN;
11614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
11624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
11634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else
11644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        { /* update upwards */
11654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            temp = mult_r(alpha_up, temp, pOverflow);
11664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            temp = add(st->bckr_est[i], temp, pOverflow);
11674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->bckr_est[i] = add(bckr_add, temp, pOverflow);
11684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            /* limit maximum value of the noise estimate to NOISE_MAX */
11704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (st->bckr_est[i] > NOISE_MAX)
11714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
11724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->bckr_est[i] = NOISE_MAX;
11734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
11744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
11754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
11764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Update signal levels of the previous frame (old_level) */
11784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = 0; i < COMPLEN; i++)
11794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
11804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->old_level[i] = level[i];
11814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
11824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
11834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
11864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
11874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: complex_estimate_adapt
11884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
11894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
11904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
11924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st -- pointer to type vadState1 --  State struct
11934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    low_power -- Word16 -- very low level flag of the input frame
11944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
11964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st -- pointer to type vadState1 --  State struct
11974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicator
11984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
12004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
12014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
12034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
12044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
12064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
12074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
12094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
12104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Function   : complex_estimate_adapt
12124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Purpose    : Update/adapt of complex signal estimate
12134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs     : low_power:   low signal power flag
12144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs    : st->corr_hp_fast:   long term complex signal estimate
12154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
12174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
12184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
12204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
12224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
12234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
12254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
12274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
12284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
12314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
12324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
12344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
12354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
12374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
12394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
12414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
12424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
12434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
12444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
12454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
12474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
12484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
12494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
12514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
12524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberstatic void complex_estimate_adapt(
12544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    vadState1 *st,      /* i/o : VAD state struct                       */
12554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 low_power,   /* i   : very low level flag of the input frame */
12564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Flag  *pOverflow    /* o : Flag set when overflow occurs            */
12574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber)
12584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
12594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 alpha;            /* Q15 */
12604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word32 L_tmp;            /* Q31 */
12614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* adapt speed on own state */
12644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (st->best_corr_hp < st->corr_hp_fast) /* decrease */
12654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
12664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (st->corr_hp_fast < CVAD_THRESH_ADAPT_HIGH)
12674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {  /* low state  */
12684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            alpha = CVAD_ADAPT_FAST;
12694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
12704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else
12714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {  /* high state */
12724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            alpha = CVAD_ADAPT_REALLY_FAST;
12734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
12744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
12754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else  /* increase */
12764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
12774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (st->corr_hp_fast < CVAD_THRESH_ADAPT_HIGH)
12784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
12794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            alpha = CVAD_ADAPT_FAST;
12804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
12814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else
12824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
12834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            alpha = CVAD_ADAPT_SLOW;
12844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
12854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
12864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    L_tmp = L_deposit_h(st->corr_hp_fast);
12884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    L_tmp = L_msu(L_tmp, alpha, st->corr_hp_fast, pOverflow);
12894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    L_tmp = L_mac(L_tmp, alpha, st->best_corr_hp, pOverflow);
12904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->corr_hp_fast = pv_round(L_tmp, pOverflow);           /* Q15 */
12914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (st->corr_hp_fast < CVAD_MIN_CORR)
12934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
12944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->corr_hp_fast = CVAD_MIN_CORR;
12954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
12964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (low_power != 0)
12984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
12994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->corr_hp_fast = CVAD_MIN_CORR;
13004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
13014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
13024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
13054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
13064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: complex_vad
13074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
13084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
13094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
13114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st -- pointer to type vadState1 --  State struct
13124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    low_power -- Word16 -- flag power of the input frame
13134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
13154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st -- pointer to type vadState1 --  State struct
13164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicator
13174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
13204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    the complex background decision
13214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
13234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
13244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
13264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
13274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
13294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
13304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Purpose      : complex background decision
13324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Return value : the complex background decision
13334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
13354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
13364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
13384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
13404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
13414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
13434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
13454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
13464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
13494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
13504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
13524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
13534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
13554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
13574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
13594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
13604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
13614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
13624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
13634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
13654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
13664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
13674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
13694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
13704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberstatic Word16 complex_vad(
13724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    vadState1 *st,    /* i/o : VAD state struct              */
13734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 low_power, /* i   : flag power of the input frame */
13744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Flag  *pOverflow  /* o : Flag set when overflow occurs   */
13754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber)
13764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
13774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->complex_high = shr(st->complex_high, 1, pOverflow);
13784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->complex_low = shr(st->complex_low, 1, pOverflow);
13794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (low_power == 0)
13814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
13824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (st->corr_hp_fast > CVAD_THRESH_ADAPT_HIGH)
13834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
13844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->complex_high |= 0x4000;
13854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
13864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (st->corr_hp_fast > CVAD_THRESH_ADAPT_LOW)
13884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
13894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->complex_low |= 0x4000;
13904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
13914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
13924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (st->corr_hp_fast > CVAD_THRESH_HANG)
13944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
13954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->complex_hang_timer = add(st->complex_hang_timer, 1, pOverflow);
13964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
13974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else
13984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
13994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->complex_hang_timer =  0;
14004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
14014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    return ((Word16)(st->complex_high & 0x7f80) == 0x7f80 ||
14034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            (Word16)(st->complex_low & 0x7fff) == 0x7fff);
14044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
14054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
14084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
14094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: vad_decision
14104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
14114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
14124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
14144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st -- pointer to type vadState1 --  State struct
14154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    level -- array of type Word16 -- sub-band levels of the input frame
14164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    pow_sum -- Word32 -- power of the input frame
14174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
14194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st -- pointer to type vadState1 --  State struct
14204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicator
14214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
14234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    VAD_flag (Word16)
14244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
14264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
14274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
14294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
14304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
14324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
14334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Purpose      : Calculates VAD_flag
14354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs       : bckr_est:    background noise estimate
14364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                vadreg:      intermediate VAD flags
14374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs      : noise_level: average level of the noise estimates
14384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                vadreg:      intermediate VAD flags
14394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Return value : VAD_flag
14404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
14424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
14434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
14454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
14474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
14484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
14504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
14524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
14534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
14564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
14574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
14594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
14604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
14624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
14644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
14664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
14674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
14684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
14694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
14704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
14724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
14734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
14744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
14764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
14774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberstatic Word16 vad_decision(
14794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    vadState1 *st,         /* i/o : State struct                       */
14804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 level[COMPLEN], /* i   : sub-band levels of the input frame */
14814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word32 pow_sum,        /* i   : power of the input frame           */
14824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Flag  *pOverflow       /* o : Flag set when overflow occurs        */
14834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber)
14844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
14854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 i;
14864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 snr_sum;
14874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word32 L_temp;
14884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 vad_thr;
14894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 temp;
14904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 noise_level;
14914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 low_power_flag;
14924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 temp1;
14934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*
14954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       Calculate squared sum of the input levels (level)
14964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       divided by the background noise components (bckr_est).
14974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       */
14984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    L_temp = 0;
14994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = 0; i < COMPLEN; i++)
15014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
15024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        Word16 exp;
15034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        exp = norm_s(st->bckr_est[i]);
15054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = shl(st->bckr_est[i], exp, pOverflow);
15064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = div_s(shr(level[i], 1, pOverflow), temp);
15074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = shl(temp, sub(exp, UNIRSHFT - 1, pOverflow), pOverflow);
15084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        L_temp = L_mac(L_temp, temp, temp, pOverflow);
15094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
15104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    snr_sum = extract_h(L_shl(L_temp, 6, pOverflow));
15124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    snr_sum = mult(snr_sum, INV_COMPLEN, pOverflow);
15134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Calculate average level of estimated background noise */
15154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    L_temp = 0;
15164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = 0; i < COMPLEN; i++)
15174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
15184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        L_temp = L_add(L_temp, st->bckr_est[i], pOverflow);
15194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
15204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    noise_level = extract_h(L_shl(L_temp, 13, pOverflow));
15224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Calculate VAD threshold */
15244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    temp1 = sub(noise_level, VAD_P1, pOverflow);
15254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    temp1 = mult(VAD_SLOPE, temp1, pOverflow);
15264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    vad_thr = add(temp1, VAD_THR_HIGH, pOverflow);
15274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (vad_thr < VAD_THR_LOW)
15294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
15304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        vad_thr = VAD_THR_LOW;
15314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
15324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Shift VAD decision register */
15344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->vadreg = shr(st->vadreg, 1, pOverflow);
15354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Make intermediate VAD decision */
15374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (snr_sum > vad_thr)
15384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
15394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->vadreg |= 0x4000;
15404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
15414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* primary vad decsion made */
15424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* check if the input power (pow_sum) is lower than a threshold" */
15444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (L_sub(pow_sum, VAD_POW_LOW, pOverflow) < 0)
15454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
15464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        low_power_flag = 1;
15474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
15484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else
15494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
15504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        low_power_flag = 0;
15514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
15524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* update complex signal estimate st->corr_hp_fast and hangover reset timer using */
15544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* low_power_flag and corr_hp_fast  and various adaptation speeds                 */
15554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    complex_estimate_adapt(st, low_power_flag, pOverflow);
15564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* check multiple thresholds of the st->corr_hp_fast value */
15584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->complex_warning = complex_vad(st, low_power_flag, pOverflow);
15594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Update speech subband vad background noise estimates */
15614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    noise_estimate_update(st, level, pOverflow);
15624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*  Add speech and complex hangover and return speech VAD_flag */
15644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*  long term complex hangover may be added */
15654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->speech_vad_decision = hangover_addition(st, noise_level, low_power_flag, pOverflow);
15664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    return (st->speech_vad_decision);
15684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
15694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
15724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
15734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: vad1_init
15744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
15754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
15764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
15784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state -- double pointer to type vadState1 -- pointer to memory to
15794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                                 be initialized.
15804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
15824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state -- points to initalized area in memory.
15834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
15854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
15864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
15884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
15894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
15914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
15924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
15944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
15954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Allocates state memory and initializes state memory
15974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
15994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
16004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
16024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
16044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
16054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
16074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
16094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
16104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
16134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
16144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
16164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
16174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
16194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
16214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
16234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
16244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
16254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
16264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
16274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
16294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
16304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
16314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
16334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
16344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas HuberWord16 vad1_init(vadState1 **state)
16364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
16374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    vadState1* s;
16384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (state == (vadState1 **) NULL)
16404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
16414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        return -1;
16424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
16434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    *state = NULL;
16444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* allocate memory */
16464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if ((s = (vadState1 *) malloc(sizeof(vadState1))) == NULL)
16474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
16484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        return -1;
16494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
16504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    vad1_reset(s);
16524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    *state = s;
16544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    return 0;
16564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
16574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
16594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
16604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: vad1_reset
16614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
16624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
16634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
16654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state -- pointer to type vadState1 --  State struct
16664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
16684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state -- pointer to type vadState1 --  State struct
16694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
16714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
16724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
16744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
16754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
16774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
16784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
16804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
16814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Purpose:    Resets state memory to zero
16834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
16854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
16864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
16884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
16904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
16914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
16934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
16954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
16964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
16994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
17004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
17024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
17034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
17054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
17074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
17094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
17104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
17114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
17124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
17134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
17154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
17164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
17174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
17194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
17204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas HuberWord16 vad1_reset(vadState1 *state)
17224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
17234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 i;
17244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 j;
17254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (state == (vadState1 *) NULL)
17274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
17284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        return -1;
17294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
17304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Initialize pitch detection variables */
17324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state->oldlag_count = 0;
17334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state->oldlag = 0;
17344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state->pitch = 0;
17354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state->tone = 0;
17364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state->complex_high = 0;
17384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state->complex_low = 0;
17394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state->complex_hang_timer = 0;
17404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state->vadreg = 0;
17424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state->stat_count = 0;
17444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state->burst_count = 0;
17454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state->hang_count = 0;
17464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state->complex_hang_count = 0;
17474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* initialize memory used by the filter bank */
17494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = 0; i < 3; i++)
17504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
17514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        for (j = 0; j < 2; j++)
17524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
17534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            state->a_data5[i][j] = 0;
17544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
17554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
17564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = 0; i < 5; i++)
17584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
17594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        state->a_data3[i] = 0;
17604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
17614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* initialize the rest of the memory */
17634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = 0; i < COMPLEN; i++)
17644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
17654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        state->bckr_est[i] = NOISE_INIT;
17664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        state->old_level[i] = NOISE_INIT;
17674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        state->ave_level[i] = NOISE_INIT;
17684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        state->sub_level[i] = 0;
17694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
17704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state->best_corr_hp = CVAD_LOWPOW_RESET;
17724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state->speech_vad_decision = 0;
17744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state->complex_warning = 0;
17754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state->sp_burst_count = 0;
17764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state->corr_hp_fast = CVAD_LOWPOW_RESET;
17784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    return 0;
17804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
17814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
17844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
17854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: vad1_exit
17864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
17874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
17884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
17904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state -- pointer to type vadState1 --  State struct
17914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
17934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
17944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
17964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
17974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
17994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
18004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
18024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
18034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
18054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
18064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    The memory used for state memory is freed
18084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
18104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
18114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
18134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
18154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
18164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
18184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
18204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
18214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
18244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
18254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
18274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
18284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
18304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
18324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
18344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
18354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
18364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
18374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
18384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
18404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
18414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
18424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
18444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
18454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Hubervoid vad1_exit(vadState1 **state)
18474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
18484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (state == NULL || *state == NULL)
18494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        return;
18504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* deallocate memory */
18524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    free(*state);
18534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    *state = NULL;
18544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    return;
18564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
18574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
18604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
18614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: vad_complex_detection_update
18624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
18634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
18644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
18664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    best_corr_hp -- Word16 -- best Corr
18674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state -- pointer to type vadState1 --  State struct
18684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
18704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state -- pointer to type vadState1 --  State struct
18714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
18734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
18744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
18764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
18774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
18794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
18804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
18824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
18834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Purpose      : update vad->bestCorr_hp  complex signal feature state
18854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
18864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
18874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
18894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
18914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
18924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
18944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
18964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
18974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
19004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
19014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
19034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
19044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
19064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
19084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
19104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
19114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
19124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
19134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
19144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
19164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
19174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
19184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
19204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
19214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Hubervoid vad_complex_detection_update(
19234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    vadState1 *st,       /* i/o : State struct */
19244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 best_corr_hp) /* i   : best Corr    */
19254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
19264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->best_corr_hp = best_corr_hp;
19274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
19284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
19324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
19334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: vad_tone_detection
19344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
19354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
19364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
19384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st -- pointer to type vadState1 --  State struct
19394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    t0 -- Word32 -- autocorrelation maxima
19404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    t1 -- Word32 -- energy
19414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
19434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st -- pointer to type vadState1 --  State struct
19444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicator
19454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
19474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
19484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
19504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
19514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
19534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
19544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
19564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
19574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Purpose      : Set tone flag if pitch gain is high. This is used to detect
19594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                signaling tones and other signals with high pitch gain.
19604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs       : tone: flags indicating presence of a tone
19614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs      : tone: flags indicating presence of a tone
19624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
19634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
19644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
19664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
19684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
19694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
19714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
19734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
19744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
19774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
19784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
19804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
19814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
19834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
19854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
19874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
19884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
19894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
19904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
19914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
19934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
19944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
19954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
19974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
19984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Hubervoid vad_tone_detection(
20004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    vadState1 *st,    /* i/o : State struct                       */
20014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word32 t0,        /* i   : autocorrelation maxima             */
20024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word32 t1,        /* i   : energy                             */
20034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Flag  *pOverflow  /* o : Flag set when overflow occurs        */
20044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber)
20054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
20064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 temp;
20074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*
20084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       if (t0 > TONE_THR * t1)
20094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       set tone flag
20104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       */
20114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    temp = pv_round(t1, pOverflow);
20124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if ((temp > 0) && (L_msu(t0, temp, TONE_THR, pOverflow) > 0))
20144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
20154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->tone |= 0x4000;
20164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
20174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
20184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
20214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
20224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: vad_tone_detection_update
20234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
20244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
20254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
20274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    one_lag_per_frame -- Word16 -- 1 if one open-loop lag is calculated per
20284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                   each frame, otherwise 0
20294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st -- pointer to type vadState1 --  State struct
20304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
20324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st -- pointer to type vadState1 --  State struct
20334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicator
20344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
20364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
20374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
20394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
20404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
20424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
20434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
20454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
20464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Purpose      : Update the tone flag register. Tone flags are shifted right
20484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                by one bit. This function should be called from the speech
20494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                encoder before call to Vad_tone_detection() function.
20504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
20524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
20534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
20554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
20574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
20584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
20604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
20624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
20634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
20664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
20674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
20694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
20704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
20724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
20744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
20764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
20774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
20784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
20794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
20804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
20824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
20834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
20844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
20864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
20874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Hubervoid vad_tone_detection_update(
20894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    vadState1 *st,              /* i/o : State struct           */
20904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 one_lag_per_frame,   /* i   : 1 if one open-loop lag */
20914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*       is calculated per each */
20924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*       frame, otherwise 0     */
20934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Flag *pOverflow             /* o   : Flags overflow         */
20944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber)
20954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
20964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Shift tone flags right by one bit */
20974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->tone = shr(st->tone, 1, pOverflow);
20984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* If open-loop lag is calculated only once in each frame, do extra update
21004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       and assume that the other tone flag of the frame is one. */
21014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (one_lag_per_frame != 0)
21024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
21034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->tone = shr(st->tone, 1, pOverflow);
21044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->tone |= 0x2000;
21054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
21064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
21074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
21104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
21114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: vad_pitch_detection
21124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
21134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
21144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
21164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    T_op -- array of type Word16 -- speech encoder open loop lags
21174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st -- pointer to type vadState1 --  State struct
21184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
21204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st -- pointer to type vadState1 --  State struct
21214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicator
21224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
21244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
21254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
21274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
21284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
21304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
21314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
21334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
21344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Purpose      : Test whether signal contains pitch or other periodic
21364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                component.
21374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Return value : Boolean voiced / unvoiced decision in state variable
21384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
21404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
21414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
21434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
21454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
21464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
21484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
21504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
21514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
21544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
21554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
21574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
21584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
21604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
21624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
21644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
21654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
21664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
21674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
21684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
21704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
21714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
21724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
21744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
21754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Hubervoid vad_pitch_detection(
21774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    vadState1 *st,    /* i/o : State struct                  */
21784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 T_op[],    /* i   : speech encoder open loop lags */
21794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Flag  *pOverflow  /* o : Flag set when overflow occurs   */
21804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber)
21814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
21824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 lagcount;
21834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 i;
21844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 temp;
21854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lagcount = 0;
21874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = 0; i < 2; i++)
21894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
21904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = sub(st->oldlag, T_op[i], pOverflow);
21914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = abs_s(temp);
21924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (temp < LTHRESH)
21944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
21954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            lagcount = add(lagcount, 1, pOverflow);
21964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
21974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* Save the current LTP lag */
21994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->oldlag = T_op[i];
22004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
22014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Make pitch decision.
22034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       Save flag of the pitch detection to the variable pitch.
22044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       */
22054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->pitch = shr(st->pitch, 1, pOverflow);
22064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    temp =
22084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        add(
22094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->oldlag_count,
22104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            lagcount,
22114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            pOverflow);
22124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (temp >= NTHRESH)
22144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
22154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->pitch |= 0x4000;
22164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
22174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Update oldlagcount */
22194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->oldlag_count = lagcount;
22204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
22214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
22234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
22244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: vad1
22254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
22264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
22274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
22294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st -- pointer to type vadState1 --  State struct
22304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    in_buf -- array of type Word16 -- samples of the input frame
22314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
22334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st -- pointer to type vadState1 --  State struct
22344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicator
22354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
22374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    VAD Decision, 1 = speech, 0 = noise
22384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
22404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
22414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
22434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
22444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
22464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
22474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Purpose      : Main program for Voice Activity Detection (VAD) for AMR
22494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Return value : VAD Decision, 1 = speech, 0 = noise
22504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
22524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
22534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
22554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
22574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
22584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
22604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
22624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
22634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
22664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
22674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
22694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
22704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
22724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
22744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
22764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
22774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
22784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
22794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
22804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
22824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
22834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
22844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
22864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
22874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas HuberWord16 vad1(
22894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    vadState1 *st,    /* i/o : State struct                       */
22904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 in_buf[],  /* i   : samples of the input frame         */
22914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Flag  *pOverflow  /* o   : Flag set when overflow occurs      */
22924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber)
22934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
22944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 level[COMPLEN];
22954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word32 pow_sum;
22964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 i;
22974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Calculate power of the input frame. */
22994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    pow_sum = 0L;
23004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
23014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = 0; i < FRAME_LEN; i++)
23024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
23034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        pow_sum = L_mac(pow_sum, in_buf[i-LOOKAHEAD], in_buf[i-LOOKAHEAD], pOverflow);
23044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
23054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
23064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*
23074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      If input power is very low, clear pitch flag of the current frame
23084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      */
23094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (L_sub(pow_sum, POW_PITCH_THR, pOverflow) < 0)
23104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
23114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->pitch = st->pitch & 0x3fff;
23124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
23134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
23144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*
23154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      If input power is very low, clear complex flag of the "current" frame
23164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      */
23174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (L_sub(pow_sum, POW_COMPLEX_THR, pOverflow) < 0)
23184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
23194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->complex_low = st->complex_low & 0x3fff;
23204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
23214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
23224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*
23234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      Run the filter bank which calculates signal levels at each band
23244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      */
23254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    filter_bank(st, in_buf, level, pOverflow);
23264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
23274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    return (vad_decision(st, level, pow_sum, pOverflow));
23284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
23294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
23304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2331