1e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* 2e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Copyright 2003-2010, VisualOn, Inc. 3e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** 4e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Licensed under the Apache License, Version 2.0 (the "License"); 5e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** you may not use this file except in compliance with the License. 6e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** You may obtain a copy of the License at 7e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** 8e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** http://www.apache.org/licenses/LICENSE-2.0 9e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** 10e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Unless required by applicable law or agreed to in writing, software 11e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** distributed under the License is distributed on an "AS IS" BASIS, 12e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** See the License for the specific language governing permissions and 14e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** limitations under the License. 15e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard */ 16e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 17e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*********************************************************************** 18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* File: voicefac.c * 19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Description: Find the voicing factors (1 = voice to -1 = unvoiced) * 21b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard* * 22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard************************************************************************/ 23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "typedef.h" 25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "basic_op.h" 26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "math_op.h" 27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 28e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 voice_factor( /* (o) Q15 : factor (-1=unvoiced to 1=voiced) */ 29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 exc[], /* (i) Q_exc : pitch excitation */ 30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 Q_exc, /* (i) : exc format */ 31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 gain_pit, /* (i) Q14 : gain of pitch */ 32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 code[], /* (i) Q9 : Fixed codebook excitation */ 33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 gain_code, /* (i) Q0 : gain of code */ 34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 L_subfr /* (i) : subframe length */ 35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ) 36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 tmp, exp, ener1, exp1, ener2, exp2; 38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 i, L_tmp; 39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef ASM_OPT /* asm optimization branch */ 41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ener1 = extract_h(Dot_product12_asm(exc, exc, L_subfr, &exp1)); 42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else 43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ener1 = extract_h(Dot_product12(exc, exc, L_subfr, &exp1)); 44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard exp1 = exp1 - (Q_exc + Q_exc); 46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp = vo_L_mult(gain_pit, gain_pit); 47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard exp = norm_l(L_tmp); 48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard tmp = extract_h(L_tmp << exp); 49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ener1 = vo_mult(ener1, tmp); 50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard exp1 = exp1 - exp - 10; /* 10 -> gain_pit Q14 to Q9 */ 51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef ASM_OPT /* asm optimization branch */ 53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ener2 = extract_h(Dot_product12_asm(code, code, L_subfr, &exp2)); 54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else 55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ener2 = extract_h(Dot_product12(code, code, L_subfr, &exp2)); 56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard exp = norm_s(gain_code); 59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard tmp = gain_code << exp; 60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard tmp = vo_mult(tmp, tmp); 61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ener2 = vo_mult(ener2, tmp); 62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard exp2 = exp2 - (exp + exp); 63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard i = exp1 - exp2; 65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (i >= 0) 67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ener1 = ener1 >> 1; 69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ener2 = ener2 >> (i + 1); 70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } else 71e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ener1 = ener1 >> (1 - i); 73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ener2 = ener2 >> 1; 74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard tmp = vo_sub(ener1, ener2); 77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ener1 = add1(add1(ener1, ener2), 1); 78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (tmp >= 0) 80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard tmp = div_s(tmp, ener1); 82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } else 83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard tmp = vo_negate(div_s(vo_negate(tmp), ener1)); 85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (tmp); 88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 93