| /* |
| ** 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); |
| } |
| |
| |
| |