blob: 98ee87e0b946b509038aa99a7316b032c675049c [file] [log] [blame]
/*
** 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 <y1[],y1[]> */
#ifdef ASM_OPT /* asm optimization branch */
/* Compute scalar product <xn[],y1[]> */
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 <xn[],y1[]> */
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);
}