/* ** Copyright 2003-2010, VisualOn, Inc. ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. ** You may obtain a copy of the License at ** ** http://www.apache.org/licenses/LICENSE-2.0 ** ** Unless required by applicable law or agreed to in writing, software ** distributed under the License is distributed on an "AS IS" BASIS, ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ** See the License for the specific language governing permissions and ** limitations under the License. */ /*********************************************************************** * File: g_pitch.c * * * * Description:Compute the gain of pitch. Result in Q12 * * if(gain < 0) gain = 0 * * if(gain > 1.2) gain = 1.2 * ************************************************************************/ #include "typedef.h" #include "basic_op.h" #include "math_op.h" Word16 G_pitch( /* (o) Q14 : Gain of pitch lag saturated to 1.2 */ Word16 xn[], /* (i) : Pitch target. */ Word16 y1[], /* (i) : filtered adaptive codebook. */ Word16 g_coeff[], /* : Correlations need for gain quantization. */ Word16 L_subfr /* : Length of subframe. */ ) { Word32 i; Word16 xy, yy, exp_xy, exp_yy, gain; /* Compute scalar product */ #ifdef ASM_OPT /* asm optimization branch */ /* Compute scalar product */ xy = extract_h(Dot_product12_asm(xn, y1, L_subfr, &exp_xy)); yy = extract_h(Dot_product12_asm(y1, y1, L_subfr, &exp_yy)); #else /* Compute scalar product */ xy = extract_h(Dot_product12(xn, y1, L_subfr, &exp_xy)); yy = extract_h(Dot_product12(y1, y1, L_subfr, &exp_yy)); #endif g_coeff[0] = yy; g_coeff[1] = exp_yy; g_coeff[2] = xy; g_coeff[3] = exp_xy; /* If (xy < 0) gain = 0 */ if (xy < 0) return ((Word16) 0); /* compute gain = xy/yy */ xy >>= 1; /* Be sure xy < yy */ gain = div_s(xy, yy); i = exp_xy; i -= exp_yy; gain = shl(gain, i); /* if (gain > 1.2) gain = 1.2 in Q14 */ if(gain > 19661) { gain = 19661; } return (gain); }