1a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/* ------------------------------------------------------------------ 2a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Copyright (C) 1998-2009 PacketVideo 3a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 4a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * you may not use this file except in compliance with the License. 6a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * You may obtain a copy of the License at 7a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 8a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 10a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Unless required by applicable law or agreed to in writing, software 11a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * express or implied. 14a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * See the License for the specific language governing permissions 15a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * and limitations under the License. 16a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * ------------------------------------------------------------------- 17a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber */ 18a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/**************************************************************************************** 19a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberPortions of this file are derived from the following 3GPP standard: 20a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 21a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 3GPP TS 26.073 22a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec 23a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Available from http://www.3gpp.org 24a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 25a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC) 26a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberPermission to distribute, modify and use this file under the standard license 27a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberterms listed above has been obtained from the copyright holder. 28a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber****************************************************************************************/ 29a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/* 30a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 31a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 32a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Pathname: ./audio/gsm-amr/c/src/dec_amr.c 33a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Funtions: Decoder_amr_init 34a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Decoder_amr_reset 35a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Decoder_amr 36a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 37a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 38a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber MODULE DESCRIPTION 39a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 40a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber This file contains the function used to decode one speech frame using a given 41a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber codec mode. The functions used to initialize, reset, and exit are also 42a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber included in this file. 43a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 44a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 45a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/ 46a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 47a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*---------------------------------------------------------------------------- 48a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; INCLUDES 49a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/ 50a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include <string.h> 51a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 52a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "dec_amr.h" 53a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "typedef.h" 54a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "cnst.h" 55a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "copy.h" 56a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "set_zero.h" 57a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "syn_filt.h" 58a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "d_plsf.h" 59a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "agc.h" 60a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "int_lpc.h" 61a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "dec_gain.h" 62a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "dec_lag3.h" 63a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "dec_lag6.h" 64a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "d2_9pf.h" 65a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "d2_11pf.h" 66a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "d3_14pf.h" 67a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "d4_17pf.h" 68a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "d8_31pf.h" 69a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "d1035pf.h" 70a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "pred_lt.h" 71a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "d_gain_p.h" 72a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "d_gain_c.h" 73a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "dec_gain.h" 74a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "ec_gains.h" 75a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "ph_disp.h" 76a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "c_g_aver.h" 77a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "int_lsf.h" 78a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "lsp_lsf.h" 79a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "lsp_avg.h" 80a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "bgnscd.h" 81a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "ex_ctrl.h" 82a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "sqrt_l.h" 83a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "frame.h" 84a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "bitno_tab.h" 85a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "b_cn_cod.h" 86a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "basic_op.h" 87a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 88a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*---------------------------------------------------------------------------- 89a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; MACROS 90a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Define module specific macros here 91a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/ 92a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 93a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*---------------------------------------------------------------------------- 94a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; DEFINES 95a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Include all pre-processor statements here. Include conditional 96a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; compile variables also. 97a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/ 98a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 99a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*---------------------------------------------------------------------------- 100a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; LOCAL FUNCTION DEFINITIONS 101a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Function Prototype declaration 102a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/ 103a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 104a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*---------------------------------------------------------------------------- 105a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; LOCAL VARIABLE DEFINITIONS 106a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Variable declaration - defined here and used outside this module 107a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/ 108a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 109a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 110a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/* 111a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 112a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: Decoder_amr_init 113a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 114a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS 115a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 116a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs: 117a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state = pointer to a pointer to structures of type Decoder_amrState 118a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 119a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs: 120a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber structure pointed to by the pointer which is pointed to by state is 121a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber initialized to each field's initial values 122a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 123a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state pointer points to the address of the memory allocated by 124a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Decoder_amr_init function 125a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 126a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns: 127a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return_value = 0, if the initialization was successful; -1, otherwise (int) 128a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 129a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used: 130a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 131a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 132a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed: 133a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 134a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 135a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 136a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION 137a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 138a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber This function allocates and initializes state memory used by the Decoder_amr 139a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber function. It stores the pointer to the filter status structure in state. This 140a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pointer has to be passed to Decoder_amr in each call. The function returns 141a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 0, if initialization was successful and -1, otherwise. 142a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 143a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 144a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS 145a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 146a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 147a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 148a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 149a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES 150a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 151a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber dec_amr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 152a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 153a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 154a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE 155a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 156a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberint Decoder_amr_init (Decoder_amrState **state) 157a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 158a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Decoder_amrState* s; 159a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 i; 160a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 161a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (state == (Decoder_amrState **) NULL){ 162a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber fprintf(stderr, "Decoder_amr_init: invalid parameter\n"); 163a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return -1; 164a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 165a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *state = NULL; 166a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 167a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // allocate memory 168a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ((s= (Decoder_amrState *) malloc(sizeof(Decoder_amrState))) == NULL){ 169a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber fprintf(stderr, "Decoder_amr_init: can not malloc state structure\n"); 170a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return -1; 171a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 172a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 173a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber s->T0_lagBuff = 40; 174a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber s->inBackgroundNoise = 0; 175a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber s->voicedHangover = 0; 176a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = 0; i < 9; i++) 177a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber s->ltpGainHistory[i] = 0; 178a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 179a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber s->lsfState = NULL; 180a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber s->ec_gain_p_st = NULL; 181a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber s->ec_gain_c_st = NULL; 182a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber s->pred_state = NULL; 183a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber s->ph_disp_st = NULL; 184a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber s->dtxDecoderState = NULL; 185a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 186a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (D_plsf_init(&s->lsfState) || 187a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_pitch_init(&s->ec_gain_p_st) || 188a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_code_init(&s->ec_gain_c_st) || 189a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber gc_pred_init(&s->pred_state) || 190a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Cb_gain_average_init(&s->Cb_gain_averState) || 191a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber lsp_avg_init(&s->lsp_avg_st) || 192a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Bgn_scd_init(&s->background_state) || 193a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ph_disp_init(&s->ph_disp_st) || 194a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber dtx_dec_init(&s->dtxDecoderState)) { 195a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Decoder_amr_exit(&s); 196a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return -1; 197a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 198a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 199a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Decoder_amr_reset(s, (enum Mode)0); 200a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *state = s; 201a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 202a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return 0; 203a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber} 204a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 205a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 206a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional] 207a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 208a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the 209a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below. 210a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 211a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes 212a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 213a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes 214a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 215a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 216a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber used to represent cycle count for each subroutine 217a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber called) 218a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber where: (cycle count variable) = cycle count for [subroutine 219a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber name] 220a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 221a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 222a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional] 223a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function] 224a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 225a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 226a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/ 227a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 228a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberWord16 Decoder_amr_init(Decoder_amrState *s) 229a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 230a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 i; 231a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 232a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (s == (Decoder_amrState *) NULL) 233a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 234a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* fprint(stderr, "Decoder_amr_init: invalid parameter\n"); */ 235a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return(-1); 236a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 237a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 238a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber s->T0_lagBuff = 40; 239a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber s->inBackgroundNoise = 0; 240a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber s->voicedHangover = 0; 241a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 242a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* Initialize overflow Flag */ 243a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 244a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber s->overflow = 0; 245a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 246a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = 0; i < LTP_GAIN_HISTORY_LEN; i++) 247a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 248a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber s->ltpGainHistory[i] = 0; 249a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 250a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 251a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber D_plsf_reset(&s->lsfState); 252a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_pitch_reset(&s->ec_gain_p_st); 253a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_code_reset(&s->ec_gain_c_st); 254a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Cb_gain_average_reset(&s->Cb_gain_averState); 255a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber lsp_avg_reset(&s->lsp_avg_st); 256a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Bgn_scd_reset(&s->background_state); 257a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ph_disp_reset(&s->ph_disp_st); 258a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber dtx_dec_reset(&s->dtxDecoderState); 259a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber gc_pred_reset(&s->pred_state); 260a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 261a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Decoder_amr_reset(s, MR475); 262a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 263a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return(0); 264a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber} 265a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 266a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/****************************************************************************/ 267a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 268a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/* 269a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 270a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: Decoder_amr_reset 271a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 272a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS 273a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 274a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs: 275a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state = pointer to a structure of type Decoder_amrState 276a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber mode = codec mode (enum Mode) 277a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 278a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs: 279a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber structure pointed to by state is initialized to its reset value 280a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 281a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns: 282a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return_value = 0, if reset was successful; -1, otherwise (int) 283a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 284a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used: 285a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 286a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 287a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed: 288a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 289a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 290a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 291a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION 292a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 293a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber This function resets the state memory used by the Decoder_amr function. It 294a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber returns a 0, if reset was successful and -1, otherwise. 295a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 296a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 297a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS 298a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 299a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 300a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 301a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 302a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES 303a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 304a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber dec_amr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 305a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 306a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 307a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE 308a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 309a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberint Decoder_amr_reset (Decoder_amrState *state, enum Mode mode) 310a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 311a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 i; 312a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 313a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (state == (Decoder_amrState *) NULL){ 314a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber fprintf(stderr, "Decoder_amr_reset: invalid parameter\n"); 315a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return -1; 316a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 317a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 318a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // Initialize static pointer 319a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->exc = state->old_exc + PIT_MAX + L_INTERPOL; 320a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 321a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // Static vectors to zero 322a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Set_zero (state->old_exc, PIT_MAX + L_INTERPOL); 323a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 324a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (mode != MRDTX) 325a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Set_zero (state->mem_syn, M); 326a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 327a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // initialize pitch sharpening 328a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->sharp = SHARPMIN; 329a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->old_T0 = 40; 330a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 331a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // Initialize state->lsp_old [] 332a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 333a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (mode != MRDTX) { 334a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Copy(lsp_init_data, &state->lsp_old[0], M); 335a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 336a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 337a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // Initialize memories of bad frame handling 338a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->prev_bf = 0; 339a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->prev_pdf = 0; 340a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->state = 0; 341a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 342a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->T0_lagBuff = 40; 343a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->inBackgroundNoise = 0; 344a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->voicedHangover = 0; 345a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (mode != MRDTX) { 346a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i=0;i<9;i++) 347a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->excEnergyHist[i] = 0; 348a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 349a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 350a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = 0; i < 9; i++) 351a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->ltpGainHistory[i] = 0; 352a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 353a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Cb_gain_average_reset(state->Cb_gain_averState); 354a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (mode != MRDTX) 355a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber lsp_avg_reset(state->lsp_avg_st); 356a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber D_plsf_reset(state->lsfState); 357a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_pitch_reset(state->ec_gain_p_st); 358a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_code_reset(state->ec_gain_c_st); 359a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 360a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (mode != MRDTX) 361a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber gc_pred_reset(state->pred_state); 362a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 363a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Bgn_scd_reset(state->background_state); 364a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->nodataSeed = 21845; 365a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ph_disp_reset(state->ph_disp_st); 366a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (mode != MRDTX) 367a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber dtx_dec_reset(state->dtxDecoderState); 368a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 369a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return 0; 370a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber} 371a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 372a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 373a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional] 374a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 375a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the 376a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below. 377a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 378a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes 379a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 380a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes 381a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 382a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 383a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber used to represent cycle count for each subroutine 384a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber called) 385a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber where: (cycle count variable) = cycle count for [subroutine 386a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber name] 387a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 388a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 389a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional] 390a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function] 391a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 392a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 393a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/ 394a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 395a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberWord16 Decoder_amr_reset(Decoder_amrState *state, enum Mode mode) 396a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 397a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 i; 398a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 399a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (state == (Decoder_amrState *) NULL) 400a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 401a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* fprint(stderr, "Decoder_amr_reset: invalid parameter\n"); */ 402a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return(-1); 403a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 404a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 405a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* Initialize static pointer */ 406a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->exc = state->old_exc + PIT_MAX + L_INTERPOL; 407a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 408a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* Static vectors to zero */ 409a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber memset(state->old_exc, 0, sizeof(Word16)*(PIT_MAX + L_INTERPOL)); 410a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 411a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (mode != MRDTX) 412a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 413a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber memset(state->mem_syn, 0, sizeof(Word16)*M); 414a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 415a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* initialize pitch sharpening */ 416a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->sharp = SHARPMIN; 417a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->old_T0 = 40; 418a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 419a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* Initialize overflow Flag */ 420a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 421a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->overflow = 0; 422a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 423a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* Initialize state->lsp_old [] */ 424a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 425a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (mode != MRDTX) 426a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 427a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->lsp_old[0] = 30000; 428a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->lsp_old[1] = 26000; 429a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->lsp_old[2] = 21000; 430a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->lsp_old[3] = 15000; 431a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->lsp_old[4] = 8000; 432a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->lsp_old[5] = 0; 433a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->lsp_old[6] = -8000; 434a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->lsp_old[7] = -15000; 435a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->lsp_old[8] = -21000; 436a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->lsp_old[9] = -26000; 437a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 438a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 439a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* Initialize memories of bad frame handling */ 440a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->prev_bf = 0; 441a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->prev_pdf = 0; 442a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->state = 0; 443a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 444a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->T0_lagBuff = 40; 445a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->inBackgroundNoise = 0; 446a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->voicedHangover = 0; 447a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (mode != MRDTX) 448a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 449a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = 0; i < EXC_ENERGY_HIST_LEN; i++) 450a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 451a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->excEnergyHist[i] = 0; 452a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 453a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 454a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 455a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = 0; i < LTP_GAIN_HISTORY_LEN; i++) 456a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 457a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->ltpGainHistory[i] = 0; 458a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 459a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 460a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Cb_gain_average_reset(&(state->Cb_gain_averState)); 461a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (mode != MRDTX) 462a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 463a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber lsp_avg_reset(&(state->lsp_avg_st)); 464a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 465a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber D_plsf_reset(&(state->lsfState)); 466a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_pitch_reset(&(state->ec_gain_p_st)); 467a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_code_reset(&(state->ec_gain_c_st)); 468a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 469a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (mode != MRDTX) 470a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 471a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber gc_pred_reset(&(state->pred_state)); 472a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 473a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 474a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Bgn_scd_reset(&(state->background_state)); 475a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber state->nodataSeed = 21845; 476a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ph_disp_reset(&(state->ph_disp_st)); 477a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (mode != MRDTX) 478a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 479a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber dtx_dec_reset(&(state->dtxDecoderState)); 480a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 481a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 482a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return(0); 483a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber} 484a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 485a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/****************************************************************************/ 486a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 487a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/* 488a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 489a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: Decoder_amr 490a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 491a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS 492a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 493a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs: 494a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st = pointer to a structure of type Decoder_amrState 495a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber mode = codec mode (enum Mode) 496a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber parm = buffer of synthesis parameters (Word16) 497a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber frame_type = received frame type (enum RXFrameType) 498a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber synth = buffer containing synthetic speech (Word16) 499a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber A_t = buffer containing decoded LP filter in 4 subframes (Word16) 500a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 501a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs: 502a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber structure pointed to by st contains the newly calculated decoder 503a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber parameters 504a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber synth buffer contains the decoded speech samples 505a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber A_t buffer contains the decoded LP filter parameters 506a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 507a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns: 508a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return_value = 0 (int) 509a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 510a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used: 511a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 512a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 513a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed: 514a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 515a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 516a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 517a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION 518a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 519a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber This function performs the decoding of one speech frame for a given codec 520a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber mode. 521a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 522a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 523a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS 524a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 525a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 526a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 527a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 528a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES 529a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 530a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber dec_amr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 531a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 532a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 533a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE 534a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 535a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberint Decoder_amr ( 536a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Decoder_amrState *st, // i/o : State variables 537a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber enum Mode mode, // i : AMR mode 538a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 parm[], // i : vector of synthesis parameters 539a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (PRM_SIZE) 540a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber enum RXFrameType frame_type, // i : received frame type 541a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 synth[], // o : synthesis speech (L_FRAME) 542a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 A_t[] // o : decoded LP filter in 4 subframes 543a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (AZ_SIZE) 544a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber) 545a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 546a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // LPC coefficients 547a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 548a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 *Az; // Pointer on A_t 549a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 550a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // LSPs 551a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 552a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 lsp_new[M]; 553a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 lsp_mid[M]; 554a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 555a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // LSFs 556a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 557a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 prev_lsf[M]; 558a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 lsf_i[M]; 559a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 560a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // Algebraic codevector 561a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 562a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 code[L_SUBFR]; 563a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 564a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // excitation 565a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 566a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 excp[L_SUBFR]; 567a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 exc_enhanced[L_SUBFR]; 568a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 569a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // Scalars 570a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 571a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 i, i_subfr; 572a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 T0, T0_frac, index, index_mr475 = 0; 573a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 gain_pit, gain_code, gain_code_mix, pit_sharp, pit_flag, pitch_fac; 574a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 t0_min, t0_max; 575a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 delta_frc_low, delta_frc_range; 576a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 tmp_shift; 577a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 temp; 578a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word32 L_temp; 579a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 flag4; 580a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 carefulFlag; 581a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 excEnergy; 582a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 subfrNr; 583a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 evenSubfr = 0; 584a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 585a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 bfi = 0; // bad frame indication flag 586a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 pdfi = 0; // potential degraded bad frame flag 587a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 588a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber enum DTXStateType newDTXState; // SPEECH , DTX, DTX_MUTE 589a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 590a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // find the new DTX state SPEECH OR DTX 591a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber newDTXState = rx_dtx_handler(st->dtxDecoderState, frame_type); 592a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 593a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // DTX actions 594a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (sub(newDTXState, SPEECH) != 0 ) 595a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 596a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Decoder_amr_reset (st, MRDTX); 597a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 598a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber dtx_dec(st->dtxDecoderState, 599a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->mem_syn, 600a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->lsfState, 601a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->pred_state, 602a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->Cb_gain_averState, 603a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber newDTXState, 604a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber mode, 605a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber parm, synth, A_t); 606a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // update average lsp 607a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 608a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Lsf_lsp(st->lsfState->past_lsf_q, st->lsp_old, M); 609a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber lsp_avg(st->lsp_avg_st, st->lsfState->past_lsf_q); 610a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber goto the_end; 611a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 612a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 613a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // SPEECH action state machine 614a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ((sub(frame_type, RX_SPEECH_BAD) == 0) || 615a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (sub(frame_type, RX_NO_DATA) == 0) || 616a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (sub(frame_type, RX_ONSET) == 0)) 617a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 618a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber bfi = 1; 619a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ((sub(frame_type, RX_NO_DATA) == 0) || 620a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (sub(frame_type, RX_ONSET) == 0)) 621a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 622a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber build_CN_param(&st->nodataSeed, 623a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber prmno[mode], 624a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber bitno[mode], 625a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber parm); 626a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 627a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 628a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else if (sub(frame_type, RX_SPEECH_DEGRADED) == 0) 629a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 630a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pdfi = 1; 631a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 632a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 633a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (bfi != 0) 634a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 635a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->state = add (st->state, 1); 636a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 637a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else if (sub (st->state, 6) == 0) 638a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 639a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 640a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->state = 5; 641a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 642a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 643a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 644a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->state = 0; 645a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 646a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 647a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (sub (st->state, 6) > 0) 648a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 649a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->state = 6; 650a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 651a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 652a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // If this frame is the first speech frame after CNI period, 653a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // set the BFH state machine to an appropriate state depending 654a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // on whether there was DTX muting before start of speech or not 655a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // If there was DTX muting, the first speech frame is muted. 656a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // If there was no DTX muting, the first speech frame is not 657a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // muted. The BFH state machine starts from state 5, however, to 658a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // keep the audible noise resulting from a SID frame which is 659a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // erroneously interpreted as a good speech frame as small as 660a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // possible (the decoder output in this case is quickly muted) 661a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 662a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (sub(st->dtxDecoderState->dtxGlobalState, DTX) == 0) 663a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 664a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->state = 5; 665a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->prev_bf = 0; 666a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 667a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else if (sub(st->dtxDecoderState->dtxGlobalState, DTX_MUTE) == 0) 668a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 669a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->state = 5; 670a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->prev_bf = 1; 671a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 672a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 673a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // save old LSFs for CB gain smoothing 674a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Copy (st->lsfState->past_lsf_q, prev_lsf, M); 675a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 676a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // decode LSF parameters and generate interpolated lpc coefficients 677a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for the 4 subframes 678a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (sub (mode, MR122) != 0) 679a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 680a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber D_plsf_3(st->lsfState, mode, bfi, parm, lsp_new); 681a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 682a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // Advance synthesis parameters pointer 683a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber parm += 3; 684a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 685a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Int_lpc_1to3(st->lsp_old, lsp_new, A_t); 686a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 687a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 688a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 689a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber D_plsf_5 (st->lsfState, bfi, parm, lsp_mid, lsp_new); 690a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 691a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // Advance synthesis parameters pointer 692a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber parm += 5; 693a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 694a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Int_lpc_1and3 (st->lsp_old, lsp_mid, lsp_new, A_t); 695a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 696a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 697a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // update the LSPs for the next frame 698a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = 0; i < M; i++) 699a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 700a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->lsp_old[i] = lsp_new[i]; 701a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 702a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 703a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *------------------------------------------------------------------------* 704a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Loop for every subframe in the analysis frame * 705a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *------------------------------------------------------------------------* 706a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * The subframe size is L_SUBFR and the loop is repeated L_FRAME/L_SUBFR * 707a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * times * 708a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - decode the pitch delay * 709a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - decode algebraic code * 710a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - decode pitch and codebook gains * 711a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - find the excitation and compute synthesis speech * 712a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *------------------------------------------------------------------------* 713a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 714a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // pointer to interpolated LPC parameters 715a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Az = A_t; 716a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 717a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber evenSubfr = 0; 718a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber subfrNr = -1; 719a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR) 720a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 721a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber subfrNr = add(subfrNr, 1); 722a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber evenSubfr = sub(1, evenSubfr); 723a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 724a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // flag for first and 3th subframe 725a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_flag = i_subfr; 726a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 727a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (sub (i_subfr, L_FRAME_BY2) == 0) 728a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 729a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (sub(mode, MR475) != 0 && sub(mode, MR515) != 0) 730a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 731a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_flag = 0; 732a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 733a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 734a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 735a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // pitch index 736a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index = *parm++; 737a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 738a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------* 739a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - decode pitch lag and find adaptive codebook vector. * 740a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------* 741a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 742a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (sub(mode, MR122) != 0) 743a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 744a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // flag4 indicates encoding with 4 bit resolution; 745a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // this is needed for mode MR475, MR515, MR59 and MR67 746a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 747a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber flag4 = 0; 748a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ((sub (mode, MR475) == 0) || 749a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (sub (mode, MR515) == 0) || 750a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (sub (mode, MR59) == 0) || 751a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (sub (mode, MR67) == 0) ) { 752a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber flag4 = 1; 753a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 754a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 755a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------* 756a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - get ranges for the t0_min and t0_max * 757a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - only needed in delta decoding * 758a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------* 759a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 760a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber delta_frc_low = 5; 761a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber delta_frc_range = 9; 762a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 763a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ( sub(mode, MR795) == 0 ) 764a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 765a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber delta_frc_low = 10; 766a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber delta_frc_range = 19; 767a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 768a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 769a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber t0_min = sub(st->old_T0, delta_frc_low); 770a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (sub(t0_min, PIT_MIN) < 0) 771a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 772a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber t0_min = PIT_MIN; 773a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 774a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber t0_max = add(t0_min, delta_frc_range); 775a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (sub(t0_max, PIT_MAX) > 0) 776a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 777a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber t0_max = PIT_MAX; 778a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber t0_min = sub(t0_max, delta_frc_range); 779a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 780a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 781a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Dec_lag3 (index, t0_min, t0_max, pit_flag, st->old_T0, 782a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &T0, &T0_frac, flag4); 783a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 784a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->T0_lagBuff = T0; 785a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 786a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (bfi != 0) 787a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 788a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (sub (st->old_T0, PIT_MAX) < 0) 789a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { // Graceful pitch 790a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->old_T0 = add(st->old_T0, 1); // degradation 791a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 792a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber T0 = st->old_T0; 793a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber T0_frac = 0; 794a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 795a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ( st->inBackgroundNoise != 0 && 796a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber sub(st->voicedHangover, 4) > 0 && 797a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ((sub(mode, MR475) == 0 ) || 798a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (sub(mode, MR515) == 0 ) || 799a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (sub(mode, MR59) == 0) ) 800a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ) 801a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 802a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber T0 = st->T0_lagBuff; 803a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 804a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 805a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 806a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Pred_lt_3or6 (st->exc, T0, T0_frac, L_SUBFR, 1); 807a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 808a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 809a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 810a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Dec_lag6 (index, PIT_MIN_MR122, 811a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PIT_MAX, pit_flag, &T0, &T0_frac); 812a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 813a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ( bfi == 0 && (pit_flag == 0 || sub (index, 61) < 0)) 814a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 815a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 816a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 817a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 818a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->T0_lagBuff = T0; 819a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber T0 = st->old_T0; 820a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber T0_frac = 0; 821a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 822a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 823a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Pred_lt_3or6 (st->exc, T0, T0_frac, L_SUBFR, 0); 824a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 825a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 826a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------* 827a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - (MR122 only: Decode pitch gain.) * 828a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - Decode innovative codebook. * 829a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - set pitch sharpening factor * 830a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------* 831a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 832a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (sub (mode, MR475) == 0 || sub (mode, MR515) == 0) 833a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { // MR475, MR515 834a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index = *parm++; // index of position 835a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber i = *parm++; // signs 836a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 837a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber decode_2i40_9bits (subfrNr, i, index, code); 838a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 839a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = shl (st->sharp, 1); 840a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 841a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else if (sub (mode, MR59) == 0) 842a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { // MR59 843a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index = *parm++; // index of position 844a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber i = *parm++; // signs 845a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 846a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber decode_2i40_11bits (i, index, code); 847a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 848a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = shl (st->sharp, 1); 849a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 850a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else if (sub (mode, MR67) == 0) 851a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { // MR67 852a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index = *parm++; // index of position 853a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber i = *parm++; // signs 854a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 855a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber decode_3i40_14bits (i, index, code); 856a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 857a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = shl (st->sharp, 1); 858a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 859a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else if (sub (mode, MR795) <= 0) 860a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { // MR74, MR795 861a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index = *parm++; // index of position 862a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber i = *parm++; // signs 863a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 864a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber decode_4i40_17bits (i, index, code); 865a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 866a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = shl (st->sharp, 1); 867a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 868a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else if (sub (mode, MR102) == 0) 869a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { // MR102 870a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber dec_8i40_31bits (parm, code); 871a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber parm += 7; 872a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 873a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = shl (st->sharp, 1); 874a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 875a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 876a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { // MR122 877a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index = *parm++; 878a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (bfi != 0) 879a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 880a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_pitch (st->ec_gain_p_st, st->state, &gain_pit); 881a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 882a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 883a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 884a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber gain_pit = d_gain_pitch (mode, index); 885a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 886a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_pitch_update (st->ec_gain_p_st, bfi, st->prev_bf, 887a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_pit); 888a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 889a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber dec_10i40_35bits (parm, code); 890a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber parm += 10; 891a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 892a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // pit_sharp = gain_pit; 893a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // if (pit_sharp > 1.0) pit_sharp = 1.0; 894a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 895a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = shl (gain_pit, 1); 896a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 897a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 898a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------* 899a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - Add the pitch contribution to code[]. * 900a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------* 901a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = T0; i < L_SUBFR; i++) 902a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 903a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber temp = mult (code[i - T0], pit_sharp); 904a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber code[i] = add (code[i], temp); 905a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 906a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 907a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *------------------------------------------------------------* 908a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - Decode codebook gain (MR122) or both pitch * 909a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * gain and codebook gain (all others) * 910a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - Update pitch sharpening "sharp" with quantized gain_pit * 911a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *------------------------------------------------------------* 912a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 913a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (sub (mode, MR475) == 0) 914a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 915a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // read and decode pitch and code gain 916a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (evenSubfr != 0) 917a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 918a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index_mr475 = *parm++; // index of gain(s) 919a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 920a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 921a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (bfi == 0) 922a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 923a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Dec_gain(st->pred_state, mode, index_mr475, code, 924a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber evenSubfr, &gain_pit, &gain_code); 925a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 926a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 927a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 928a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_pitch (st->ec_gain_p_st, st->state, &gain_pit); 929a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_code (st->ec_gain_c_st, st->pred_state, st->state, 930a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_code); 931a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 932a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_pitch_update (st->ec_gain_p_st, bfi, st->prev_bf, 933a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_pit); 934a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_code_update (st->ec_gain_c_st, bfi, st->prev_bf, 935a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_code); 936a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 937a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = gain_pit; 938a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (sub (pit_sharp, SHARPMAX) > 0) 939a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 940a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = SHARPMAX; 941a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 942a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 943a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 944a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else if ((sub (mode, MR74) <= 0) || 945a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (sub (mode, MR102) == 0)) 946a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 947a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // read and decode pitch and code gain 948a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index = *parm++; // index of gain(s) 949a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 950a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (bfi == 0) 951a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 952a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Dec_gain(st->pred_state, mode, index, code, 953a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber evenSubfr, &gain_pit, &gain_code); 954a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 955a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 956a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 957a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_pitch (st->ec_gain_p_st, st->state, &gain_pit); 958a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_code (st->ec_gain_c_st, st->pred_state, st->state, 959a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_code); 960a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 961a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_pitch_update (st->ec_gain_p_st, bfi, st->prev_bf, 962a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_pit); 963a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_code_update (st->ec_gain_c_st, bfi, st->prev_bf, 964a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_code); 965a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 966a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = gain_pit; 967a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (sub (pit_sharp, SHARPMAX) > 0) 968a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 969a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = SHARPMAX; 970a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 971a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 972a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (sub (mode, MR102) == 0) 973a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 974a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (sub (st->old_T0, add(L_SUBFR, 5)) > 0) 975a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 976a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = shr(pit_sharp, 2); 977a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 978a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 979a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 980a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 981a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 982a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // read and decode pitch gain 983a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index = *parm++; // index of gain(s) 984a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 985a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (sub (mode, MR795) == 0) 986a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 987a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // decode pitch gain 988a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (bfi != 0) 989a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 990a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_pitch (st->ec_gain_p_st, st->state, &gain_pit); 991a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 992a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 993a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 994a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber gain_pit = d_gain_pitch (mode, index); 995a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 996a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_pitch_update (st->ec_gain_p_st, bfi, st->prev_bf, 997a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_pit); 998a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 999a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // read and decode code gain 1000a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index = *parm++; 1001a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (bfi == 0) 1002a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1003a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber d_gain_code (st->pred_state, mode, index, code, &gain_code); 1004a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1005a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 1006a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1007a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_code (st->ec_gain_c_st, st->pred_state, st->state, 1008a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_code); 1009a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1010a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_code_update (st->ec_gain_c_st, bfi, st->prev_bf, 1011a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_code); 1012a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1013a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = gain_pit; 1014a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (sub (pit_sharp, SHARPMAX) > 0) 1015a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1016a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = SHARPMAX; 1017a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1018a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1019a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 1020a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { // MR122 1021a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (bfi == 0) 1022a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1023a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber d_gain_code (st->pred_state, mode, index, code, &gain_code); 1024a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1025a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 1026a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1027a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_code (st->ec_gain_c_st, st->pred_state, st->state, 1028a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_code); 1029a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1030a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_code_update (st->ec_gain_c_st, bfi, st->prev_bf, 1031a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_code); 1032a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1033a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = gain_pit; 1034a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1035a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1036a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1037a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // store pitch sharpening for next subframe 1038a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // (for modes which use the previous pitch gain for 1039a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // pitch sharpening in the search phase) 1040a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // do not update sharpening in even subframes for MR475 1041a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (sub(mode, MR475) != 0 || evenSubfr == 0) 1042a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1043a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->sharp = gain_pit; 1044a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (sub (st->sharp, SHARPMAX) > 0) 1045a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1046a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->sharp = SHARPMAX; 1047a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1048a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1049a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1050a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = shl (pit_sharp, 1); 1051a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (sub (pit_sharp, 16384) > 0) 1052a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1053a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = 0; i < L_SUBFR; i++) 1054a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1055a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber temp = mult (st->exc[i], pit_sharp); 1056a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_temp = L_mult (temp, gain_pit); 1057a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (sub(mode, MR122)==0) 1058a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1059a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_temp = L_shr (L_temp, 1); 1060a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1061a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber excp[i] = pv_round (L_temp); 1062a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1063a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1064a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1065a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------* 1066a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - Store list of LTP gains needed in the source * 1067a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * characteristic detector (SCD) * 1068a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------* 1069a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ( bfi == 0 ) 1070a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1071a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = 0; i < 8; i++) 1072a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1073a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->ltpGainHistory[i] = st->ltpGainHistory[i+1]; 1074a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1075a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->ltpGainHistory[8] = gain_pit; 1076a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1077a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1078a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------* 1079a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - Limit gain_pit if in background noise and BFI * 1080a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * for MR475, MR515, MR59 * 1081a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------* 1082a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1083a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ( (st->prev_bf != 0 || bfi != 0) && st->inBackgroundNoise != 0 && 1084a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ((sub(mode, MR475) == 0) || 1085a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (sub(mode, MR515) == 0) || 1086a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (sub(mode, MR59) == 0)) 1087a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ) 1088a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1089a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ( sub (gain_pit, 12288) > 0) // if (gain_pit > 0.75) in Q14 1090a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber gain_pit = add( shr( sub(gain_pit, 12288), 1 ), 12288 ); 1091a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // gain_pit = (gain_pit-0.75)/2.0 + 0.75; 1092a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1093a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ( sub (gain_pit, 14745) > 0) // if (gain_pit > 0.90) in Q14 1094a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1095a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber gain_pit = 14745; 1096a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1097a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1098a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1099a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------* 1100a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Calculate CB mixed gain * 1101a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------* 1102a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Int_lsf(prev_lsf, st->lsfState->past_lsf_q, i_subfr, lsf_i); 1103a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber gain_code_mix = Cb_gain_average( 1104a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->Cb_gain_averState, mode, gain_code, 1105a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber lsf_i, st->lsp_avg_st->lsp_meanSave, bfi, 1106a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->prev_bf, pdfi, st->prev_pdf, 1107a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->inBackgroundNoise, st->voicedHangover); 1108a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1109a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // make sure that MR74, MR795, MR122 have original code_gain 1110a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ((sub(mode, MR67) > 0) && (sub(mode, MR102) != 0) ) 1111a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // MR74, MR795, MR122 1112a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1113a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber gain_code_mix = gain_code; 1114a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1115a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1116a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------* 1117a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - Find the total excitation. * 1118a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - Find synthesis speech corresponding to st->exc[]. * 1119a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------* 1120a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (sub(mode, MR102) <= 0) // MR475, MR515, MR59, MR67, MR74, MR795, MR102 1121a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1122a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pitch_fac = gain_pit; 1123a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber tmp_shift = 1; 1124a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1125a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else // MR122 1126a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1127a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pitch_fac = shr (gain_pit, 1); 1128a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber tmp_shift = 2; 1129a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1130a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1131a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // copy unscaled LTP excitation to exc_enhanced (used in phase 1132a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * dispersion below) and compute total excitation for LTP feedback 1133a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1134a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = 0; i < L_SUBFR; i++) 1135a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1136a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber exc_enhanced[i] = st->exc[i]; 1137a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1138a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // st->exc[i] = gain_pit*st->exc[i] + gain_code*code[i]; 1139a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_temp = L_mult (st->exc[i], pitch_fac); 1140a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // 12.2: Q0 * Q13 1141a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // 7.4: Q0 * Q14 1142a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_temp = L_mac (L_temp, code[i], gain_code); 1143a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // 12.2: Q12 * Q1 1144a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // 7.4: Q13 * Q1 1145a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_temp = L_shl (L_temp, tmp_shift); // Q16 1146a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->exc[i] = pv_round (L_temp); 1147a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1148a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1149a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------* 1150a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - Adaptive phase dispersion * 1151a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------* 1152a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ph_disp_release(st->ph_disp_st); // free phase dispersion adaption 1153a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1154a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ( ((sub(mode, MR475) == 0) || 1155a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (sub(mode, MR515) == 0) || 1156a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (sub(mode, MR59) == 0)) && 1157a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber sub(st->voicedHangover, 3) > 0 && 1158a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->inBackgroundNoise != 0 && 1159a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber bfi != 0 ) 1160a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1161a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ph_disp_lock(st->ph_disp_st); // Always Use full Phase Disp. 1162a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } // if error in bg noise 1163a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1164a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // apply phase dispersion to innovation (if enabled) and 1165a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber compute total excitation for synthesis part 1166a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ph_disp(st->ph_disp_st, mode, 1167a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber exc_enhanced, gain_code_mix, gain_pit, code, 1168a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pitch_fac, tmp_shift); 1169a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1170a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------* 1171a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - The Excitation control module are active during BFI.* 1172a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - Conceal drops in signal energy if in bg noise. * 1173a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------* 1174a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1175a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_temp = 0; 1176a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = 0; i < L_SUBFR; i++) 1177a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1178a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_temp = L_mac (L_temp, exc_enhanced[i], exc_enhanced[i] ); 1179a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1180a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1181a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_temp = L_shr (L_temp, 1); // excEnergy = sqrt(L_temp) in Q0 1182a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_temp = sqrt_l_exp(L_temp, &temp); // function result 1183a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_temp = L_shr(L_temp, add( shr(temp, 1), 15)); 1184a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_temp = L_shr(L_temp, 2); // To cope with 16-bit and 1185a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber excEnergy = extract_l(L_temp); // scaling in ex_ctrl() 1186a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1187a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ( ((sub (mode, MR475) == 0) || 1188a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (sub (mode, MR515) == 0) || 1189a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (sub (mode, MR59) == 0)) && 1190a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber sub(st->voicedHangover, 5) > 0 && 1191a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->inBackgroundNoise != 0 && 1192a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber sub(st->state, 4) < 0 && 1193a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ( (pdfi != 0 && st->prev_pdf != 0) || 1194a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber bfi != 0 || 1195a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->prev_bf != 0) ) 1196a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1197a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber carefulFlag = 0; 1198a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ( pdfi != 0 && bfi == 0 ) 1199a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1200a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber carefulFlag = 1; 1201a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1202a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1203a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Ex_ctrl(exc_enhanced, 1204a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber excEnergy, 1205a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->excEnergyHist, 1206a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->voicedHangover, 1207a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->prev_bf, 1208a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber carefulFlag); 1209a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1210a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1211a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ( st->inBackgroundNoise != 0 && 1212a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ( bfi != 0 || st->prev_bf != 0 ) && 1213a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber sub(st->state, 4) < 0 ) 1214a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1215a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ; // do nothing! 1216a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1217a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 1218a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1219a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // Update energy history for all modes 1220a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = 0; i < 8; i++) 1221a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1222a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->excEnergyHist[i] = st->excEnergyHist[i+1]; 1223a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1224a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->excEnergyHist[8] = excEnergy; 1225a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1226a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------* 1227a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Excitation control module end. * 1228a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------* 1229a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1230a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (sub (pit_sharp, 16384) > 0) 1231a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1232a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = 0; i < L_SUBFR; i++) 1233a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1234a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber excp[i] = add (excp[i], exc_enhanced[i]); 1235a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1236a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber agc2 (exc_enhanced, excp, L_SUBFR); 1237a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Overflow = 0; 1238a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Syn_filt (Az, excp, &synth[i_subfr], L_SUBFR, 1239a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->mem_syn, 0); 1240a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1241a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 1242a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1243a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Overflow = 0; 1244a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Syn_filt (Az, exc_enhanced, &synth[i_subfr], L_SUBFR, 1245a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->mem_syn, 0); 1246a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1247a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1248a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (Overflow != 0) // Test for overflow 1249a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1250a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = 0; i < PIT_MAX + L_INTERPOL + L_SUBFR; i++) 1251a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1252a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->old_exc[i] = shr(st->old_exc[i], 2); 1253a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1254a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = 0; i < L_SUBFR; i++) 1255a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1256a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber exc_enhanced[i] = shr(exc_enhanced[i], 2); 1257a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1258a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Syn_filt(Az, exc_enhanced, &synth[i_subfr], L_SUBFR, st->mem_syn, 1); 1259a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1260a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 1261a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1262a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Copy(&synth[i_subfr+L_SUBFR-M], st->mem_syn, M); 1263a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1264a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1265a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *--------------------------------------------------* 1266a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Update signal for next frame. * 1267a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * -> shift to the left by L_SUBFR st->exc[] * 1268a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *--------------------------------------------------* 1269a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1270a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Copy (&st->old_exc[L_SUBFR], &st->old_exc[0], PIT_MAX + L_INTERPOL); 1271a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1272a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // interpolated LPC parameters for next subframe 1273a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Az += MP1; 1274a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1275a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // store T0 for next subframe 1276a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->old_T0 = T0; 1277a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1278a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1279a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------* 1280a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Call the Source Characteristic Detector which updates * 1281a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * st->inBackgroundNoise and st->voicedHangover. * 1282a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------* 1283a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1284a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->inBackgroundNoise = Bgn_scd(st->background_state, 1285a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->ltpGainHistory[0]), 1286a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(synth[0]), 1287a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->voicedHangover) ); 1288a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1289a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber dtx_dec_activity_update(st->dtxDecoderState, 1290a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->lsfState->past_lsf_q, 1291a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber synth); 1292a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1293a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber // store bfi for next subframe 1294a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->prev_bf = bfi; 1295a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->prev_pdf = pdfi; 1296a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1297a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *--------------------------------------------------* 1298a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Calculate the LSF averages on the eight * 1299a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * previous frames * 1300a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *--------------------------------------------------* 1301a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1302a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber lsp_avg(st->lsp_avg_st, st->lsfState->past_lsf_q); 1303a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1304a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberthe_end: 1305a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->dtxDecoderState->dtxGlobalState = newDTXState; 1306a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1307a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return 0; 1308a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber} 1309a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1310a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 1311a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional] 1312a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1313a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the 1314a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below. 1315a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1316a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes 1317a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1318a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes 1319a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1320a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 1321a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber used to represent cycle count for each subroutine 1322a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber called) 1323a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber where: (cycle count variable) = cycle count for [subroutine 1324a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber name] 1325a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1326a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 1327a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional] 1328a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function] 1329a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1330a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 1331a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/ 1332a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1333a30d40083856cb4edd225faf8b488fab156e5976Andreas Hubervoid Decoder_amr( 1334a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Decoder_amrState *st, /* i/o : State variables */ 1335a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber enum Mode mode, /* i : AMR mode */ 1336a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 parm[], /* i : vector of synthesis parameters 1337a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (PRM_SIZE) */ 1338a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber enum RXFrameType frame_type, /* i : received frame type */ 1339a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 synth[], /* o : synthesis speech (L_FRAME) */ 1340a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 A_t[] /* o : decoded LP filter in 4 subframes 1341a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (AZ_SIZE) */ 1342a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber) 1343a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 1344a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* LPC coefficients */ 1345a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1346a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 *Az; /* Pointer on A_t */ 1347a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1348a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* LSPs */ 1349a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1350a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 lsp_new[M]; 1351a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 lsp_mid[M]; 1352a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1353a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* LSFs */ 1354a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1355a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 prev_lsf[M]; 1356a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 lsf_i[M]; 1357a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1358a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* Algebraic codevector */ 1359a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1360a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 code[L_SUBFR]; 1361a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1362a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* excitation */ 1363a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1364a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 excp[L_SUBFR]; 1365a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 exc_enhanced[L_SUBFR]; 1366a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1367a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* Scalars */ 1368a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1369a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 i; 1370a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 i_subfr; 1371a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 T0; 1372a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 T0_frac; 1373a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 index; 1374a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 index_mr475 = 0; 1375a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 gain_pit; 1376a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 gain_code; 1377a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 gain_code_mix; 1378a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 pit_sharp; 1379a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 pit_flag; 1380a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 pitch_fac; 1381a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 t0_min; 1382a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 t0_max; 1383a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 delta_frc_low; 1384a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 delta_frc_range; 1385a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 tmp_shift; 1386a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 temp; 1387a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word32 L_temp; 1388a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 flag4; 1389a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 carefulFlag; 1390a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 excEnergy; 1391a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 subfrNr; 1392a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 evenSubfr = 0; 1393a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1394a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 bfi = 0; /* bad frame indication flag */ 1395a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 pdfi = 0; /* potential degraded bad frame flag */ 1396a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1397a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber enum DTXStateType newDTXState; /* SPEECH , DTX, DTX_MUTE */ 1398a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Flag *pOverflow = &(st->overflow); /* Overflow flag */ 1399a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1400a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1401a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* find the new DTX state SPEECH OR DTX */ 1402a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber newDTXState = rx_dtx_handler(&(st->dtxDecoderState), frame_type, pOverflow); 1403a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1404a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* DTX actions */ 1405a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1406a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (newDTXState != SPEECH) 1407a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1408a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Decoder_amr_reset(st, MRDTX); 1409a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1410a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber dtx_dec(&(st->dtxDecoderState), 1411a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->mem_syn, 1412a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->lsfState), 1413a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->pred_state), 1414a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->Cb_gain_averState), 1415a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber newDTXState, 1416a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber mode, 1417a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber parm, synth, A_t, pOverflow); 1418a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1419a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* update average lsp */ 1420a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Lsf_lsp( 1421a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->lsfState.past_lsf_q, 1422a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->lsp_old, 1423a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber M, 1424a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 1425a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1426a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber lsp_avg( 1427a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->lsp_avg_st), 1428a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->lsfState.past_lsf_q, 1429a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 1430a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1431a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber goto the_end; 1432a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1433a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1434a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* SPEECH action state machine */ 1435a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ((frame_type == RX_SPEECH_BAD) || (frame_type == RX_NO_DATA) || 1436a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (frame_type == RX_ONSET)) 1437a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1438a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber bfi = 1; 1439a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1440a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ((frame_type == RX_NO_DATA) || (frame_type == RX_ONSET)) 1441a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1442a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber build_CN_param(&st->nodataSeed, 1443a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber prmno[mode], 1444a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber bitno[mode], 1445a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber parm, 1446a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 1447a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1448a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1449a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else if (frame_type == RX_SPEECH_DEGRADED) 1450a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1451a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pdfi = 1; 1452a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1453a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1454a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (bfi != 0) 1455a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1456a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->state += 1; 1457a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1458a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else if (st->state == 6) 1459a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1460a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1461a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->state = 5; 1462a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1463a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 1464a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1465a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->state = 0; 1466a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1467a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1468a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1469a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (st->state > 6) 1470a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1471a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->state = 6; 1472a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1473a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1474a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* If this frame is the first speech frame after CNI period, */ 1475a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* set the BFH state machine to an appropriate state depending */ 1476a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* on whether there was DTX muting before start of speech or not */ 1477a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* If there was DTX muting, the first speech frame is muted. */ 1478a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* If there was no DTX muting, the first speech frame is not */ 1479a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* muted. The BFH state machine starts from state 5, however, to */ 1480a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* keep the audible noise resulting from a SID frame which is */ 1481a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* erroneously interpreted as a good speech frame as small as */ 1482a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* possible (the decoder output in this case is quickly muted) */ 1483a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1484a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (st->dtxDecoderState.dtxGlobalState == DTX) 1485a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1486a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->state = 5; 1487a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->prev_bf = 0; 1488a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1489a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else if (st->dtxDecoderState.dtxGlobalState == DTX_MUTE) 1490a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1491a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->state = 5; 1492a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->prev_bf = 1; 1493a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1494a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1495a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* save old LSFs for CB gain smoothing */ 1496a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Copy(st->lsfState.past_lsf_q, prev_lsf, M); 1497a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1498a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* decode LSF parameters and generate interpolated lpc coefficients 1499a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for the 4 subframes */ 1500a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1501a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (mode != MR122) 1502a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1503a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber D_plsf_3( 1504a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->lsfState), 1505a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber mode, 1506a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber bfi, 1507a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber parm, 1508a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber lsp_new, 1509a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 1510a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1511a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* Advance synthesis parameters pointer */ 1512a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber parm += 3; 1513a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1514a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Int_lpc_1to3( 1515a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->lsp_old, 1516a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber lsp_new, 1517a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber A_t, 1518a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 1519a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1520a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 1521a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1522a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber D_plsf_5( 1523a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->lsfState), 1524a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber bfi, 1525a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber parm, 1526a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber lsp_mid, 1527a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber lsp_new, 1528a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 1529a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1530a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* Advance synthesis parameters pointer */ 1531a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber parm += 5; 1532a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1533a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Int_lpc_1and3( 1534a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->lsp_old, 1535a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber lsp_mid, 1536a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber lsp_new, 1537a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber A_t, 1538a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 1539a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1540a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1541a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* update the LSPs for the next frame */ 1542a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = 0; i < M; i++) 1543a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1544a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->lsp_old[i] = lsp_new[i]; 1545a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1546a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1547a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /*------------------------------------------------------------------------* 1548a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Loop for every subframe in the analysis frame * 1549a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *------------------------------------------------------------------------* 1550a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * The subframe size is L_SUBFR and the loop is repeated L_FRAME/L_SUBFR * 1551a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * times * 1552a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - decode the pitch delay * 1553a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - decode algebraic code * 1554a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - decode pitch and codebook gains * 1555a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - find the excitation and compute synthesis speech * 1556a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *------------------------------------------------------------------------*/ 1557a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1558a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* pointer to interpolated LPC parameters */ 1559a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Az = A_t; 1560a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1561a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber evenSubfr = 0; 1562a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber subfrNr = -1; 1563a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR) 1564a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1565a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber subfrNr += 1; 1566a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber evenSubfr = 1 - evenSubfr; 1567a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1568a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* flag for first and 3th subframe */ 1569a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_flag = i_subfr; 1570a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1571a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1572a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (i_subfr == L_FRAME_BY2) 1573a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1574a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ((mode != MR475) && (mode != MR515)) 1575a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1576a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_flag = 0; 1577a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1578a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1579a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1580a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* pitch index */ 1581a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index = *parm++; 1582a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1583a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /*-------------------------------------------------------* 1584a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - decode pitch lag and find adaptive codebook vector. * 1585a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------*/ 1586a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1587a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (mode != MR122) 1588a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1589a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* flag4 indicates encoding with 4 bit resolution; */ 1590a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* this is needed for mode MR475, MR515, MR59 and MR67 */ 1591a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1592a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber flag4 = 0; 1593a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1594a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ((mode == MR475) || (mode == MR515) || (mode == MR59) || 1595a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (mode == MR67)) 1596a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1597a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber flag4 = 1; 1598a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1599a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1600a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /*-------------------------------------------------------* 1601a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - get ranges for the t0_min and t0_max * 1602a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - only needed in delta decoding * 1603a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------*/ 1604a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1605a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber delta_frc_low = 5; 1606a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber delta_frc_range = 9; 1607a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1608a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (mode == MR795) 1609a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1610a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber delta_frc_low = 10; 1611a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber delta_frc_range = 19; 1612a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1613a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1614a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber t0_min = sub(st->old_T0, delta_frc_low, pOverflow); 1615a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1616a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (t0_min < PIT_MIN) 1617a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1618a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber t0_min = PIT_MIN; 1619a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1620a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber t0_max = add(t0_min, delta_frc_range, pOverflow); 1621a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1622a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (t0_max > PIT_MAX) 1623a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1624a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber t0_max = PIT_MAX; 1625a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber t0_min = t0_max - delta_frc_range; 1626a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1627a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1628a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Dec_lag3(index, t0_min, t0_max, pit_flag, st->old_T0, 1629a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &T0, &T0_frac, flag4, pOverflow); 1630a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1631a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->T0_lagBuff = T0; 1632a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1633a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (bfi != 0) 1634a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1635a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (st->old_T0 < PIT_MAX) 1636a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { /* Graceful pitch */ 163749e5a4c5be2e8ba114efff8d0634a34867cb2c26Dave Sparks st->old_T0 += 0; /* degradation */ 1638a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1639a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber T0 = st->old_T0; 1640a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber T0_frac = 0; 1641a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1642a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ((st->inBackgroundNoise != 0) && (st->voicedHangover > 4) && 1643a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ((mode == MR475) || (mode == MR515) || (mode == MR59))) 1644a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1645a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber T0 = st->T0_lagBuff; 1646a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1647a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1648a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1649a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Pred_lt_3or6(st->exc, T0, T0_frac, L_SUBFR, 1, pOverflow); 1650a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1651a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 1652a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1653a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Dec_lag6(index, PIT_MIN_MR122, 1654a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PIT_MAX, pit_flag, &T0, &T0_frac, pOverflow); 1655a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1656a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1657a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (!(bfi == 0 && (pit_flag == 0 || index < 61))) 1658a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1659a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->T0_lagBuff = T0; 1660a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber T0 = st->old_T0; 1661a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber T0_frac = 0; 1662a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1663a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1664a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Pred_lt_3or6(st->exc, T0, T0_frac, L_SUBFR, 0, pOverflow); 1665a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1666a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1667a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /*-------------------------------------------------------* 1668a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - (MR122 only: Decode pitch gain.) * 1669a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - Decode innovative codebook. * 1670a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - set pitch sharpening factor * 1671a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------*/ 1672a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ((mode == MR475) || (mode == MR515)) 1673a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { /* MR475, MR515 */ 1674a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index = *parm++; /* index of position */ 1675a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber i = *parm++; /* signs */ 1676a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1677a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber decode_2i40_9bits(subfrNr, i, index, code, pOverflow); 1678a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1679a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_temp = (Word32)st->sharp << 1; 1680a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (L_temp != (Word32)((Word16) L_temp)) 1681a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1682a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16; 1683a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1684a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 1685a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1686a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = (Word16) L_temp; 1687a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1688a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1689a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else if (mode == MR59) 1690a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { /* MR59 */ 1691a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index = *parm++; /* index of position */ 1692a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber i = *parm++; /* signs */ 1693a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1694a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber decode_2i40_11bits(i, index, code); 1695a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1696a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_temp = (Word32)st->sharp << 1; 1697a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (L_temp != (Word32)((Word16) L_temp)) 1698a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1699a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16; 1700a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1701a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 1702a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1703a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = (Word16) L_temp; 1704a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1705a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1706a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else if (mode == MR67) 1707a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { /* MR67 */ 1708a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index = *parm++; /* index of position */ 1709a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber i = *parm++; /* signs */ 1710a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1711a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber decode_3i40_14bits(i, index, code); 1712a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1713a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_temp = (Word32)st->sharp << 1; 1714a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (L_temp != (Word32)((Word16) L_temp)) 1715a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1716a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16; 1717a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1718a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 1719a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1720a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = (Word16) L_temp; 1721a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1722a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1723a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else if (mode <= MR795) 1724a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { /* MR74, MR795 */ 1725a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index = *parm++; /* index of position */ 1726a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber i = *parm++; /* signs */ 1727a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1728a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber decode_4i40_17bits(i, index, code); 1729a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1730a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_temp = (Word32)st->sharp << 1; 1731a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (L_temp != (Word32)((Word16) L_temp)) 1732a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1733a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16; 1734a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1735a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 1736a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1737a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = (Word16) L_temp; 1738a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1739a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1740a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else if (mode == MR102) 1741a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { /* MR102 */ 1742a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber dec_8i40_31bits(parm, code, pOverflow); 1743a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber parm += 7; 1744a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1745a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_temp = (Word32)st->sharp << 1; 1746a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (L_temp != (Word32)((Word16) L_temp)) 1747a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1748a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16; 1749a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1750a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 1751a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1752a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = (Word16) L_temp; 1753a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1754a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1755a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 1756a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { /* MR122 */ 1757a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index = *parm++; 1758a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1759a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (bfi != 0) 1760a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1761a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_pitch( 1762a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->ec_gain_p_st), 1763a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->state, 1764a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_pit, 1765a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 1766a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1767a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 1768a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1769a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber gain_pit = d_gain_pitch(mode, index); 1770a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1771a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_pitch_update( 1772a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->ec_gain_p_st), 1773a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber bfi, 1774a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->prev_bf, 1775a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_pit, 1776a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 1777a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1778a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1779a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber dec_10i40_35bits(parm, code); 1780a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber parm += 10; 1781a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1782a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* pit_sharp = gain_pit; */ 1783a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* if (pit_sharp > 1.0) pit_sharp = 1.0; */ 1784a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1785a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_temp = (Word32)gain_pit << 1; 1786a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (L_temp != (Word32)((Word16) L_temp)) 1787a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1788a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = (gain_pit > 0) ? MAX_16 : MIN_16; 1789a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1790a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 1791a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1792a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = (Word16) L_temp; 1793a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1794a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1795a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /*-------------------------------------------------------* 1796a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - Add the pitch contribution to code[]. * 1797a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------*/ 1798a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = T0; i < L_SUBFR; i++) 1799a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1800a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber temp = mult(*(code + i - T0), pit_sharp, pOverflow); 1801a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *(code + i) = add(*(code + i), temp, pOverflow); 1802a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1803a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1804a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1805a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /*------------------------------------------------------------* 1806a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - Decode codebook gain (MR122) or both pitch * 1807a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * gain and codebook gain (all others) * 1808a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - Update pitch sharpening "sharp" with quantized gain_pit * 1809a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *------------------------------------------------------------*/ 1810a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (mode == MR475) 1811a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1812a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* read and decode pitch and code gain */ 1813a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1814a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (evenSubfr != 0) 1815a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1816a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index_mr475 = *parm++; /* index of gain(s) */ 1817a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1818a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1819a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (bfi == 0) 1820a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1821a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Dec_gain( 1822a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->pred_state), 1823a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber mode, 1824a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index_mr475, 1825a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber code, 1826a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber evenSubfr, 1827a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_pit, 1828a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_code, 1829a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 1830a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1831a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 1832a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1833a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_pitch( 1834a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->ec_gain_p_st), 1835a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->state, 1836a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_pit, 1837a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 1838a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1839a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_code( 1840a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->ec_gain_c_st), 1841a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->pred_state), 1842a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->state, 1843a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_code, 1844a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 1845a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1846a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_pitch_update( 1847a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &st->ec_gain_p_st, 1848a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber bfi, 1849a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->prev_bf, 1850a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_pit, 1851a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 1852a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1853a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_code_update( 1854a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &st->ec_gain_c_st, 1855a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber bfi, 1856a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->prev_bf, 1857a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_code, 1858a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 1859a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1860a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = gain_pit; 1861a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1862a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (pit_sharp > SHARPMAX) 1863a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1864a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = SHARPMAX; 1865a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1866a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1867a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1868a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else if ((mode <= MR74) || (mode == MR102)) 1869a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1870a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* read and decode pitch and code gain */ 1871a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index = *parm++; /* index of gain(s) */ 1872a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1873a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (bfi == 0) 1874a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1875a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Dec_gain( 1876a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->pred_state), 1877a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber mode, 1878a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index, 1879a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber code, 1880a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber evenSubfr, 1881a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_pit, 1882a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_code, 1883a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 1884a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1885a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 1886a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1887a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_pitch( 1888a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->ec_gain_p_st), 1889a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->state, 1890a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_pit, 1891a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 1892a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1893a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_code( 1894a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->ec_gain_c_st), 1895a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->pred_state), 1896a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->state, 1897a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_code, 1898a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 1899a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1900a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1901a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_pitch_update( 1902a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->ec_gain_p_st), 1903a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber bfi, 1904a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->prev_bf, 1905a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_pit, 1906a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 1907a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1908a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_code_update( 1909a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->ec_gain_c_st), 1910a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber bfi, 1911a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->prev_bf, 1912a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_code, 1913a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 1914a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1915a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = gain_pit; 1916a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1917a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (pit_sharp > SHARPMAX) 1918a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1919a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = SHARPMAX; 1920a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1921a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1922a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (mode == MR102) 1923a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1924a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (st->old_T0 > (L_SUBFR + 5)) 1925a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1926a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (pit_sharp < 0) 1927a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1928a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = ~((~pit_sharp) >> 2); 1929a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1930a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 1931a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1932a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = pit_sharp >> 2; 1933a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1934a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1935a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1936a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1937a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 1938a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1939a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* read and decode pitch gain */ 1940a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index = *parm++; /* index of gain(s) */ 1941a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1942a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (mode == MR795) 1943a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1944a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* decode pitch gain */ 1945a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (bfi != 0) 1946a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1947a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_pitch( 1948a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->ec_gain_p_st), 1949a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->state, 1950a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_pit, 1951a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 1952a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1953a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 1954a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1955a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber gain_pit = d_gain_pitch(mode, index); 1956a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1957a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_pitch_update( 1958a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->ec_gain_p_st), 1959a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber bfi, 1960a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->prev_bf, 1961a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_pit, 1962a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 1963a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1964a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* read and decode code gain */ 1965a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index = *parm++; 1966a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1967a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (bfi == 0) 1968a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1969a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber d_gain_code( 1970a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->pred_state), 1971a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber mode, 1972a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index, 1973a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber code, 1974a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_code, 1975a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 1976a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1977a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 1978a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1979a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_code( 1980a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->ec_gain_c_st), 1981a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->pred_state), 1982a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->state, 1983a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_code, 1984a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 1985a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 1986a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1987a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_code_update( 1988a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->ec_gain_c_st), 1989a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber bfi, 1990a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->prev_bf, 1991a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_code, 1992a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 1993a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1994a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = gain_pit; 1995a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1996a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (pit_sharp > SHARPMAX) 1997a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 1998a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = SHARPMAX; 1999a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2000a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2001a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 2002a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { /* MR122 */ 2003a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2004a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (bfi == 0) 2005a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2006a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber d_gain_code( 2007a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->pred_state), 2008a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber mode, 2009a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index, 2010a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber code, 2011a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_code, 2012a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 2013a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2014a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 2015a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2016a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_code( 2017a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->ec_gain_c_st), 2018a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->pred_state), 2019a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->state, 2020a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_code, 2021a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 2022a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2023a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2024a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ec_gain_code_update( 2025a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->ec_gain_c_st), 2026a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber bfi, 2027a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->prev_bf, 2028a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &gain_code, 2029a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 2030a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2031a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = gain_pit; 2032a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2033a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2034a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2035a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* store pitch sharpening for next subframe */ 2036a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* (for modes which use the previous pitch gain for */ 2037a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* pitch sharpening in the search phase) */ 2038a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* do not update sharpening in even subframes for MR475 */ 2039a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ((mode != MR475) || (evenSubfr == 0)) 2040a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2041a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->sharp = gain_pit; 2042a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2043a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (st->sharp > SHARPMAX) 2044a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2045a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->sharp = SHARPMAX; 2046a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2047a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2048a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2049a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pit_sharp = shl(pit_sharp, 1, pOverflow); 2050a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2051a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (pit_sharp > 16384) 2052a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2053a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = 0; i < L_SUBFR; i++) 2054a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2055a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber temp = mult(st->exc[i], pit_sharp, pOverflow); 2056a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_temp = L_mult(temp, gain_pit, pOverflow); 2057a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2058a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (mode == MR122) 2059a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2060a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (L_temp < 0) 2061a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2062a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_temp = ~((~L_temp) >> 1); 2063a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2064a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 2065a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2066a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_temp = L_temp >> 1; 2067a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2068a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2069a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *(excp + i) = pv_round(L_temp, pOverflow); 2070a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2071a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2072a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2073a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /*-------------------------------------------------------* 2074a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - Store list of LTP gains needed in the source * 2075a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * characteristic detector (SCD) * 2076a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------*/ 2077a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2078a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (bfi == 0) 2079a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2080a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = 0; i < 8; i++) 2081a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2082a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->ltpGainHistory[i] = st->ltpGainHistory[i+1]; 2083a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2084a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->ltpGainHistory[8] = gain_pit; 2085a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2086a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2087a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /*-------------------------------------------------------* 2088a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - Limit gain_pit if in background noise and BFI * 2089a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * for MR475, MR515, MR59 * 2090a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------*/ 2091a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2092a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2093a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ((st->prev_bf != 0 || bfi != 0) && st->inBackgroundNoise != 0 && 2094a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ((mode == MR475) || (mode == MR515) || (mode == MR59))) 2095a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2096a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2097a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (gain_pit > 12288) /* if (gain_pit > 0.75) in Q14*/ 2098a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2099a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber gain_pit = ((gain_pit - 12288) >> 1) + 12288; 2100a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* gain_pit = (gain_pit-0.75)/2.0 + 0.75; */ 2101a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2102a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2103a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (gain_pit > 14745) /* if (gain_pit > 0.90) in Q14*/ 2104a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2105a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber gain_pit = 14745; 2106a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2107a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2108a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2109a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /*-------------------------------------------------------* 2110a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Calculate CB mixed gain * 2111a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------*/ 2112a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Int_lsf( 2113a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber prev_lsf, 2114a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->lsfState.past_lsf_q, 2115a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber i_subfr, 2116a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber lsf_i, 2117a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 2118a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2119a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber gain_code_mix = 2120a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Cb_gain_average( 2121a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->Cb_gain_averState), 2122a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber mode, 2123a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber gain_code, 2124a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber lsf_i, 2125a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->lsp_avg_st.lsp_meanSave, 2126a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber bfi, 2127a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->prev_bf, 2128a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pdfi, 2129a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->prev_pdf, 2130a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->inBackgroundNoise, 2131a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->voicedHangover, 2132a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 2133a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2134a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* make sure that MR74, MR795, MR122 have original code_gain*/ 2135a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ((mode > MR67) && (mode != MR102)) 2136a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* MR74, MR795, MR122 */ 2137a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2138a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber gain_code_mix = gain_code; 2139a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2140a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2141a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /*-------------------------------------------------------* 2142a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - Find the total excitation. * 2143a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - Find synthesis speech corresponding to st->exc[]. * 2144a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------*/ 2145a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (mode <= MR102) /* MR475, MR515, MR59, MR67, MR74, MR795, MR102*/ 2146a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2147a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pitch_fac = gain_pit; 2148a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber tmp_shift = 1; 2149a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2150a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else /* MR122 */ 2151a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2152a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (gain_pit < 0) 2153a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2154a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pitch_fac = ~((~gain_pit) >> 1); 2155a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2156a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 2157a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2158a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pitch_fac = gain_pit >> 1; 2159a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2160a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber tmp_shift = 2; 2161a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2162a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2163a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* copy unscaled LTP excitation to exc_enhanced (used in phase 2164a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * dispersion below) and compute total excitation for LTP feedback 2165a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber */ 2166a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = 0; i < L_SUBFR; i++) 2167a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2168a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber exc_enhanced[i] = st->exc[i]; 2169a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2170a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* st->exc[i] = gain_pit*st->exc[i] + gain_code*code[i]; */ 2171a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_temp = L_mult(st->exc[i], pitch_fac, pOverflow); 2172a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* 12.2: Q0 * Q13 */ 2173a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* 7.4: Q0 * Q14 */ 2174a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_temp = L_mac(L_temp, code[i], gain_code, pOverflow); 2175a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* 12.2: Q12 * Q1 */ 2176a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* 7.4: Q13 * Q1 */ 2177a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_temp = L_shl(L_temp, tmp_shift, pOverflow); /* Q16 */ 2178a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->exc[i] = pv_round(L_temp, pOverflow); 2179a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2180a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2181a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /*-------------------------------------------------------* 2182a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - Adaptive phase dispersion * 2183a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------*/ 2184a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ph_disp_release(&(st->ph_disp_st)); /* free phase dispersion adaption */ 2185a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2186a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2187a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (((mode == MR475) || (mode == MR515) || (mode == MR59)) && 2188a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (st->voicedHangover > 3) && (st->inBackgroundNoise != 0) && 2189a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (bfi != 0)) 2190a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2191a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ph_disp_lock(&(st->ph_disp_st)); /* Always Use full Phase Disp. */ 2192a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } /* if error in bg noise */ 2193a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2194a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* apply phase dispersion to innovation (if enabled) and 2195a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber compute total excitation for synthesis part */ 2196a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ph_disp( 2197a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->ph_disp_st), 2198a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber mode, 2199a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber exc_enhanced, 2200a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber gain_code_mix, 2201a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber gain_pit, 2202a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber code, 2203a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pitch_fac, 2204a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber tmp_shift, 2205a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 2206a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2207a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /*-------------------------------------------------------* 2208a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - The Excitation control module are active during BFI.* 2209a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * - Conceal drops in signal energy if in bg noise. * 2210a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------*/ 2211a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_temp = 0; 2212a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = 0; i < L_SUBFR; i++) 2213a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2214a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_temp = L_mac(L_temp, *(exc_enhanced + i), *(exc_enhanced + i), pOverflow); 2215a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2216a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2217a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* excEnergy = sqrt(L_temp) in Q0 */ 2218a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (L_temp < 0) 2219a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2220a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_temp = ~((~L_temp) >> 1); 2221a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2222a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 2223a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2224a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_temp = L_temp >> 1; 2225a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2226a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2227a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_temp = sqrt_l_exp(L_temp, &temp, pOverflow); 2228a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* To cope with 16-bit and scaling in ex_ctrl() */ 2229a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_temp = L_shr(L_temp, (Word16)((temp >> 1) + 15), pOverflow); 2230a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (L_temp < 0) 2231a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2232a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber excEnergy = (Word16)(~((~L_temp) >> 2)); 2233a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2234a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 2235a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2236a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber excEnergy = (Word16)(L_temp >> 2); 2237a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2238a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2239a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (((mode == MR475) || (mode == MR515) || (mode == MR59)) && 2240a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (st->voicedHangover > 5) && (st->inBackgroundNoise != 0) && 2241a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (st->state < 4) && 2242a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ((pdfi != 0 && st->prev_pdf != 0) || bfi != 0 || st->prev_bf != 0)) 2243a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2244a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber carefulFlag = 0; 2245a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2246a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (pdfi != 0 && bfi == 0) 2247a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2248a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber carefulFlag = 1; 2249a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2250a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2251a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Ex_ctrl(exc_enhanced, 2252a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber excEnergy, 2253a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->excEnergyHist, 2254a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->voicedHangover, 2255a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->prev_bf, 2256a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber carefulFlag, pOverflow); 2257a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2258a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2259a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (!((st->inBackgroundNoise != 0) && (bfi != 0 || st->prev_bf != 0) && 2260a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (st->state < 4))) 2261a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2262a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* Update energy history for all modes */ 2263a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = 0; i < 8; i++) 2264a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2265a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->excEnergyHist[i] = st->excEnergyHist[i+1]; 2266a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2267a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->excEnergyHist[8] = excEnergy; 2268a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2269a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /*-------------------------------------------------------* 2270a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Excitation control module end. * 2271a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------*/ 2272a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (pit_sharp > 16384) 2273a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2274a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = 0; i < L_SUBFR; i++) 2275a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2276a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *(excp + i) = add(*(excp + i), *(exc_enhanced + i), pOverflow); 2277a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2278a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2279a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber agc2(exc_enhanced, excp, L_SUBFR, pOverflow); 2280a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *pOverflow = 0; 2281a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Syn_filt(Az, excp, &synth[i_subfr], L_SUBFR, 2282a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->mem_syn, 0); 2283a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2284a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 2285a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2286a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *pOverflow = 0; 2287a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Syn_filt(Az, exc_enhanced, &synth[i_subfr], L_SUBFR, 2288a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->mem_syn, 0); 2289a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2290a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2291a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (*pOverflow != 0) /* Test for overflow */ 2292a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2293a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = PIT_MAX + L_INTERPOL + L_SUBFR - 1; i >= 0; i--) 2294a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2295a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (st->old_exc[i] < 0) 2296a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2297a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->old_exc[i] = ~((~st->old_exc[i]) >> 2); 2298a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2299a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 2300a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2301a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->old_exc[i] = st->old_exc[i] >> 2; 2302a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2303a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2304a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2305a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2306a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = L_SUBFR - 1; i >= 0; i--) 2307a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2308a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (*(exc_enhanced + i) < 0) 2309a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2310a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *(exc_enhanced + i) = ~((~(*(exc_enhanced + i))) >> 2); 2311a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2312a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 2313a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2314a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *(exc_enhanced + i) = *(exc_enhanced + i) >> 2; 2315a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2316a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2317a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Syn_filt(Az, exc_enhanced, &synth[i_subfr], L_SUBFR, st->mem_syn, 1); 2318a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2319a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 2320a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 2321a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Copy(&synth[i_subfr+L_SUBFR-M], st->mem_syn, M); 2322a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2323a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2324a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /*--------------------------------------------------* 2325a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Update signal for next frame. * 2326a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * -> shift to the left by L_SUBFR st->exc[] * 2327a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *--------------------------------------------------*/ 2328a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2329a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Copy(&st->old_exc[L_SUBFR], &st->old_exc[0], PIT_MAX + L_INTERPOL); 2330a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2331a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* interpolated LPC parameters for next subframe */ 2332a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Az += MP1; 2333a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2334a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* store T0 for next subframe */ 2335a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->old_T0 = T0; 2336a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 2337a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2338a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /*-------------------------------------------------------* 2339a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Call the Source Characteristic Detector which updates * 2340a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * st->inBackgroundNoise and st->voicedHangover. * 2341a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *-------------------------------------------------------*/ 2342a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2343a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->inBackgroundNoise = 2344a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Bgn_scd( 2345a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->background_state), 2346a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->ltpGainHistory[0]), 2347a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(synth[0]), 2348a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->voicedHangover), 2349a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 2350a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2351a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber dtx_dec_activity_update( 2352a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->dtxDecoderState), 2353a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->lsfState.past_lsf_q, 2354a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber synth, 2355a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 2356a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2357a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* store bfi for next subframe */ 2358a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->prev_bf = bfi; 2359a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->prev_pdf = pdfi; 2360a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2361a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /*--------------------------------------------------* 2362a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Calculate the LSF averages on the eight * 2363a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * previous frames * 2364a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *--------------------------------------------------*/ 2365a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber lsp_avg( 2366a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber &(st->lsp_avg_st), 2367a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->lsfState.past_lsf_q, 2368a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 2369a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2370a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberthe_end: 2371a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber st->dtxDecoderState.dtxGlobalState = newDTXState; 2372a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2373a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber// return(0); 2374a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber} 2375