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