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) */ 295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 exc[], /* (i) Q_exc : pitch excitation */ 305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 Q_exc, /* (i) : exc format */ 315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 gain_pit, /* (i) Q14 : gain of pitch */ 325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 code[], /* (i) Q9 : Fixed codebook excitation */ 335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 gain_code, /* (i) Q0 : gain of code */ 345d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 L_subfr /* (i) : subframe length */ 355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ) 36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 tmp, exp, ener1, exp1, ener2, exp2; 385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 i, L_tmp; 39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef ASM_OPT /* asm optimization branch */ 415d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ener1 = extract_h(Dot_product12_asm(exc, exc, L_subfr, &exp1)); 42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else 435d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ener1 = extract_h(Dot_product12(exc, exc, L_subfr, &exp1)); 44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen exp1 = exp1 - (Q_exc + Q_exc); 465d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp = vo_L_mult(gain_pit, gain_pit); 475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen exp = norm_l(L_tmp); 485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen tmp = extract_h(L_tmp << exp); 495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ener1 = vo_mult(ener1, tmp); 505d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen exp1 = exp1 - exp - 10; /* 10 -> gain_pit Q14 to Q9 */ 51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef ASM_OPT /* asm optimization branch */ 535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ener2 = extract_h(Dot_product12_asm(code, code, L_subfr, &exp2)); 54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else 555d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ener2 = extract_h(Dot_product12(code, code, L_subfr, &exp2)); 56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen exp = norm_s(gain_code); 595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen tmp = gain_code << exp; 605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen tmp = vo_mult(tmp, tmp); 615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ener2 = vo_mult(ener2, tmp); 625d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen exp2 = exp2 - (exp + exp); 63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen i = exp1 - exp2; 65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 665d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (i >= 0) 675d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 685d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ener1 = ener1 >> 1; 695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ener2 = ener2 >> (i + 1); 705d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } else 715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ener1 = ener1 >> (1 - i); 735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ener2 = ener2 >> 1; 745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen tmp = vo_sub(ener1, ener2); 775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ener1 = add1(add1(ener1, ener2), 1); 78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (tmp >= 0) 805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen tmp = div_s(tmp, ener1); 825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } else 835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen tmp = vo_negate(div_s(vo_negate(tmp), ener1)); 855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return (tmp); 88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 93