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------------------------------------------------------------------------------
314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Pathname: ./audio/gsm-amr/c/src/dtx_dec.c
354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Functions:
364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           dtx_dec_reset
374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           dtx_dec
384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           dtx_dec_activity_update
394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           rx_dtx_handler
404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber MODULE DESCRIPTION
434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber These modules decode the comfort noise when in DTX.
454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*----------------------------------------------------------------------------
514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; INCLUDES
524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber----------------------------------------------------------------------------*/
534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include <string.h>
544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "dtx_dec.h"
564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "typedef.h"
574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "basic_op.h"
584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "copy.h"
594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "set_zero.h"
604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "mode.h"
614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "log2.h"
624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "lsp_az.h"
634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "pow2.h"
644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "a_refl.h"
654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "b_cn_cod.h"
664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "syn_filt.h"
674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "lsp_lsf.h"
684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "reorder.h"
694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "lsp_tab.h"
704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*----------------------------------------------------------------------------
724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; MACROS
734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; Define module specific macros here
744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber----------------------------------------------------------------------------*/
754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*----------------------------------------------------------------------------
784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; DEFINES
794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; Include all pre-processor statements here. Include conditional
804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; compile variables also.
814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber----------------------------------------------------------------------------*/
824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#define PN_INITIAL_SEED 0x70816958L   /* Pseudo noise generator seed value  */
834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*----------------------------------------------------------------------------
854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; LOCAL FUNCTION DEFINITIONS
864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; Function Prototype declaration
874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber----------------------------------------------------------------------------*/
884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*----------------------------------------------------------------------------
914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; LOCAL VARIABLE DEFINITIONS
924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; Variable declaration - defined here and used outside this module
934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber----------------------------------------------------------------------------*/
944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/***************************************************
964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Scaling factors for the lsp variability operation *
974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ***************************************************/
984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberstatic const Word16 lsf_hist_mean_scale[M] =
994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
1004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    20000,
1014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    20000,
1024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    20000,
1034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    20000,
1044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    20000,
1054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    18000,
1064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    16384,
1074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    8192,
1084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    0,
1094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    0
1104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber};
1114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*************************************************
1134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * level adjustment for different modes Q11      *
1144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *************************************************/
1154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberstatic const Word16 dtx_log_en_adjust[9] =
1164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
1174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    -1023, /* MR475 */
1184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    -878, /* MR515 */
1194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    -732, /* MR59  */
1204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    -586, /* MR67  */
1214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    -440, /* MR74  */
1224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    -294, /* MR795 */
1234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    -148, /* MR102 */
1244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    0, /* MR122 */
1254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    0, /* MRDTX */
1264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber};
1274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
1304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
1314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: dtx_dec_reset
1324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
1334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
1344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
1364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st = pointer to a structure of type dtx_decState
1374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
1394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Structure pointed to by st is initialized to a set of initial values.
1404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
1424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    return_value = 0 if memory was successfully initialized,
1434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        otherwise returns -1 (int)
1444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
1464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None.
1474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
1494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None.
1504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
1524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
1534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Reset of state memory for dtx_dec.
1554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
1574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
1584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None.
1604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
1624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
1634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber dtx_dec.c, UMTS GSM AMR speech codec, R99 - Version 3.3.0, December 12, 2001
1654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
1674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
1684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberint dtx_dec_reset (dtx_decState *st)
1704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
1714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   int i;
1724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   if (st == (dtx_decState *) NULL){
1744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      fprintf(stderr, "dtx_dec_reset: invalid parameter\n");
1754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      return -1;
1764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   }
1774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   st->since_last_sid = 0;
1794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   st->true_sid_period_inv = (1 << 13);
1804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   st->log_en = 3500;
1824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   st->old_log_en = 3500;
1834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // low level noise for better performance in  DTX handover cases
1844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   st->L_pn_seed_rx = PN_INITIAL_SEED;
1864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // Initialize state->lsp [] and state->lsp_old []
1884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Copy(lsp_init_data, &st->lsp[0], M);
1894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Copy(lsp_init_data, &st->lsp_old[0], M);
1904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   st->lsf_hist_ptr = 0;
1924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   st->log_pg_mean = 0;
1934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   st->log_en_hist_ptr = 0;
1944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // initialize decoder lsf history
1964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Copy(mean_lsf, &st->lsf_hist[0], M);
1974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   for (i = 1; i < DTX_HIST_SIZE; i++)
1994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   {
2004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      Copy(&st->lsf_hist[0], &st->lsf_hist[M*i], M);
2014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   }
2024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Set_zero(st->lsf_hist_mean, M*DTX_HIST_SIZE);
2034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // initialize decoder log frame energy
2054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   for (i = 0; i < DTX_HIST_SIZE; i++)
2064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   {
2074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      st->log_en_hist[i] = st->log_en;
2084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   }
2094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   st->log_en_adjust = 0;
2114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   st->dtxHangoverCount = DTX_HANG_CONST;
2134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   st->decAnaElapsedCount = 32767;
2144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   st->sid_frame = 0;
2164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   st->valid_data = 0;
2174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   st->dtxHangoverAdded = 0;
2184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   st->dtxGlobalState = DTX;
2204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   st->data_updated = 0;
2214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   return 0;
2224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
2234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
2254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
2264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
2284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
2294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
2314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
2334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
2354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
2364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
2374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
2384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
2394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
2414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
2424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
2434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
2454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
2464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas HuberWord16 dtx_dec_reset(dtx_decState *st)
2484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
2494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 i;
2504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (st == (dtx_decState *) NULL)
2524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
2534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* fprint(stderr, "dtx_dec_reset: invalid parameter\n");  */
2544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        return(-1);
2554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
2564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->since_last_sid = 0;
2584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->true_sid_period_inv = (1 << 13);
2594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->log_en = 3500;
2614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->old_log_en = 3500;
2624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* low level noise for better performance in  DTX handover cases*/
2634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->L_pn_seed_rx = PN_INITIAL_SEED;
2654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Initialize state->lsp [] */
2674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsp[0] = 30000;
2684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsp[1] = 26000;
2694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsp[2] = 21000;
2704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsp[3] = 15000;
2714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsp[4] = 8000;
2724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsp[5] = 0;
2734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsp[6] = -8000;
2744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsp[7] = -15000;
2754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsp[8] = -21000;
2764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsp[9] = -26000;
2774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Initialize state->lsp_old [] */
2794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsp_old[0] = 30000;
2804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsp_old[1] = 26000;
2814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsp_old[2] = 21000;
2824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsp_old[3] = 15000;
2834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsp_old[4] = 8000;
2844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsp_old[5] = 0;
2854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsp_old[6] = -8000;
2864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsp_old[7] = -15000;
2874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsp_old[8] = -21000;
2884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsp_old[9] = -26000;
2894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsf_hist_ptr = 0;
2914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->log_pg_mean = 0;
2924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->log_en_hist_ptr = 0;
2934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* initialize decoder lsf history */
2954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsf_hist[0] =  1384;
2964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsf_hist[1] =  2077;
2974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsf_hist[2] =  3420;
2984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsf_hist[3] =  5108;
2994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsf_hist[4] =  6742;
3004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsf_hist[5] =  8122;
3014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsf_hist[6] =  9863;
3024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsf_hist[7] = 11092;
3034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsf_hist[8] = 12714;
3044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsf_hist[9] = 13701;
3054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = 1; i < DTX_HIST_SIZE; i++)
3074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
3084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        Copy(&st->lsf_hist[0], &st->lsf_hist[M*i], M);
3094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
3104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    memset(st->lsf_hist_mean, 0, sizeof(Word16)*M*DTX_HIST_SIZE);
3114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* initialize decoder log frame energy */
3134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = 0; i < DTX_HIST_SIZE; i++)
3144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
3154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->log_en_hist[i] = st->log_en;
3164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
3174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->log_en_adjust = 0;
3194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->dtxHangoverCount = DTX_HANG_CONST;
3214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->decAnaElapsedCount = 32767;
3224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->sid_frame = 0;
3244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->valid_data = 0;
3254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->dtxHangoverAdded = 0;
3264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->dtxGlobalState = DTX;
3284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->data_updated = 0;
3294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    return(0);
3314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
3324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/****************************************************************************/
3344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
3364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
3374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: dtx_dec
3384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
3394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
3404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
3424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st = pointer to a structure of type dtx_decState
3434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    mem_syn = AMR decoder state
3444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsfState = decoder lsf states
3454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    predState = prediction states
3464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    averState = CB gain average states
3474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    new_state = new DTX state
3484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    mode = AMR mode
3494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    parm = Vector of synthesis parameters
3504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
3524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st points to an updated structure of type dtx_decState
3534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    mem_syn = AMR decoder state
3544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsfState = decoder lsf states
3554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    predState = prediction states
3564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    averState = CB gain average states
3574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    synth = synthesised speech
3584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    A_t = decoded LP filter in 4 subframes
3594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
3614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    return_value = 0 (int)
3624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
3644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None.
3654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
3674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None.
3684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
3704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
3714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Decode comfort noise when in DTX.
3734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
3754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
3764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
3784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
3804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
3814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber dtx_dec.c, UMTS GSM AMR speech codec, R99 - Version 3.3.0, December 12, 2001
3834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
3854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
3864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberint dtx_dec(
3884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   dtx_decState *st,                // i/o : State struct
3894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 mem_syn[],                // i/o : AMR decoder state
3904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   D_plsfState* lsfState,           // i/o : decoder lsf states
3914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   gc_predState* predState,         // i/o : prediction states
3924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Cb_gain_averageState* averState, // i/o : CB gain average states
3934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   enum DTXStateType new_state,     // i   : new DTX state
3944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   enum Mode mode,                  // i   : AMR mode
3954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 parm[],                   // i   : Vector of synthesis parameters
3964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 synth[],                  // o   : synthesised speech
3974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 A_t[]                     // o   : decoded LP filter in 4 subframes
3984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   )
3994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
4004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 log_en_index;
4014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 i, j;
4024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 int_fac;
4034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word32 L_log_en_int;
4044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 lsp_int[M];
4054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 log_en_int_e;
4064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 log_en_int_m;
4074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 level;
4084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 acoeff[M + 1];
4094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 refl[M];
4104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 pred_err;
4114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 ex[L_SUBFR];
4124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 ma_pred_init;
4134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 log_pg_e, log_pg_m;
4144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 log_pg;
4154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Flag negative;
4164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 lsf_mean;
4174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word32 L_lsf_mean;
4184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 lsf_variab_index;
4194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 lsf_variab_factor;
4204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 lsf_int[M];
4214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 lsf_int_variab[M];
4224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 lsp_int_variab[M];
4234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 acoeff_variab[M + 1];
4244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 lsf[M];
4264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word32 L_lsf[M];
4274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 ptr;
4284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 tmp_int_length;
4294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // This function is called if synthesis state is not SPEECH
4324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // the globally passed  inputs to this function are
4334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // st->sid_frame
4344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // st->valid_data
4354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // st->dtxHangoverAdded
4364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // new_state  (SPEECH, DTX, DTX_MUTE)
4374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   if ((st->dtxHangoverAdded != 0) &&
4394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       (st->sid_frame != 0))
4404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   {
4414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // sid_first after dtx hangover period
4424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // or sid_upd after dtxhangover
4434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // set log_en_adjust to correct value
4454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      st->log_en_adjust = dtx_log_en_adjust[mode];
4464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      ptr = add(st->lsf_hist_ptr, M);
4484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      if (sub(ptr, 80) == 0)
4494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      {
4504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         ptr = 0;
4514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      }
4524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      Copy( &st->lsf_hist[st->lsf_hist_ptr],&st->lsf_hist[ptr],M);
4534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      ptr = add(st->log_en_hist_ptr,1);
4554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      if (sub(ptr, DTX_HIST_SIZE) == 0)
4564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      {
4574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         ptr = 0;
4584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      }
4594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      st->log_en_hist[ptr] = st->log_en_hist[st->log_en_hist_ptr]; // Q11
4604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // compute mean log energy and lsp
4624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // from decoded signal (SID_FIRST)
4634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      st->log_en = 0;
4644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      for (i = 0; i < M; i++)
4654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      {
4664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         L_lsf[i] = 0;
4674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      }
4684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // average energy and lsp
4704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      for (i = 0; i < DTX_HIST_SIZE; i++)
4714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      {
4724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         st->log_en = add(st->log_en,
4734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                          shr(st->log_en_hist[i],3));
4744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         for (j = 0; j < M; j++)
4754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         {
4764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            L_lsf[j] = L_add(L_lsf[j],
4774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                             L_deposit_l(st->lsf_hist[i * M + j]));
4784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         }
4794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      }
4804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      for (j = 0; j < M; j++)
4824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      {
4834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         lsf[j] = extract_l(L_shr(L_lsf[j],3)); // divide by 8
4844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      }
4854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      Lsf_lsp(lsf, st->lsp, M);
4874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // make log_en speech coder mode independent
4894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // added again later before synthesis
4904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      st->log_en = sub(st->log_en, st->log_en_adjust);
4914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // compute lsf variability vector
4934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      Copy(st->lsf_hist, st->lsf_hist_mean, 80);
4944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      for (i = 0; i < M; i++)
4964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      {
4974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         L_lsf_mean = 0;
4984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         // compute mean lsf
4994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         for (j = 0; j < 8; j++)
5004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         {
5014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            L_lsf_mean = L_add(L_lsf_mean,
5024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                               L_deposit_l(st->lsf_hist_mean[i+j*M]));
5034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         }
5044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         lsf_mean = extract_l(L_shr(L_lsf_mean, 3));
5064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          // subtract mean and limit to within reasonable limits
5074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          // moreover the upper lsf's are attenuated
5084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         for (j = 0; j < 8; j++)
5094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         {
5104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            // subtract mean
5114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->lsf_hist_mean[i+j*M] =
5124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               sub(st->lsf_hist_mean[i+j*M], lsf_mean);
5134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            // attenuate deviation from mean, especially for upper lsf's
5154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->lsf_hist_mean[i+j*M] =
5164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               mult(st->lsf_hist_mean[i+j*M], lsf_hist_mean_scale[i]);
5174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            // limit the deviation
5194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (st->lsf_hist_mean[i+j*M] < 0)
5204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
5214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               negative = 1;
5224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
5234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            else
5244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
5254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               negative = 0;
5264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
5274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->lsf_hist_mean[i+j*M] = abs_s(st->lsf_hist_mean[i+j*M]);
5284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            // apply soft limit
5304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (sub(st->lsf_hist_mean[i+j*M], 655) > 0)
5314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
5324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               st->lsf_hist_mean[i+j*M] =
5334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                  add(655, shr(sub(st->lsf_hist_mean[i+j*M], 655), 2));
5344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
5354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            // apply hard limit
5374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (sub(st->lsf_hist_mean[i+j*M], 1310) > 0)
5384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
5394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               st->lsf_hist_mean[i+j*M] = 1310;
5404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
5414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (negative != 0)
5424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
5434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               st->lsf_hist_mean[i+j*M] = -st->lsf_hist_mean[i+j*M];
5444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
5454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         }
5474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      }
5484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   }
5494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   if (st->sid_frame != 0 )
5514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   {
5524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // Set old SID parameters, always shift
5534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // even if there is no new valid_data
5544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      Copy(st->lsp, st->lsp_old, M);
5554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      st->old_log_en = st->log_en;
5564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      if (st->valid_data != 0 )  // new data available (no CRC)
5584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      {
5594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         // Compute interpolation factor, since the division only works
5604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         // for values of since_last_sid < 32 we have to limit the
5614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         // interpolation to 32 frames
5624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         tmp_int_length = st->since_last_sid;
5634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         st->since_last_sid = 0;
5644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         if (sub(tmp_int_length, 32) > 0)
5664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         {
5674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            tmp_int_length = 32;
5684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         }
5694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         if (sub(tmp_int_length, 2) >= 0)
5704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         {
5714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->true_sid_period_inv = div_s(1 << 10, shl(tmp_int_length, 10));
5724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         }
5734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         else
5744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         {
5754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->true_sid_period_inv = 1 << 14; // 0.5 it Q15
5764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         }
5774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         Init_D_plsf_3(lsfState, parm[0]);  // temporay initialization
5794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         D_plsf_3(lsfState, MRDTX, 0, &parm[1], st->lsp);
5804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         Set_zero(lsfState->past_r_q, M);   // reset for next speech frame
5814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         log_en_index = parm[4];
5834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         // Q11 and divide by 4
5844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         st->log_en = shl(log_en_index, (11 - 2));
5854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         // Subtract 2.5 in Q11
5874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         st->log_en = sub(st->log_en, (2560 * 2));
5884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         // Index 0 is reserved for silence
5904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         if (log_en_index == 0)
5914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         {
5924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->log_en = MIN_16;
5934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         }
5944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         // no interpolation at startup after coder reset
5964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         // or when SID_UPD has been received right after SPEECH
5974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         if ((st->data_updated == 0) ||
5984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             (sub(st->dtxGlobalState, SPEECH) == 0)
5994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             )
6004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         {
6014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            Copy(st->lsp, st->lsp_old, M);
6024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->old_log_en = st->log_en;
6034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         }
6044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      } // endif valid_data
6054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // initialize gain predictor memory of other modes
6074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      ma_pred_init = sub(shr(st->log_en,1), 9000);
6084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      if (ma_pred_init > 0)
6094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      {
6104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         ma_pred_init = 0;
6114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      }
6124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      if (sub(ma_pred_init, -14436) < 0)
6134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      {
6144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         ma_pred_init = -14436;
6154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      }
6164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      predState->past_qua_en[0] = ma_pred_init;
6184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      predState->past_qua_en[1] = ma_pred_init;
6194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      predState->past_qua_en[2] = ma_pred_init;
6204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      predState->past_qua_en[3] = ma_pred_init;
6214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // past_qua_en for other modes than MR122
6234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      ma_pred_init = mult(5443, ma_pred_init);
6244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // scale down by factor 20*log10(2) in Q15
6254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      predState->past_qua_en_MR122[0] = ma_pred_init;
6264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      predState->past_qua_en_MR122[1] = ma_pred_init;
6274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      predState->past_qua_en_MR122[2] = ma_pred_init;
6284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      predState->past_qua_en_MR122[3] = ma_pred_init;
6294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   } // endif sid_frame
6304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // CN generation
6324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // recompute level adjustment factor Q11
6334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // st->log_en_adjust = 0.9*st->log_en_adjust +
6344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   //                     0.1*dtx_log_en_adjust[mode]);
6354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   st->log_en_adjust = add(mult(st->log_en_adjust, 29491),
6364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                           shr(mult(shl(dtx_log_en_adjust[mode],5),3277),5));
6374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // Interpolate SID info
6394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   int_fac = shl(add(1,st->since_last_sid), 10); // Q10
6404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   int_fac = mult(int_fac, st->true_sid_period_inv); // Q10 * Q15 -> Q10
6414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // Maximize to 1.0 in Q10
6434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   if (sub(int_fac, 1024) > 0)
6444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   {
6454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      int_fac = 1024;
6464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   }
6474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   int_fac = shl(int_fac, 4); // Q10 -> Q14
6484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   L_log_en_int = L_mult(int_fac, st->log_en); // Q14 * Q11->Q26
6504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   for(i = 0; i < M; i++)
6514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   {
6524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      lsp_int[i] = mult(int_fac, st->lsp[i]);// Q14 * Q15 -> Q14
6534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   }
6544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   int_fac = sub(16384, int_fac); // 1-k in Q14
6564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // (Q14 * Q11 -> Q26) + Q26 -> Q26
6584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   L_log_en_int = L_mac(L_log_en_int, int_fac, st->old_log_en);
6594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   for(i = 0; i < M; i++)
6604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   {
6614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // Q14 + (Q14 * Q15 -> Q14) -> Q14
6624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      lsp_int[i] = add(lsp_int[i], mult(int_fac, st->lsp_old[i]));
6634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      lsp_int[i] = shl(lsp_int[i], 1); // Q14 -> Q15
6644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   }
6654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // compute the amount of lsf variability
6674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   lsf_variab_factor = sub(st->log_pg_mean,2457); // -0.6 in Q12
6684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // *0.3 Q12*Q15 -> Q12
6694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   lsf_variab_factor = sub(4096, mult(lsf_variab_factor, 9830));
6704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // limit to values between 0..1 in Q12
6724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   if (sub(lsf_variab_factor, 4096) > 0)
6734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   {
6744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      lsf_variab_factor = 4096;
6754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   }
6764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   if (lsf_variab_factor < 0)
6774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   {
6784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      lsf_variab_factor = 0;
6794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   }
6804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   lsf_variab_factor = shl(lsf_variab_factor, 3); // -> Q15
6814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // get index of vector to do variability with
6834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   lsf_variab_index = pseudonoise(&st->L_pn_seed_rx, 3);
6844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // convert to lsf
6864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Lsp_lsf(lsp_int, lsf_int, M);
6874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // apply lsf variability
6894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Copy(lsf_int, lsf_int_variab, M);
6904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   for(i = 0; i < M; i++)
6914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   {
6924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      lsf_int_variab[i] = add(lsf_int_variab[i],
6934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                              mult(lsf_variab_factor,
6944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                   st->lsf_hist_mean[i+lsf_variab_index*M]));
6954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   }
6964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // make sure that LSP's are ordered
6984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Reorder_lsf(lsf_int, LSF_GAP, M);
6994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Reorder_lsf(lsf_int_variab, LSF_GAP, M);
7004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // copy lsf to speech decoders lsf state
7024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Copy(lsf_int, lsfState->past_lsf_q, M);
7034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // convert to lsp
7054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Lsf_lsp(lsf_int, lsp_int, M);
7064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Lsf_lsp(lsf_int_variab, lsp_int_variab, M);
7074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // Compute acoeffs Q12 acoeff is used for level
7094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // normalization and postfilter, acoeff_variab is
7104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // used for synthesis filter
7114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // by doing this we make sure that the level
7124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // in high frequenncies does not jump up and down
7134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Lsp_Az(lsp_int, acoeff);
7154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Lsp_Az(lsp_int_variab, acoeff_variab);
7164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // For use in postfilter
7184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Copy(acoeff, &A_t[0],           M + 1);
7194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Copy(acoeff, &A_t[M + 1],       M + 1);
7204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Copy(acoeff, &A_t[2 * (M + 1)], M + 1);
7214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Copy(acoeff, &A_t[3 * (M + 1)], M + 1);
7224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // Compute reflection coefficients Q15
7244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   A_Refl(&acoeff[1], refl);
7254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // Compute prediction error in Q15
7274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   pred_err = MAX_16; // 0.99997 in Q15
7284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   for (i = 0; i < M; i++)
7294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   {
7304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      pred_err = mult(pred_err, sub(MAX_16, mult(refl[i], refl[i])));
7314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   }
7324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // compute logarithm of prediction gain
7344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Log2(L_deposit_l(pred_err), &log_pg_e, &log_pg_m);
7354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // convert exponent and mantissa to Word16 Q12
7374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   log_pg = shl(sub(log_pg_e,15), 12);  // Q12
7384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   log_pg = shr(sub(0,add(log_pg, shr(log_pg_m, 15-12))), 1);
7394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   st->log_pg_mean = add(mult(29491,st->log_pg_mean),
7404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                         mult(3277, log_pg));
7414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // Compute interpolated log energy
7434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   L_log_en_int = L_shr(L_log_en_int, 10); // Q26 -> Q16
7444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // Add 4 in Q16
7464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   L_log_en_int = L_add(L_log_en_int, 4 * 65536L);
7474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // subtract prediction gain
7494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   L_log_en_int = L_sub(L_log_en_int, L_shl(L_deposit_l(log_pg), 4));
7504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // adjust level to speech coder mode
7524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   L_log_en_int = L_add(L_log_en_int,
7534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        L_shl(L_deposit_l(st->log_en_adjust), 5));
7544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   log_en_int_e = extract_h(L_log_en_int);
7564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   log_en_int_m = extract_l(L_shr(L_sub(L_log_en_int,
7574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                        L_deposit_h(log_en_int_e)), 1));
7584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   level = extract_l(Pow2(log_en_int_e, log_en_int_m)); // Q4
7594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   for (i = 0; i < 4; i++)
7614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   {
7624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // Compute innovation vector
7634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      build_CN_code(&st->L_pn_seed_rx, ex);
7644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      for (j = 0; j < L_SUBFR; j++)
7654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      {
7664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         ex[j] = mult(level, ex[j]);
7674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      }
7684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // Synthesize
7694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      Syn_filt(acoeff_variab, ex, &synth[i * L_SUBFR], L_SUBFR,
7704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               mem_syn, 1);
7714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   } // next i
7734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // reset codebook averaging variables
7754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   averState->hangVar = 20;
7764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   averState->hangCount = 0;
7774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   if (sub(new_state, DTX_MUTE) == 0)
7794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   {
7804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // mute comfort noise as it has been quite a long time since
7814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       * last SID update  was performed
7824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      tmp_int_length = st->since_last_sid;
7844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      if (sub(tmp_int_length, 32) > 0)
7854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      {
7864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         tmp_int_length = 32;
7874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      }
7884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // safety guard against division by zero
7904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      if(tmp_int_length <= 0) {
7914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         tmp_int_length = 8;
7924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      }
7934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      st->true_sid_period_inv = div_s(1 << 10, shl(tmp_int_length, 10));
7954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      st->since_last_sid = 0;
7974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      Copy(st->lsp, st->lsp_old, M);
7984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      st->old_log_en = st->log_en;
7994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // subtract 1/8 in Q11 i.e -6/8 dB
8004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      st->log_en = sub(st->log_en, 256);
8014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   }
8024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // reset interpolation length timer
8044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // if data has been updated.
8054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   if ((st->sid_frame != 0) &&
8064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       ((st->valid_data != 0) ||
8074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        ((st->valid_data == 0) &&  (st->dtxHangoverAdded) != 0)))
8084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   {
8094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      st->since_last_sid =  0;
8104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      st->data_updated = 1;
8114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   }
8124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   return 0;
8144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
8154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
8184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
8194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
8214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
8224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
8244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
8264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
8284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
8294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
8304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
8314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
8324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
8344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
8354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
8364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
8384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
8394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Hubervoid dtx_dec(
8414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    dtx_decState *st,                /* i/o : State struct                    */
8424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 mem_syn[],                /* i/o : AMR decoder state               */
8434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    D_plsfState* lsfState,           /* i/o : decoder lsf states              */
8444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    gc_predState* predState,         /* i/o : prediction states               */
8454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Cb_gain_averageState* averState, /* i/o : CB gain average states          */
8464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    enum DTXStateType new_state,     /* i   : new DTX state                   */
8474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    enum Mode mode,                  /* i   : AMR mode                        */
8484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 parm[],                   /* i   : Vector of synthesis parameters  */
8494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 synth[],                  /* o   : synthesised speech              */
8504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 A_t[],                    /* o   : decoded LP filter in 4 subframes*/
8514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Flag   *pOverflow
8524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber)
8534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
8544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 log_en_index;
8554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 i;
8564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 j;
8574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 int_fac;
8584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word32 L_log_en_int;
8594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 lsp_int[M];
8604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 log_en_int_e;
8614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 log_en_int_m;
8624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 level;
8634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 acoeff[M + 1];
8644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 refl[M];
8654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 pred_err;
8664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 ex[L_SUBFR];
8674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 ma_pred_init;
8684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 log_pg_e;
8694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 log_pg_m;
8704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 log_pg;
8714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Flag negative;
8724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 lsf_mean;
8734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word32 L_lsf_mean;
8744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 lsf_variab_index;
8754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 lsf_variab_factor;
8764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 lsf_int[M];
8774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 lsf_int_variab[M];
8784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 lsp_int_variab[M];
8794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 acoeff_variab[M + 1];
8804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 lsf[M];
8824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word32 L_lsf[M];
8834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 ptr;
8844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 tmp_int_length;
8854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word32 L_temp;
8874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 temp;
8884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*  This function is called if synthesis state is not SPEECH
8904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *  the globally passed  inputs to this function are
8914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * st->sid_frame
8924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * st->valid_data
8934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * st->dtxHangoverAdded
8944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * new_state  (SPEECH, DTX, DTX_MUTE)
8954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     */
8964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if ((st->dtxHangoverAdded != 0) &&
8984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            (st->sid_frame != 0))
8994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
9004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* sid_first after dtx hangover period */
9014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* or sid_upd after dtxhangover        */
9024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* set log_en_adjust to correct value */
9044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->log_en_adjust = dtx_log_en_adjust[mode];
9054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        ptr = st->lsf_hist_ptr + M;
9074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (ptr == 80)
9094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
9104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            ptr = 0;
9114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
9124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        Copy(&st->lsf_hist[st->lsf_hist_ptr], &st->lsf_hist[ptr], M);
9134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        ptr = st->log_en_hist_ptr + 1;
9154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (ptr == DTX_HIST_SIZE)
9174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
9184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            ptr = 0;
9194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
9204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->log_en_hist[ptr] = st->log_en_hist[st->log_en_hist_ptr]; /* Q11 */
9224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* compute mean log energy and lsp *
9244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * from decoded signal (SID_FIRST) */
9254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->log_en = 0;
9264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        for (i = M - 1; i >= 0; i--)
9274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
9284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            L_lsf[i] = 0;
9294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
9304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* average energy and lsp */
9324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        for (i = DTX_HIST_SIZE - 1; i >= 0; i--)
9334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
9344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (st->log_en_hist[i] < 0)
9354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
9364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                temp = ~((~st->log_en_hist[i]) >> 3);
9374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
9384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            else
9394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
9404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                temp = st->log_en_hist[i] >> 3;
9414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
9424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->log_en = add(st->log_en, temp, pOverflow);
9434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            for (j = M - 1; j >= 0; j--)
9444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
9454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                L_lsf[j] = L_add(L_lsf[j],
9464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                 L_deposit_l(st->lsf_hist[i * M + j]), pOverflow);
9474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
9484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
9494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        for (j = M - 1; j >= 0; j--)
9514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
9524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (L_lsf[j] < 0)
9534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
9544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                lsf[j] = (Word16)(~((~L_lsf[j]) >> 3));
9554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
9564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            else
9574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
9584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                lsf[j] = (Word16)(L_lsf[j] >> 3);
9594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
9604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
9614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        Lsf_lsp(lsf, st->lsp, M, pOverflow);
9634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* make log_en speech coder mode independent */
9654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* added again later before synthesis        */
9664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->log_en = sub(st->log_en, st->log_en_adjust, pOverflow);
9674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* compute lsf variability vector */
9694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        Copy(st->lsf_hist, st->lsf_hist_mean, 80);
9704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        for (i = M - 1; i >= 0; i--)
9724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
9734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            L_lsf_mean = 0;
9744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            /* compute mean lsf */
9754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            for (j = 8 - 1; j >= 0; j--)
9764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
9774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                L_lsf_mean = L_add(L_lsf_mean,
9784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                   L_deposit_l(st->lsf_hist_mean[i+j*M]), pOverflow);
9794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
9804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (L_lsf_mean < 0)
9824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
9834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                lsf_mean = (Word16)(~((~L_lsf_mean) >> 3));
9844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
9854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            else
9864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
9874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                lsf_mean = (Word16)(L_lsf_mean >> 3);
9884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
9894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            /* subtract mean and limit to within reasonable limits  *
9904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            * moreover the upper lsf's are attenuated              */
9914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            for (j = 8 - 1; j >= 0; j--)
9924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
9934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                /* subtract mean */
9944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->lsf_hist_mean[i+j*M] =
9954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    sub(st->lsf_hist_mean[i+j*M], lsf_mean, pOverflow);
9964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                /* attenuate deviation from mean, especially for upper lsf's */
9984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->lsf_hist_mean[i+j*M] =
9994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    mult(st->lsf_hist_mean[i+j*M], lsf_hist_mean_scale[i], pOverflow);
10004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                /* limit the deviation */
10024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                if (st->lsf_hist_mean[i+j*M] < 0)
10034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                {
10044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    negative = 1;
10054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                }
10064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                else
10074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                {
10084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    negative = 0;
10094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                }
10104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->lsf_hist_mean[i+j*M] = abs_s(st->lsf_hist_mean[i+j*M]);
10114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                /* apply soft limit */
10134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                if (st->lsf_hist_mean[i+j*M] > 655)
10144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                {
10154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    st->lsf_hist_mean[i+j*M] = 655 + ((st->lsf_hist_mean[i+j*M]
10164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                                       - 655) >> 2);
10174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                }
10184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                /* apply hard limit */
10204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                if (st->lsf_hist_mean[i+j*M] > 1310)
10214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                {
10224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    st->lsf_hist_mean[i+j*M] = 1310;
10234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                }
10244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                if (negative != 0)
10264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                {
10274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    st->lsf_hist_mean[i+j*M] = -st->lsf_hist_mean[i+j*M];
10284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                }
10294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
10304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
10314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
10324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (st->sid_frame != 0)
10354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
10364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* Set old SID parameters, always shift */
10374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* even if there is no new valid_data   */
10384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        Copy(st->lsp, st->lsp_old, M);
10394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->old_log_en = st->log_en;
10404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (st->valid_data != 0)   /* new data available (no CRC) */
10424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
10434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            /* Compute interpolation factor, since the division only works *
10444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             * for values of since_last_sid < 32 we have to limit the      *
10454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             * interpolation to 32 frames                                  */
10464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            tmp_int_length = st->since_last_sid;
10474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->since_last_sid = 0;
10484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (tmp_int_length >= 32)
10504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
10514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                tmp_int_length = 32;
10524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
10534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            L_temp = ((Word32) tmp_int_length) << 10;
10554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (L_temp != (Word32)((Word16) L_temp))
10564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
10574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                *pOverflow = 1;
10584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                L_temp = (Word32)((tmp_int_length > 0) ? MAX_16 : MIN_16);
10594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
10604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            temp = (Word16) L_temp;
10614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (tmp_int_length >= 2)
10634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
10644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->true_sid_period_inv = div_s(1 << 10, temp);
10654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
10664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            else
10674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
10684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->true_sid_period_inv = 1 << 14; /* 0.5 it Q15 */
10694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
10704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            Init_D_plsf_3(lsfState, parm[0]);
10724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            D_plsf_3(lsfState, MRDTX, 0, &parm[1], st->lsp, pOverflow);
10734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            Set_zero(lsfState->past_r_q, M);   /* reset for next speech frame */
10744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            log_en_index = parm[4];
10764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            /* Q11 and divide by 4 */
10774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if ((log_en_index > 63) || (log_en_index < -64))
10784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
10794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->log_en = (log_en_index > 0) ? MAX_16 : MIN_16;
10804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
10814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            else
10824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
10834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->log_en = (log_en_index) << (11 - 2);
10844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
10854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            /* Subtract 2.5 in Q11 */
10874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->log_en = sub(st->log_en, (2560 * 2), pOverflow);
10884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            /* Index 0 is reserved for silence */
10904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (log_en_index == 0)
10914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
10924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->log_en = MIN_16;
10934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
10944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            /* no interpolation at startup after coder reset        */
10964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            /* or when SID_UPD has been received right after SPEECH */
10974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if ((st->data_updated == 0) ||
10994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    (st->dtxGlobalState == SPEECH))
11004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
11014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                Copy(st->lsp, st->lsp_old, M);
11024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->old_log_en = st->log_en;
11034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
11044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        } /* endif valid_data */
11054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* initialize gain predictor memory of other modes */
11074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (st->log_en < 0)
11084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
11094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            temp = ~((~st->log_en) >> 1);
11104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
11114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else
11124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
11134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            temp = st->log_en >> 1;
11144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
11154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        ma_pred_init = sub(temp, 9000, pOverflow);
11164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (ma_pred_init > 0)
11184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
11194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            ma_pred_init = 0;
11204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
11214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else if (ma_pred_init < -14436)
11224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
11234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            ma_pred_init = -14436;
11244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
11254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        predState->past_qua_en[0] = ma_pred_init;
11274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        predState->past_qua_en[1] = ma_pred_init;
11284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        predState->past_qua_en[2] = ma_pred_init;
11294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        predState->past_qua_en[3] = ma_pred_init;
11304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* past_qua_en for other modes than MR122 */
11324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        ma_pred_init = mult(5443, ma_pred_init, pOverflow);
11334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* scale down by factor 20*log10(2) in Q15 */
11344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        predState->past_qua_en_MR122[0] = ma_pred_init;
11354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        predState->past_qua_en_MR122[1] = ma_pred_init;
11364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        predState->past_qua_en_MR122[2] = ma_pred_init;
11374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        predState->past_qua_en_MR122[3] = ma_pred_init;
11384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    } /* endif sid_frame */
11394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* CN generation */
11414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* recompute level adjustment factor Q11             *
11424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * st->log_en_adjust = 0.9*st->log_en_adjust +       *
11434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *                     0.1*dtx_log_en_adjust[mode]); */
11444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (dtx_log_en_adjust[mode] > 1023)
11454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
11464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = MAX_16;
11474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
11484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else if (dtx_log_en_adjust[mode] < -1024)
11494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
11504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = MIN_16;
11514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
11524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else
11534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
11544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = mult((Word16)((Word32)dtx_log_en_adjust[mode] << 5), 3277, pOverflow);
11554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
11564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (temp < 0)
11584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
11594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = ~((~temp) >> 5);
11604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
11614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else
11624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
11634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp >>= 5;
11644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
11654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->log_en_adjust = add(mult(st->log_en_adjust, 29491, pOverflow), temp, pOverflow);
11664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Interpolate SID info */
11684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    int_fac = shl(add(1, st->since_last_sid, pOverflow), 10, pOverflow); /* Q10 */
11694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    int_fac = mult(int_fac, st->true_sid_period_inv, pOverflow); /* Q10 * Q15 -> Q10 */
11704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Maximize to 1.0 in Q10 */
11724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (int_fac > 1024)
11734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
11744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        int_fac = 16384;
11754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
11764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else if (int_fac < -2048)
11774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
11784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        int_fac = MIN_16;
11794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
11804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else
11814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
11824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        int_fac <<= 4;      /* Q10 -> Q14 */
11834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
11844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    L_log_en_int = L_mult(int_fac, st->log_en, pOverflow); /* Q14 * Q11->Q26 */
11864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = M - 1; i >= 0; i--)
11874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
11884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        lsp_int[i] = mult(int_fac, st->lsp[i], pOverflow);/* Q14 * Q15 -> Q14 */
11894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
11904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    int_fac = sub(16384, int_fac, pOverflow); /* 1-k in Q14 */
11924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* (Q14 * Q11 -> Q26) + Q26 -> Q26 */
11944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    L_log_en_int = L_mac(L_log_en_int, int_fac, st->old_log_en, pOverflow);
11954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = M - 1; i >= 0; i--)
11964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
11974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* Q14 + (Q14 * Q15 -> Q14) -> Q14 */
11984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        lsp_int[i] = add(lsp_int[i], mult(int_fac, st->lsp_old[i], pOverflow), pOverflow);
11994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        L_temp = ((Word32) lsp_int[i]) << 1;    /* Q14 -> Q15 */
12014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (L_temp != (Word32)((Word16) L_temp))
12024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
12034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            *pOverflow = 1;
12044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            L_temp = (Word32)((lsp_int[i] > 0) ? MAX_16 : MIN_16);
12054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
12064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        lsp_int[i] = (Word16) L_temp;
12074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
12084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* compute the amount of lsf variability */
12104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsf_variab_factor = sub(st->log_pg_mean, 2457, pOverflow); /* -0.6 in Q12 */
12114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* *0.3 Q12*Q15 -> Q12 */
12124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsf_variab_factor = sub(4096, mult(lsf_variab_factor, 9830, pOverflow), pOverflow);
12134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* limit to values between 0..1 in Q12 */
12154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (lsf_variab_factor > 4095)
12164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
12174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        lsf_variab_factor = MAX_16;
12184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
12194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else if (lsf_variab_factor < 0)
12204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
12214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        lsf_variab_factor = 0;
12224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
12234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else
12244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
12254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        lsf_variab_factor <<= 3; /* -> Q15 */
12264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
12274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* get index of vector to do variability with */
12294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsf_variab_index = pseudonoise(&st->L_pn_seed_rx, 3);
12304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* convert to lsf */
12324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Lsp_lsf(lsp_int, lsf_int, M, pOverflow);
12334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* apply lsf variability */
12354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Copy(lsf_int, lsf_int_variab, M);
12364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = M - 1; i >= 0; i--)
12374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
12384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        lsf_int_variab[i] = add(lsf_int_variab[i],
12394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                mult(lsf_variab_factor,
12404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     st->lsf_hist_mean[i+lsf_variab_index*M], pOverflow)
12414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                , pOverflow);
12424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
12434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* make sure that LSP's are ordered */
12454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Reorder_lsf(lsf_int, LSF_GAP, M, pOverflow);
12464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Reorder_lsf(lsf_int_variab, LSF_GAP, M, pOverflow);
12474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* copy lsf to speech decoders lsf state */
12494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Copy(lsf_int, lsfState->past_lsf_q, M);
12504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* convert to lsp */
12524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Lsf_lsp(lsf_int, lsp_int, M, pOverflow);
12534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Lsf_lsp(lsf_int_variab, lsp_int_variab, M, pOverflow);
12544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Compute acoeffs Q12 acoeff is used for level    *
12564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * normalization and postfilter, acoeff_variab is  *
12574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * used for synthesis filter                       *
12584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * by doing this we make sure that the level       *
12594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * in high frequenncies does not jump up and down  */
12604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Lsp_Az(lsp_int, acoeff, pOverflow);
12624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Lsp_Az(lsp_int_variab, acoeff_variab, pOverflow);
12634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* For use in postfilter */
12654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Copy(acoeff, &A_t[0],           M + 1);
12664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Copy(acoeff, &A_t[M + 1],       M + 1);
12674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Copy(acoeff, &A_t[2 *(M + 1)], M + 1);
12684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Copy(acoeff, &A_t[3 *(M + 1)], M + 1);
12694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Compute reflection coefficients Q15 */
12714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    A_Refl(&acoeff[1], refl, pOverflow);
12724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Compute prediction error in Q15 */
12744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    pred_err = MAX_16; /* 0.99997 in Q15 */
12754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = 0; i < M; i++)
12764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
12774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        L_temp = (((Word32) refl[i]) * refl[i]) >> 15;
12784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (L_temp <= 0x00007fffL)
12794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
12804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            temp = MAX_16 - (Word16) L_temp;
12814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
12824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else
12834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
12844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            *pOverflow = 1;
12854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            temp = 0;
12864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
12874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        pred_err = mult(pred_err, temp, pOverflow);
12884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
12894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* compute logarithm of prediction gain */
12914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Log2(L_deposit_l(pred_err), &log_pg_e, &log_pg_m, pOverflow);
12924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* convert exponent and mantissa to Word16 Q12 */
12944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    log_pg = shl(sub(log_pg_e, 15, pOverflow), 12, pOverflow); /* Q12 */
12954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    log_pg = shr(sub(0, add(log_pg, shr(log_pg_m, 15 - 12, pOverflow),
12964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                            pOverflow), pOverflow), 1, pOverflow);
12974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->log_pg_mean = add(mult(29491, st->log_pg_mean, pOverflow),
12984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                          mult(3277, log_pg, pOverflow), pOverflow);
12994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Compute interpolated log energy */
13014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    L_log_en_int = L_shr(L_log_en_int, 10, pOverflow); /* Q26 -> Q16 */
13024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Add 4 in Q16 */
13044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    L_log_en_int = L_add(L_log_en_int, 4 * 65536L, pOverflow);
13054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* subtract prediction gain */
13074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    L_log_en_int = L_sub(L_log_en_int, L_shl(L_deposit_l(log_pg), 4, pOverflow), pOverflow);
13084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* adjust level to speech coder mode */
13104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    L_log_en_int = L_add(L_log_en_int,
13114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                         L_shl(L_deposit_l(st->log_en_adjust), 5, pOverflow), pOverflow);
13124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    log_en_int_e = (Word16)(L_log_en_int >> 16);
13144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    log_en_int_m = (Word16)(L_shr(L_sub(L_log_en_int,
13164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                        L_deposit_h(log_en_int_e), pOverflow), 1, pOverflow));
13174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    level = (Word16)(Pow2(log_en_int_e, log_en_int_m, pOverflow));  /* Q4 */
13184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = 0; i < 4; i++)
13204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
13214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* Compute innovation vector */
13224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        build_CN_code(&st->L_pn_seed_rx, ex, pOverflow);
13234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        for (j = L_SUBFR - 1; j >= 0; j--)
13244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
13254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            ex[j] = mult(level, ex[j], pOverflow);
13264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
13274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* Synthesize */
13284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        Syn_filt(acoeff_variab, ex, &synth[i * L_SUBFR], L_SUBFR,
13294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                 mem_syn, 1);
13304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    } /* next i */
13324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* reset codebook averaging variables */
13344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    averState->hangVar = 20;
13354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    averState->hangCount = 0;
13364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (new_state == DTX_MUTE)
13384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
13394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* mute comfort noise as it has been quite a long time since
13404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * last SID update  was performed                            */
13414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        tmp_int_length = st->since_last_sid;
13434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (tmp_int_length > 32)
13454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
13464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            tmp_int_length = 32;
13474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
13484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else if (tmp_int_length <= 0)
13494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
13504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            /* safety guard against division by zero */
13514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            tmp_int_length = 8;
13524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
13534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        L_temp = ((Word32) tmp_int_length) << 10;
13554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (L_temp != (Word32)((Word16) L_temp))
13564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
13574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            *pOverflow = 1;
13584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            L_temp = (Word32)((tmp_int_length > 0) ? MAX_16 : MIN_16);
13594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
13604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = (Word16) L_temp;
13614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->true_sid_period_inv = div_s(1 << 10, temp);
13634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->since_last_sid = 0;
13654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        Copy(st->lsp, st->lsp_old, M);
13664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->old_log_en = st->log_en;
13674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* subtract 1/8 in Q11 i.e -6/8 dB */
13684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->log_en = sub(st->log_en, 256, pOverflow);
13694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
13704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* reset interpolation length timer
13724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * if data has been updated.        */
13734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if ((st->sid_frame != 0) &&
13744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            ((st->valid_data != 0) ||
13754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             ((st->valid_data == 0) && (st->dtxHangoverAdded) != 0)))
13764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
13774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->since_last_sid =  0;
13784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->data_updated = 1;
13794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
13804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    return;
13824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
13834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/****************************************************************************/
13864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
13884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
13894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: dtx_dec_activity_update
13904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
13914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
13924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
13944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st = pointer to a structure of type dtx_decState
13954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsf =
13964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        frame =
13974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
13994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st points to an updated structure of type dtx_decState
14004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
14024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None.
14034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
14054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None.
14064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
14084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None.
14094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
14114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
14124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber This function updates the DTX parameters.
14144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
14164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
14174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
14194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
14214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
14224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber dtx_dec.c, UMTS GSM AMR speech codec, R99 - Version 3.3.0, December 12, 2001
14244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
14264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
14274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Hubervoid dtx_dec_activity_update(dtx_decState *st,
14294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                             Word16 lsf[],
14304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                             Word16 frame[])
14314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
14324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 i;
14334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word32 L_frame_en;
14354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Word16 log_en_e, log_en_m, log_en;
14364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // update lsp history
14384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   st->lsf_hist_ptr = add(st->lsf_hist_ptr,M);
14394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   if (sub(st->lsf_hist_ptr, 80) == 0)
14404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   {
14414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      st->lsf_hist_ptr = 0;
14424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   }
14434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Copy(lsf, &st->lsf_hist[st->lsf_hist_ptr], M);
14444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // compute log energy based on frame energy
14464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   L_frame_en = 0;     // Q0
14474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   for (i=0; i < L_FRAME; i++)
14484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   {
14494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      L_frame_en = L_mac(L_frame_en, frame[i], frame[i]);
14504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   }
14514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   Log2(L_frame_en, &log_en_e, &log_en_m);
14524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // convert exponent and mantissa to Word16 Q10
14544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   log_en = shl(log_en_e, 10);  // Q10
14554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   log_en = add(log_en, shr(log_en_m, 15-10));
14564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // divide with L_FRAME i.e subtract with log2(L_FRAME) = 7.32193
14584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   log_en = sub(log_en, 7497+1024);
14594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // insert into log energy buffer, no division by two as  *
14614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    * log_en in decoder is Q11
14624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   st->log_en_hist_ptr = add(st->log_en_hist_ptr, 1);
14634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   if (sub(st->log_en_hist_ptr, DTX_HIST_SIZE) == 0)
14644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   {
14654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      st->log_en_hist_ptr = 0;
14664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   }
14674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   st->log_en_hist[st->log_en_hist_ptr] = log_en; // Q11
14684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
14694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
14714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
14724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
14744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
14754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
14774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
14794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
14814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
14824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
14834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
14844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
14854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
14874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
14884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
14894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
14914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
14924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Hubervoid dtx_dec_activity_update(dtx_decState *st,
14944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                             Word16 lsf[],
14954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                             Word16 frame[],
14964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                             Flag   *pOverflow)
14974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
14984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 i;
14994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word32 L_frame_en;
15014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word32 L_temp;
15024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 log_en_e;
15034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 log_en_m;
15044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 log_en;
15054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* update lsp history */
15074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->lsf_hist_ptr += M;
15084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (st->lsf_hist_ptr == 80)
15104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
15114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->lsf_hist_ptr = 0;
15124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
15134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Copy(lsf, &st->lsf_hist[st->lsf_hist_ptr], M);
15144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* compute log energy based on frame energy */
15164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    L_frame_en = 0;     /* Q0 */
15174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = L_FRAME - 1; i >= 0; i--)
15184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
15194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        L_temp = ((Word32) frame[i]) * frame[i];
15204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (L_temp != (Word32) 0x40000000L)
15214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
15224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            L_temp = L_temp << 1;
15234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
15244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else
15254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
15264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            L_temp = MAX_32;
15274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
15284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        L_frame_en = L_add(L_frame_en, L_temp, pOverflow);
15294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
15304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Log2(L_frame_en, &log_en_e, &log_en_m, pOverflow);
15314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* convert exponent and mantissa to Word16 Q10 */
15334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    L_temp = ((Word32) log_en_e) << 10;
15344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (L_temp != (Word32)((Word16) L_temp))
15364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
15374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        *pOverflow = 1;
15384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        L_temp = (Word32)((log_en_e > 0) ? MAX_16 : MIN_16);
15394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
15404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    log_en_e = (Word16) L_temp;
15414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (log_en_m < 0)
15434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
15444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        log_en_m = ~((~log_en_m) >> 5);
15454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
15464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else
15474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
15484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        log_en_m >>= 5;
15494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
15504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    log_en = add(log_en_e, log_en_m, pOverflow);
15514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* divide with L_FRAME i.e subtract with log2(L_FRAME) = 7.32193 */
15534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    log_en = sub(log_en, 7497 + 1024, pOverflow);
15544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* insert into log energy buffer, no division by two as  *
15564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    * log_en in decoder is Q11                              */
15574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->log_en_hist_ptr += 1;
15584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (st->log_en_hist_ptr == DTX_HIST_SIZE)
15604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
15614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->log_en_hist_ptr = 0;
15624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
15634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->log_en_hist[st->log_en_hist_ptr] = log_en; /* Q11 */
15644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    return;
15664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
15674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/****************************************************************************/
15694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
15714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
15724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: rx_dtx_handler
15734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
15744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
15754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
15774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st = pointer to a structure of type dtx_decState
15784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    frame_type = RX frame type
15794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
15814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    newState = variable of type DTXStateType
15824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
15844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st points to an updated structure of type dtx_decState
15854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
15874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None.
15884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
15904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None.
15914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
15934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
15944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber This function determines the new state of the decoder based on the frame_type
15964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber and sets up the decoder parameters according to newState.
15974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Table of new SPD synthesis states
15994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                           |     previous SPD_synthesis_state
16014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     Incoming              |
16024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     frame_type            | SPEECH       | DTX           | DTX_MUTE
16034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     ---------------------------------------------------------------
16044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     RX_SPEECH_GOOD ,      |              |               |
16054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     RX_SPEECH_PR_DEGRADED | SPEECH       | SPEECH        | SPEECH
16064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     ----------------------------------------------------------------
16074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     RX_SPEECH_PR_BAD,     |              |               |
16084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     RX_SPEECH_BAD,        | SPEECH       | DTX           | DTX_MUTE
16094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     ----------------------------------------------------------------
16104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     RX_SID_FIRST,         | DTX          | DTX/(DTX_MUTE)| DTX_MUTE
16114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     ----------------------------------------------------------------
16124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     RX_SID_UPDATE,        | DTX          | DTX           | DTX
16134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     ----------------------------------------------------------------
16144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     RX_SID_BAD,           | DTX          | DTX/(DTX_MUTE)| DTX_MUTE
16154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     ----------------------------------------------------------------
16164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     RX_NO_DATA            | SPEECH       | DTX/(DTX_MUTE)| DTX_MUTE
16174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                           |(class2 garb.)|               |
16184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     ----------------------------------------------------------------
16194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     RX_ONSET              | SPEECH       | DTX/(DTX_MUTE)| DTX_MUTE
16204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                           |(class2 garb.)|               |
16214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     ----------------------------------------------------------------
16224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
16244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
16254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
16274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
16294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
16304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber dtx_dec.c, UMTS GSM AMR speech codec, R99 - Version 3.3.0, December 12, 2001
16324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
16344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
16354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberenum DTXStateType rx_dtx_handler(
16374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                      dtx_decState *st,           // i/o : State struct
16384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                      enum RXFrameType frame_type // i   : Frame type
16394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                      )
16404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
16414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   enum DTXStateType newState;
16424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   enum DTXStateType encState;
16434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // DTX if SID frame or previously in DTX{_MUTE} and (NO_RX OR BAD_SPEECH)
16454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   if ((sub(frame_type, RX_SID_FIRST) == 0)   ||
16464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       (sub(frame_type, RX_SID_UPDATE) == 0)  ||
16474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       (sub(frame_type, RX_SID_BAD) == 0)     ||
16484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       (((sub(st->dtxGlobalState, DTX) == 0) ||
16494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         (sub(st->dtxGlobalState, DTX_MUTE) == 0)) &&
16504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        ((sub(frame_type, RX_NO_DATA) == 0) ||
16514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         (sub(frame_type, RX_SPEECH_BAD) == 0) ||
16524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         (sub(frame_type, RX_ONSET) == 0))))
16534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   {
16544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      newState = DTX;
16554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // stay in mute for these input types
16574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      if ((sub(st->dtxGlobalState, DTX_MUTE) == 0) &&
16584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          ((sub(frame_type, RX_SID_BAD) == 0) ||
16594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           (sub(frame_type, RX_SID_FIRST) ==  0) ||
16604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           (sub(frame_type, RX_ONSET) ==  0) ||
16614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           (sub(frame_type, RX_NO_DATA) == 0)))
16624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      {
16634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         newState = DTX_MUTE;
16644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      }
16654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // evaluate if noise parameters are too old
16674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // since_last_sid is reset when CN parameters have been updated
16684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      st->since_last_sid = add(st->since_last_sid, 1);
16694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // no update of sid parameters in DTX for a long while
16714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // Due to the delayed update of  st->since_last_sid counter
16724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // SID_UPDATE frames need to be handled separately to avoid
16734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // entering DTX_MUTE for late SID_UPDATE frames
16744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      if((sub(frame_type, RX_SID_UPDATE) != 0) &&
16754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         (sub(st->since_last_sid, DTX_MAX_EMPTY_THRESH) > 0))
16764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      {
16774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         newState = DTX_MUTE;
16784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      }
16794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   }
16804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   else
16814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   {
16824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      newState = SPEECH;
16834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      st->since_last_sid = 0;
16844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   }
16854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // reset the decAnaElapsed Counter when receiving CNI data the first
16874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // time, to robustify counter missmatch after handover
16884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // this might delay the bwd CNI analysis in the new decoder slightly.
16894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   if ((st->data_updated == 0) &&
16914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       (sub(frame_type, RX_SID_UPDATE) == 0))
16924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   {
16934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      st->decAnaElapsedCount = 0;
16944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   }
16954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // update the SPE-SPD DTX hangover synchronization
16974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // to know when SPE has added dtx hangover
16984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   st->decAnaElapsedCount = add(st->decAnaElapsedCount, 1);
16994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   st->dtxHangoverAdded = 0;
17004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   if ((sub(frame_type, RX_SID_FIRST) == 0)  ||
17024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       (sub(frame_type, RX_SID_UPDATE) == 0) ||
17034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       (sub(frame_type, RX_SID_BAD) == 0)    ||
17044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       (sub(frame_type, RX_ONSET) == 0)      ||
17054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       (sub(frame_type, RX_NO_DATA) == 0))
17064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   {
17074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      encState = DTX;
17084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // In frame errors simulations RX_NO_DATA may occasionally mean that
17104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // a speech packet was probably sent by the encoder,
17114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // the assumed _encoder_ state should be SPEECH in such cases.
17124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      if((sub(frame_type, RX_NO_DATA) == 0) &&
17134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         (sub(newState, SPEECH) == 0))
17144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      {
17154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         encState = SPEECH;
17164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      }
17174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // Note on RX_ONSET operation differing from RX_NO_DATA operation:
17194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // If a  RX_ONSET is received in the decoder (by "accident")
17204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // it is still most likely that the encoder  state
17214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // for the "ONSET frame" was DTX.
17224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   }
17244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   else
17254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   {
17264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      encState = SPEECH;
17274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   }
17284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   if (sub(encState, SPEECH) == 0)
17304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   {
17314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      st->dtxHangoverCount = DTX_HANG_CONST;
17324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   }
17334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   else
17344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   {
17354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      if (sub(st->decAnaElapsedCount, DTX_ELAPSED_FRAMES_THRESH) > 0)
17364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      {
17374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         st->dtxHangoverAdded = 1;
17384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         st->decAnaElapsedCount = 0;
17394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         st->dtxHangoverCount = 0;
17404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      }
17414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      else if (st->dtxHangoverCount == 0)
17424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      {
17434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         st->decAnaElapsedCount = 0;
17444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      }
17454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      else
17464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      {
17474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         st->dtxHangoverCount = sub(st->dtxHangoverCount, 1);
17484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      }
17494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   }
17504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   if (sub(newState, SPEECH) != 0)
17524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   {
17534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // DTX or DTX_MUTE
17544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // CN data is not in a first SID, first SIDs are marked as SID_BAD
17554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      //  but will do backwards analysis if a hangover period has been added
17564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      // according to the state machine above
17574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      st->sid_frame = 0;
17594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      st->valid_data = 0;
17604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      if (sub(frame_type, RX_SID_FIRST) == 0)
17624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      {
17634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         st->sid_frame = 1;
17644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      }
17654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      else if (sub(frame_type, RX_SID_UPDATE) == 0)
17664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      {
17674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         st->sid_frame = 1;
17684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         st->valid_data = 1;
17694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      }
17704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      else if (sub(frame_type, RX_SID_BAD) == 0)
17714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      {
17724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         st->sid_frame = 1;
17734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         st->dtxHangoverAdded = 0; // use old data
17744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      }
17754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   }
17764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   return newState;
17784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   // newState is used by both SPEECH AND DTX synthesis routines
17794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
17804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
17824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
17834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
17854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
17864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
17884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
17904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
17924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
17934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
17944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
17954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
17964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
17984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
17994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
18004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
18024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
18034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberenum DTXStateType rx_dtx_handler(
18054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    dtx_decState *st,           /* i/o : State struct     */
18064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    enum RXFrameType frame_type,/* i   : Frame type       */
18074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Flag *pOverflow)
18084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
18094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    enum DTXStateType newState;
18104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    enum DTXStateType encState;
18114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* DTX if SID frame or previously in DTX{_MUTE} and (NO_RX OR BAD_SPEECH) */
18144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if ((frame_type == RX_SID_FIRST)   ||
18164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            (frame_type == RX_SID_UPDATE)  ||
18174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            (frame_type == RX_SID_BAD)     ||
18184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            (((st->dtxGlobalState == DTX) || (st->dtxGlobalState == DTX_MUTE)) &&
18194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             ((frame_type == RX_NO_DATA) || (frame_type == RX_SPEECH_BAD) ||
18204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              (frame_type == RX_ONSET))))
18214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
18224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        newState = DTX;
18234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* stay in mute for these input types */
18254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if ((st->dtxGlobalState == DTX_MUTE) &&
18274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                ((frame_type == RX_SID_BAD) ||
18284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                 (frame_type == RX_SID_FIRST) ||
18294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                 (frame_type == RX_ONSET) ||
18304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                 (frame_type == RX_NO_DATA)))
18314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
18324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            newState = DTX_MUTE;
18334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
18344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* evaluate if noise parameters are too old                     */
18364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* since_last_sid is reset when CN parameters have been updated */
18374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->since_last_sid = add(st->since_last_sid, 1, pOverflow);
18384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* no update of sid parameters in DTX for a long while      */
18404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* Due to the delayed update of  st->since_last_sid counter */
18414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* SID_UPDATE frames need to be handled separately to avoid */
18424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* entering DTX_MUTE for late SID_UPDATE frames             */
18434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if ((frame_type != RX_SID_UPDATE) &&
18444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                (st->since_last_sid > DTX_MAX_EMPTY_THRESH))
18454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
18464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            newState = DTX_MUTE;
18474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
18484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
18494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else
18504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
18514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        newState = SPEECH;
18524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->since_last_sid = 0;
18534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
18544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*
18564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    reset the decAnaElapsed Counter when receiving CNI data the first
18574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    time, to robustify counter missmatch after handover
18584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    this might delay the bwd CNI analysis in the new decoder slightly.
18594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    */
18604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if ((st->data_updated == 0) &&
18624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            (frame_type == RX_SID_UPDATE))
18634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
18644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->decAnaElapsedCount = 0;
18654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
18664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* update the SPE-SPD DTX hangover synchronization */
18684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* to know when SPE has added dtx hangover         */
18694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->decAnaElapsedCount = add(st->decAnaElapsedCount, 1, pOverflow);
18704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->dtxHangoverAdded = 0;
18714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if ((frame_type == RX_SID_FIRST)  ||
18734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            (frame_type == RX_SID_UPDATE) ||
18744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            (frame_type == RX_SID_BAD)    ||
18754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            (frame_type == RX_ONSET) ||
18764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            (frame_type == RX_NO_DATA))
18774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
18784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        encState = DTX;
18794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /*
18814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         In frame errors simulations RX_NO_DATA may occasionally mean that
18824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         a speech packet was probably sent by the encoder,
18834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         the assumed _encoder_ state should be SPEECH in such cases.
18844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        */
18854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if ((frame_type == RX_NO_DATA) &&
18864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                (newState == SPEECH))
18874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
18884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            encState = SPEECH;
18894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
18904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /*
18924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         Note on RX_ONSET operation differing from RX_NO_DATA operation:
18934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         If a  RX_ONSET is received in the decoder (by "accident")
18944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         it is still most likely that the encoder  state
18954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         for the "ONSET frame" was DTX.
18964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        */
18974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
18984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else
18994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
19004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        encState = SPEECH;
19014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
19024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (encState == SPEECH)
19054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
19064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->dtxHangoverCount = DTX_HANG_CONST;
19074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
19084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else
19094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
19104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (st->decAnaElapsedCount > DTX_ELAPSED_FRAMES_THRESH)
19124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
19134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->dtxHangoverAdded = 1;
19144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->decAnaElapsedCount = 0;
19154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->dtxHangoverCount = 0;
19164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
19174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else if (st->dtxHangoverCount == 0)
19184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
19194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->decAnaElapsedCount = 0;
19204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
19214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else
19224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
19234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->dtxHangoverCount -= 1;
19244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
19254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
19264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (newState != SPEECH)
19284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
19294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* DTX or DTX_MUTE
19304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * CN data is not in a first SID, first SIDs are marked as SID_BAD
19314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *  but will do backwards analysis if a hangover period has been added
19324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *  according to the state machine above
19334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        */
19344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->sid_frame = 0;
19364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->valid_data = 0;
19374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (frame_type == RX_SID_FIRST)
19394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
19404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->sid_frame = 1;
19414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
19424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else if (frame_type == RX_SID_UPDATE)
19434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
19444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->sid_frame = 1;
19454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->valid_data = 1;
19464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
19474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else if (frame_type == RX_SID_BAD)
19484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
19494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->sid_frame = 1;
19504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->dtxHangoverAdded = 0; /* use old data */
19514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
19524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
19534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* newState is used by both SPEECH AND DTX synthesis routines */
19554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    return(newState);
19564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
1957