1d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/* ------------------------------------------------------------------ 2d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * Copyright (C) 1998-2009 PacketVideo 3d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * 4d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * you may not use this file except in compliance with the License. 6d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * You may obtain a copy of the License at 7d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * 8d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * 10d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * Unless required by applicable law or agreed to in writing, software 11d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * express or implied. 14d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * See the License for the specific language governing permissions 15d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * and limitations under the License. 16d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * ------------------------------------------------------------------- 17d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber */ 18d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/**************************************************************************************** 19d49b526dd2009270cb15f7fe4e70b74673950608Andreas HuberPortions of this file are derived from the following 3GPP standard: 20d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 21d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 3GPP TS 26.073 22d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec 23d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Available from http://www.3gpp.org 24d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 25d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC) 26d49b526dd2009270cb15f7fe4e70b74673950608Andreas HuberPermission to distribute, modify and use this file under the standard license 27d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberterms listed above has been obtained from the copyright holder. 28d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber****************************************************************************************/ 29d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/* 30d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 31d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 32d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 33d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 34d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Pathname: ./audio/gsm-amr/c/src/pitch_fr.c 35d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Functions: 36d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 37d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 38d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Date: 02/04/2002 39d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 40d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 41d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REVISION HISTORY 42d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 43d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: Added pOverflow as a passed in value to searchFrac and made 44d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber other fixes to the code regarding simple syntax fixes. Removed 45d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the include of stio.h. 46d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 47d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: *lag-- decrements the pointer. (*lag)-- decrements what is 48d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pointed to. The latter is what the coder intended, but the former is 49d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the coding instruction that was used. 50d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 51d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: A common problem -- a comparison != 0 was inadvertantly replaced 52d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber by a comparison == 0. 53d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 54d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 55d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: For Norm_Corr() and getRange() 56d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1. Eliminated unused include files. 57d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 2. Replaced array addressing by pointers 58d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 3. Eliminated math operations that unnecessary checked for 59d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber saturation, in some cases this by shifting before adding and 60d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber in other cases by evaluating the operands 61d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 4. Unrolled loops to speed up processing, use decrement loops 62d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 5. Replaced extract_l() call with equivalent code 63d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 6. Modified scaling threshold and group all shifts (avoiding 64d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber successive shifts) 65d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 66d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: Replaced OSCL mem type functions and eliminated include 67d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber files that now are chosen by OSCL definitions 68d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 69d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: Replaced "int" and/or "char" with OSCL defined types. 70d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 71d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: Removed compiler warnings. 72d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 73d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: 74d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 75d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber MODULE DESCRIPTION 76d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 77d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber File : pitch_fr.c 78d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Purpose : Find the pitch period with 1/3 or 1/6 subsample 79d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber : resolution (closed loop). 80d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 81d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 82d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/ 83d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 84d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*---------------------------------------------------------------------------- 85d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; INCLUDES 86d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/ 87d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include <stdlib.h> 88d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 89d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "pitch_fr.h" 90d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "oper_32b.h" 91d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "cnst.h" 92d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "enc_lag3.h" 93d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "enc_lag6.h" 94d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "inter_36.h" 95d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "inv_sqrt.h" 96d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "convolve.h" 97d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 98d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "basic_op.h" 99d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 100d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 101d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*---------------------------------------------------------------------------- 102d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; MACROS 103d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Define module specific macros here 104d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/ 105d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 106d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*---------------------------------------------------------------------------- 107d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; DEFINES 108d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Include all pre-processor statements here. Include conditional 109d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; compile variables also. 110d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/ 111d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 112d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*---------------------------------------------------------------------------- 113d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; LOCAL FUNCTION DEFINITIONS 114d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Function Prototype declaration 115d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/ 116d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 117d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*---------------------------------------------------------------------------- 118d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; LOCAL VARIABLE DEFINITIONS 119d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Variable declaration - defined here and used outside this module 120d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/ 121d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 122d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/* 123d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * mode dependent parameters used in Pitch_fr() 124d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * Note: order of MRxx in 'enum Mode' is important! 125d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber */ 126d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberstatic const struct 127d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{ 128d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 max_frac_lag; /* lag up to which fractional lags are used */ 129d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 flag3; /* enable 1/3 instead of 1/6 fract. resolution */ 130d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 first_frac; /* first fractional to check */ 131d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 last_frac; /* last fractional to check */ 132d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 delta_int_low; /* integer lag below TO to start search from */ 133d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 delta_int_range; /* integer range around T0 */ 134d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 delta_frc_low; /* fractional below T0 */ 135d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 delta_frc_range; /* fractional range around T0 */ 136d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 pit_min; /* minimum pitch */ 137d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber} mode_dep_parm[N_MODES] = 138d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{ 139d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* MR475 */ { 84, 1, -2, 2, 5, 10, 5, 9, PIT_MIN }, 140d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* MR515 */ { 84, 1, -2, 2, 5, 10, 5, 9, PIT_MIN }, 141d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* MR59 */ { 84, 1, -2, 2, 3, 6, 5, 9, PIT_MIN }, 142d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* MR67 */ { 84, 1, -2, 2, 3, 6, 5, 9, PIT_MIN }, 143d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* MR74 */ { 84, 1, -2, 2, 3, 6, 5, 9, PIT_MIN }, 144d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* MR795 */ { 84, 1, -2, 2, 3, 6, 10, 19, PIT_MIN }, 145d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* MR102 */ { 84, 1, -2, 2, 3, 6, 5, 9, PIT_MIN }, 146d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* MR122 */ { 94, 0, -3, 3, 3, 6, 5, 9, PIT_MIN_MR122 } 147d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}; 148d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 149d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/* 150d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 151d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: Norm_Corr 152d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 153d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS 154d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 155d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs: 156d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exc[] = pointer to buffer of type Word16 157d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber xn[] = pointer to buffer of type Word16 158d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber h[] = pointer to buffer of type Word16 159d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber L_subfr = length of sub frame (Word16) 160d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber t_min = the minimum table value of type Word16 161d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber t_max = the maximum table value of type Word16 162d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber corr_norm[] = pointer to buffer of type Word16 163d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 164d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs: 165d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pOverflow = 1 if the math functions called result in overflow else zero. 166d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 167d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns: 168d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 169d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 170d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used: 171d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 172d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 173d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed: 174d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 175d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 176d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 177d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION 178d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 179d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION: Norm_Corr() 180d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 181d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PURPOSE: Find the normalized correlation between the target vector 182d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber and the filtered past excitation. 183d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 184d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber DESCRIPTION: 185d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber The normalized correlation is given by the correlation between the 186d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber target and filtered past excitation divided by the square root of 187d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the energy of filtered excitation. 188d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber corr[k] = <x[], y_k[]>/sqrt(y_k[],y_k[]) 189d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber where x[] is the target vector and y_k[] is the filtered past 190d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber excitation at delay k. 191d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 192d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 193d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 194d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS 195d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 196d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 197d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 198d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 199d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES 200d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 201d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pitch_fr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 202d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 203d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 204d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE 205d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 206d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberstatic void Norm_Corr (Word16 exc[], Word16 xn[], Word16 h[], Word16 L_subfr, 207d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 t_min, Word16 t_max, Word16 corr_norm[]) 208d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{ 209d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 i, j, k; 210d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 corr_h, corr_l, norm_h, norm_l; 211d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word32 s; 212d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 213d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // Usally dynamic allocation of (L_subfr) 214d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 excf[L_SUBFR]; 215d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 scaling, h_fac, *s_excf, scaled_excf[L_SUBFR]; 216d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 217d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber k = -t_min; 218d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 219d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // compute the filtered excitation for the first delay t_min 220d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 221d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Convolve (&exc[k], h, excf, L_subfr); 222d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 223d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // scale "excf[]" to avoid overflow 224d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 225d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber for (j = 0; j < L_subfr; j++) { 226d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber scaled_excf[j] = shr (excf[j], 2); 227d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 228d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 229d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // Compute 1/sqrt(energy of excf[]) 230d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 231d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = 0; 232d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber for (j = 0; j < L_subfr; j++) { 233d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = L_mac (s, excf[j], excf[j]); 234d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 235d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (L_sub (s, 67108864L) <= 0) { // if (s <= 2^26) 236d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s_excf = excf; 237d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber h_fac = 15 - 12; 238d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber scaling = 0; 239d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 240d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else { 241d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // "excf[]" is divided by 2 242d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s_excf = scaled_excf; 243d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber h_fac = 15 - 12 - 2; 244d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber scaling = 2; 245d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 246d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 247d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // loop for every possible period 248d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 249d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber for (i = t_min; i <= t_max; i++) { 250d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // Compute 1/sqrt(energy of excf[]) 251d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 252d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = 0; 253d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber for (j = 0; j < L_subfr; j++) { 254d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = L_mac (s, s_excf[j], s_excf[j]); 255d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 256d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 257d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = Inv_sqrt (s); 258d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber L_Extract (s, &norm_h, &norm_l); 259d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 260d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // Compute correlation between xn[] and excf[] 261d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 262d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = 0; 263d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber for (j = 0; j < L_subfr; j++) { 264d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = L_mac (s, xn[j], s_excf[j]); 265d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 266d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber L_Extract (s, &corr_h, &corr_l); 267d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 268d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // Normalize correlation = correlation * (1/sqrt(energy)) 269d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 270d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = Mpy_32 (corr_h, corr_l, norm_h, norm_l); 271d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 272d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber corr_norm[i] = extract_h (L_shl (s, 16)); 273d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 274d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // modify the filtered excitation excf[] for the next iteration 275d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 276d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (sub (i, t_max) != 0) { 277d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber k--; 278d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber for (j = L_subfr - 1; j > 0; j--) { 279d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = L_mult (exc[k], h[j]); 280d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = L_shl (s, h_fac); 281d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s_excf[j] = add (extract_h (s), s_excf[j - 1]); 282d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 283d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s_excf[0] = shr (exc[k], scaling); 284d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 285d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 286d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber return; 287d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber} 288d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 289d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 290d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional] 291d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 292d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the 293d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below. 294d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 295d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes 296d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 297d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes 298d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 299d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 300d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber used to represent cycle count for each subroutine 301d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber called) 302d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber where: (cycle count variable) = cycle count for [subroutine 303d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber name] 304d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 305d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 306d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional] 307d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function] 308d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 309d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 310d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/ 311d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 312d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberstatic void Norm_Corr(Word16 exc[], 313d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 xn[], 314d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 h[], 315d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 L_subfr, 316d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 t_min, 317d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 t_max, 318d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 corr_norm[], 319d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Flag *pOverflow) 320d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{ 321d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 i; 322d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 j; 323d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 k; 324d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 corr_h; 325d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 corr_l; 326d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 norm_h; 327d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 norm_l; 328d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word32 s; 329d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word32 s2; 330d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 excf[L_SUBFR]; 331d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 scaling; 332d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 h_fac; 333d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *s_excf; 334d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 scaled_excf[L_SUBFR]; 335d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *p_s_excf; 336d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *p_excf; 337d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 temp; 338d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *p_x; 339d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *p_h; 340d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 341d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber k = -t_min; 342d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 343d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* compute the filtered excitation for the first delay t_min */ 344d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 345d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Convolve(&exc[k], h, excf, L_subfr); 346d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 347d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* scale "excf[]" to avoid overflow */ 348d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = 0; 349d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber p_s_excf = scaled_excf; 350d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber p_excf = excf; 351d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 352d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber for (j = (L_subfr >> 1); j != 0; j--) 353d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 354d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber temp = *(p_excf++); 355d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *(p_s_excf++) = temp >> 2; 356d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s += (Word32) temp * temp; 357d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber temp = *(p_excf++); 358d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *(p_s_excf++) = temp >> 2; 359d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s += (Word32) temp * temp; 360d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 361d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 362d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 363d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (s <= (67108864L >> 1)) 364d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 365d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s_excf = excf; 366d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber h_fac = 12; 367d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber scaling = 0; 368d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 369d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else 370d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 371d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* "excf[]" is divided by 2 */ 372d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s_excf = scaled_excf; 373d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber h_fac = 14; 374d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber scaling = 2; 375d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 376d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 377d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* loop for every possible period */ 378d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 379d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber for (i = t_min; i <= t_max; i++) 380d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 381d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* Compute 1/sqrt(energy of excf[]) */ 382d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 383d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = s2 = 0; 384d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber p_x = xn; 385d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber p_s_excf = s_excf; 386d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber j = L_subfr >> 1; 387d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 388d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber while (j--) 389d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 390d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s += (Word32) * (p_x++) * *(p_s_excf); 391d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s2 += ((Word32)(*(p_s_excf)) * (*(p_s_excf))); 392d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber p_s_excf++; 393d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s += (Word32) * (p_x++) * *(p_s_excf); 394d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s2 += ((Word32)(*(p_s_excf)) * (*(p_s_excf))); 395d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber p_s_excf++; 396d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 397d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 398d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s2 = s2 << 1; 399d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s2 = Inv_sqrt(s2, pOverflow); 400d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber norm_h = (Word16)(s2 >> 16); 401d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber norm_l = (Word16)((s2 >> 1) - (norm_h << 15)); 402d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber corr_h = (Word16)(s >> 15); 403d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber corr_l = (Word16)((s) - (corr_h << 15)); 404d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 405d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* Normalize correlation = correlation * (1/sqrt(energy)) */ 406d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 407d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = Mpy_32(corr_h, corr_l, norm_h, norm_l, pOverflow); 408d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 409d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber corr_norm[i] = (Word16) s ; 410d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 411d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* modify the filtered excitation excf[] for the next iteration */ 412d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (i != t_max) 413d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 414d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber k--; 415d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber temp = exc[k]; 416d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber p_s_excf = &s_excf[L_subfr - 1]; 417d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber p_h = &h[L_subfr - 1]; 418d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 419d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber p_excf = &s_excf[L_subfr - 2]; 420d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber for (j = (L_subfr - 1) >> 1; j != 0; j--) 421d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 422d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = ((Word32) temp * *(p_h--)) >> h_fac; 423d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *(p_s_excf--) = (Word16) s + *(p_excf--); 424d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = ((Word32) temp * *(p_h--)) >> h_fac; 425d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *(p_s_excf--) = (Word16) s + *(p_excf--); 426d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 427d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 428d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = ((Word32) temp * *(p_h)) >> h_fac; 429d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *(p_s_excf--) = (Word16) s + *(p_excf); 430d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 431d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *(p_s_excf) = temp >> scaling; 432d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 433d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 434d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 435d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber return; 436d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber} 437d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 438d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/****************************************************************************/ 439d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 440d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 441d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/* 442d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 443d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: searchFrac 444d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 445d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS 446d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 447d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs: 448d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber lag = pointer to integer pitch of type Word16 449d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac = pointer to starting point of search fractional pitch of type Word16 450d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber last_frac = endpoint of search of type Word16 451d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber corr[] = pointer to normalized correlation of type Word16 452d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber flag3 = subsample resolution (3: =1 / 6: =0) of type Word16 453d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 454d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs: 455d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 456d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 457d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns: 458d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 459d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 460d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used: 461d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 462d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 463d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed: 464d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 465d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 466d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 467d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION 468d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 469d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION: searchFrac() 470d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 471d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PURPOSE: Find fractional pitch 472d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 473d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber DESCRIPTION: 474d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber The function interpolates the normalized correlation at the 475d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber fractional positions around lag T0. The position at which the 476d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber interpolation function reaches its maximum is the fractional pitch. 477d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Starting point of the search is frac, end point is last_frac. 478d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac is overwritten with the fractional pitch. 479d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 480d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 481d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS 482d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 483d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 484d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 485d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 486d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES 487d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 488d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pitch_fr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 489d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 490d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 491d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE 492d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 493d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberstatic void searchFrac ( 494d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *lag, // i/o : integer pitch 495d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *frac, // i/o : start point of search - 496d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber fractional pitch 497d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 last_frac, // i : endpoint of search 498d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 corr[], // i : normalized correlation 499d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 flag3 // i : subsample resolution 500d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber (3: =1 / 6: =0) 501d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber) 502d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{ 503d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 i; 504d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 max; 505d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 corr_int; 506d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 507d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // Test the fractions around T0 and choose the one which maximizes 508d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // the interpolated normalized correlation. 509d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 510d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber max = Interpol_3or6 (&corr[*lag], *frac, flag3); // function result 511d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 512d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber for (i = add (*frac, 1); i <= last_frac; i++) { 513d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber corr_int = Interpol_3or6 (&corr[*lag], i, flag3); 514d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (sub (corr_int, max) > 0) { 515d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber max = corr_int; 516d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *frac = i; 517d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 518d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 519d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 520d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (flag3 == 0) { 521d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // Limit the fraction value in the interval [-2,-1,0,1,2,3] 522d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 523d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (sub (*frac, -3) == 0) { 524d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *frac = 3; 525d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *lag = sub (*lag, 1); 526d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 527d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 528d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else { 529d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // limit the fraction value between -1 and 1 530d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 531d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (sub (*frac, -2) == 0) { 532d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *frac = 1; 533d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *lag = sub (*lag, 1); 534d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 535d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (sub (*frac, 2) == 0) { 536d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *frac = -1; 537d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *lag = add (*lag, 1); 538d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 539d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 540d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber} 541d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 542d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 543d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional] 544d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 545d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the 546d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below. 547d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 548d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes 549d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 550d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes 551d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 552d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 553d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber used to represent cycle count for each subroutine 554d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber called) 555d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber where: (cycle count variable) = cycle count for [subroutine 556d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber name] 557d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 558d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 559d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional] 560d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function] 561d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 562d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 563d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/ 564d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 565d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberstatic void searchFrac( 566d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *lag, /* i/o : integer pitch */ 567d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *frac, /* i/o : start point of search - 568d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber fractional pitch */ 569d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 last_frac, /* i : endpoint of search */ 570d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 corr[], /* i : normalized correlation */ 571d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 flag3, /* i : subsample resolution 572d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber (3: =1 / 6: =0) */ 573d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Flag *pOverflow 574d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber) 575d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{ 576d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 i; 577d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 max; 578d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 corr_int; 579d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 580d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* Test the fractions around T0 and choose the one which maximizes */ 581d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* the interpolated normalized correlation. */ 582d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 583d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber max = Interpol_3or6(&corr[*lag], *frac, flag3, pOverflow); 584d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* function result */ 585d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 586d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber for (i = *frac + 1; i <= last_frac; i++) 587d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 588d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber corr_int = Interpol_3or6(&corr[*lag], i, flag3, pOverflow); 589d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (corr_int > max) 590d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 591d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber max = corr_int; 592d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *frac = i; 593d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 594d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 595d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 596d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (flag3 == 0) 597d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 598d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* Limit the fraction value in the interval [-2,-1,0,1,2,3] */ 599d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 600d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (*frac == -3) 601d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 602d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *frac = 3; 603d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber (*lag)--; 604d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 605d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 606d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else 607d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 608d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* limit the fraction value between -1 and 1 */ 609d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 610d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (*frac == -2) 611d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 612d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *frac = 1; 613d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber (*lag)--; 614d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 615d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (*frac == 2) 616d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 617d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *frac = -1; 618d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber (*lag)++; 619d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 620d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 621d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber} 622d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 623d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/****************************************************************************/ 624d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 625d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 626d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/* 627d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 628d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: getRange 629d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 630d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS 631d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 632d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs: 633d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber T0 = integer pitch of type Word16 634d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber delta_low = search start offset of type Word16 635d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber delta_range = search range of type Word16 636d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pitmin = minimum pitch of type Word16 637d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pitmax = maximum pitch of type Word16 638d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber t0_min = search range minimum of type Word16 639d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber t0_max = search range maximum of type Word16 640d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 641d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs: 642d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pOverflow = 1 if the math functions called result in overflow else zero. 643d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 644d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns: 645d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 646d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 647d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used: 648d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 649d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 650d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed: 651d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 652d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 653d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 654d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION 655d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 656d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION: getRange() 657d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 658d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PURPOSE: Sets range around open-loop pitch or integer pitch of last subframe 659d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 660d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber DESCRIPTION: 661d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Takes integer pitch T0 and calculates a range around it with 662d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber t0_min = T0-delta_low and t0_max = (T0-delta_low) + delta_range 663d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber t0_min and t0_max are bounded by pitmin and pitmax 664d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 665d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS 666d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 667d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 668d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 669d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 670d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES 671d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 672d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pitch_fr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 673d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 674d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 675d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE 676d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 677d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberstatic void getRange ( 678d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 T0, // i : integer pitch 679d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 delta_low, // i : search start offset 680d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 delta_range, // i : search range 681d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 pitmin, // i : minimum pitch 682d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 pitmax, // i : maximum pitch 683d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *t0_min, // o : search range minimum 684d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *t0_max) // o : search range maximum 685d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{ 686d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *t0_min = sub(T0, delta_low); 687d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (sub(*t0_min, pitmin) < 0) { 688d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *t0_min = pitmin; 689d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 690d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *t0_max = add(*t0_min, delta_range); 691d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (sub(*t0_max, pitmax) > 0) { 692d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *t0_max = pitmax; 693d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *t0_min = sub(*t0_max, delta_range); 694d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 695d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber} 696d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 697d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 698d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional] 699d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 700d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the 701d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below. 702d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 703d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes 704d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 705d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes 706d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 707d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 708d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber used to represent cycle count for each subroutine 709d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber called) 710d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber where: (cycle count variable) = cycle count for [subroutine 711d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber name] 712d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 713d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 714d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional] 715d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function] 716d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 717d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 718d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/ 719d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberstatic void getRange( 720d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 T0, /* i : integer pitch */ 721d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 delta_low, /* i : search start offset */ 722d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 delta_range, /* i : search range */ 723d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 pitmin, /* i : minimum pitch */ 724d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 pitmax, /* i : maximum pitch */ 725d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *t0_min, /* o : search range minimum */ 726d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *t0_max, /* o : search range maximum */ 727d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Flag *pOverflow) 728d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{ 729d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 730d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 temp; 731d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber OSCL_UNUSED_ARG(pOverflow); 732d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 733d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber temp = *t0_min; 734d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber temp = T0 - delta_low; 735d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (temp < pitmin) 736d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 737d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber temp = pitmin; 738d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 739d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *t0_min = temp; 740d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 741d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber temp += delta_range; 742d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (temp > pitmax) 743d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 744d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber temp = pitmax; 745d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *t0_min = pitmax - delta_range; 746d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 747d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *t0_max = temp; 748d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 749d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber} 750d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 751d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 752d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/****************************************************************************/ 753d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 754d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 755d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/* 756d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 757d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: Pitch_fr_init 758d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 759d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS 760d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 761d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs: 762d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber state = pointer to a pointer of structure type Pitch_fr_State. 763d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 764d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs: 765d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 766d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 767d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns: 768d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns a zero if successful and -1 if not successful. 769d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 770d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used: 771d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 772d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 773d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed: 774d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 775d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 776d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 777d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION 778d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 779d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Function: Pitch_fr_init 780d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Purpose: Allocates state memory and initializes state memory 781d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 782d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 783d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS 784d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 785d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 786d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 787d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 788d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES 789d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 790d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pitch_fr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 791d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 792d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 793d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE 794d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 795d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberint Pitch_fr_init (Pitch_frState **state) 796d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{ 797d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Pitch_frState* s; 798d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 799d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (state == (Pitch_frState **) NULL){ 800d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // fprintf(stderr, "Pitch_fr_init: invalid parameter\n"); 801d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber return -1; 802d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 803d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *state = NULL; 804d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 805d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // allocate memory 806d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if ((s= (Pitch_frState *) malloc(sizeof(Pitch_frState))) == NULL){ 807d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // fprintf(stderr, "Pitch_fr_init: can not malloc state structure\n"); 808d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber return -1; 809d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 810d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 811d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Pitch_fr_reset(s); 812d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *state = s; 813d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 814d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber return 0; 815d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber} 816d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 817d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 818d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional] 819d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 820d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the 821d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below. 822d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 823d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes 824d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 825d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes 826d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 827d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 828d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber used to represent cycle count for each subroutine 829d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber called) 830d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber where: (cycle count variable) = cycle count for [subroutine 831d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber name] 832d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 833d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 834d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional] 835d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function] 836d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 837d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 838d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/ 839d49b526dd2009270cb15f7fe4e70b74673950608Andreas HuberWord16 Pitch_fr_init(Pitch_frState **state) 840d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{ 841d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Pitch_frState* s; 842d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 843d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (state == (Pitch_frState **) NULL) 844d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 845d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* fprintf(stderr, "Pitch_fr_init: invalid parameter\n"); */ 846d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber return -1; 847d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 848d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *state = NULL; 849d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 850d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* allocate memory */ 851d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if ((s = (Pitch_frState *) malloc(sizeof(Pitch_frState))) == NULL) 852d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 853d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* fprintf(stderr, "Pitch_fr_init: can not malloc state structure\n"); */ 854d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber return -1; 855d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 856d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 857d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Pitch_fr_reset(s); 858d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *state = s; 859d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 860d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber return 0; 861d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber} 862d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 863d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 864d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/****************************************************************************/ 865d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 866d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 867d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/* 868d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 869d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: Pitch_fr_reset 870d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 871d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS 872d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 873d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs: 874d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber state = pointer to a pointer of structure type Pitch_fr_State. 875d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 876d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs: 877d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 878d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 879d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns: 880d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns a zero if successful and -1 if not successful. 881d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 882d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used: 883d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 884d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 885d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed: 886d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 887d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 888d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 889d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION 890d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 891d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Function: Pitch_fr_reset 892d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Purpose: Initializes state memory to zero 893d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 894d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 895d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS 896d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 897d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 898d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 899d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 900d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES 901d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 902d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pitch_fr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 903d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 904d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 905d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE 906d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 907d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberint Pitch_fr_reset (Pitch_frState *state) 908d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{ 909d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 910d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (state == (Pitch_frState *) NULL){ 911d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // fprintf(stderr, "Pitch_fr_reset: invalid parameter\n"); 912d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber return -1; 913d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 914d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 915d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber state->T0_prev_subframe = 0; 916d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 917d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber return 0; 918d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber} 919d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 920d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 921d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional] 922d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 923d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the 924d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below. 925d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 926d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes 927d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 928d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes 929d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 930d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 931d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber used to represent cycle count for each subroutine 932d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber called) 933d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber where: (cycle count variable) = cycle count for [subroutine 934d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber name] 935d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 936d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 937d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional] 938d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function] 939d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 940d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 941d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/ 942d49b526dd2009270cb15f7fe4e70b74673950608Andreas HuberWord16 Pitch_fr_reset(Pitch_frState *state) 943d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{ 944d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 945d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (state == (Pitch_frState *) NULL) 946d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 947d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* fprintf(stderr, "Pitch_fr_reset: invalid parameter\n"); */ 948d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber return -1; 949d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 950d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 951d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber state->T0_prev_subframe = 0; 952d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 953d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber return 0; 954d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber} 955d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 956d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 957d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/****************************************************************************/ 958d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 959d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 960d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/* 961d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 962d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: Pitch_fr_exit 963d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 964d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS 965d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 966d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs: 967d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber state = pointer to a pointer of structure type Pitch_fr_State. 968d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 969d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs: 970d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 971d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 972d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns: 973d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 974d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 975d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used: 976d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 977d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 978d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed: 979d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 980d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 981d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 982d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION 983d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 984d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Function: Pitch_fr_exit 985d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Purpose: The memory for state is freed. 986d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 987d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 988d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS 989d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 990d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 991d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 992d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 993d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES 994d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 995d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pitch_fr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 996d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 997d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 998d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE 999d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1000d49b526dd2009270cb15f7fe4e70b74673950608Andreas Hubervoid Pitch_fr_exit (Pitch_frState **state) 1001d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{ 1002d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (state == NULL || *state == NULL) 1003d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber return; 1004d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1005d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // deallocate memory 1006d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber free(*state); 1007d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *state = NULL; 1008d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1009d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber return; 1010d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber} 1011d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1012d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 1013d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional] 1014d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1015d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the 1016d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below. 1017d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1018d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes 1019d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1020d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes 1021d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1022d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 1023d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber used to represent cycle count for each subroutine 1024d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber called) 1025d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber where: (cycle count variable) = cycle count for [subroutine 1026d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber name] 1027d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1028d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 1029d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional] 1030d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function] 1031d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1032d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 1033d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/ 1034d49b526dd2009270cb15f7fe4e70b74673950608Andreas Hubervoid Pitch_fr_exit(Pitch_frState **state) 1035d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{ 1036d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (state == NULL || *state == NULL) 1037d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber return; 1038d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1039d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* deallocate memory */ 1040d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber free(*state); 1041d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *state = NULL; 1042d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1043d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber return; 1044d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber} 1045d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1046d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/****************************************************************************/ 1047d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1048d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1049d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/* 1050d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 1051d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: Pitch_fr 1052d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 1053d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS 1054d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1055d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs: 1056d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber st = pointer to stat structure of type Pitch_frState 1057d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber mode = codec mode of type enum Mode 1058d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber T_op[] = pointer to open loop pitch lags of type Word16 1059d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exc[] = pointer to excitation buffer of type Word16 1060d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber xn[] = pointer to target vector of type Word16 1061d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber h[] = pointer to impulse response of synthesis and weighting filters 1062d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber of type Word16 1063d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber L_subfr = length of subframe of type Word16 1064d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber i_subfr = subframe offset of type Word16 1065d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1066d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs: 1067d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pit_frac = pointer to pitch period (fractional) of type Word16 1068d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber resu3 = pointer to subsample resolution of type Word16 1069d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber ana_index = pointer to index of encoding of type Word16 1070d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1071d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns: 1072d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 1073d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1074d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used: 1075d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 1076d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1077d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed: 1078d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 1079d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1080d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 1081d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION 1082d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1083d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION: Pitch_fr() 1084d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1085d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PURPOSE: Find the pitch period with 1/3 or 1/6 subsample resolution 1086d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber (closed loop). 1087d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1088d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber DESCRIPTION: 1089d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber - find the normalized correlation between the target and filtered 1090d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber past excitation in the search range. 1091d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber - select the delay with maximum normalized correlation. 1092d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber - interpolate the normalized correlation at fractions -3/6 to 3/6 1093d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber with step 1/6 around the chosen delay. 1094d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber - The fraction which gives the maximum interpolated value is chosen. 1095d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1096d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 1097d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS 1098d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1099d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 1100d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1101d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 1102d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES 1103d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1104d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pitch_fr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 1105d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1106d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 1107d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE 1108d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1109d49b526dd2009270cb15f7fe4e70b74673950608Andreas HuberWord16 Pitch_fr ( // o : pitch period (integer) 1110d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Pitch_frState *st, // i/o : State struct 1111d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber enum Mode mode, // i : codec mode 1112d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 T_op[], // i : open loop pitch lags 1113d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 exc[], // i : excitation buffer Q0 1114d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 xn[], // i : target vector Q0 1115d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 h[], // i : impulse response of synthesis and 1116d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber weighting filters Q12 1117d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 L_subfr, // i : Length of subframe 1118d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 i_subfr, // i : subframe offset 1119d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *pit_frac, // o : pitch period (fractional) 1120d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *resu3, // o : subsample resolution 1/3 (=1) or 1/6 (=0) 1121d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *ana_index // o : index of encoding 1122d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber) 1123d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{ 1124d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 i; 1125d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 t_min, t_max; 1126d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 t0_min, t0_max; 1127d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 max, lag, frac; 1128d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 tmp_lag; 1129d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *corr; 1130d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 corr_v[40]; // Total length = t0_max-t0_min+1+2*L_INTER_SRCH 1131d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1132d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 max_frac_lag; 1133d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 flag3, flag4; 1134d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 last_frac; 1135d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 delta_int_low, delta_int_range; 1136d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 delta_frc_low, delta_frc_range; 1137d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 pit_min; 1138d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 frame_offset; 1139d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 delta_search; 1140d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1141d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber //----------------------------------------------------------------------- 1142d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // set mode specific variables 1143d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber //---------------------------------------------------------------------- 1144d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1145d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber max_frac_lag = mode_dep_parm[mode].max_frac_lag; 1146d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber flag3 = mode_dep_parm[mode].flag3; 1147d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac = mode_dep_parm[mode].first_frac; 1148d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber last_frac = mode_dep_parm[mode].last_frac; 1149d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber delta_int_low = mode_dep_parm[mode].delta_int_low; 1150d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber delta_int_range = mode_dep_parm[mode].delta_int_range; 1151d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1152d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber delta_frc_low = mode_dep_parm[mode].delta_frc_low; 1153d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber delta_frc_range = mode_dep_parm[mode].delta_frc_range; 1154d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pit_min = mode_dep_parm[mode].pit_min; 1155d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1156d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber //----------------------------------------------------------------------- 1157d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // decide upon full or differential search 1158d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber //----------------------------------------------------------------------- 1159d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1160d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber delta_search = 1; 1161d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1162d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if ((i_subfr == 0) || (sub(i_subfr,L_FRAME_BY2) == 0)) { 1163d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1164d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // Subframe 1 and 3 1165d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1166d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (((sub((Word16)mode, (Word16)MR475) != 0) && (sub((Word16)mode, 1167d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber (Word16)MR515) != 0)) || 1168d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber (sub(i_subfr,L_FRAME_BY2) != 0)) { 1169d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1170d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // set t0_min, t0_max for full search 1171d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // this is *not* done for mode MR475, MR515 in subframe 3 1172d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1173d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber delta_search = 0; // no differential search 1174d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1175d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // calculate index into T_op which contains the open-loop 1176d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // pitch estimations for the 2 big subframes 1177d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1178d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frame_offset = 1; 1179d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (i_subfr == 0) 1180d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frame_offset = 0; 1181d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1182d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // get T_op from the corresponding half frame and 1183d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // set t0_min, t0_max 1184d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1185d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber getRange (T_op[frame_offset], delta_int_low, delta_int_range, 1186d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pit_min, PIT_MAX, &t0_min, &t0_max); 1187d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1188d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else { 1189d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1190d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // mode MR475, MR515 and 3. Subframe: delta search as well 1191d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber getRange (st->T0_prev_subframe, delta_frc_low, delta_frc_range, 1192d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pit_min, PIT_MAX, &t0_min, &t0_max); 1193d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1194d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1195d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else { 1196d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1197d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // for Subframe 2 and 4 1198d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // get range around T0 of previous subframe for delta search 1199d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1200d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber getRange (st->T0_prev_subframe, delta_frc_low, delta_frc_range, 1201d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pit_min, PIT_MAX, &t0_min, &t0_max); 1202d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1203d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1204d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber //----------------------------------------------------------------------- 1205d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Find interval to compute normalized correlation 1206d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber ----------------------------------------------------------------------- 1207d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1208d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber t_min = sub (t0_min, L_INTER_SRCH); 1209d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber t_max = add (t0_max, L_INTER_SRCH); 1210d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1211d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber corr = &corr_v[-t_min]; 1212d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1213d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber //----------------------------------------------------------------------- 1214d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Compute normalized correlation between target and filtered excitation 1215d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber ----------------------------------------------------------------------- 1216d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1217d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Norm_Corr (exc, xn, h, L_subfr, t_min, t_max, corr); 1218d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1219d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber //----------------------------------------------------------------------- 1220d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Find integer pitch 1221d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber ----------------------------------------------------------------------- 1222d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1223d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber max = corr[t0_min]; 1224d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber lag = t0_min; 1225d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1226d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber for (i = t0_min + 1; i <= t0_max; i++) { 1227d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (sub (corr[i], max) >= 0) { 1228d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber max = corr[i]; 1229d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber lag = i; 1230d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1231d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1232d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1233d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber //----------------------------------------------------------------------- 1234d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Find fractional pitch 1235d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber ----------------------------------------------------------------------- 1236d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if ((delta_search == 0) && (sub (lag, max_frac_lag) > 0)) { 1237d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1238d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // full search and integer pitch greater than max_frac_lag 1239d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // fractional search is not needed, set fractional to zero 1240d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1241d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac = 0; 1242d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1243d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else { 1244d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1245d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // if differential search AND mode MR475 OR MR515 OR MR59 OR MR67 1246d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // then search fractional with 4 bits resolution 1247d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1248d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if ((delta_search != 0) && 1249d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber ((sub ((Word16)mode, (Word16)MR475) == 0) || 1250d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber (sub ((Word16)mode, (Word16)MR515) == 0) || 1251d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber (sub ((Word16)mode, (Word16)MR59) == 0) || 1252d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber (sub ((Word16)mode, (Word16)MR67) == 0))) { 1253d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1254d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // modify frac or last_frac according to position of last 1255d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // integer pitch: either search around integer pitch, 1256d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // or only on left or right side 1257d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1258d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber tmp_lag = st->T0_prev_subframe; 1259d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if ( sub( sub(tmp_lag, t0_min), 5) > 0) 1260d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber tmp_lag = add (t0_min, 5); 1261d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if ( sub( sub(t0_max, tmp_lag), 4) > 0) 1262d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber tmp_lag = sub (t0_max, 4); 1263d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1264d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if ((sub (lag, tmp_lag) == 0) || 1265d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber (sub (lag, sub(tmp_lag, 1)) == 0)) { 1266d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1267d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // normal search in fractions around T0 1268d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1269d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber searchFrac (&lag, &frac, last_frac, corr, flag3); 1270d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1271d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1272d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else if (sub (lag, sub (tmp_lag, 2)) == 0) { 1273d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // limit search around T0 to the right side 1274d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac = 0; 1275d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber searchFrac (&lag, &frac, last_frac, corr, flag3); 1276d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1277d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else if (sub (lag, add(tmp_lag, 1)) == 0) { 1278d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // limit search around T0 to the left side 1279d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber last_frac = 0; 1280d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber searchFrac (&lag, &frac, last_frac, corr, flag3); 1281d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1282d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else { 1283d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // no fractional search 1284d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac = 0; 1285d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1286d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1287d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else 1288d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // test the fractions around T0 1289d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber searchFrac (&lag, &frac, last_frac, corr, flag3); 1290d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1291d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1292d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber //----------------------------------------------------------------------- 1293d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // encode pitch 1294d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber //----------------------------------------------------------------------- 1295d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1296d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (flag3 != 0) { 1297d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // flag4 indicates encoding with 4 bit resolution; 1298d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // this is needed for mode MR475, MR515 and MR59 1299d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1300d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber flag4 = 0; 1301d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if ( (sub ((Word16)mode, (Word16)MR475) == 0) || 1302d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber (sub ((Word16)mode, (Word16)MR515) == 0) || 1303d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber (sub ((Word16)mode, (Word16)MR59) == 0) || 1304d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber (sub ((Word16)mode, (Word16)MR67) == 0) ) { 1305d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber flag4 = 1; 1306d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1307d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1308d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // encode with 1/3 subsample resolution 1309d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1310d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *ana_index = Enc_lag3(lag, frac, st->T0_prev_subframe, 1311d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber t0_min, t0_max, delta_search, flag4); 1312d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // function result 1313d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1314d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1315d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else 1316d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 1317d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // encode with 1/6 subsample resolution 1318d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1319d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *ana_index = Enc_lag6(lag, frac, t0_min, delta_search); 1320d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // function result 1321d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1322d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1323d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber //----------------------------------------------------------------------- 1324d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // update state variables 1325d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber //----------------------------------------------------------------------- 1326d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1327d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber st->T0_prev_subframe = lag; 1328d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1329d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber //----------------------------------------------------------------------- 1330d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // update output variables 1331d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber //----------------------------------------------------------------------- 1332d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1333d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *resu3 = flag3; 1334d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1335d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *pit_frac = frac; 1336d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1337d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber return (lag); 1338d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber} 1339d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1340d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1341d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 1342d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional] 1343d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1344d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the 1345d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below. 1346d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1347d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes 1348d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1349d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes 1350d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1351d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 1352d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber used to represent cycle count for each subroutine 1353d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber called) 1354d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber where: (cycle count variable) = cycle count for [subroutine 1355d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber name] 1356d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1357d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 1358d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional] 1359d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function] 1360d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1361d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 1362d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/ 1363d49b526dd2009270cb15f7fe4e70b74673950608Andreas HuberWord16 Pitch_fr( /* o : pitch period (integer) */ 1364d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Pitch_frState *st, /* i/o : State struct */ 1365d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber enum Mode mode, /* i : codec mode */ 1366d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 T_op[], /* i : open loop pitch lags */ 1367d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 exc[], /* i : excitation buffer Q0 */ 1368d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 xn[], /* i : target vector Q0 */ 1369d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 h[], /* i : impulse response of synthesis and 1370d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber weighting filters Q12 */ 1371d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 L_subfr, /* i : Length of subframe */ 1372d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 i_subfr, /* i : subframe offset */ 1373d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *pit_frac, /* o : pitch period (fractional) */ 1374d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *resu3, /* o : subsample resolution 1/3 (=1) or 1/6 (=0) */ 1375d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *ana_index, /* o : index of encoding */ 1376d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Flag *pOverflow 1377d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber) 1378d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{ 1379d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 i; 1380d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 t_min; 1381d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 t_max; 1382d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 t0_min = 0; 1383d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 t0_max; 1384d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 max; 1385d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 lag; 1386d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 frac; 1387d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 tmp_lag; 1388d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *corr; 1389d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 corr_v[40]; /* Total length = t0_max-t0_min+1+2*L_INTER_SRCH */ 1390d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1391d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 max_frac_lag; 1392d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 flag3; 1393d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 flag4; 1394d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 last_frac; 1395d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 delta_int_low; 1396d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 delta_int_range; 1397d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 delta_frc_low; 1398d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 delta_frc_range; 1399d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 pit_min; 1400d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 frame_offset; 1401d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 delta_search; 1402d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1403d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /*-----------------------------------------------------------------------* 1404d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * set mode specific variables * 1405d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *-----------------------------------------------------------------------*/ 1406d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1407d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber max_frac_lag = mode_dep_parm[mode].max_frac_lag; 1408d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber flag3 = mode_dep_parm[mode].flag3; 1409d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac = mode_dep_parm[mode].first_frac; 1410d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber last_frac = mode_dep_parm[mode].last_frac; 1411d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber delta_int_low = mode_dep_parm[mode].delta_int_low; 1412d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber delta_int_range = mode_dep_parm[mode].delta_int_range; 1413d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1414d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber delta_frc_low = mode_dep_parm[mode].delta_frc_low; 1415d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber delta_frc_range = mode_dep_parm[mode].delta_frc_range; 1416d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pit_min = mode_dep_parm[mode].pit_min; 1417d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1418d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /*-----------------------------------------------------------------------* 1419d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * decide upon full or differential search * 1420d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *-----------------------------------------------------------------------*/ 1421d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1422d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber delta_search = 1; 1423d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1424d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if ((i_subfr == 0) || (i_subfr == L_FRAME_BY2)) 1425d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 1426d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1427d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* Subframe 1 and 3 */ 1428d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1429d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (((mode != MR475) && (mode != MR515)) || (i_subfr != L_FRAME_BY2)) 1430d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 1431d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1432d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* set t0_min, t0_max for full search */ 1433d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* this is *not* done for mode MR475, MR515 in subframe 3 */ 1434d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1435d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber delta_search = 0; /* no differential search */ 1436d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1437d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* calculate index into T_op which contains the open-loop */ 1438d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* pitch estimations for the 2 big subframes */ 1439d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1440d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frame_offset = 1; 1441d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (i_subfr == 0) 1442d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frame_offset = 0; 1443d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1444d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* get T_op from the corresponding half frame and */ 1445d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* set t0_min, t0_max */ 1446d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1447d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber getRange(T_op[frame_offset], delta_int_low, delta_int_range, 1448d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pit_min, PIT_MAX, &t0_min, &t0_max, pOverflow); 1449d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1450d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else 1451d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 1452d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1453d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* mode MR475, MR515 and 3. Subframe: delta search as well */ 1454d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber getRange(st->T0_prev_subframe, delta_frc_low, delta_frc_range, 1455d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pit_min, PIT_MAX, &t0_min, &t0_max, pOverflow); 1456d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1457d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1458d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else 1459d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 1460d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1461d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* for Subframe 2 and 4 */ 1462d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* get range around T0 of previous subframe for delta search */ 1463d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1464d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber getRange(st->T0_prev_subframe, delta_frc_low, delta_frc_range, 1465d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pit_min, PIT_MAX, &t0_min, &t0_max, pOverflow); 1466d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1467d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1468d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /*-----------------------------------------------------------------------* 1469d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * Find interval to compute normalized correlation * 1470d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *-----------------------------------------------------------------------*/ 1471d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1472d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber t_min = sub(t0_min, L_INTER_SRCH, pOverflow); 1473d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber t_max = add(t0_max, L_INTER_SRCH, pOverflow); 1474d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1475d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber corr = &corr_v[-t_min]; 1476d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1477d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /*-----------------------------------------------------------------------* 1478d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * Compute normalized correlation between target and filtered excitation * 1479d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *-----------------------------------------------------------------------*/ 1480d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1481d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Norm_Corr(exc, xn, h, L_subfr, t_min, t_max, corr, pOverflow); 1482d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1483d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /*-----------------------------------------------------------------------* 1484d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * Find integer pitch * 1485d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *-----------------------------------------------------------------------*/ 1486d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1487d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber max = corr[t0_min]; 1488d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber lag = t0_min; 1489d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1490d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber for (i = t0_min + 1; i <= t0_max; i++) 1491d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 1492d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (corr[i] >= max) 1493d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 1494d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber max = corr[i]; 1495d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber lag = i; 1496d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1497d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1498d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1499d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /*-----------------------------------------------------------------------* 1500d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * Find fractional pitch * 1501d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *-----------------------------------------------------------------------*/ 1502d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if ((delta_search == 0) && (lag > max_frac_lag)) 1503d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 1504d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1505d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* full search and integer pitch greater than max_frac_lag */ 1506d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* fractional search is not needed, set fractional to zero */ 1507d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1508d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac = 0; 1509d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1510d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else 1511d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 1512d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1513d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* if differential search AND mode MR475 OR MR515 OR MR59 OR MR67 */ 1514d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* then search fractional with 4 bits resolution */ 1515d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1516d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if ((delta_search != 0) && 1517d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber ((mode == MR475) || (mode == MR515) || 1518d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber (mode == MR59) || (mode == MR67))) 1519d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 1520d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1521d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* modify frac or last_frac according to position of last */ 1522d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* integer pitch: either search around integer pitch, */ 1523d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* or only on left or right side */ 1524d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1525d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber tmp_lag = st->T0_prev_subframe; 1526d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (sub(sub(tmp_lag, t0_min, pOverflow), 5, pOverflow) > 0) 1527d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber tmp_lag = add(t0_min, 5, pOverflow); 1528d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (sub(sub(t0_max, tmp_lag, pOverflow), 4, pOverflow) > 0) 1529d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber tmp_lag = sub(t0_max, 4, pOverflow); 1530d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1531d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if ((lag == tmp_lag) || (lag == (tmp_lag - 1))) 1532d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 1533d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1534d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* normal search in fractions around T0 */ 1535d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1536d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber searchFrac(&lag, &frac, last_frac, corr, flag3, pOverflow); 1537d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1538d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1539d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else if (lag == (tmp_lag - 2)) 1540d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 1541d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* limit search around T0 to the right side */ 1542d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac = 0; 1543d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber searchFrac(&lag, &frac, last_frac, corr, flag3, pOverflow); 1544d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1545d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else if (lag == (tmp_lag + 1)) 1546d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 1547d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* limit search around T0 to the left side */ 1548d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber last_frac = 0; 1549d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber searchFrac(&lag, &frac, last_frac, corr, flag3, pOverflow); 1550d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1551d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else 1552d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 1553d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* no fractional search */ 1554d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac = 0; 1555d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1556d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1557d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else 1558d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* test the fractions around T0 */ 1559d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber searchFrac(&lag, &frac, last_frac, corr, flag3, pOverflow); 1560d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1561d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1562d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /*-----------------------------------------------------------------------* 1563d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * encode pitch * 1564d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *-----------------------------------------------------------------------*/ 1565d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1566d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (flag3 != 0) 1567d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 1568d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* flag4 indicates encoding with 4 bit resolution; */ 1569d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* this is needed for mode MR475, MR515 and MR59 */ 1570d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1571d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber flag4 = 0; 1572d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if ((mode == MR475) || (mode == MR515) || 1573d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber (mode == MR59) || (mode == MR67)) 1574d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 1575d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber flag4 = 1; 1576d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1577d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1578d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* encode with 1/3 subsample resolution */ 1579d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1580d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *ana_index = Enc_lag3(lag, frac, st->T0_prev_subframe, 1581d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber t0_min, t0_max, delta_search, flag4, pOverflow); 1582d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* function result */ 1583d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1584d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1585d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else 1586d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 1587d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* encode with 1/6 subsample resolution */ 1588d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1589d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *ana_index = Enc_lag6(lag, frac, t0_min, delta_search, pOverflow); 1590d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* function result */ 1591d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 1592d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1593d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /*-----------------------------------------------------------------------* 1594d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * update state variables * 1595d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *-----------------------------------------------------------------------*/ 1596d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1597d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber st->T0_prev_subframe = lag; 1598d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1599d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /*-----------------------------------------------------------------------* 1600d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * update output variables * 1601d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *-----------------------------------------------------------------------*/ 1602d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1603d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *resu3 = flag3; 1604d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1605d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *pit_frac = frac; 1606d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1607d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber return (lag); 1608d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber} 1609d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 1610