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 Pathname: ./audio/gsm-amr/c/src/dec_amr.c 334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Funtions: Decoder_amr_init 344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Decoder_amr_reset 354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Decoder_amr 364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------ 384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber MODULE DESCRIPTION 394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber This file contains the function used to decode one speech frame using a given 414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber codec mode. The functions used to initialize, reset, and exit are also 424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber included in this file. 434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------ 454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/ 464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*---------------------------------------------------------------------------- 484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; INCLUDES 494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber----------------------------------------------------------------------------*/ 504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include <string.h> 514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "dec_amr.h" 534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "typedef.h" 544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "cnst.h" 554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "copy.h" 564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "set_zero.h" 574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "syn_filt.h" 584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "d_plsf.h" 594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "agc.h" 604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "int_lpc.h" 614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "dec_gain.h" 624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "dec_lag3.h" 634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "dec_lag6.h" 644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "d2_9pf.h" 654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "d2_11pf.h" 664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "d3_14pf.h" 674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "d4_17pf.h" 684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "d8_31pf.h" 694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "d1035pf.h" 704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "pred_lt.h" 714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "d_gain_p.h" 724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "d_gain_c.h" 734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "dec_gain.h" 744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "ec_gains.h" 754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "ph_disp.h" 764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "c_g_aver.h" 774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "int_lsf.h" 784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "lsp_lsf.h" 794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "lsp_avg.h" 804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "bgnscd.h" 814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "ex_ctrl.h" 824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "sqrt_l.h" 834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "frame.h" 844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "bitno_tab.h" 854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "b_cn_cod.h" 864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "basic_op.h" 874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*---------------------------------------------------------------------------- 894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; MACROS 904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; Define module specific macros here 914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber----------------------------------------------------------------------------*/ 924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*---------------------------------------------------------------------------- 944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; DEFINES 954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; Include all pre-processor statements here. Include conditional 964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; compile variables also. 974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber----------------------------------------------------------------------------*/ 984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*---------------------------------------------------------------------------- 1004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; LOCAL FUNCTION DEFINITIONS 1014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; Function Prototype declaration 1024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber----------------------------------------------------------------------------*/ 1034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 1044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*---------------------------------------------------------------------------- 1054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; LOCAL VARIABLE DEFINITIONS 1064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; Variable declaration - defined here and used outside this module 1074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber----------------------------------------------------------------------------*/ 1084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 1094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 1104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/* 1114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------ 1124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: Decoder_amr_init 1134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------ 1144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS 1154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 1164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs: 1174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state = pointer to a pointer to structures of type Decoder_amrState 1184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 1194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs: 1204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber structure pointed to by the pointer which is pointed to by state is 1214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber initialized to each field's initial values 1224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 1234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state pointer points to the address of the memory allocated by 1244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Decoder_amr_init function 1254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 1264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns: 1274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber return_value = 0, if the initialization was successful; -1, otherwise (int) 1284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 1294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used: 1304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None 1314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 1324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed: 1334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None 1344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 1354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------ 1364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION 1374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 1384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber This function allocates and initializes state memory used by the Decoder_amr 1394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber function. It stores the pointer to the filter status structure in state. This 1404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pointer has to be passed to Decoder_amr in each call. The function returns 1414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 0, if initialization was successful and -1, otherwise. 1424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 1434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------ 1444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS 1454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 1464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None 1474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 1484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------ 1494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES 1504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 1514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber dec_amr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 1524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 1534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------ 1544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE 1554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 1564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberint Decoder_amr_init (Decoder_amrState **state) 1574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{ 1584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Decoder_amrState* s; 1594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 i; 1604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 1614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (state == (Decoder_amrState **) NULL){ 1624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber fprintf(stderr, "Decoder_amr_init: invalid parameter\n"); 1634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber return -1; 1644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 1654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *state = NULL; 1664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 1674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // allocate memory 1684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if ((s= (Decoder_amrState *) malloc(sizeof(Decoder_amrState))) == NULL){ 1694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber fprintf(stderr, "Decoder_amr_init: can not malloc state structure\n"); 1704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber return -1; 1714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 1724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 1734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber s->T0_lagBuff = 40; 1744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber s->inBackgroundNoise = 0; 1754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber s->voicedHangover = 0; 1764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i = 0; i < 9; i++) 1774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber s->ltpGainHistory[i] = 0; 1784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 1794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber s->lsfState = NULL; 1804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber s->ec_gain_p_st = NULL; 1814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber s->ec_gain_c_st = NULL; 1824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber s->pred_state = NULL; 1834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber s->ph_disp_st = NULL; 1844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber s->dtxDecoderState = NULL; 1854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 1864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (D_plsf_init(&s->lsfState) || 1874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_pitch_init(&s->ec_gain_p_st) || 1884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_code_init(&s->ec_gain_c_st) || 1894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber gc_pred_init(&s->pred_state) || 1904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Cb_gain_average_init(&s->Cb_gain_averState) || 1914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber lsp_avg_init(&s->lsp_avg_st) || 1924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Bgn_scd_init(&s->background_state) || 1934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ph_disp_init(&s->ph_disp_st) || 1944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber dtx_dec_init(&s->dtxDecoderState)) { 1954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Decoder_amr_exit(&s); 1964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber return -1; 1974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 1984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 1994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Decoder_amr_reset(s, (enum Mode)0); 2004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *state = s; 2014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber return 0; 2034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber} 2044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------ 2064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional] 2074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the 2094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below. 2104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes 2124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes 2144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 2164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber used to represent cycle count for each subroutine 2174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber called) 2184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber where: (cycle count variable) = cycle count for [subroutine 2194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber name] 2204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------ 2224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional] 2234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function] 2244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------ 2264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/ 2274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas HuberWord16 Decoder_amr_init(Decoder_amrState *s) 2294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{ 2304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 i; 2314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (s == (Decoder_amrState *) NULL) 2334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 2344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* fprint(stderr, "Decoder_amr_init: invalid parameter\n"); */ 2354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber return(-1); 2364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 2374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber s->T0_lagBuff = 40; 2394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber s->inBackgroundNoise = 0; 2404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber s->voicedHangover = 0; 2414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* Initialize overflow Flag */ 2434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber s->overflow = 0; 2454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i = 0; i < LTP_GAIN_HISTORY_LEN; i++) 2474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 2484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber s->ltpGainHistory[i] = 0; 2494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 2504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber D_plsf_reset(&s->lsfState); 2524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_pitch_reset(&s->ec_gain_p_st); 2534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_code_reset(&s->ec_gain_c_st); 2544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Cb_gain_average_reset(&s->Cb_gain_averState); 2554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber lsp_avg_reset(&s->lsp_avg_st); 2564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Bgn_scd_reset(&s->background_state); 2574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ph_disp_reset(&s->ph_disp_st); 2584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber dtx_dec_reset(&s->dtxDecoderState); 2594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber gc_pred_reset(&s->pred_state); 2604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Decoder_amr_reset(s, MR475); 2624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber return(0); 2644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber} 2654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/****************************************************************************/ 2674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/* 2694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------ 2704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: Decoder_amr_reset 2714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------ 2724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS 2734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs: 2754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state = pointer to a structure of type Decoder_amrState 2764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mode = codec mode (enum Mode) 2774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs: 2794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber structure pointed to by state is initialized to its reset value 2804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns: 2824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber return_value = 0, if reset was successful; -1, otherwise (int) 2834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used: 2854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None 2864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed: 2884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None 2894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------ 2914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION 2924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber This function resets the state memory used by the Decoder_amr function. It 2944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber returns a 0, if reset was successful and -1, otherwise. 2954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------ 2974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS 2984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 2994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None 3004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------ 3024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES 3034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber dec_amr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 3054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------ 3074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE 3084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberint Decoder_amr_reset (Decoder_amrState *state, enum Mode mode) 3104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{ 3114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 i; 3124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (state == (Decoder_amrState *) NULL){ 3144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber fprintf(stderr, "Decoder_amr_reset: invalid parameter\n"); 3154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber return -1; 3164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 3174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // Initialize static pointer 3194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->exc = state->old_exc + PIT_MAX + L_INTERPOL; 3204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // Static vectors to zero 3224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Set_zero (state->old_exc, PIT_MAX + L_INTERPOL); 3234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (mode != MRDTX) 3254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Set_zero (state->mem_syn, M); 3264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // initialize pitch sharpening 3284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->sharp = SHARPMIN; 3294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->old_T0 = 40; 3304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // Initialize state->lsp_old [] 3324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (mode != MRDTX) { 3344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Copy(lsp_init_data, &state->lsp_old[0], M); 3354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 3364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // Initialize memories of bad frame handling 3384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->prev_bf = 0; 3394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->prev_pdf = 0; 3404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->state = 0; 3414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->T0_lagBuff = 40; 3434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->inBackgroundNoise = 0; 3444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->voicedHangover = 0; 3454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (mode != MRDTX) { 3464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i=0;i<9;i++) 3474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->excEnergyHist[i] = 0; 3484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 3494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i = 0; i < 9; i++) 3514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->ltpGainHistory[i] = 0; 3524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Cb_gain_average_reset(state->Cb_gain_averState); 3544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (mode != MRDTX) 3554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber lsp_avg_reset(state->lsp_avg_st); 3564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber D_plsf_reset(state->lsfState); 3574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_pitch_reset(state->ec_gain_p_st); 3584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_code_reset(state->ec_gain_c_st); 3594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (mode != MRDTX) 3614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber gc_pred_reset(state->pred_state); 3624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Bgn_scd_reset(state->background_state); 3644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->nodataSeed = 21845; 3654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ph_disp_reset(state->ph_disp_st); 3664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (mode != MRDTX) 3674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber dtx_dec_reset(state->dtxDecoderState); 3684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber return 0; 3704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber} 3714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------ 3734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional] 3744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the 3764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below. 3774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes 3794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes 3814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 3834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber used to represent cycle count for each subroutine 3844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber called) 3854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber where: (cycle count variable) = cycle count for [subroutine 3864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber name] 3874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------ 3894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional] 3904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function] 3914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------ 3934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/ 3944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas HuberWord16 Decoder_amr_reset(Decoder_amrState *state, enum Mode mode) 3964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{ 3974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 i; 3984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 3994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (state == (Decoder_amrState *) NULL) 4004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 4014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* fprint(stderr, "Decoder_amr_reset: invalid parameter\n"); */ 4024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber return(-1); 4034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 4044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 4054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* Initialize static pointer */ 4064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->exc = state->old_exc + PIT_MAX + L_INTERPOL; 4074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 4084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* Static vectors to zero */ 4094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber memset(state->old_exc, 0, sizeof(Word16)*(PIT_MAX + L_INTERPOL)); 4104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 4114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (mode != MRDTX) 4124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 4134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber memset(state->mem_syn, 0, sizeof(Word16)*M); 4144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 4154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* initialize pitch sharpening */ 4164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->sharp = SHARPMIN; 4174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->old_T0 = 40; 4184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 4194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* Initialize overflow Flag */ 4204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 4214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->overflow = 0; 4224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 4234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* Initialize state->lsp_old [] */ 4244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 4254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (mode != MRDTX) 4264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 4274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->lsp_old[0] = 30000; 4284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->lsp_old[1] = 26000; 4294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->lsp_old[2] = 21000; 4304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->lsp_old[3] = 15000; 4314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->lsp_old[4] = 8000; 4324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->lsp_old[5] = 0; 4334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->lsp_old[6] = -8000; 4344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->lsp_old[7] = -15000; 4354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->lsp_old[8] = -21000; 4364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->lsp_old[9] = -26000; 4374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 4384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 4394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* Initialize memories of bad frame handling */ 4404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->prev_bf = 0; 4414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->prev_pdf = 0; 4424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->state = 0; 4434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 4444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->T0_lagBuff = 40; 4454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->inBackgroundNoise = 0; 4464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->voicedHangover = 0; 4474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (mode != MRDTX) 4484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 4494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i = 0; i < EXC_ENERGY_HIST_LEN; i++) 4504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 4514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->excEnergyHist[i] = 0; 4524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 4534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 4544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 4554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i = 0; i < LTP_GAIN_HISTORY_LEN; i++) 4564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 4574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->ltpGainHistory[i] = 0; 4584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 4594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 4604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Cb_gain_average_reset(&(state->Cb_gain_averState)); 4614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (mode != MRDTX) 4624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 4634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber lsp_avg_reset(&(state->lsp_avg_st)); 4644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 4654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber D_plsf_reset(&(state->lsfState)); 4664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_pitch_reset(&(state->ec_gain_p_st)); 4674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_code_reset(&(state->ec_gain_c_st)); 4684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 4694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (mode != MRDTX) 4704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 4714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber gc_pred_reset(&(state->pred_state)); 4724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 4734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 4744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Bgn_scd_reset(&(state->background_state)); 4754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber state->nodataSeed = 21845; 4764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ph_disp_reset(&(state->ph_disp_st)); 4774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (mode != MRDTX) 4784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 4794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber dtx_dec_reset(&(state->dtxDecoderState)); 4804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 4814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 4824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber return(0); 4834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber} 4844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 4854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/****************************************************************************/ 4864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 4874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/* 4884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------ 4894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: Decoder_amr 4904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------ 4914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS 4924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 4934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs: 4944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st = pointer to a structure of type Decoder_amrState 4954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mode = codec mode (enum Mode) 4964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber parm = buffer of synthesis parameters (Word16) 4974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber frame_type = received frame type (enum RXFrameType) 4984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber synth = buffer containing synthetic speech (Word16) 4994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber A_t = buffer containing decoded LP filter in 4 subframes (Word16) 5004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 5014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs: 5024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber structure pointed to by st contains the newly calculated decoder 5034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber parameters 5044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber synth buffer contains the decoded speech samples 5054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber A_t buffer contains the decoded LP filter parameters 5064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 5074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns: 5084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber return_value = 0 (int) 5094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 5104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used: 5114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None 5124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 5134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed: 5144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None 5154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 5164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------ 5174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION 5184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 5194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber This function performs the decoding of one speech frame for a given codec 5204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mode. 5214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 5224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------ 5234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS 5244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 5254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None 5264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 5274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------ 5284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES 5294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 5304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber dec_amr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 5314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 5324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------ 5334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE 5344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 5354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberint Decoder_amr ( 5364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Decoder_amrState *st, // i/o : State variables 5374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber enum Mode mode, // i : AMR mode 5384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 parm[], // i : vector of synthesis parameters 5394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber (PRM_SIZE) 5404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber enum RXFrameType frame_type, // i : received frame type 5414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 synth[], // o : synthesis speech (L_FRAME) 5424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 A_t[] // o : decoded LP filter in 4 subframes 5434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber (AZ_SIZE) 5444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber) 5454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{ 5464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // LPC coefficients 5474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 5484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 *Az; // Pointer on A_t 5494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 5504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // LSPs 5514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 5524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 lsp_new[M]; 5534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 lsp_mid[M]; 5544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 5554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // LSFs 5564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 5574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 prev_lsf[M]; 5584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 lsf_i[M]; 5594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 5604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // Algebraic codevector 5614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 5624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 code[L_SUBFR]; 5634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 5644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // excitation 5654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 5664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 excp[L_SUBFR]; 5674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 exc_enhanced[L_SUBFR]; 5684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 5694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // Scalars 5704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 5714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 i, i_subfr; 5724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 T0, T0_frac, index, index_mr475 = 0; 5734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 gain_pit, gain_code, gain_code_mix, pit_sharp, pit_flag, pitch_fac; 5744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 t0_min, t0_max; 5754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 delta_frc_low, delta_frc_range; 5764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 tmp_shift; 5774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 temp; 5784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word32 L_temp; 5794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 flag4; 5804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 carefulFlag; 5814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 excEnergy; 5824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 subfrNr; 5834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 evenSubfr = 0; 5844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 5854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 bfi = 0; // bad frame indication flag 5864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 pdfi = 0; // potential degraded bad frame flag 5874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 5884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber enum DTXStateType newDTXState; // SPEECH , DTX, DTX_MUTE 5894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 5904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // find the new DTX state SPEECH OR DTX 5914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber newDTXState = rx_dtx_handler(st->dtxDecoderState, frame_type); 5924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 5934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // DTX actions 5944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (sub(newDTXState, SPEECH) != 0 ) 5954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 5964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Decoder_amr_reset (st, MRDTX); 5974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 5984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber dtx_dec(st->dtxDecoderState, 5994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->mem_syn, 6004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->lsfState, 6014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->pred_state, 6024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->Cb_gain_averState, 6034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber newDTXState, 6044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mode, 6054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber parm, synth, A_t); 6064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // update average lsp 6074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 6084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Lsf_lsp(st->lsfState->past_lsf_q, st->lsp_old, M); 6094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber lsp_avg(st->lsp_avg_st, st->lsfState->past_lsf_q); 6104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber goto the_end; 6114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 6124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 6134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // SPEECH action state machine 6144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if ((sub(frame_type, RX_SPEECH_BAD) == 0) || 6154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber (sub(frame_type, RX_NO_DATA) == 0) || 6164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber (sub(frame_type, RX_ONSET) == 0)) 6174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 6184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber bfi = 1; 6194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if ((sub(frame_type, RX_NO_DATA) == 0) || 6204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber (sub(frame_type, RX_ONSET) == 0)) 6214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 6224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber build_CN_param(&st->nodataSeed, 6234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber prmno[mode], 6244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber bitno[mode], 6254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber parm); 6264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 6274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 6284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else if (sub(frame_type, RX_SPEECH_DEGRADED) == 0) 6294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 6304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pdfi = 1; 6314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 6324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 6334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (bfi != 0) 6344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 6354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->state = add (st->state, 1); 6364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 6374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else if (sub (st->state, 6) == 0) 6384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 6394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 6404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->state = 5; 6414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 6424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 6434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 6444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->state = 0; 6454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 6464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 6474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (sub (st->state, 6) > 0) 6484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 6494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->state = 6; 6504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 6514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 6524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // If this frame is the first speech frame after CNI period, 6534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // set the BFH state machine to an appropriate state depending 6544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // on whether there was DTX muting before start of speech or not 6554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // If there was DTX muting, the first speech frame is muted. 6564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // If there was no DTX muting, the first speech frame is not 6574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // muted. The BFH state machine starts from state 5, however, to 6584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // keep the audible noise resulting from a SID frame which is 6594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // erroneously interpreted as a good speech frame as small as 6604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // possible (the decoder output in this case is quickly muted) 6614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 6624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (sub(st->dtxDecoderState->dtxGlobalState, DTX) == 0) 6634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 6644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->state = 5; 6654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->prev_bf = 0; 6664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 6674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else if (sub(st->dtxDecoderState->dtxGlobalState, DTX_MUTE) == 0) 6684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 6694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->state = 5; 6704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->prev_bf = 1; 6714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 6724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 6734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // save old LSFs for CB gain smoothing 6744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Copy (st->lsfState->past_lsf_q, prev_lsf, M); 6754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 6764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // decode LSF parameters and generate interpolated lpc coefficients 6774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for the 4 subframes 6784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (sub (mode, MR122) != 0) 6794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 6804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber D_plsf_3(st->lsfState, mode, bfi, parm, lsp_new); 6814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 6824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // Advance synthesis parameters pointer 6834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber parm += 3; 6844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 6854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Int_lpc_1to3(st->lsp_old, lsp_new, A_t); 6864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 6874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 6884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 6894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber D_plsf_5 (st->lsfState, bfi, parm, lsp_mid, lsp_new); 6904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 6914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // Advance synthesis parameters pointer 6924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber parm += 5; 6934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 6944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Int_lpc_1and3 (st->lsp_old, lsp_mid, lsp_new, A_t); 6954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 6964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 6974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // update the LSPs for the next frame 6984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i = 0; i < M; i++) 6994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 7004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->lsp_old[i] = lsp_new[i]; 7014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 7024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 7034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *------------------------------------------------------------------------* 7044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Loop for every subframe in the analysis frame * 7054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *------------------------------------------------------------------------* 7064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * The subframe size is L_SUBFR and the loop is repeated L_FRAME/L_SUBFR * 7074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * times * 7084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - decode the pitch delay * 7094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - decode algebraic code * 7104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - decode pitch and codebook gains * 7114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - find the excitation and compute synthesis speech * 7124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *------------------------------------------------------------------------* 7134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 7144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // pointer to interpolated LPC parameters 7154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Az = A_t; 7164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 7174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber evenSubfr = 0; 7184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber subfrNr = -1; 7194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR) 7204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 7214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber subfrNr = add(subfrNr, 1); 7224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber evenSubfr = sub(1, evenSubfr); 7234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 7244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // flag for first and 3th subframe 7254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_flag = i_subfr; 7264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 7274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (sub (i_subfr, L_FRAME_BY2) == 0) 7284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 7294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (sub(mode, MR475) != 0 && sub(mode, MR515) != 0) 7304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 7314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_flag = 0; 7324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 7334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 7344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 7354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // pitch index 7364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber index = *parm++; 7374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 7384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------* 7394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - decode pitch lag and find adaptive codebook vector. * 7404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------* 7414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 7424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (sub(mode, MR122) != 0) 7434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 7444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // flag4 indicates encoding with 4 bit resolution; 7454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // this is needed for mode MR475, MR515, MR59 and MR67 7464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 7474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber flag4 = 0; 7484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if ((sub (mode, MR475) == 0) || 7494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber (sub (mode, MR515) == 0) || 7504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber (sub (mode, MR59) == 0) || 7514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber (sub (mode, MR67) == 0) ) { 7524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber flag4 = 1; 7534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 7544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 7554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------* 7564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - get ranges for the t0_min and t0_max * 7574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - only needed in delta decoding * 7584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------* 7594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 7604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber delta_frc_low = 5; 7614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber delta_frc_range = 9; 7624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 7634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if ( sub(mode, MR795) == 0 ) 7644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 7654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber delta_frc_low = 10; 7664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber delta_frc_range = 19; 7674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 7684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 7694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber t0_min = sub(st->old_T0, delta_frc_low); 7704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (sub(t0_min, PIT_MIN) < 0) 7714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 7724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber t0_min = PIT_MIN; 7734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 7744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber t0_max = add(t0_min, delta_frc_range); 7754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (sub(t0_max, PIT_MAX) > 0) 7764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 7774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber t0_max = PIT_MAX; 7784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber t0_min = sub(t0_max, delta_frc_range); 7794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 7804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 7814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Dec_lag3 (index, t0_min, t0_max, pit_flag, st->old_T0, 7824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &T0, &T0_frac, flag4); 7834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 7844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->T0_lagBuff = T0; 7854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 7864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (bfi != 0) 7874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 7884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (sub (st->old_T0, PIT_MAX) < 0) 7894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { // Graceful pitch 7904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->old_T0 = add(st->old_T0, 1); // degradation 7914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 7924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber T0 = st->old_T0; 7934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber T0_frac = 0; 7944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 7954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if ( st->inBackgroundNoise != 0 && 7964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber sub(st->voicedHangover, 4) > 0 && 7974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ((sub(mode, MR475) == 0 ) || 7984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber (sub(mode, MR515) == 0 ) || 7994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber (sub(mode, MR59) == 0) ) 8004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ) 8014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 8024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber T0 = st->T0_lagBuff; 8034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 8044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 8054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 8064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Pred_lt_3or6 (st->exc, T0, T0_frac, L_SUBFR, 1); 8074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 8084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 8094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 8104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Dec_lag6 (index, PIT_MIN_MR122, 8114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PIT_MAX, pit_flag, &T0, &T0_frac); 8124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 8134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if ( bfi == 0 && (pit_flag == 0 || sub (index, 61) < 0)) 8144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 8154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 8164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 8174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 8184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->T0_lagBuff = T0; 8194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber T0 = st->old_T0; 8204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber T0_frac = 0; 8214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 8224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 8234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Pred_lt_3or6 (st->exc, T0, T0_frac, L_SUBFR, 0); 8244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 8254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 8264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------* 8274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - (MR122 only: Decode pitch gain.) * 8284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - Decode innovative codebook. * 8294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - set pitch sharpening factor * 8304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------* 8314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 8324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (sub (mode, MR475) == 0 || sub (mode, MR515) == 0) 8334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { // MR475, MR515 8344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber index = *parm++; // index of position 8354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber i = *parm++; // signs 8364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 8374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber decode_2i40_9bits (subfrNr, i, index, code); 8384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 8394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = shl (st->sharp, 1); 8404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 8414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else if (sub (mode, MR59) == 0) 8424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { // MR59 8434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber index = *parm++; // index of position 8444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber i = *parm++; // signs 8454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 8464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber decode_2i40_11bits (i, index, code); 8474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 8484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = shl (st->sharp, 1); 8494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 8504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else if (sub (mode, MR67) == 0) 8514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { // MR67 8524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber index = *parm++; // index of position 8534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber i = *parm++; // signs 8544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 8554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber decode_3i40_14bits (i, index, code); 8564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 8574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = shl (st->sharp, 1); 8584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 8594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else if (sub (mode, MR795) <= 0) 8604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { // MR74, MR795 8614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber index = *parm++; // index of position 8624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber i = *parm++; // signs 8634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 8644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber decode_4i40_17bits (i, index, code); 8654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 8664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = shl (st->sharp, 1); 8674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 8684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else if (sub (mode, MR102) == 0) 8694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { // MR102 8704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber dec_8i40_31bits (parm, code); 8714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber parm += 7; 8724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 8734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = shl (st->sharp, 1); 8744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 8754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 8764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { // MR122 8774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber index = *parm++; 8784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (bfi != 0) 8794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 8804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_pitch (st->ec_gain_p_st, st->state, &gain_pit); 8814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 8824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 8834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 8844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber gain_pit = d_gain_pitch (mode, index); 8854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 8864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_pitch_update (st->ec_gain_p_st, bfi, st->prev_bf, 8874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_pit); 8884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 8894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber dec_10i40_35bits (parm, code); 8904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber parm += 10; 8914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 8924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // pit_sharp = gain_pit; 8934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // if (pit_sharp > 1.0) pit_sharp = 1.0; 8944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 8954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = shl (gain_pit, 1); 8964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 8974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 8984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------* 8994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - Add the pitch contribution to code[]. * 9004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------* 9014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i = T0; i < L_SUBFR; i++) 9024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 9034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber temp = mult (code[i - T0], pit_sharp); 9044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber code[i] = add (code[i], temp); 9054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 9064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 9074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *------------------------------------------------------------* 9084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - Decode codebook gain (MR122) or both pitch * 9094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * gain and codebook gain (all others) * 9104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - Update pitch sharpening "sharp" with quantized gain_pit * 9114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *------------------------------------------------------------* 9124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 9134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (sub (mode, MR475) == 0) 9144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 9154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // read and decode pitch and code gain 9164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (evenSubfr != 0) 9174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 9184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber index_mr475 = *parm++; // index of gain(s) 9194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 9204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 9214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (bfi == 0) 9224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 9234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Dec_gain(st->pred_state, mode, index_mr475, code, 9244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber evenSubfr, &gain_pit, &gain_code); 9254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 9264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 9274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 9284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_pitch (st->ec_gain_p_st, st->state, &gain_pit); 9294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_code (st->ec_gain_c_st, st->pred_state, st->state, 9304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_code); 9314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 9324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_pitch_update (st->ec_gain_p_st, bfi, st->prev_bf, 9334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_pit); 9344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_code_update (st->ec_gain_c_st, bfi, st->prev_bf, 9354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_code); 9364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 9374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = gain_pit; 9384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (sub (pit_sharp, SHARPMAX) > 0) 9394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 9404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = SHARPMAX; 9414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 9424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 9434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 9444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else if ((sub (mode, MR74) <= 0) || 9454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber (sub (mode, MR102) == 0)) 9464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 9474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // read and decode pitch and code gain 9484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber index = *parm++; // index of gain(s) 9494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 9504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (bfi == 0) 9514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 9524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Dec_gain(st->pred_state, mode, index, code, 9534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber evenSubfr, &gain_pit, &gain_code); 9544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 9554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 9564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 9574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_pitch (st->ec_gain_p_st, st->state, &gain_pit); 9584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_code (st->ec_gain_c_st, st->pred_state, st->state, 9594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_code); 9604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 9614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_pitch_update (st->ec_gain_p_st, bfi, st->prev_bf, 9624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_pit); 9634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_code_update (st->ec_gain_c_st, bfi, st->prev_bf, 9644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_code); 9654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 9664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = gain_pit; 9674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (sub (pit_sharp, SHARPMAX) > 0) 9684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 9694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = SHARPMAX; 9704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 9714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 9724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (sub (mode, MR102) == 0) 9734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 9744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (sub (st->old_T0, add(L_SUBFR, 5)) > 0) 9754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 9764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = shr(pit_sharp, 2); 9774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 9784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 9794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 9804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 9814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 9824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // read and decode pitch gain 9834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber index = *parm++; // index of gain(s) 9844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 9854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (sub (mode, MR795) == 0) 9864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 9874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // decode pitch gain 9884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (bfi != 0) 9894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 9904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_pitch (st->ec_gain_p_st, st->state, &gain_pit); 9914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 9924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 9934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 9944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber gain_pit = d_gain_pitch (mode, index); 9954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 9964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_pitch_update (st->ec_gain_p_st, bfi, st->prev_bf, 9974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_pit); 9984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 9994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // read and decode code gain 10004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber index = *parm++; 10014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (bfi == 0) 10024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 10034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber d_gain_code (st->pred_state, mode, index, code, &gain_code); 10044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 10054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 10064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 10074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_code (st->ec_gain_c_st, st->pred_state, st->state, 10084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_code); 10094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 10104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_code_update (st->ec_gain_c_st, bfi, st->prev_bf, 10114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_code); 10124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 10134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = gain_pit; 10144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (sub (pit_sharp, SHARPMAX) > 0) 10154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 10164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = SHARPMAX; 10174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 10184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 10194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 10204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { // MR122 10214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (bfi == 0) 10224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 10234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber d_gain_code (st->pred_state, mode, index, code, &gain_code); 10244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 10254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 10264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 10274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_code (st->ec_gain_c_st, st->pred_state, st->state, 10284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_code); 10294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 10304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_code_update (st->ec_gain_c_st, bfi, st->prev_bf, 10314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_code); 10324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 10334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = gain_pit; 10344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 10354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 10364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 10374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // store pitch sharpening for next subframe 10384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // (for modes which use the previous pitch gain for 10394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // pitch sharpening in the search phase) 10404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // do not update sharpening in even subframes for MR475 10414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (sub(mode, MR475) != 0 || evenSubfr == 0) 10424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 10434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->sharp = gain_pit; 10444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (sub (st->sharp, SHARPMAX) > 0) 10454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 10464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->sharp = SHARPMAX; 10474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 10484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 10494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 10504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = shl (pit_sharp, 1); 10514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (sub (pit_sharp, 16384) > 0) 10524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 10534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i = 0; i < L_SUBFR; i++) 10544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 10554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber temp = mult (st->exc[i], pit_sharp); 10564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_temp = L_mult (temp, gain_pit); 10574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (sub(mode, MR122)==0) 10584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 10594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_temp = L_shr (L_temp, 1); 10604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 10614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber excp[i] = pv_round (L_temp); 10624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 10634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 10644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 10654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------* 10664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - Store list of LTP gains needed in the source * 10674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * characteristic detector (SCD) * 10684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------* 10694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if ( bfi == 0 ) 10704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 10714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i = 0; i < 8; i++) 10724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 10734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->ltpGainHistory[i] = st->ltpGainHistory[i+1]; 10744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 10754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->ltpGainHistory[8] = gain_pit; 10764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 10774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 10784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------* 10794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - Limit gain_pit if in background noise and BFI * 10804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * for MR475, MR515, MR59 * 10814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------* 10824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 10834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if ( (st->prev_bf != 0 || bfi != 0) && st->inBackgroundNoise != 0 && 10844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ((sub(mode, MR475) == 0) || 10854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber (sub(mode, MR515) == 0) || 10864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber (sub(mode, MR59) == 0)) 10874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ) 10884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 10894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if ( sub (gain_pit, 12288) > 0) // if (gain_pit > 0.75) in Q14 10904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber gain_pit = add( shr( sub(gain_pit, 12288), 1 ), 12288 ); 10914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // gain_pit = (gain_pit-0.75)/2.0 + 0.75; 10924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 10934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if ( sub (gain_pit, 14745) > 0) // if (gain_pit > 0.90) in Q14 10944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 10954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber gain_pit = 14745; 10964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 10974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 10984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 10994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------* 11004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Calculate CB mixed gain * 11014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------* 11024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Int_lsf(prev_lsf, st->lsfState->past_lsf_q, i_subfr, lsf_i); 11034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber gain_code_mix = Cb_gain_average( 11044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->Cb_gain_averState, mode, gain_code, 11054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber lsf_i, st->lsp_avg_st->lsp_meanSave, bfi, 11064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->prev_bf, pdfi, st->prev_pdf, 11074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->inBackgroundNoise, st->voicedHangover); 11084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 11094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // make sure that MR74, MR795, MR122 have original code_gain 11104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if ((sub(mode, MR67) > 0) && (sub(mode, MR102) != 0) ) 11114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // MR74, MR795, MR122 11124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 11134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber gain_code_mix = gain_code; 11144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 11154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 11164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------* 11174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - Find the total excitation. * 11184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - Find synthesis speech corresponding to st->exc[]. * 11194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------* 11204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (sub(mode, MR102) <= 0) // MR475, MR515, MR59, MR67, MR74, MR795, MR102 11214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 11224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pitch_fac = gain_pit; 11234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber tmp_shift = 1; 11244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 11254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else // MR122 11264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 11274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pitch_fac = shr (gain_pit, 1); 11284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber tmp_shift = 2; 11294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 11304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 11314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // copy unscaled LTP excitation to exc_enhanced (used in phase 11324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * dispersion below) and compute total excitation for LTP feedback 11334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 11344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i = 0; i < L_SUBFR; i++) 11354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 11364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber exc_enhanced[i] = st->exc[i]; 11374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 11384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // st->exc[i] = gain_pit*st->exc[i] + gain_code*code[i]; 11394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_temp = L_mult (st->exc[i], pitch_fac); 11404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // 12.2: Q0 * Q13 11414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // 7.4: Q0 * Q14 11424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_temp = L_mac (L_temp, code[i], gain_code); 11434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // 12.2: Q12 * Q1 11444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // 7.4: Q13 * Q1 11454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_temp = L_shl (L_temp, tmp_shift); // Q16 11464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->exc[i] = pv_round (L_temp); 11474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 11484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 11494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------* 11504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - Adaptive phase dispersion * 11514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------* 11524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ph_disp_release(st->ph_disp_st); // free phase dispersion adaption 11534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 11544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if ( ((sub(mode, MR475) == 0) || 11554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber (sub(mode, MR515) == 0) || 11564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber (sub(mode, MR59) == 0)) && 11574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber sub(st->voicedHangover, 3) > 0 && 11584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->inBackgroundNoise != 0 && 11594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber bfi != 0 ) 11604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 11614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ph_disp_lock(st->ph_disp_st); // Always Use full Phase Disp. 11624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } // if error in bg noise 11634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 11644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // apply phase dispersion to innovation (if enabled) and 11654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber compute total excitation for synthesis part 11664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ph_disp(st->ph_disp_st, mode, 11674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber exc_enhanced, gain_code_mix, gain_pit, code, 11684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pitch_fac, tmp_shift); 11694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 11704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------* 11714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - The Excitation control module are active during BFI.* 11724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - Conceal drops in signal energy if in bg noise. * 11734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------* 11744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 11754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_temp = 0; 11764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i = 0; i < L_SUBFR; i++) 11774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 11784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_temp = L_mac (L_temp, exc_enhanced[i], exc_enhanced[i] ); 11794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 11804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 11814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_temp = L_shr (L_temp, 1); // excEnergy = sqrt(L_temp) in Q0 11824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_temp = sqrt_l_exp(L_temp, &temp); // function result 11834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_temp = L_shr(L_temp, add( shr(temp, 1), 15)); 11844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_temp = L_shr(L_temp, 2); // To cope with 16-bit and 11854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber excEnergy = extract_l(L_temp); // scaling in ex_ctrl() 11864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 11874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if ( ((sub (mode, MR475) == 0) || 11884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber (sub (mode, MR515) == 0) || 11894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber (sub (mode, MR59) == 0)) && 11904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber sub(st->voicedHangover, 5) > 0 && 11914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->inBackgroundNoise != 0 && 11924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber sub(st->state, 4) < 0 && 11934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ( (pdfi != 0 && st->prev_pdf != 0) || 11944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber bfi != 0 || 11954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->prev_bf != 0) ) 11964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 11974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber carefulFlag = 0; 11984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if ( pdfi != 0 && bfi == 0 ) 11994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 12004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber carefulFlag = 1; 12014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 12024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 12034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Ex_ctrl(exc_enhanced, 12044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber excEnergy, 12054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->excEnergyHist, 12064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->voicedHangover, 12074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->prev_bf, 12084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber carefulFlag); 12094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 12104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 12114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if ( st->inBackgroundNoise != 0 && 12124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ( bfi != 0 || st->prev_bf != 0 ) && 12134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber sub(st->state, 4) < 0 ) 12144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 12154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ; // do nothing! 12164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 12174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 12184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 12194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // Update energy history for all modes 12204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i = 0; i < 8; i++) 12214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 12224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->excEnergyHist[i] = st->excEnergyHist[i+1]; 12234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 12244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->excEnergyHist[8] = excEnergy; 12254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 12264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------* 12274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Excitation control module end. * 12284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------* 12294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 12304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (sub (pit_sharp, 16384) > 0) 12314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 12324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i = 0; i < L_SUBFR; i++) 12334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 12344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber excp[i] = add (excp[i], exc_enhanced[i]); 12354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 12364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber agc2 (exc_enhanced, excp, L_SUBFR); 12374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Overflow = 0; 12384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Syn_filt (Az, excp, &synth[i_subfr], L_SUBFR, 12394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->mem_syn, 0); 12404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 12414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 12424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 12434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Overflow = 0; 12444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Syn_filt (Az, exc_enhanced, &synth[i_subfr], L_SUBFR, 12454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->mem_syn, 0); 12464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 12474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 12484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (Overflow != 0) // Test for overflow 12494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 12504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i = 0; i < PIT_MAX + L_INTERPOL + L_SUBFR; i++) 12514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 12524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->old_exc[i] = shr(st->old_exc[i], 2); 12534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 12544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i = 0; i < L_SUBFR; i++) 12554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 12564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber exc_enhanced[i] = shr(exc_enhanced[i], 2); 12574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 12584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Syn_filt(Az, exc_enhanced, &synth[i_subfr], L_SUBFR, st->mem_syn, 1); 12594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 12604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 12614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 12624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Copy(&synth[i_subfr+L_SUBFR-M], st->mem_syn, M); 12634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 12644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 12654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *--------------------------------------------------* 12664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Update signal for next frame. * 12674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * -> shift to the left by L_SUBFR st->exc[] * 12684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *--------------------------------------------------* 12694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 12704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Copy (&st->old_exc[L_SUBFR], &st->old_exc[0], PIT_MAX + L_INTERPOL); 12714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 12724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // interpolated LPC parameters for next subframe 12734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Az += MP1; 12744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 12754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // store T0 for next subframe 12764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->old_T0 = T0; 12774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 12784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 12794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------* 12804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Call the Source Characteristic Detector which updates * 12814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * st->inBackgroundNoise and st->voicedHangover. * 12824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------* 12834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 12844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->inBackgroundNoise = Bgn_scd(st->background_state, 12854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->ltpGainHistory[0]), 12864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(synth[0]), 12874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->voicedHangover) ); 12884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 12894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber dtx_dec_activity_update(st->dtxDecoderState, 12904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->lsfState->past_lsf_q, 12914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber synth); 12924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 12934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber // store bfi for next subframe 12944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->prev_bf = bfi; 12954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->prev_pdf = pdfi; 12964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 12974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *--------------------------------------------------* 12984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Calculate the LSF averages on the eight * 12994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * previous frames * 13004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *--------------------------------------------------* 13014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 13024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber lsp_avg(st->lsp_avg_st, st->lsfState->past_lsf_q); 13034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 13044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberthe_end: 13054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->dtxDecoderState->dtxGlobalState = newDTXState; 13064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 13074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber return 0; 13084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber} 13094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 13104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------ 13114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional] 13124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 13134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the 13144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below. 13154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 13164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes 13174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 13184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes 13194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 13204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 13214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber used to represent cycle count for each subroutine 13224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber called) 13234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber where: (cycle count variable) = cycle count for [subroutine 13244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber name] 13254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 13264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------ 13274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional] 13284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function] 13294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 13304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------ 13314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/ 13324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 13334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Hubervoid Decoder_amr( 13344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Decoder_amrState *st, /* i/o : State variables */ 13354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber enum Mode mode, /* i : AMR mode */ 13364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 parm[], /* i : vector of synthesis parameters 13374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber (PRM_SIZE) */ 13384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber enum RXFrameType frame_type, /* i : received frame type */ 13394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 synth[], /* o : synthesis speech (L_FRAME) */ 13404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 A_t[] /* o : decoded LP filter in 4 subframes 13414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber (AZ_SIZE) */ 13424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber) 13434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{ 13444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* LPC coefficients */ 13454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 13464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 *Az; /* Pointer on A_t */ 13474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 13484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* LSPs */ 13494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 13504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 lsp_new[M]; 13514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 lsp_mid[M]; 13524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 13534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* LSFs */ 13544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 13554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 prev_lsf[M]; 13564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 lsf_i[M]; 13574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 13584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* Algebraic codevector */ 13594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 13604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 code[L_SUBFR]; 13614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 13624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* excitation */ 13634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 13644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 excp[L_SUBFR]; 13654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 exc_enhanced[L_SUBFR]; 13664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 13674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* Scalars */ 13684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 13694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 i; 13704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 i_subfr; 13714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 T0; 13724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 T0_frac; 13734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 index; 13744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 index_mr475 = 0; 13754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 gain_pit; 13764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 gain_code; 13774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 gain_code_mix; 13784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 pit_sharp; 13794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 pit_flag; 13804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 pitch_fac; 13814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 t0_min; 13824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 t0_max; 13834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 delta_frc_low; 13844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 delta_frc_range; 13854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 tmp_shift; 13864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 temp; 13874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word32 L_temp; 13884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 flag4; 13894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 carefulFlag; 13904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 excEnergy; 13914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 subfrNr; 13924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 evenSubfr = 0; 13934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 13944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 bfi = 0; /* bad frame indication flag */ 13954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 pdfi = 0; /* potential degraded bad frame flag */ 13964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 13974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber enum DTXStateType newDTXState; /* SPEECH , DTX, DTX_MUTE */ 13984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Flag *pOverflow = &(st->overflow); /* Overflow flag */ 13994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 14004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 14014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* find the new DTX state SPEECH OR DTX */ 14024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber newDTXState = rx_dtx_handler(&(st->dtxDecoderState), frame_type, pOverflow); 14034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 14044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* DTX actions */ 14054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 14064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (newDTXState != SPEECH) 14074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 14084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Decoder_amr_reset(st, MRDTX); 14094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 14104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber dtx_dec(&(st->dtxDecoderState), 14114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->mem_syn, 14124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->lsfState), 14134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->pred_state), 14144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->Cb_gain_averState), 14154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber newDTXState, 14164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mode, 14174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber parm, synth, A_t, pOverflow); 14184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 14194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* update average lsp */ 14204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Lsf_lsp( 14214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->lsfState.past_lsf_q, 14224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->lsp_old, 14234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber M, 14244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 14254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 14264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber lsp_avg( 14274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->lsp_avg_st), 14284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->lsfState.past_lsf_q, 14294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 14304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 14314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber goto the_end; 14324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 14334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 14344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* SPEECH action state machine */ 14354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if ((frame_type == RX_SPEECH_BAD) || (frame_type == RX_NO_DATA) || 14364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber (frame_type == RX_ONSET)) 14374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 14384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber bfi = 1; 14394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 14404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if ((frame_type == RX_NO_DATA) || (frame_type == RX_ONSET)) 14414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 14424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber build_CN_param(&st->nodataSeed, 14434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber prmno[mode], 14444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber bitno[mode], 14454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber parm, 14464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 14474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 14484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 14494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else if (frame_type == RX_SPEECH_DEGRADED) 14504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 14514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pdfi = 1; 14524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 14534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 14544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (bfi != 0) 14554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 14564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->state += 1; 14574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 14584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else if (st->state == 6) 14594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 14604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 14614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->state = 5; 14624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 14634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 14644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 14654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->state = 0; 14664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 14674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 14684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 14694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (st->state > 6) 14704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 14714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->state = 6; 14724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 14734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 14744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* If this frame is the first speech frame after CNI period, */ 14754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* set the BFH state machine to an appropriate state depending */ 14764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* on whether there was DTX muting before start of speech or not */ 14774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* If there was DTX muting, the first speech frame is muted. */ 14784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* If there was no DTX muting, the first speech frame is not */ 14794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* muted. The BFH state machine starts from state 5, however, to */ 14804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* keep the audible noise resulting from a SID frame which is */ 14814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* erroneously interpreted as a good speech frame as small as */ 14824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* possible (the decoder output in this case is quickly muted) */ 14834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 14844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (st->dtxDecoderState.dtxGlobalState == DTX) 14854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 14864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->state = 5; 14874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->prev_bf = 0; 14884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 14894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else if (st->dtxDecoderState.dtxGlobalState == DTX_MUTE) 14904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 14914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->state = 5; 14924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->prev_bf = 1; 14934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 14944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 14954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* save old LSFs for CB gain smoothing */ 14964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Copy(st->lsfState.past_lsf_q, prev_lsf, M); 14974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 14984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* decode LSF parameters and generate interpolated lpc coefficients 14994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for the 4 subframes */ 15004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 15014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (mode != MR122) 15024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 15034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber D_plsf_3( 15044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->lsfState), 15054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mode, 15064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber bfi, 15074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber parm, 15084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber lsp_new, 15094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 15104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 15114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* Advance synthesis parameters pointer */ 15124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber parm += 3; 15134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 15144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Int_lpc_1to3( 15154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->lsp_old, 15164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber lsp_new, 15174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber A_t, 15184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 15194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 15204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 15214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 15224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber D_plsf_5( 15234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->lsfState), 15244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber bfi, 15254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber parm, 15264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber lsp_mid, 15274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber lsp_new, 15284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 15294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 15304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* Advance synthesis parameters pointer */ 15314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber parm += 5; 15324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 15334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Int_lpc_1and3( 15344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->lsp_old, 15354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber lsp_mid, 15364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber lsp_new, 15374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber A_t, 15384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 15394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 15404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 15414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* update the LSPs for the next frame */ 15424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i = 0; i < M; i++) 15434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 15444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->lsp_old[i] = lsp_new[i]; 15454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 15464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 15474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /*------------------------------------------------------------------------* 15484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Loop for every subframe in the analysis frame * 15494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *------------------------------------------------------------------------* 15504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * The subframe size is L_SUBFR and the loop is repeated L_FRAME/L_SUBFR * 15514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * times * 15524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - decode the pitch delay * 15534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - decode algebraic code * 15544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - decode pitch and codebook gains * 15554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - find the excitation and compute synthesis speech * 15564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *------------------------------------------------------------------------*/ 15574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 15584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* pointer to interpolated LPC parameters */ 15594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Az = A_t; 15604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 15614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber evenSubfr = 0; 15624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber subfrNr = -1; 15634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR) 15644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 15654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber subfrNr += 1; 15664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber evenSubfr = 1 - evenSubfr; 15674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 15684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* flag for first and 3th subframe */ 15694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_flag = i_subfr; 15704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 15714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 15724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (i_subfr == L_FRAME_BY2) 15734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 15744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if ((mode != MR475) && (mode != MR515)) 15754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 15764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_flag = 0; 15774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 15784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 15794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 15804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* pitch index */ 15814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber index = *parm++; 15824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 15834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /*-------------------------------------------------------* 15844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - decode pitch lag and find adaptive codebook vector. * 15854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------*/ 15864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 15874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (mode != MR122) 15884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 15894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* flag4 indicates encoding with 4 bit resolution; */ 15904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* this is needed for mode MR475, MR515, MR59 and MR67 */ 15914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 15924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber flag4 = 0; 15934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 15944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if ((mode == MR475) || (mode == MR515) || (mode == MR59) || 15954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber (mode == MR67)) 15964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 15974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber flag4 = 1; 15984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 15994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 16004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /*-------------------------------------------------------* 16014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - get ranges for the t0_min and t0_max * 16024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - only needed in delta decoding * 16034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------*/ 16044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 16054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber delta_frc_low = 5; 16064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber delta_frc_range = 9; 16074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 16084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (mode == MR795) 16094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 16104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber delta_frc_low = 10; 16114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber delta_frc_range = 19; 16124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 16134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 16144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber t0_min = sub(st->old_T0, delta_frc_low, pOverflow); 16154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 16164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (t0_min < PIT_MIN) 16174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 16184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber t0_min = PIT_MIN; 16194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 16204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber t0_max = add(t0_min, delta_frc_range, pOverflow); 16214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 16224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (t0_max > PIT_MAX) 16234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 16244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber t0_max = PIT_MAX; 16254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber t0_min = t0_max - delta_frc_range; 16264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 16274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 16284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Dec_lag3(index, t0_min, t0_max, pit_flag, st->old_T0, 16294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &T0, &T0_frac, flag4, pOverflow); 16304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 16314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->T0_lagBuff = T0; 16324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 16334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (bfi != 0) 16344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 16354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (st->old_T0 < PIT_MAX) 16364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { /* Graceful pitch */ 1637ab4412a1992ce7ec0965cdbf616d64d821b67183Dave Sparks st->old_T0 += 0; /* degradation */ 16384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 16394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber T0 = st->old_T0; 16404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber T0_frac = 0; 16414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 16424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if ((st->inBackgroundNoise != 0) && (st->voicedHangover > 4) && 16434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ((mode == MR475) || (mode == MR515) || (mode == MR59))) 16444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 16454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber T0 = st->T0_lagBuff; 16464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 16474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 16484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 16494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Pred_lt_3or6(st->exc, T0, T0_frac, L_SUBFR, 1, pOverflow); 16504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 16514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 16524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 16534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Dec_lag6(index, PIT_MIN_MR122, 16544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PIT_MAX, pit_flag, &T0, &T0_frac, pOverflow); 16554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 16564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 16574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (!(bfi == 0 && (pit_flag == 0 || index < 61))) 16584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 16594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->T0_lagBuff = T0; 16604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber T0 = st->old_T0; 16614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber T0_frac = 0; 16624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 16634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 16644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Pred_lt_3or6(st->exc, T0, T0_frac, L_SUBFR, 0, pOverflow); 16654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 16664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 16674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /*-------------------------------------------------------* 16684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - (MR122 only: Decode pitch gain.) * 16694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - Decode innovative codebook. * 16704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - set pitch sharpening factor * 16714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------*/ 16724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if ((mode == MR475) || (mode == MR515)) 16734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { /* MR475, MR515 */ 16744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber index = *parm++; /* index of position */ 16754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber i = *parm++; /* signs */ 16764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 16774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber decode_2i40_9bits(subfrNr, i, index, code, pOverflow); 16784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 16794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_temp = (Word32)st->sharp << 1; 16804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (L_temp != (Word32)((Word16) L_temp)) 16814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 16824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16; 16834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 16844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 16854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 16864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = (Word16) L_temp; 16874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 16884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 16894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else if (mode == MR59) 16904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { /* MR59 */ 16914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber index = *parm++; /* index of position */ 16924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber i = *parm++; /* signs */ 16934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 16944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber decode_2i40_11bits(i, index, code); 16954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 16964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_temp = (Word32)st->sharp << 1; 16974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (L_temp != (Word32)((Word16) L_temp)) 16984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 16994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16; 17004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 17014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 17024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 17034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = (Word16) L_temp; 17044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 17054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 17064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else if (mode == MR67) 17074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { /* MR67 */ 17084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber index = *parm++; /* index of position */ 17094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber i = *parm++; /* signs */ 17104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 17114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber decode_3i40_14bits(i, index, code); 17124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 17134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_temp = (Word32)st->sharp << 1; 17144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (L_temp != (Word32)((Word16) L_temp)) 17154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 17164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16; 17174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 17184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 17194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 17204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = (Word16) L_temp; 17214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 17224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 17234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else if (mode <= MR795) 17244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { /* MR74, MR795 */ 17254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber index = *parm++; /* index of position */ 17264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber i = *parm++; /* signs */ 17274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 17284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber decode_4i40_17bits(i, index, code); 17294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 17304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_temp = (Word32)st->sharp << 1; 17314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (L_temp != (Word32)((Word16) L_temp)) 17324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 17334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16; 17344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 17354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 17364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 17374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = (Word16) L_temp; 17384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 17394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 17404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else if (mode == MR102) 17414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { /* MR102 */ 17424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber dec_8i40_31bits(parm, code, pOverflow); 17434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber parm += 7; 17444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 17454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_temp = (Word32)st->sharp << 1; 17464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (L_temp != (Word32)((Word16) L_temp)) 17474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 17484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16; 17494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 17504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 17514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 17524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = (Word16) L_temp; 17534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 17544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 17554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 17564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { /* MR122 */ 17574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber index = *parm++; 17584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 17594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (bfi != 0) 17604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 17614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_pitch( 17624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->ec_gain_p_st), 17634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->state, 17644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_pit, 17654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 17664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 17674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 17684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 17694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber gain_pit = d_gain_pitch(mode, index); 17704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 17714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_pitch_update( 17724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->ec_gain_p_st), 17734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber bfi, 17744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->prev_bf, 17754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_pit, 17764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 17774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 17784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 17794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber dec_10i40_35bits(parm, code); 17804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber parm += 10; 17814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 17824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* pit_sharp = gain_pit; */ 17834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* if (pit_sharp > 1.0) pit_sharp = 1.0; */ 17844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 17854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_temp = (Word32)gain_pit << 1; 17864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (L_temp != (Word32)((Word16) L_temp)) 17874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 17884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = (gain_pit > 0) ? MAX_16 : MIN_16; 17894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 17904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 17914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 17924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = (Word16) L_temp; 17934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 17944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 17954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /*-------------------------------------------------------* 17964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - Add the pitch contribution to code[]. * 17974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------*/ 17984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i = T0; i < L_SUBFR; i++) 17994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 18004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber temp = mult(*(code + i - T0), pit_sharp, pOverflow); 18014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *(code + i) = add(*(code + i), temp, pOverflow); 18024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 18034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 18044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 18054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /*------------------------------------------------------------* 18064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - Decode codebook gain (MR122) or both pitch * 18074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * gain and codebook gain (all others) * 18084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - Update pitch sharpening "sharp" with quantized gain_pit * 18094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *------------------------------------------------------------*/ 18104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (mode == MR475) 18114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 18124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* read and decode pitch and code gain */ 18134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 18144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (evenSubfr != 0) 18154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 18164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber index_mr475 = *parm++; /* index of gain(s) */ 18174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 18184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 18194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (bfi == 0) 18204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 18214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Dec_gain( 18224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->pred_state), 18234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mode, 18244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber index_mr475, 18254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber code, 18264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber evenSubfr, 18274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_pit, 18284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_code, 18294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 18304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 18314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 18324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 18334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_pitch( 18344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->ec_gain_p_st), 18354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->state, 18364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_pit, 18374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 18384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 18394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_code( 18404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->ec_gain_c_st), 18414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->pred_state), 18424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->state, 18434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_code, 18444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 18454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 18464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_pitch_update( 18474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &st->ec_gain_p_st, 18484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber bfi, 18494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->prev_bf, 18504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_pit, 18514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 18524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 18534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_code_update( 18544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &st->ec_gain_c_st, 18554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber bfi, 18564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->prev_bf, 18574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_code, 18584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 18594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 18604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = gain_pit; 18614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 18624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (pit_sharp > SHARPMAX) 18634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 18644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = SHARPMAX; 18654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 18664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 18674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 18684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else if ((mode <= MR74) || (mode == MR102)) 18694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 18704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* read and decode pitch and code gain */ 18714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber index = *parm++; /* index of gain(s) */ 18724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 18734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (bfi == 0) 18744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 18754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Dec_gain( 18764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->pred_state), 18774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mode, 18784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber index, 18794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber code, 18804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber evenSubfr, 18814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_pit, 18824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_code, 18834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 18844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 18854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 18864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 18874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_pitch( 18884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->ec_gain_p_st), 18894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->state, 18904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_pit, 18914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 18924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 18934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_code( 18944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->ec_gain_c_st), 18954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->pred_state), 18964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->state, 18974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_code, 18984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 18994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 19004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 19014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_pitch_update( 19024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->ec_gain_p_st), 19034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber bfi, 19044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->prev_bf, 19054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_pit, 19064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 19074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 19084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_code_update( 19094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->ec_gain_c_st), 19104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber bfi, 19114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->prev_bf, 19124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_code, 19134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 19144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 19154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = gain_pit; 19164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 19174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (pit_sharp > SHARPMAX) 19184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 19194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = SHARPMAX; 19204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 19214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 19224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (mode == MR102) 19234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 19244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (st->old_T0 > (L_SUBFR + 5)) 19254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 19264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (pit_sharp < 0) 19274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 19284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = ~((~pit_sharp) >> 2); 19294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 19304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 19314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 19324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = pit_sharp >> 2; 19334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 19344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 19354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 19364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 19374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 19384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 19394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* read and decode pitch gain */ 19404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber index = *parm++; /* index of gain(s) */ 19414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 19424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (mode == MR795) 19434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 19444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* decode pitch gain */ 19454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (bfi != 0) 19464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 19474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_pitch( 19484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->ec_gain_p_st), 19494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->state, 19504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_pit, 19514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 19524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 19534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 19544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 19554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber gain_pit = d_gain_pitch(mode, index); 19564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 19574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_pitch_update( 19584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->ec_gain_p_st), 19594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber bfi, 19604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->prev_bf, 19614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_pit, 19624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 19634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 19644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* read and decode code gain */ 19654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber index = *parm++; 19664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 19674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (bfi == 0) 19684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 19694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber d_gain_code( 19704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->pred_state), 19714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mode, 19724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber index, 19734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber code, 19744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_code, 19754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 19764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 19774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 19784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 19794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_code( 19804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->ec_gain_c_st), 19814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->pred_state), 19824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->state, 19834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_code, 19844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 19854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 19864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 19874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_code_update( 19884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->ec_gain_c_st), 19894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber bfi, 19904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->prev_bf, 19914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_code, 19924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 19934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 19944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = gain_pit; 19954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 19964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (pit_sharp > SHARPMAX) 19974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 19984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = SHARPMAX; 19994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 20004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 20014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 20024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { /* MR122 */ 20034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 20044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (bfi == 0) 20054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 20064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber d_gain_code( 20074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->pred_state), 20084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mode, 20094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber index, 20104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber code, 20114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_code, 20124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 20134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 20144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 20154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 20164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_code( 20174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->ec_gain_c_st), 20184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->pred_state), 20194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->state, 20204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_code, 20214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 20224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 20234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 20244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ec_gain_code_update( 20254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->ec_gain_c_st), 20264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber bfi, 20274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->prev_bf, 20284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &gain_code, 20294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 20304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 20314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = gain_pit; 20324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 20334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 20344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 20354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* store pitch sharpening for next subframe */ 20364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* (for modes which use the previous pitch gain for */ 20374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* pitch sharpening in the search phase) */ 20384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* do not update sharpening in even subframes for MR475 */ 20394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if ((mode != MR475) || (evenSubfr == 0)) 20404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 20414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->sharp = gain_pit; 20424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 20434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (st->sharp > SHARPMAX) 20444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 20454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->sharp = SHARPMAX; 20464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 20474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 20484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 20494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pit_sharp = shl(pit_sharp, 1, pOverflow); 20504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 20514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (pit_sharp > 16384) 20524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 20534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i = 0; i < L_SUBFR; i++) 20544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 20554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber temp = mult(st->exc[i], pit_sharp, pOverflow); 20564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_temp = L_mult(temp, gain_pit, pOverflow); 20574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 20584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (mode == MR122) 20594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 20604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (L_temp < 0) 20614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 20624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_temp = ~((~L_temp) >> 1); 20634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 20644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 20654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 20664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_temp = L_temp >> 1; 20674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 20684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 20694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *(excp + i) = pv_round(L_temp, pOverflow); 20704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 20714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 20724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 20734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /*-------------------------------------------------------* 20744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - Store list of LTP gains needed in the source * 20754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * characteristic detector (SCD) * 20764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------*/ 20774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 20784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (bfi == 0) 20794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 20804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i = 0; i < 8; i++) 20814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 20824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->ltpGainHistory[i] = st->ltpGainHistory[i+1]; 20834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 20844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->ltpGainHistory[8] = gain_pit; 20854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 20864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 20874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /*-------------------------------------------------------* 20884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - Limit gain_pit if in background noise and BFI * 20894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * for MR475, MR515, MR59 * 20904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------*/ 20914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 20924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 20934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if ((st->prev_bf != 0 || bfi != 0) && st->inBackgroundNoise != 0 && 20944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ((mode == MR475) || (mode == MR515) || (mode == MR59))) 20954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 20964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 20974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (gain_pit > 12288) /* if (gain_pit > 0.75) in Q14*/ 20984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 20994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber gain_pit = ((gain_pit - 12288) >> 1) + 12288; 21004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* gain_pit = (gain_pit-0.75)/2.0 + 0.75; */ 21014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 21024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 21034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (gain_pit > 14745) /* if (gain_pit > 0.90) in Q14*/ 21044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 21054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber gain_pit = 14745; 21064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 21074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 21084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 21094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /*-------------------------------------------------------* 21104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Calculate CB mixed gain * 21114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------*/ 21124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Int_lsf( 21134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber prev_lsf, 21144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->lsfState.past_lsf_q, 21154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber i_subfr, 21164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber lsf_i, 21174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 21184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 21194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber gain_code_mix = 21204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Cb_gain_average( 21214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->Cb_gain_averState), 21224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mode, 21234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber gain_code, 21244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber lsf_i, 21254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->lsp_avg_st.lsp_meanSave, 21264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber bfi, 21274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->prev_bf, 21284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pdfi, 21294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->prev_pdf, 21304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->inBackgroundNoise, 21314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->voicedHangover, 21324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 21334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 21344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* make sure that MR74, MR795, MR122 have original code_gain*/ 21354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if ((mode > MR67) && (mode != MR102)) 21364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* MR74, MR795, MR122 */ 21374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 21384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber gain_code_mix = gain_code; 21394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 21404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 21414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /*-------------------------------------------------------* 21424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - Find the total excitation. * 21434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - Find synthesis speech corresponding to st->exc[]. * 21444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------*/ 21454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (mode <= MR102) /* MR475, MR515, MR59, MR67, MR74, MR795, MR102*/ 21464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 21474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pitch_fac = gain_pit; 21484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber tmp_shift = 1; 21494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 21504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else /* MR122 */ 21514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 21524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (gain_pit < 0) 21534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 21544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pitch_fac = ~((~gain_pit) >> 1); 21554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 21564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 21574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 21584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pitch_fac = gain_pit >> 1; 21594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 21604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber tmp_shift = 2; 21614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 21624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 21634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* copy unscaled LTP excitation to exc_enhanced (used in phase 21644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * dispersion below) and compute total excitation for LTP feedback 21654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber */ 21664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i = 0; i < L_SUBFR; i++) 21674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 21684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber exc_enhanced[i] = st->exc[i]; 21694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 21704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* st->exc[i] = gain_pit*st->exc[i] + gain_code*code[i]; */ 21714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_temp = L_mult(st->exc[i], pitch_fac, pOverflow); 21724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* 12.2: Q0 * Q13 */ 21734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* 7.4: Q0 * Q14 */ 21744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_temp = L_mac(L_temp, code[i], gain_code, pOverflow); 21754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* 12.2: Q12 * Q1 */ 21764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* 7.4: Q13 * Q1 */ 21774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_temp = L_shl(L_temp, tmp_shift, pOverflow); /* Q16 */ 21784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->exc[i] = pv_round(L_temp, pOverflow); 21794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 21804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 21814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /*-------------------------------------------------------* 21824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - Adaptive phase dispersion * 21834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------*/ 21844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ph_disp_release(&(st->ph_disp_st)); /* free phase dispersion adaption */ 21854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 21864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 21874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (((mode == MR475) || (mode == MR515) || (mode == MR59)) && 21884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber (st->voicedHangover > 3) && (st->inBackgroundNoise != 0) && 21894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber (bfi != 0)) 21904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 21914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ph_disp_lock(&(st->ph_disp_st)); /* Always Use full Phase Disp. */ 21924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } /* if error in bg noise */ 21934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 21944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* apply phase dispersion to innovation (if enabled) and 21954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber compute total excitation for synthesis part */ 21964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ph_disp( 21974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->ph_disp_st), 21984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mode, 21994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber exc_enhanced, 22004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber gain_code_mix, 22014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber gain_pit, 22024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber code, 22034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pitch_fac, 22044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber tmp_shift, 22054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 22064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 22074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /*-------------------------------------------------------* 22084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - The Excitation control module are active during BFI.* 22094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * - Conceal drops in signal energy if in bg noise. * 22104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------*/ 22114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_temp = 0; 22124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i = 0; i < L_SUBFR; i++) 22134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 22144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_temp = L_mac(L_temp, *(exc_enhanced + i), *(exc_enhanced + i), pOverflow); 22154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 22164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 22174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* excEnergy = sqrt(L_temp) in Q0 */ 22184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (L_temp < 0) 22194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 22204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_temp = ~((~L_temp) >> 1); 22214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 22224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 22234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 22244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_temp = L_temp >> 1; 22254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 22264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 22274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_temp = sqrt_l_exp(L_temp, &temp, pOverflow); 22284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* To cope with 16-bit and scaling in ex_ctrl() */ 22294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_temp = L_shr(L_temp, (Word16)((temp >> 1) + 15), pOverflow); 22304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (L_temp < 0) 22314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 22324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber excEnergy = (Word16)(~((~L_temp) >> 2)); 22334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 22344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 22354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 22364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber excEnergy = (Word16)(L_temp >> 2); 22374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 22384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 22394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (((mode == MR475) || (mode == MR515) || (mode == MR59)) && 22404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber (st->voicedHangover > 5) && (st->inBackgroundNoise != 0) && 22414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber (st->state < 4) && 22424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ((pdfi != 0 && st->prev_pdf != 0) || bfi != 0 || st->prev_bf != 0)) 22434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 22444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber carefulFlag = 0; 22454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 22464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (pdfi != 0 && bfi == 0) 22474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 22484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber carefulFlag = 1; 22494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 22504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 22514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Ex_ctrl(exc_enhanced, 22524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber excEnergy, 22534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->excEnergyHist, 22544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->voicedHangover, 22554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->prev_bf, 22564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber carefulFlag, pOverflow); 22574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 22584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 22594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (!((st->inBackgroundNoise != 0) && (bfi != 0 || st->prev_bf != 0) && 22604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber (st->state < 4))) 22614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 22624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* Update energy history for all modes */ 22634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i = 0; i < 8; i++) 22644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 22654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->excEnergyHist[i] = st->excEnergyHist[i+1]; 22664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 22674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->excEnergyHist[8] = excEnergy; 22684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 22694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /*-------------------------------------------------------* 22704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Excitation control module end. * 22714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------*/ 22724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (pit_sharp > 16384) 22734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 22744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i = 0; i < L_SUBFR; i++) 22754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 22764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *(excp + i) = add(*(excp + i), *(exc_enhanced + i), pOverflow); 22774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 22784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 22794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber agc2(exc_enhanced, excp, L_SUBFR, pOverflow); 22804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *pOverflow = 0; 22814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Syn_filt(Az, excp, &synth[i_subfr], L_SUBFR, 22824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->mem_syn, 0); 22834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 22844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 22854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 22864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *pOverflow = 0; 22874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Syn_filt(Az, exc_enhanced, &synth[i_subfr], L_SUBFR, 22884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->mem_syn, 0); 22894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 22904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 22914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (*pOverflow != 0) /* Test for overflow */ 22924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 22934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i = PIT_MAX + L_INTERPOL + L_SUBFR - 1; i >= 0; i--) 22944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 22954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (st->old_exc[i] < 0) 22964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 22974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->old_exc[i] = ~((~st->old_exc[i]) >> 2); 22984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 22994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 23004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 23014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->old_exc[i] = st->old_exc[i] >> 2; 23024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 23034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 23044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 23054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 23064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i = L_SUBFR - 1; i >= 0; i--) 23074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 23084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (*(exc_enhanced + i) < 0) 23094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 23104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *(exc_enhanced + i) = ~((~(*(exc_enhanced + i))) >> 2); 23114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 23124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 23134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 23144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *(exc_enhanced + i) = *(exc_enhanced + i) >> 2; 23154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 23164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 23174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Syn_filt(Az, exc_enhanced, &synth[i_subfr], L_SUBFR, st->mem_syn, 1); 23184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 23194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber else 23204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 23214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Copy(&synth[i_subfr+L_SUBFR-M], st->mem_syn, M); 23224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 23234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 23244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /*--------------------------------------------------* 23254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Update signal for next frame. * 23264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * -> shift to the left by L_SUBFR st->exc[] * 23274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *--------------------------------------------------*/ 23284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 23294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Copy(&st->old_exc[L_SUBFR], &st->old_exc[0], PIT_MAX + L_INTERPOL); 23304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 23314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* interpolated LPC parameters for next subframe */ 23324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Az += MP1; 23334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 23344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* store T0 for next subframe */ 23354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->old_T0 = T0; 23364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 23374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 23384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /*-------------------------------------------------------* 23394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Call the Source Characteristic Detector which updates * 23404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * st->inBackgroundNoise and st->voicedHangover. * 23414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *-------------------------------------------------------*/ 23424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 23434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->inBackgroundNoise = 23444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Bgn_scd( 23454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->background_state), 23464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->ltpGainHistory[0]), 23474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(synth[0]), 23484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->voicedHangover), 23494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 23504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 23514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber dtx_dec_activity_update( 23524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->dtxDecoderState), 23534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->lsfState.past_lsf_q, 23544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber synth, 23554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 23564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 23574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* store bfi for next subframe */ 23584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->prev_bf = bfi; 23594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->prev_pdf = pdfi; 23604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 23614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /*--------------------------------------------------* 23624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Calculate the LSF averages on the eight * 23634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * previous frames * 23644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *--------------------------------------------------*/ 23654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber lsp_avg( 23664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber &(st->lsp_avg_st), 23674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->lsfState.past_lsf_q, 23684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pOverflow); 23694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 23704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberthe_end: 23714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber st->dtxDecoderState.dtxGlobalState = newDTXState; 23724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 23734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber// return(0); 23744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber} 2375