1219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard/*
2219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** Copyright 2003-2010, VisualOn, Inc.
3219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard **
4219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** Licensed under the Apache License, Version 2.0 (the "License");
5219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** you may not use this file except in compliance with the License.
6219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** You may obtain a copy of the License at
7219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard **
8219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard **     http://www.apache.org/licenses/LICENSE-2.0
9219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard **
10219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** Unless required by applicable law or agreed to in writing, software
11219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** distributed under the License is distributed on an "AS IS" BASIS,
12219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** See the License for the specific language governing permissions and
14219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** limitations under the License.
15219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard */
16219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
17219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard/***********************************************************************
18219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*      File: g_pitch.c                                                 *
19219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*                                                                      *
20219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*	   Description:Compute the gain of pitch. Result in Q12        *
21219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*	               if(gain < 0) gain = 0                           *
22219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*				   if(gain > 1.2) gain = 1.2           *
23219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard************************************************************************/
24219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
25219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard#include "typedef.h"
26219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard#include "basic_op.h"
27219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard#include "math_op.h"
28219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
29219e2627f1e062c10645664b0d2470d4dfaf5083Mans RullgardWord16 G_pitch(                            /* (o) Q14 : Gain of pitch lag saturated to 1.2   */
30219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 xn[],                          /* (i)     : Pitch target.                        */
31219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 y1[],                          /* (i)     : filtered adaptive codebook.          */
32219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 g_coeff[],                     /* : Correlations need for gain quantization.     */
33219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 L_subfr                        /* : Length of subframe.                          */
34219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	      )
35219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard{
36219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	Word32 i;
37219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	Word16 xy, yy, exp_xy, exp_yy, gain;
38219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	/* Compute scalar product <y1[],y1[]> */
39219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard#ifdef ASM_OPT                  /* asm optimization branch */
40219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	/* Compute scalar product <xn[],y1[]> */
41219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	xy = extract_h(Dot_product12_asm(xn, y1, L_subfr, &exp_xy));
42219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	yy = extract_h(Dot_product12_asm(y1, y1, L_subfr, &exp_yy));
43219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
44219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard#else
45219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	/* Compute scalar product <xn[],y1[]> */
46219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	xy = extract_h(Dot_product12(xn, y1, L_subfr, &exp_xy));
47219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	yy = extract_h(Dot_product12(y1, y1, L_subfr, &exp_yy));
48219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
49219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard#endif
50219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
51219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	g_coeff[0] = yy;
52219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	g_coeff[1] = exp_yy;
53219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	g_coeff[2] = xy;
54219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	g_coeff[3] = exp_xy;
55219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
56219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	/* If (xy < 0) gain = 0 */
57219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	if (xy < 0)
58219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		return ((Word16) 0);
59219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
60219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	/* compute gain = xy/yy */
61219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
62219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	xy >>= 1;                       /* Be sure xy < yy */
63219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	gain = div_s(xy, yy);
64219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
65219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	i = exp_xy;
66219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	i -= exp_yy;
67219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
68219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	gain = shl(gain, i);
69219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
70219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	/* if (gain > 1.2) gain = 1.2  in Q14 */
71219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	if(gain > 19661)
72219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	{
73219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		gain = 19661;
74219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	}
75219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	return (gain);
76219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard}
77219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
78219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
79219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
80