1b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/* ------------------------------------------------------------------ 2b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * Copyright (C) 1998-2009 PacketVideo 3b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * 4b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * you may not use this file except in compliance with the License. 6b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * You may obtain a copy of the License at 7b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * 8b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * 10b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * Unless required by applicable law or agreed to in writing, software 11b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * express or implied. 14b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * See the License for the specific language governing permissions 15b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * and limitations under the License. 16b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * ------------------------------------------------------------------- 17b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber */ 18b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/**************************************************************************************** 19b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberPortions of this file are derived from the following 3GPP standard: 20b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 21b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 3GPP TS 26.073 22b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec 23b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Available from http://www.3gpp.org 24b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 25b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC) 26b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberPermission to distribute, modify and use this file under the standard license 27b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberterms listed above has been obtained from the copyright holder. 28b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber****************************************************************************************/ 29b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/* 30b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 31b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 32b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 33b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 34b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Pathname: ./audio/gsm-amr/c/src/cod_amr.c 35b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Funtions: cod_amr_init 36b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod_amr_reset 37b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod_amr_exit 38b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod_amr_first 39b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod_amr 40b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 41b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Date: 06/09/2000 42b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 43b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 44b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REVISION HISTORY 45b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 46b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Made changes based on comments from the review meeting. 47b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 48b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Synchronized file with UMTS version 3.2.0. Updated coding 49b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber template. Removed unnecessary include files. 50b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 51b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Added initialization of the overflow flag in cod_amr_init() 52b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber and in cod_amr_reset(). This overflow flag is now part of 53b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the cod_amrState structure. 54b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 55b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Cleaned up INCLUDES. removed inclusion of basic_op.h and repeat 56b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber inclusion of copy.h 57b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 58b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Updated function call to dtx_enc 59b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 60b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: For cod_amr_first() and cod_amr() 61b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1. Replaced copy() function with memcpy() 62b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 63b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Replaced OSCL mem type functions and eliminated include 64b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber files that now are chosen by OSCL definitions 65b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 66b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Replaced "int" and/or "char" with OSCL defined types. 67b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 68b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: 69b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 70b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 71b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber MODULE DESCRIPTION 72b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 73b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber These functions comprise the main encoder routine operating on a frame basis. 74b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 75b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 76b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/ 77b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 78b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 79b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*---------------------------------------------------------------------------- 80b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; INCLUDES 81b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/ 82b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include <stdlib.h> 83b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include <string.h> 84b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 85b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "cod_amr.h" 86b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "typedef.h" 87b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "cnst.h" 88b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "copy.h" 89b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "qua_gain.h" 90b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "lpc.h" 91b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "lsp.h" 92b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "pre_big.h" 93b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "ol_ltp.h" 94b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "p_ol_wgh.h" 95b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "spreproc.h" 96b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "cl_ltp.h" 97b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "pred_lt.h" 98b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "spstproc.h" 99b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "cbsearch.h" 100b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "gain_q.h" 101b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "convolve.h" 102b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "ton_stab.h" 103b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "vad.h" 104b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "dtx_enc.h" 105b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 106b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*---------------------------------------------------------------------------- 107b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; MACROS 108b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; Define module specific macros here 109b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/ 110b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 111b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 112b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*---------------------------------------------------------------------------- 113b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; DEFINES 114b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; Include all pre-processor statements here. Include conditional 115b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; compile variables also. 116b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/ 117b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 118b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*---------------------------------------------------------------------------- 119b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; LOCAL FUNCTION DEFINITIONS 120b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; Function Prototype declaration 121b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/ 122b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 123b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*---------------------------------------------------------------------------- 124b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; LOCAL VARIABLE DEFINITIONS 125b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; Variable declaration - defined here and used outside this module 126b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/ 127b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 128b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/* Spectral expansion factors */ 129b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 130b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberstatic const Word16 gamma1[M] = 131b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{ 132b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 30802, 28954, 27217, 25584, 24049, 133b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 22606, 21250, 19975, 18777, 17650 134b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}; 135b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 136b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/* gamma1 differs for the 12k2 coder */ 137b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberstatic const Word16 gamma1_12k2[M] = 138b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{ 139b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 29491, 26542, 23888, 21499, 19349, 140b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 17414, 15672, 14105, 12694, 11425 141b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}; 142b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 143b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberstatic const Word16 gamma2[M] = 144b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{ 145b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 19661, 11797, 7078, 4247, 2548, 146b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1529, 917, 550, 330, 198 147b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}; 148b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 149b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 150b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/* 151b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 152b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: cod_amr_init 153b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 154b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS 155b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 156b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs: 157b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber state = pointer to a pointer to a structure of type cod_amrState 158b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 159b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs: 160b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Structure pointed to by the pointer pointed to by state is 161b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber initialized to its reset value 162b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber state points to the allocated memory 163b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 164b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns: 165b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns 0 if memory was successfully initialized, 166b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber otherwise returns -1. 167b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 168b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used: 169b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None. 170b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 171b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed: 172b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None. 173b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 174b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 175b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION 176b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 177b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This function allocates memory and initializes state variables. 178b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 179b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 180b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS 181b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 182b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None. 183b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 184b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 185b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES 186b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 187b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod_amr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 188b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 189b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 190b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE 191b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 192b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberint cod_amr_init (cod_amrState **state, Flag dtx) 193b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{ 194b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod_amrState* s; 195b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 196b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (state == (cod_amrState **) NULL){ 197b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber fprintf(stderr, "cod_amr_init: invalid parameter\n"); 198b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return -1; 199b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 200b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *state = NULL; 201b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 202b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // allocate memory 203b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if ((s= (cod_amrState *) malloc(sizeof(cod_amrState))) == NULL){ 204b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber fprintf(stderr, "cod_amr_init: can not malloc state structure\n"); 205b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return -1; 206b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 207b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 208b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s->lpcSt = NULL; 209b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s->lspSt = NULL; 210b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s->clLtpSt = NULL; 211b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s->gainQuantSt = NULL; 212b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s->pitchOLWghtSt = NULL; 213b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s->tonStabSt = NULL; 214b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s->vadSt = NULL; 215b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s->dtx_encSt = NULL; 216b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s->dtx = dtx; 217b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 218b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // Init sub states 219b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (cl_ltp_init(&s->clLtpSt) || 220b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber lsp_init(&s->lspSt) || 221b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber gainQuant_init(&s->gainQuantSt) || 222b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber p_ol_wgh_init(&s->pitchOLWghtSt) || 223b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ton_stab_init(&s->tonStabSt) || 224b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifndef VAD2 225b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber vad1_init(&s->vadSt) || 226b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#else 227b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber vad2_init(&s->vadSt) || 228b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif 229b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dtx_enc_init(&s->dtx_encSt) || 230b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber lpc_init(&s->lpcSt)) { 231b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod_amr_exit(&s); 232b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return -1; 233b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 234b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 235b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod_amr_reset(s); 236b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 237b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *state = s; 238b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 239b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return 0; 240b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber} 241b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 242b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 243b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional] 244b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 245b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the 246b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below. 247b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 248b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes 249b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 250b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes 251b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 252b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 253b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber used to represent cycle count for each subroutine 254b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber called) 255b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber where: (cycle count variable) = cycle count for [subroutine 256b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber name] 257b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 258b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 259b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional] 260b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function] 261b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 262b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 263b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/ 264b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 265b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberWord16 cod_amr_init(cod_amrState **state, Flag dtx) 266b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{ 267b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod_amrState* s; 268b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 269b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (state == (cod_amrState **) NULL) 270b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 271b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* fprint(stderr, "cod_amr_init: invalid parameter\n"); */ 272b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return(-1); 273b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 274b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *state = NULL; 275b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 276b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* allocate memory */ 277b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if ((s = (cod_amrState *) malloc(sizeof(cod_amrState))) == NULL) 278b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 279b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* fprint(stderr, "cod_amr_init: 280b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber can not malloc state structure\n"); */ 281b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return(-1); 282b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 283b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 284b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s->lpcSt = NULL; 285b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s->lspSt = NULL; 286b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s->clLtpSt = NULL; 287b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s->gainQuantSt = NULL; 288b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s->pitchOLWghtSt = NULL; 289b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s->tonStabSt = NULL; 290b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s->vadSt = NULL; 291b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s->dtx_encSt = NULL; 292b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s->dtx = dtx; 293b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 294b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Initialize overflow Flag */ 295b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 296b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s->overflow = 0; 297b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 298b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 299b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Init sub states */ 300b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (cl_ltp_init(&s->clLtpSt) || 301b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber lsp_init(&s->lspSt) || 302b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber gainQuant_init(&s->gainQuantSt) || 303b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber p_ol_wgh_init(&s->pitchOLWghtSt) || 304b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ton_stab_init(&s->tonStabSt) || 305b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifndef VAD2 306b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber vad1_init(&s->vadSt) || 307b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#else 308b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber vad2_init(&s->vadSt) || 309b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif 310b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dtx_enc_init(&s->dtx_encSt) || 311b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber lpc_init(&s->lpcSt)) 312b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 313b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod_amr_exit(&s); 314b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return(-1); 315b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 316b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 317b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod_amr_reset(s); 318b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 319b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *state = s; 320b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 321b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return(0); 322b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber} 323b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 324b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/****************************************************************************/ 325b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 326b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/* 327b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 328b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: cod_amr_reset 329b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 330b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS 331b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 332b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs: 333b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber state = pointer to a structure of type cod_amrState 334b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 335b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs: 336b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Structure pointed to by state is initialized to initial values. 337b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 338b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns: 339b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns 0 if memory was successfully initialized, 340b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber otherwise returns -1. 341b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 342b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used: 343b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None. 344b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 345b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed: 346b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None. 347b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 348b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 349b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION 350b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 351b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This function resets the state memory for cod_amr. 352b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 353b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 354b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS 355b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 356b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None. 357b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 358b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 359b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES 360b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 361b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod_amr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 362b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 363b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 364b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE 365b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 366b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberint cod_amr_reset (cod_amrState *st) 367b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{ 368b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 i; 369b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 370b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (st == (cod_amrState *) NULL){ 371b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber fprintf(stderr, "cod_amr_reset: invalid parameter\n"); 372b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return -1; 373b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 374b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 375b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *-----------------------------------------------------------------------* 376b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * Initialize pointers to speech vector. * 377b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *-----------------------------------------------------------------------* 378b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 379b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->new_speech = st->old_speech + L_TOTAL - L_FRAME; // New speech 380b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 381b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->speech = st->new_speech - L_NEXT; // Present frame 382b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 383b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->p_window = st->old_speech + L_TOTAL - L_WINDOW; // For LPC window 384b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->p_window_12k2 = st->p_window - L_NEXT; // EFR LPC window: no lookahead 385b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 386b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // Initialize static pointers 387b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 388b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->wsp = st->old_wsp + PIT_MAX; 389b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->exc = st->old_exc + PIT_MAX + L_INTERPOL; 390b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->zero = st->ai_zero + MP1; 391b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->error = st->mem_err + M; 392b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->h1 = &st->hvec[L_SUBFR]; 393b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 394b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // Static vectors to zero 395b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 396b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Set_zero(st->old_speech, L_TOTAL); 397b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Set_zero(st->old_exc, PIT_MAX + L_INTERPOL); 398b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Set_zero(st->old_wsp, PIT_MAX); 399b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Set_zero(st->mem_syn, M); 400b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Set_zero(st->mem_w, M); 401b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Set_zero(st->mem_w0, M); 402b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Set_zero(st->mem_err, M); 403b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Set_zero(st->zero, L_SUBFR); 404b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Set_zero(st->hvec, L_SUBFR); // set to zero "h1[-L_SUBFR..-1]" 405b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 406b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // OL LTP states 407b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber for (i = 0; i < 5; i++) 408b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 409b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->old_lags[i] = 40; 410b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 411b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 412b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // Reset lpc states 413b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber lpc_reset(st->lpcSt); 414b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 415b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // Reset lsp states 416b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber lsp_reset(st->lspSt); 417b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 418b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // Reset clLtp states 419b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cl_ltp_reset(st->clLtpSt); 420b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 421b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber gainQuant_reset(st->gainQuantSt); 422b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 423b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber p_ol_wgh_reset(st->pitchOLWghtSt); 424b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 425b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ton_stab_reset(st->tonStabSt); 426b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 427b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifndef VAD2 428b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber vad1_reset(st->vadSt); 429b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#else 430b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber vad2_reset(st->vadSt); 431b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif 432b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 433b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dtx_enc_reset(st->dtx_encSt); 434b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 435b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->sharp = SHARPMIN; 436b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 437b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return 0; 438b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber} 439b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 440b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 441b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional] 442b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 443b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the 444b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below. 445b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 446b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes 447b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 448b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes 449b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 450b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 451b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber used to represent cycle count for each subroutine 452b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber called) 453b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber where: (cycle count variable) = cycle count for [subroutine 454b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber name] 455b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 456b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 457b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional] 458b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function] 459b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 460b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 461b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/ 462b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 463b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberWord16 cod_amr_reset(cod_amrState *st) 464b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{ 465b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 i; 466b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 467b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (st == (cod_amrState *) NULL) 468b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 469b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* fprint(stderr, "cod_amr_reset: invalid parameter\n"); */ 470b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return(-1); 471b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 472b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 473b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /*-----------------------------------------------------------------------* 474b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * Initialize pointers to speech vector. * 475b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *-----------------------------------------------------------------------*/ 476b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 477b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->new_speech = st->old_speech + L_TOTAL - L_FRAME; /* New speech */ 478b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 479b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->speech = st->new_speech - L_NEXT; /* Present frame */ 480b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 481b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->p_window = st->old_speech + L_TOTAL - L_WINDOW; /* For LPC window */ 482b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->p_window_12k2 = st->p_window - L_NEXT; /* EFR LPC window: no lookahead */ 483b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 484b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Initialize static pointers */ 485b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 486b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->wsp = st->old_wsp + PIT_MAX; 487b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->exc = st->old_exc + PIT_MAX + L_INTERPOL; 488b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->zero = st->ai_zero + MP1; 489b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->error = st->mem_err + M; 490b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->h1 = &st->hvec[L_SUBFR]; 491b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 492b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Initialize overflow Flag */ 493b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 494b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->overflow = 0; 495b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 496b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Static vectors to zero */ 497b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memset(st->old_speech, 0, sizeof(Word16)*L_TOTAL); 498b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memset(st->old_exc, 0, sizeof(Word16)*(PIT_MAX + L_INTERPOL)); 499b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memset(st->old_wsp, 0, sizeof(Word16)*PIT_MAX); 500b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memset(st->mem_syn, 0, sizeof(Word16)*M); 501b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memset(st->mem_w, 0, sizeof(Word16)*M); 502b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memset(st->mem_w0, 0, sizeof(Word16)*M); 503b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memset(st->mem_err, 0, sizeof(Word16)*M); 504b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memset(st->zero, 0, sizeof(Word16)*L_SUBFR); 505b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memset(st->hvec, 0, sizeof(Word16)*L_SUBFR); /* set to zero "h1[-L_SUBFR..-1]" */ 506b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 507b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* OL LTP states */ 508b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber for (i = 0; i < 5; i++) 509b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 510b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->old_lags[i] = 40; 511b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 512b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 513b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Reset lpc states */ 514b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber lpc_reset(st->lpcSt); 515b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 516b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Reset lsp states */ 517b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber lsp_reset(st->lspSt); 518b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 519b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Reset clLtp states */ 520b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cl_ltp_reset(st->clLtpSt); 521b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 522b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber gainQuant_reset(st->gainQuantSt); 523b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 524b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber p_ol_wgh_reset(st->pitchOLWghtSt); 525b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 526b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ton_stab_reset(st->tonStabSt); 527b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 528b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifndef VAD2 529b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber vad1_reset(st->vadSt); 530b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#else 531b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber vad2_reset(st->vadSt); 532b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif 533b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 534b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dtx_enc_reset(st->dtx_encSt); 535b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 536b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->sharp = SHARPMIN; 537b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 538b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return(0); 539b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber} 540b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 541b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/****************************************************************************/ 542b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 543b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/* 544b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 545b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: cod_amr_exit 546b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 547b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS 548b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 549b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs: 550b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber state = pointer to a pointer to a structure of type cod_amrState 551b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 552b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs: 553b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber state points to a NULL address 554b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 555b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns: 556b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None. 557b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 558b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used: 559b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None. 560b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 561b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed: 562b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None. 563b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 564b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 565b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION 566b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 567b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This function frees the memory used for state memory. 568b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 569b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 570b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS 571b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 572b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None. 573b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 574b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 575b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES 576b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 577b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod_amr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 578b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 579b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 580b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE 581b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 582b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Hubervoid cod_amr_exit (cod_amrState **state) 583b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{ 584b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (state == NULL || *state == NULL) 585b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return; 586b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 587b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // dealloc members 588b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber lpc_exit(&(*state)->lpcSt); 589b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber lsp_exit(&(*state)->lspSt); 590b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber gainQuant_exit(&(*state)->gainQuantSt); 591b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cl_ltp_exit(&(*state)->clLtpSt); 592b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber p_ol_wgh_exit(&(*state)->pitchOLWghtSt); 593b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ton_stab_exit(&(*state)->tonStabSt); 594b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifndef VAD2 595b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber vad1_exit(&(*state)->vadSt); 596b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#else 597b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber vad2_exit(&(*state)->vadSt); 598b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif 599b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dtx_enc_exit(&(*state)->dtx_encSt); 600b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 601b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // deallocate memory 602b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber free(*state); 603b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *state = NULL; 604b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 605b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return; 606b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber} 607b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 608b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 609b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional] 610b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 611b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the 612b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below. 613b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 614b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes 615b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 616b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes 617b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 618b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 619b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber used to represent cycle count for each subroutine 620b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber called) 621b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber where: (cycle count variable) = cycle count for [subroutine 622b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber name] 623b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 624b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 625b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional] 626b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function] 627b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 628b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 629b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/ 630b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 631b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Hubervoid cod_amr_exit(cod_amrState **state) 632b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{ 633b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (state == NULL || *state == NULL) 634b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 635b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return; 636b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 637b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 638b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* dealloc members */ 639b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber lpc_exit(&(*state)->lpcSt); 640b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber lsp_exit(&(*state)->lspSt); 641b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber gainQuant_exit(&(*state)->gainQuantSt); 642b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cl_ltp_exit(&(*state)->clLtpSt); 643b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber p_ol_wgh_exit(&(*state)->pitchOLWghtSt); 644b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ton_stab_exit(&(*state)->tonStabSt); 645b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifndef VAD2 646b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber vad1_exit(&(*state)->vadSt); 647b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#else 648b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber vad2_exit(&(*state)->vadSt); 649b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif 650b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dtx_enc_exit(&(*state)->dtx_encSt); 651b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 652b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* deallocate memory */ 653b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber free(*state); // BX 654b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *state = NULL; 655b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 656b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return; 657b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber} 658b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 659b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/****************************************************************************/ 660b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 661b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/* 662b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 663b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: cod_amr_first 664b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 665b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS 666b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 667b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs: 668b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st = pointer to a structure of type cod_amrState 669b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber new_speech = pointer to buffer of length L_FRAME that contains 670b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the speech input (Word16) 671b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 672b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs: 673b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber The structure of type cod_amrState pointed to by st is updated. 674b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 675b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns: 676b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return_value = 0 (int) 677b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 678b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used: 679b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None. 680b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 681b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed: 682b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None. 683b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 684b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 685b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION 686b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 687b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This function copes with look-ahead and calls cod_amr. 688b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber No input argument are passed to this function. However, before 689b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber calling this function, 40 new speech data should be copied to the 690b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber vector new_speech[]. This is a global pointer which is declared in 691b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber this file (it points to the end of speech buffer minus 200). 692b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 693b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 694b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS 695b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 696b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None. 697b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 698b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 699b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES 700b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 701b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod_amr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 702b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 703b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 704b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE 705b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 706b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberint cod_amr_first(cod_amrState *st, // i/o : State struct 707b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 new_speech[]) // i : speech input (L_FRAME) 708b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{ 709b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Copy(new_speech,&st->new_speech[-L_NEXT], L_NEXT); 710b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // Copy(new_speech,st->new_speech,L_FRAME); 711b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 712b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return 0; 713b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber} 714b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 715b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 716b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional] 717b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 718b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the 719b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below. 720b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 721b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes 722b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 723b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes 724b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 725b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 726b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber used to represent cycle count for each subroutine 727b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber called) 728b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber where: (cycle count variable) = cycle count for [subroutine 729b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber name] 730b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 731b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 732b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional] 733b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function] 734b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 735b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 736b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/ 737b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 738b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberWord16 cod_amr_first(cod_amrState *st, /* i/o : State struct */ 739b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 new_speech[]) /* i : speech input (L_FRAME) */ 740b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{ 741b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 742b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memcpy(&st->new_speech[-L_NEXT], new_speech, L_NEXT*sizeof(Word16)); 743b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 744b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Copy(new_speech,st->new_speech,L_FRAME); */ 745b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 746b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return(0); 747b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber} 748b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 749b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/****************************************************************************/ 750b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 751b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/* 752b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 753b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: cod_amr 754b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 755b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS 756b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 757b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs: 758b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st = pointer to a structure of type cod_amrState 759b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber mode = AMR mode of type enum Mode 760b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber new_speech = pointer to buffer of length L_FRAME that contains 761b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the speech input of type Word16 762b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ana = pointer to the analysis parameters of type Word16 763b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber usedMode = pointer to the used mode of type enum Mode 764b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber synth = pointer to a buffer containing the local synthesis speech of 765b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber type Word16 766b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 767b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs: 768b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber The structure of type cod_amrState pointed to by st is updated. 769b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber The analysis parameter buffer pointed to by ana is updated. 770b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber The value pointed to by usedMode is updated. 771b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber The local synthesis speech buffer pointed to by synth is updated. 772b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 773b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns: 774b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return_value = 0 (int) 775b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 776b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used: 777b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None. 778b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 779b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed: 780b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None. 781b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 782b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 783b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION 784b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 785b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This function is the main encoder routine. It is called every 20 ms speech 786b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber frame, operating on the newly read 160 speech samples. It performs the 787b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber principle encoding functions to produce the set of encoded parameters 788b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber which include the LSP, adaptive codebook, and fixed codebook 789b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber quantization indices (addresses and gains). 790b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 791b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Before calling this function, 160 new speech data should be copied to the 792b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber vector new_speech[]. This is a global pointer which is declared in 793b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber this file (it points to the end of speech buffer minus 160). 794b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 795b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber The outputs of the function are: 796b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ana[]: vector of analysis parameters. 797b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber synth[]: Local synthesis speech (for debugging purposes) 798b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 799b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 800b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS 801b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 802b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None. 803b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 804b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 805b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES 806b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 807b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod_amr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 808b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 809b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 810b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE 811b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 812b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberint cod_amr( 813b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod_amrState *st, // i/o : State struct 814b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber enum Mode mode, // i : AMR mode 815b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 new_speech[], // i : speech input (L_FRAME) 816b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 ana[], // o : Analysis parameters 817b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber enum Mode *usedMode, // o : used mode 818b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 synth[] // o : Local synthesis 819b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber) 820b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{ 821b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // LPC coefficients 822b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 A_t[(MP1) * 4]; // A(z) unquantized for the 4 subframes 823b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 Aq_t[(MP1) * 4]; // A(z) quantized for the 4 subframes 824b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 *A, *Aq; // Pointer on A_t and Aq_t 825b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 lsp_new[M]; 826b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 827b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // Other vectors 828b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 xn[L_SUBFR]; // Target vector for pitch search 829b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 xn2[L_SUBFR]; // Target vector for codebook search 830b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 code[L_SUBFR]; // Fixed codebook excitation 831b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 y1[L_SUBFR]; // Filtered adaptive excitation 832b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 y2[L_SUBFR]; // Filtered fixed codebook excitation 833b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 gCoeff[6]; // Correlations between xn, y1, & y2: 834b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 res[L_SUBFR]; // Short term (LPC) prediction residual 835b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 res2[L_SUBFR]; // Long term (LTP) prediction residual 836b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 837b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // Vector and scalars needed for the MR475 838b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 xn_sf0[L_SUBFR]; // Target vector for pitch search 839b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 y2_sf0[L_SUBFR]; // Filtered codebook innovation 840b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 code_sf0[L_SUBFR]; // Fixed codebook excitation 841b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 h1_sf0[L_SUBFR]; // The impulse response of sf0 842b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 mem_syn_save[M]; // Filter memory 843b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 mem_w0_save[M]; // Filter memory 844b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 mem_err_save[M]; // Filter memory 845b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 sharp_save; // Sharpening 846b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 evenSubfr; // Even subframe indicator 847b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 T0_sf0 = 0; // Integer pitch lag of sf0 848b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 T0_frac_sf0 = 0; // Fractional pitch lag of sf0 849b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 i_subfr_sf0 = 0; // Position in exc[] for sf0 850b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 gain_pit_sf0; // Quantized pitch gain for sf0 851b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 gain_code_sf0; // Quantized codebook gain for sf0 852b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 853b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // Scalars 854b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 i_subfr, subfrNr; 855b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 T_op[L_FRAME/L_FRAME_BY2]; 856b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 T0, T0_frac; 857b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 gain_pit, gain_code; 858b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 859b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // Flags 860b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 lsp_flag = 0; // indicates resonance in LPC filter 861b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 gp_limit; // pitch gain limit value 862b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 vad_flag; // VAD decision flag 863b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 compute_sid_flag; // SID analysis flag 864b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 865b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Copy(new_speech, st->new_speech, L_FRAME); 866b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 867b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *usedMode = mode; 868b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 869b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // DTX processing 870b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (st->dtx) 871b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { // no test() call since this if is only in simulation env 872b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // Find VAD decision 873b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 874b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifdef VAD2 875b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber vad_flag = vad2 (st->new_speech, st->vadSt); 876b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber vad_flag = vad2 (st->new_speech+80, st->vadSt) || vad_flag; 877b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#else 878b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber vad_flag = vad1(st->vadSt, st->new_speech); 879b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif 880b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 881b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // NB! usedMode may change here 882b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber compute_sid_flag = tx_dtx_handler(st->dtx_encSt, 883b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber vad_flag, 884b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber usedMode); 885b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 886b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber else 887b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 888b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber compute_sid_flag = 0; 889b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 890b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 891b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *------------------------------------------------------------------------* 892b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - Perform LPC analysis: * 893b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * * autocorrelation + lag windowing * 894b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * * Levinson-durbin algorithm to find a[] * 895b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * * convert a[] to lsp[] * 896b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * * quantize and code the LSPs * 897b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * * find the interpolated LSPs and convert to a[] for all * 898b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * subframes (both quantized and unquantized) * 899b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *------------------------------------------------------------------------* 900b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 901b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // LP analysis 902b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber lpc(st->lpcSt, mode, st->p_window, st->p_window_12k2, A_t); 903b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 904b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 905b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // From A(z) to lsp. LSP quantization and interpolation 906b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber lsp(st->lspSt, mode, *usedMode, A_t, Aq_t, lsp_new, &ana); 907b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 908b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 909b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // Buffer lsp's and energy 910b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dtx_buffer(st->dtx_encSt, 911b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber lsp_new, 912b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->new_speech); 913b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 914b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // Check if in DTX mode 915b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (sub(*usedMode, MRDTX) == 0) 916b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 917b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dtx_enc(st->dtx_encSt, 918b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber compute_sid_flag, 919b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->lspSt->qSt, 920b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->gainQuantSt->gc_predSt, 921b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber &ana); 922b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 923b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Set_zero(st->old_exc, PIT_MAX + L_INTERPOL); 924b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Set_zero(st->mem_w0, M); 925b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Set_zero(st->mem_err, M); 926b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Set_zero(st->zero, L_SUBFR); 927b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Set_zero(st->hvec, L_SUBFR); // set to zero "h1[-L_SUBFR..-1]" 928b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // Reset lsp states 929b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber lsp_reset(st->lspSt); 930b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Copy(lsp_new, st->lspSt->lsp_old, M); 931b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Copy(lsp_new, st->lspSt->lsp_old_q, M); 932b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 933b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // Reset clLtp states 934b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cl_ltp_reset(st->clLtpSt); 935b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->sharp = SHARPMIN; 936b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 937b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber else 938b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 939b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // check resonance in the filter 940b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber lsp_flag = check_lsp(st->tonStabSt, st->lspSt->lsp_old); 941b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 942b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 943b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *----------------------------------------------------------------------* 944b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - Find the weighted input speech w_sp[] for the whole speech frame * 945b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - Find the open-loop pitch delay for first 2 subframes * 946b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - Set the range for searching closed-loop pitch in 1st subframe * 947b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - Find the open-loop pitch delay for last 2 subframes * 948b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *----------------------------------------------------------------------* 949b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 950b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifdef VAD2 951b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (st->dtx) 952b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { // no test() call since this if is only in simulation env 953b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->vadSt->L_Rmax = 0; 954b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->vadSt->L_R0 = 0; 955b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 956b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif 957b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber for(subfrNr = 0, i_subfr = 0; 958b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subfrNr < L_FRAME/L_FRAME_BY2; 959b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subfrNr++, i_subfr += L_FRAME_BY2) 960b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 961b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // Pre-processing on 80 samples 962b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber pre_big(mode, gamma1, gamma1_12k2, gamma2, A_t, i_subfr, st->speech, 963b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->mem_w, st->wsp); 964b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 965b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if ((sub(mode, MR475) != 0) && (sub(mode, MR515) != 0)) 966b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 967b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // Find open loop pitch lag for two subframes 968b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ol_ltp(st->pitchOLWghtSt, st->vadSt, mode, &st->wsp[i_subfr], 969b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber &T_op[subfrNr], st->old_lags, st->ol_gain_flg, subfrNr, 970b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->dtx); 971b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 972b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 973b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 974b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if ((sub(mode, MR475) == 0) || (sub(mode, MR515) == 0)) 975b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 976b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // Find open loop pitch lag for ONE FRAME ONLY 977b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // search on 160 samples 978b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 979b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ol_ltp(st->pitchOLWghtSt, st->vadSt, mode, &st->wsp[0], &T_op[0], 980b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->old_lags, st->ol_gain_flg, 1, st->dtx); 981b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber T_op[1] = T_op[0]; 982b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 983b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 984b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifdef VAD2 985b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (st->dtx) 986b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { // no test() call since this if is only in simulation env 987b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber LTP_flag_update(st->vadSt, mode); 988b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 989b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif 990b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 991b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifndef VAD2 992b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // run VAD pitch detection 993b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (st->dtx) 994b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { // no test() call since this if is only in simulation env 995b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber vad_pitch_detection(st->vadSt, T_op); 996b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 997b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif 998b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 999b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (sub(*usedMode, MRDTX) == 0) 1000b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1001b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber goto the_end; 1002b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1003b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1004b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *------------------------------------------------------------------------* 1005b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * Loop for every subframe in the analysis frame * 1006b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *------------------------------------------------------------------------* 1007b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * To find the pitch and innovation parameters. The subframe size is * 1008b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * L_SUBFR and the loop is repeated L_FRAME/L_SUBFR times. * 1009b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - find the weighted LPC coefficients * 1010b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - find the LPC residual signal res[] * 1011b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - compute the target signal for pitch search * 1012b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - compute impulse response of weighted synthesis filter (h1[]) * 1013b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - find the closed-loop pitch parameters * 1014b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - encode the pitch dealy * 1015b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - update the impulse response h1[] by including fixed-gain pitch * 1016b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - find target vector for codebook search * 1017b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - codebook search * 1018b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - encode codebook address * 1019b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - VQ of pitch and codebook gains * 1020b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - find synthesis speech * 1021b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - update states of weighting filter * 1022b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *------------------------------------------------------------------------* 1023b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1024b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber A = A_t; // pointer to interpolated LPC parameters 1025b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Aq = Aq_t; // pointer to interpolated quantized LPC parameters 1026b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1027b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber evenSubfr = 0; 1028b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subfrNr = -1; 1029b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR) 1030b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1031b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subfrNr = add(subfrNr, 1); 1032b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber evenSubfr = sub(1, evenSubfr); 1033b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1034b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // Save states for the MR475 mode 1035b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if ((evenSubfr != 0) && (sub(*usedMode, MR475) == 0)) 1036b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1037b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Copy(st->mem_syn, mem_syn_save, M); 1038b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Copy(st->mem_w0, mem_w0_save, M); 1039b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Copy(st->mem_err, mem_err_save, M); 1040b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber sharp_save = st->sharp; 1041b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1042b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1043b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *-----------------------------------------------------------------* 1044b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - Preprocessing of subframe * 1045b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *-----------------------------------------------------------------* 1046b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (sub(*usedMode, MR475) != 0) 1047b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1048b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subframePreProc(*usedMode, gamma1, gamma1_12k2, 1049b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber gamma2, A, Aq, &st->speech[i_subfr], 1050b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->mem_err, st->mem_w0, st->zero, 1051b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->ai_zero, &st->exc[i_subfr], 1052b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->h1, xn, res, st->error); 1053b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1054b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber else 1055b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { // MR475 1056b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subframePreProc(*usedMode, gamma1, gamma1_12k2, 1057b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber gamma2, A, Aq, &st->speech[i_subfr], 1058b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->mem_err, mem_w0_save, st->zero, 1059b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->ai_zero, &st->exc[i_subfr], 1060b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->h1, xn, res, st->error); 1061b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1062b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // save impulse response (modified in cbsearch) 1063b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (evenSubfr != 0) 1064b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1065b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Copy (st->h1, h1_sf0, L_SUBFR); 1066b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1067b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1068b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1069b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // copy the LP residual (res2 is modified in the CL LTP search) 1070b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Copy (res, res2, L_SUBFR); 1071b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1072b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1073b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *-----------------------------------------------------------------* 1074b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - Closed-loop LTP search * 1075b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *-----------------------------------------------------------------* 1076b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cl_ltp(st->clLtpSt, st->tonStabSt, *usedMode, i_subfr, T_op, st->h1, 1077b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber &st->exc[i_subfr], res2, xn, lsp_flag, xn2, y1, 1078b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber &T0, &T0_frac, &gain_pit, gCoeff, &ana, 1079b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber &gp_limit); 1080b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1081b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // update LTP lag history 1082b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if ((subfrNr == 0) && (st->ol_gain_flg[0] > 0)) 1083b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1084b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->old_lags[1] = T0; 1085b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1086b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1087b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if ((sub(subfrNr, 3) == 0) && (st->ol_gain_flg[1] > 0)) 1088b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1089b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->old_lags[0] = T0; 1090b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1091b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1092b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1093b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *-----------------------------------------------------------------* 1094b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - Inovative codebook search (find index and gain) * 1095b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *-----------------------------------------------------------------* 1096b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cbsearch(xn2, st->h1, T0, st->sharp, gain_pit, res2, 1097b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber code, y2, &ana, *usedMode, subfrNr); 1098b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1099b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *------------------------------------------------------* 1100b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - Quantization of gains. * 1101b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *------------------------------------------------------* 1102b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber gainQuant(st->gainQuantSt, *usedMode, res, &st->exc[i_subfr], code, 1103b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber xn, xn2, y1, y2, gCoeff, evenSubfr, gp_limit, 1104b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber &gain_pit_sf0, &gain_code_sf0, 1105b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber &gain_pit, &gain_code, &ana); 1106b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1107b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // update gain history 1108b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber update_gp_clipping(st->tonStabSt, gain_pit); 1109b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1110b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (sub(*usedMode, MR475) != 0) 1111b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1112b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // Subframe Post Porcessing 1113b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subframePostProc(st->speech, *usedMode, i_subfr, gain_pit, 1114b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber gain_code, Aq, synth, xn, code, y1, y2, st->mem_syn, 1115b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->mem_err, st->mem_w0, st->exc, &st->sharp); 1116b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1117b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber else 1118b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1119b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (evenSubfr != 0) 1120b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1121b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber i_subfr_sf0 = i_subfr; 1122b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Copy(xn, xn_sf0, L_SUBFR); 1123b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Copy(y2, y2_sf0, L_SUBFR); 1124b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Copy(code, code_sf0, L_SUBFR); 1125b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber T0_sf0 = T0; 1126b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber T0_frac_sf0 = T0_frac; 1127b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1128b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // Subframe Post Porcessing 1129b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subframePostProc(st->speech, *usedMode, i_subfr, gain_pit, 1130b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber gain_code, Aq, synth, xn, code, y1, y2, 1131b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber mem_syn_save, st->mem_err, mem_w0_save, 1132b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->exc, &st->sharp); 1133b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->sharp = sharp_save; 1134b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1135b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber else 1136b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1137b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // update both subframes for the MR475 1138b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1139b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // Restore states for the MR475 mode 1140b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Copy(mem_err_save, st->mem_err, M); 1141b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1142b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // re-build excitation for sf 0 1143b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Pred_lt_3or6(&st->exc[i_subfr_sf0], T0_sf0, T0_frac_sf0, 1144b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber L_SUBFR, 1); 1145b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Convolve(&st->exc[i_subfr_sf0], h1_sf0, y1, L_SUBFR); 1146b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1147b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Aq -= MP1; 1148b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subframePostProc(st->speech, *usedMode, i_subfr_sf0, 1149b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber gain_pit_sf0, gain_code_sf0, Aq, 1150b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber synth, xn_sf0, code_sf0, y1, y2_sf0, 1151b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->mem_syn, st->mem_err, st->mem_w0, st->exc, 1152b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber &sharp_save); // overwrites sharp_save 1153b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Aq += MP1; 1154b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1155b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // re-run pre-processing to get xn right (needed by postproc) 1156b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // (this also reconstructs the unsharpened h1 for sf 1) 1157b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subframePreProc(*usedMode, gamma1, gamma1_12k2, 1158b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber gamma2, A, Aq, &st->speech[i_subfr], 1159b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->mem_err, st->mem_w0, st->zero, 1160b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->ai_zero, &st->exc[i_subfr], 1161b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->h1, xn, res, st->error); 1162b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1163b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // re-build excitation sf 1 (changed if lag < L_SUBFR) 1164b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Pred_lt_3or6(&st->exc[i_subfr], T0, T0_frac, L_SUBFR, 1); 1165b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Convolve(&st->exc[i_subfr], st->h1, y1, L_SUBFR); 1166b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1167b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subframePostProc(st->speech, *usedMode, i_subfr, gain_pit, 1168b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber gain_code, Aq, synth, xn, code, y1, y2, 1169b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->mem_syn, st->mem_err, st->mem_w0, 1170b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->exc, &st->sharp); 1171b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1172b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1173b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1174b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1175b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber A += MP1; // interpolated LPC parameters for next subframe 1176b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Aq += MP1; 1177b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1178b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1179b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Copy(&st->old_exc[L_FRAME], &st->old_exc[0], PIT_MAX + L_INTERPOL); 1180b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1181b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberthe_end: 1182b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1183b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *--------------------------------------------------* 1184b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * Update signal for next frame. * 1185b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *--------------------------------------------------* 1186b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Copy(&st->old_wsp[L_FRAME], &st->old_wsp[0], PIT_MAX); 1187b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1188b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Copy(&st->old_speech[L_FRAME], &st->old_speech[0], L_TOTAL - L_FRAME); 1189b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1190b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return 0; 1191b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber} 1192b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 1193b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional] 1194b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1195b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the 1196b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below. 1197b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1198b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes 1199b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1200b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes 1201b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1202b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 1203b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber used to represent cycle count for each subroutine 1204b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber called) 1205b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber where: (cycle count variable) = cycle count for [subroutine 1206b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber name] 1207b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1208b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 1209b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional] 1210b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function] 1211b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1212b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 1213b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/ 1214b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1215b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberWord16 cod_amr( 1216b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod_amrState *st, /* i/o : State struct */ 1217b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber enum Mode mode, /* i : AMR mode */ 1218b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 new_speech[], /* i : speech input (L_FRAME) */ 1219b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 ana[], /* o : Analysis parameters */ 1220b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber enum Mode *usedMode, /* o : used mode */ 1221b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 synth[] /* o : Local synthesis */ 1222b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber) 1223b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{ 1224b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* LPC coefficients */ 1225b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 A_t[(MP1) * 4]; /* A(z) unquantized for the 4 subframes */ 1226b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 Aq_t[(MP1) * 4]; /* A(z) quantized for the 4 subframes */ 1227b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 *A, *Aq; /* Pointer on A_t and Aq_t */ 1228b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 lsp_new[M]; 1229b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1230b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Other vectors */ 1231b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 xn[L_SUBFR]; /* Target vector for pitch search */ 1232b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 xn2[L_SUBFR]; /* Target vector for codebook search */ 1233b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 code[L_SUBFR]; /* Fixed codebook excitation */ 1234b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 y1[L_SUBFR]; /* Filtered adaptive excitation */ 1235b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 y2[L_SUBFR]; /* Filtered fixed codebook excitation */ 1236b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 gCoeff[6]; /* Correlations between xn, y1, & y2: */ 1237b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 res[L_SUBFR]; /* Short term (LPC) prediction residual */ 1238b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 res2[L_SUBFR]; /* Long term (LTP) prediction residual */ 1239b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1240b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Vector and scalars needed for the MR475 */ 1241b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 xn_sf0[L_SUBFR]; /* Target vector for pitch search */ 1242b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 y2_sf0[L_SUBFR]; /* Filtered codebook innovation */ 1243b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 code_sf0[L_SUBFR]; /* Fixed codebook excitation */ 1244b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 h1_sf0[L_SUBFR]; /* The impulse response of sf0 */ 1245b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 mem_syn_save[M]; /* Filter memory */ 1246b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 mem_w0_save[M]; /* Filter memory */ 1247b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 mem_err_save[M]; /* Filter memory */ 1248b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 sharp_save; /* Sharpening */ 1249b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 evenSubfr; /* Even subframe indicator */ 1250b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 T0_sf0 = 0; /* Integer pitch lag of sf0 */ 1251b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 T0_frac_sf0 = 0; /* Fractional pitch lag of sf0 */ 1252b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 i_subfr_sf0 = 0; /* Position in exc[] for sf0 */ 1253b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 gain_pit_sf0; /* Quantized pitch gain for sf0 */ 1254b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 gain_code_sf0; /* Quantized codebook gain for sf0 */ 1255b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1256b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Scalars */ 1257b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 i_subfr, subfrNr; 1258b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 T_op[L_FRAME/L_FRAME_BY2]; 1259b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 T0, T0_frac; 1260b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 gain_pit, gain_code; 1261b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1262b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Flags */ 1263b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 lsp_flag = 0; /* indicates resonance in LPC filter */ 1264b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 gp_limit; /* pitch gain limit value */ 1265b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 vad_flag; /* VAD decision flag */ 1266b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 compute_sid_flag; /* SID analysis flag */ 1267b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Flag *pOverflow = &(st->overflow); /* Overflow flag */ 1268b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1269b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1270b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memcpy(st->new_speech, new_speech, L_FRAME*sizeof(Word16)); 1271b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1272b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *usedMode = mode; 1273b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1274b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* DTX processing */ 1275b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (st->dtx) 1276b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1277b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Find VAD decision */ 1278b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifdef VAD2 1279b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber vad_flag = vad2(st->new_speech, st->vadSt, pOverflow); 1280b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber vad_flag = vad2(st->new_speech + 80, st->vadSt, pOverflow) || vad_flag; 1281b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#else 1282b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber vad_flag = vad1(st->vadSt, st->new_speech, pOverflow); 1283b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif 1284b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1285b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* NB! usedMode may change here */ 1286b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber compute_sid_flag = tx_dtx_handler(st->dtx_encSt, 1287b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber vad_flag, 1288b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber usedMode, pOverflow); 1289b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1290b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber else 1291b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1292b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber compute_sid_flag = 0; 1293b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1294b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1295b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /*------------------------------------------------------------------------* 1296b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - Perform LPC analysis: * 1297b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * * autocorrelation + lag windowing * 1298b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * * Levinson-durbin algorithm to find a[] * 1299b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * * convert a[] to lsp[] * 1300b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * * quantize and code the LSPs * 1301b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * * find the interpolated LSPs and convert to a[] for all * 1302b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * subframes (both quantized and unquantized) * 1303b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *------------------------------------------------------------------------*/ 1304b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1305b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* LP analysis */ 1306b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber lpc(st->lpcSt, mode, st->p_window, st->p_window_12k2, A_t, pOverflow); 1307b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1308b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* From A(z) to lsp. LSP quantization and interpolation */ 1309b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber lsp(st->lspSt, mode, *usedMode, A_t, Aq_t, lsp_new, &ana, pOverflow); 1310b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1311b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Buffer lsp's and energy */ 1312b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dtx_buffer(st->dtx_encSt, 1313b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber lsp_new, 1314b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->new_speech, pOverflow); 1315b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1316b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Check if in DTX mode */ 1317b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1318b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (*usedMode == MRDTX) 1319b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1320b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dtx_enc(st->dtx_encSt, 1321b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber compute_sid_flag, 1322b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->lspSt->qSt, 1323b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber &(st->gainQuantSt->gc_predSt), 1324b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber &ana, pOverflow); 1325b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1326b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memset(st->old_exc, 0, sizeof(Word16)*(PIT_MAX + L_INTERPOL)); 1327b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memset(st->mem_w0, 0, sizeof(Word16)*M); 1328b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memset(st->mem_err, 0, sizeof(Word16)*M); 1329b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memset(st->zero, 0, sizeof(Word16)*L_SUBFR); 1330b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memset(st->hvec, 0, sizeof(Word16)*L_SUBFR); /* set to zero "h1[-L_SUBFR..-1]" */ 1331b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Reset lsp states */ 1332b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber lsp_reset(st->lspSt); 1333b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1334b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memcpy(st->lspSt->lsp_old, lsp_new, M*sizeof(Word16)); 1335b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memcpy(st->lspSt->lsp_old_q, lsp_new, M*sizeof(Word16)); 1336b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1337b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Reset clLtp states */ 1338b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cl_ltp_reset(st->clLtpSt); 1339b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->sharp = SHARPMIN; 1340b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1341b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber else 1342b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1343b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* check resonance in the filter */ 1344b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber lsp_flag = check_lsp(st->tonStabSt, st->lspSt->lsp_old, pOverflow); 1345b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1346b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1347b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /*----------------------------------------------------------------------* 1348b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - Find the weighted input speech w_sp[] for the whole speech frame * 1349b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - Find the open-loop pitch delay for first 2 subframes * 1350b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - Set the range for searching closed-loop pitch in 1st subframe * 1351b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - Find the open-loop pitch delay for last 2 subframes * 1352b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *----------------------------------------------------------------------*/ 1353b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1354b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifdef VAD2 1355b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (st->dtx) 1356b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1357b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->vadSt->L_Rmax = 0; 1358b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->vadSt->L_R0 = 0; 1359b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1360b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif 1361b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1362b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber for (subfrNr = 0, i_subfr = 0; 1363b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subfrNr < L_FRAME / L_FRAME_BY2; 1364b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subfrNr++, i_subfr += L_FRAME_BY2) 1365b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1366b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Pre-processing on 80 samples */ 1367b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber pre_big(mode, gamma1, gamma1_12k2, gamma2, A_t, i_subfr, st->speech, 1368b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->mem_w, st->wsp, pOverflow); 1369b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1370b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1371b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if ((mode != MR475) && (mode != MR515)) 1372b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1373b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Find open loop pitch lag for two subframes */ 1374b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ol_ltp(st->pitchOLWghtSt, st->vadSt, mode, &st->wsp[i_subfr], 1375b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber &T_op[subfrNr], st->old_lags, st->ol_gain_flg, subfrNr, 1376b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->dtx, pOverflow); 1377b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1378b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1379b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1380b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if ((mode == MR475) || (mode == MR515)) 1381b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1382b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Find open loop pitch lag for ONE FRAME ONLY */ 1383b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* search on 160 samples */ 1384b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1385b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ol_ltp(st->pitchOLWghtSt, st->vadSt, mode, &st->wsp[0], &T_op[0], 1386b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->old_lags, st->ol_gain_flg, 1, st->dtx, pOverflow); 1387b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber T_op[1] = T_op[0]; 1388b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1389b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1390b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifdef VAD2 1391b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (st->dtx) 1392b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1393b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber LTP_flag_update(st->vadSt, (Word16) mode, pOverflow); 1394b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1395b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif 1396b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1397b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifndef VAD2 1398b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* run VAD pitch detection */ 1399b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (st->dtx) 1400b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1401b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber vad_pitch_detection(st->vadSt, T_op, pOverflow); 1402b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1403b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif 1404b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1405b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (*usedMode == MRDTX) 1406b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1407b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber goto the_end; 1408b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1409b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1410b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /*------------------------------------------------------------------------* 1411b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * Loop for every subframe in the analysis frame * 1412b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *------------------------------------------------------------------------* 1413b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * To find the pitch and innovation parameters. The subframe size is * 1414b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * L_SUBFR and the loop is repeated L_FRAME/L_SUBFR times. * 1415b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - find the weighted LPC coefficients * 1416b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - find the LPC residual signal res[] * 1417b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - compute the target signal for pitch search * 1418b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - compute impulse response of weighted synthesis filter (h1[]) * 1419b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - find the closed-loop pitch parameters * 1420b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - encode the pitch dealy * 1421b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - update the impulse response h1[] by including fixed-gain pitch * 1422b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - find target vector for codebook search * 1423b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - codebook search * 1424b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - encode codebook address * 1425b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - VQ of pitch and codebook gains * 1426b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - find synthesis speech * 1427b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - update states of weighting filter * 1428b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *------------------------------------------------------------------------*/ 1429b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1430b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber A = A_t; /* pointer to interpolated LPC parameters */ 1431b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Aq = Aq_t; /* pointer to interpolated quantized LPC parameters */ 1432b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1433b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber evenSubfr = 0; 1434b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subfrNr = -1; 1435b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR) 1436b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1437b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subfrNr++; 1438b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber evenSubfr = 1 - evenSubfr; 1439b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1440b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Save states for the MR475 mode */ 1441b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1442b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if ((evenSubfr != 0) && (*usedMode == MR475)) 1443b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1444b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memcpy(mem_syn_save, st->mem_syn, M*sizeof(Word16)); 1445b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memcpy(mem_w0_save, st->mem_w0, M*sizeof(Word16)); 1446b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memcpy(mem_err_save, st->mem_err, M*sizeof(Word16)); 1447b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1448b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber sharp_save = st->sharp; 1449b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1450b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1451b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /*-----------------------------------------------------------------* 1452b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - Preprocessing of subframe * 1453b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *-----------------------------------------------------------------*/ 1454b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1455b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (*usedMode != MR475) 1456b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1457b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subframePreProc(*usedMode, gamma1, gamma1_12k2, 1458b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber gamma2, A, Aq, &st->speech[i_subfr], 1459b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->mem_err, st->mem_w0, st->zero, 1460b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->ai_zero, &st->exc[i_subfr], 1461b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->h1, xn, res, st->error); 1462b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1463b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber else 1464b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { /* MR475 */ 1465b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subframePreProc(*usedMode, gamma1, gamma1_12k2, 1466b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber gamma2, A, Aq, &st->speech[i_subfr], 1467b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->mem_err, mem_w0_save, st->zero, 1468b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->ai_zero, &st->exc[i_subfr], 1469b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->h1, xn, res, st->error); 1470b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1471b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* save impulse response (modified in cbsearch) */ 1472b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1473b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (evenSubfr != 0) 1474b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1475b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memcpy(h1_sf0, st->h1, L_SUBFR*sizeof(Word16)); 1476b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1477b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1478b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1479b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1480b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* copy the LP residual (res2 is modified in the CL LTP search) */ 1481b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memcpy(res2, res, L_SUBFR*sizeof(Word16)); 1482b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1483b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /*-----------------------------------------------------------------* 1484b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - Closed-loop LTP search * 1485b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *-----------------------------------------------------------------*/ 1486b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cl_ltp(st->clLtpSt, st->tonStabSt, *usedMode, i_subfr, T_op, st->h1, 1487b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber &st->exc[i_subfr], res2, xn, lsp_flag, xn2, y1, 1488b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber &T0, &T0_frac, &gain_pit, gCoeff, &ana, 1489b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber &gp_limit, pOverflow); 1490b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1491b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* update LTP lag history */ 1492b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1493b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if ((subfrNr == 0) && (st->ol_gain_flg[0] > 0)) 1494b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1495b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->old_lags[1] = T0; 1496b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1497b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1498b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1499b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if ((subfrNr == 3) && (st->ol_gain_flg[1] > 0)) 1500b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1501b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->old_lags[0] = T0; 1502b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1503b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1504b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /*-----------------------------------------------------------------* 1505b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - Inovative codebook search (find index and gain) * 1506b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *-----------------------------------------------------------------*/ 1507b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cbsearch(xn2, st->h1, T0, st->sharp, gain_pit, res2, 1508b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber code, y2, &ana, *usedMode, subfrNr, pOverflow); 1509b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1510b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /*------------------------------------------------------* 1511b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * - Quantization of gains. * 1512b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *------------------------------------------------------*/ 1513b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber gainQuant(st->gainQuantSt, *usedMode, res, &st->exc[i_subfr], code, 1514b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber xn, xn2, y1, y2, gCoeff, evenSubfr, gp_limit, 1515b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber &gain_pit_sf0, &gain_code_sf0, 1516b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber &gain_pit, &gain_code, &ana, pOverflow); 1517b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1518b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* update gain history */ 1519b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber update_gp_clipping(st->tonStabSt, gain_pit, pOverflow); 1520b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1521b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1522b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (*usedMode != MR475) 1523b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1524b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Subframe Post Porcessing */ 1525b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subframePostProc(st->speech, *usedMode, i_subfr, gain_pit, 1526b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber gain_code, Aq, synth, xn, code, y1, y2, st->mem_syn, 1527b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->mem_err, st->mem_w0, st->exc, &st->sharp, pOverflow); 1528b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1529b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber else 1530b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1531b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1532b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (evenSubfr != 0) 1533b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1534b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber i_subfr_sf0 = i_subfr; 1535b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1536b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memcpy(xn_sf0, xn, L_SUBFR*sizeof(Word16)); 1537b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memcpy(y2_sf0, y2, L_SUBFR*sizeof(Word16)); 1538b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memcpy(code_sf0, code, L_SUBFR*sizeof(Word16)); 1539b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1540b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber T0_sf0 = T0; 1541b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber T0_frac_sf0 = T0_frac; 1542b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1543b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Subframe Post Porcessing */ 1544b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subframePostProc(st->speech, *usedMode, i_subfr, gain_pit, 1545b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber gain_code, Aq, synth, xn, code, y1, y2, 1546b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber mem_syn_save, st->mem_err, mem_w0_save, 1547b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->exc, &st->sharp, pOverflow); 1548b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->sharp = sharp_save; 1549b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1550b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber else 1551b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1552b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* update both subframes for the MR475 */ 1553b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1554b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Restore states for the MR475 mode */ 1555b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memcpy(st->mem_err, mem_err_save, M*sizeof(Word16)); 1556b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1557b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1558b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* re-build excitation for sf 0 */ 1559b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Pred_lt_3or6(&st->exc[i_subfr_sf0], T0_sf0, T0_frac_sf0, 1560b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber L_SUBFR, 1, pOverflow); 1561b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Convolve(&st->exc[i_subfr_sf0], h1_sf0, y1, L_SUBFR); 1562b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1563b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Aq -= MP1; 1564b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subframePostProc(st->speech, *usedMode, i_subfr_sf0, 1565b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber gain_pit_sf0, gain_code_sf0, Aq, 1566b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber synth, xn_sf0, code_sf0, y1, y2_sf0, 1567b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->mem_syn, st->mem_err, st->mem_w0, st->exc, 1568b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber &sharp_save, pOverflow); /* overwrites sharp_save */ 1569b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Aq += MP1; 1570b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1571b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* re-run pre-processing to get xn right (needed by postproc) */ 1572b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* (this also reconstructs the unsharpened h1 for sf 1) */ 1573b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subframePreProc(*usedMode, gamma1, gamma1_12k2, 1574b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber gamma2, A, Aq, &st->speech[i_subfr], 1575b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->mem_err, st->mem_w0, st->zero, 1576b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->ai_zero, &st->exc[i_subfr], 1577b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->h1, xn, res, st->error); 1578b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1579b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* re-build excitation sf 1 (changed if lag < L_SUBFR) */ 1580b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Pred_lt_3or6(&st->exc[i_subfr], T0, T0_frac, L_SUBFR, 1, pOverflow); 1581b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Convolve(&st->exc[i_subfr], st->h1, y1, L_SUBFR); 1582b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1583b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subframePostProc(st->speech, *usedMode, i_subfr, gain_pit, 1584b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber gain_code, Aq, synth, xn, code, y1, y2, 1585b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->mem_syn, st->mem_err, st->mem_w0, 1586b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber st->exc, &st->sharp, pOverflow); 1587b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1588b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1589b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1590b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber A += MP1; /* interpolated LPC parameters for next subframe */ 1591b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Aq += MP1; 1592b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1593b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1594b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memcpy(&st->old_exc[0], &st->old_exc[L_FRAME], (PIT_MAX + L_INTERPOL)*sizeof(Word16)); 1595b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1596b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberthe_end: 1597b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1598b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /*--------------------------------------------------* 1599b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * Update signal for next frame. * 1600b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *--------------------------------------------------*/ 1601b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1602b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memcpy(&st->old_wsp[0], &st->old_wsp[L_FRAME], PIT_MAX*sizeof(Word16)); 1603b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber memcpy(&st->old_speech[0], &st->old_speech[L_FRAME], (L_TOTAL - L_FRAME)*sizeof(Word16)); 1604b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1605b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return(0); 1606b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber} 1607b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1608b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1609