1885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/*********************************************************************** 2885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgCopyright (c) 2006-2011, Skype Limited. All rights reserved. 3885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgRedistribution and use in source and binary forms, with or without 4885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgmodification, are permitted provided that the following conditions 5885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgare met: 6885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org- Redistributions of source code must retain the above copyright notice, 7885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgthis list of conditions and the following disclaimer. 8885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org- Redistributions in binary form must reproduce the above copyright 9885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgnotice, this list of conditions and the following disclaimer in the 10885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgdocumentation and/or other materials provided with the distribution. 11e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org- Neither the name of Internet Society, IETF or IETF Trust, nor the 12885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgnames of specific contributors, may be used to endorse or promote 13885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgproducts derived from this software without specific prior written 14885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgpermission. 15e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 19885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgPOSSIBILITY OF SUCH DAMAGE. 26885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org***********************************************************************/ 27885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 28885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifdef HAVE_CONFIG_H 29885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "config.h" 30885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif 31885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 32885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "main_FLP.h" 33885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 34885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Wrappers. Calls flp / fix code */ 35885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 36885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Convert AR filter coefficients to NLSF parameters */ 37885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_A2NLSF_FLP( 38885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int16 *NLSF_Q15, /* O NLSF vector [ LPC_order ] */ 39885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_float *pAR, /* I LPC coefficients [ LPC_order ] */ 40885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int LPC_order /* I LPC order */ 41885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org) 42885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{ 43885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int i; 44885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int32 a_fix_Q16[ MAX_LPC_ORDER ]; 45885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 46885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for( i = 0; i < LPC_order; i++ ) { 47885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org a_fix_Q16[ i ] = silk_float2int( pAR[ i ] * 65536.0f ); 48885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 49885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 50885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_A2NLSF( NLSF_Q15, a_fix_Q16, LPC_order ); 51885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org} 52885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 53885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Convert LSF parameters to AR prediction filter coefficients */ 54885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_NLSF2A_FLP( 55885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_float *pAR, /* O LPC coefficients [ LPC_order ] */ 56885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int16 *NLSF_Q15, /* I NLSF vector [ LPC_order ] */ 57885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int LPC_order /* I LPC order */ 58885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org) 59885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{ 60885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int i; 61885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int16 a_fix_Q12[ MAX_LPC_ORDER ]; 62885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 63885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_NLSF2A( a_fix_Q12, NLSF_Q15, LPC_order ); 64885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 65885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for( i = 0; i < LPC_order; i++ ) { 66885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org pAR[ i ] = ( silk_float )a_fix_Q12[ i ] * ( 1.0f / 4096.0f ); 67885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 68885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org} 69885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 70885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/******************************************/ 71885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Floating-point NLSF processing wrapper */ 72885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/******************************************/ 73885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_process_NLSFs_FLP( 74885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_encoder_state *psEncC, /* I/O Encoder state */ 75885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_float PredCoef[ 2 ][ MAX_LPC_ORDER ], /* O Prediction coefficients */ 76885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int16 NLSF_Q15[ MAX_LPC_ORDER ], /* I/O Normalized LSFs (quant out) (0 - (2^15-1)) */ 77885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int16 prev_NLSF_Q15[ MAX_LPC_ORDER ] /* I Previous Normalized LSFs (0 - (2^15-1)) */ 78885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org) 79885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{ 80885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int i, j; 81885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int16 PredCoef_Q12[ 2 ][ MAX_LPC_ORDER ]; 82885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 83885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_process_NLSFs( psEncC, PredCoef_Q12, NLSF_Q15, prev_NLSF_Q15); 84885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 85885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for( j = 0; j < 2; j++ ) { 86885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for( i = 0; i < psEncC->predictLPCOrder; i++ ) { 87885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org PredCoef[ j ][ i ] = ( silk_float )PredCoef_Q12[ j ][ i ] * ( 1.0f / 4096.0f ); 88885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 89885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 90885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org} 91885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 92885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/****************************************/ 93885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Floating-point Silk NSQ wrapper */ 94885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/****************************************/ 95885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_NSQ_wrapper_FLP( 96885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ 97885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ 98885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org SideInfoIndices *psIndices, /* I/O Quantization indices */ 99885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_nsq_state *psNSQ, /* I/O Noise Shaping Quantzation state */ 100885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int8 pulses[], /* O Quantized pulse signal */ 101885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_float x[] /* I Prefiltered input signal */ 102885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org) 103885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{ 104885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int i, j; 105885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int32 x_Q3[ MAX_FRAME_LENGTH ]; 106885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int32 Gains_Q16[ MAX_NB_SUBFR ]; 107885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_DWORD_ALIGN opus_int16 PredCoef_Q12[ 2 ][ MAX_LPC_ORDER ]; 108885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ]; 109885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int LTP_scale_Q14; 110885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 111885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org /* Noise shaping parameters */ 112885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ]; 113885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ]; /* Packs two int16 coefficients per int32 value */ 114885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int Lambda_Q10; 115885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int Tilt_Q14[ MAX_NB_SUBFR ]; 116885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ]; 117885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 118885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org /* Convert control struct to fix control struct */ 119885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org /* Noise shape parameters */ 120885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { 121885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for( j = 0; j < psEnc->sCmn.shapingLPCOrder; j++ ) { 122885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org AR2_Q13[ i * MAX_SHAPE_LPC_ORDER + j ] = silk_float2int( psEncCtrl->AR2[ i * MAX_SHAPE_LPC_ORDER + j ] * 8192.0f ); 123885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 124885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 125885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 126885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { 127885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org LF_shp_Q14[ i ] = silk_LSHIFT32( silk_float2int( psEncCtrl->LF_AR_shp[ i ] * 16384.0f ), 16 ) | 128885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org (opus_uint16)silk_float2int( psEncCtrl->LF_MA_shp[ i ] * 16384.0f ); 129885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org Tilt_Q14[ i ] = (opus_int)silk_float2int( psEncCtrl->Tilt[ i ] * 16384.0f ); 130885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org HarmShapeGain_Q14[ i ] = (opus_int)silk_float2int( psEncCtrl->HarmShapeGain[ i ] * 16384.0f ); 131885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 132885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org Lambda_Q10 = ( opus_int )silk_float2int( psEncCtrl->Lambda * 1024.0f ); 133885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 134885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org /* prediction and coding parameters */ 135885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for( i = 0; i < psEnc->sCmn.nb_subfr * LTP_ORDER; i++ ) { 136885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org LTPCoef_Q14[ i ] = (opus_int16)silk_float2int( psEncCtrl->LTPCoef[ i ] * 16384.0f ); 137885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 138885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 139885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for( j = 0; j < 2; j++ ) { 140885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for( i = 0; i < psEnc->sCmn.predictLPCOrder; i++ ) { 141885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org PredCoef_Q12[ j ][ i ] = (opus_int16)silk_float2int( psEncCtrl->PredCoef[ j ][ i ] * 4096.0f ); 142885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 143885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 144885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 145885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { 146885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org Gains_Q16[ i ] = silk_float2int( psEncCtrl->Gains[ i ] * 65536.0f ); 147885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_assert( Gains_Q16[ i ] > 0 ); 148885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 149885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 150885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org if( psIndices->signalType == TYPE_VOICED ) { 151885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org LTP_scale_Q14 = silk_LTPScales_table_Q14[ psIndices->LTP_scaleIndex ]; 152885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } else { 153885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org LTP_scale_Q14 = 0; 154885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 155885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 156885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org /* Convert input to fix */ 157885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for( i = 0; i < psEnc->sCmn.frame_length; i++ ) { 1586b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org x_Q3[ i ] = silk_float2int( 8.0f * x[ i ] ); 159885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 160885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 161885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org /* Call NSQ */ 162885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org if( psEnc->sCmn.nStatesDelayedDecision > 1 || psEnc->sCmn.warping_Q16 > 0 ) { 163885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_NSQ_del_dec( &psEnc->sCmn, psNSQ, psIndices, x_Q3, pulses, PredCoef_Q12[ 0 ], LTPCoef_Q14, 164885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org AR2_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, psEncCtrl->pitchL, Lambda_Q10, LTP_scale_Q14 ); 165885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } else { 166885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_NSQ( &psEnc->sCmn, psNSQ, psIndices, x_Q3, pulses, PredCoef_Q12[ 0 ], LTPCoef_Q14, 167885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org AR2_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, psEncCtrl->pitchL, Lambda_Q10, LTP_scale_Q14 ); 168885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 169885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org} 170885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 171885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/***********************************************/ 172885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Floating-point Silk LTP quantiation wrapper */ 173885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/***********************************************/ 174885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_quant_LTP_gains_FLP( 175885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org silk_float B[ MAX_NB_SUBFR * LTP_ORDER ], /* I/O (Un-)quantized LTP gains */ 176885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int8 cbk_index[ MAX_NB_SUBFR ], /* O Codebook index */ 177885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int8 *periodicity_index, /* O Periodicity index */ 1783c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.com opus_int32 *sum_log_gain_Q7, /* I/O Cumulative max prediction gain */ 179885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const silk_float W[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* I Error weights */ 180885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int mu_Q10, /* I Mu value (R/D tradeoff) */ 181885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int lowComplexity, /* I Flag for low complexity */ 182885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org const opus_int nb_subfr /* I number of subframes */ 183885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org) 184885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{ 185885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int i; 186885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int16 B_Q14[ MAX_NB_SUBFR * LTP_ORDER ]; 187885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int32 W_Q18[ MAX_NB_SUBFR*LTP_ORDER*LTP_ORDER ]; 188885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 189885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for( i = 0; i < nb_subfr * LTP_ORDER; i++ ) { 190885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org B_Q14[ i ] = (opus_int16)silk_float2int( B[ i ] * 16384.0f ); 191885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 192885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for( i = 0; i < nb_subfr * LTP_ORDER * LTP_ORDER; i++ ) { 193885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org W_Q18[ i ] = (opus_int32)silk_float2int( W[ i ] * 262144.0f ); 194885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 195885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 1963c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.com silk_quant_LTP_gains( B_Q14, cbk_index, periodicity_index, sum_log_gain_Q7, W_Q18, mu_Q10, lowComplexity, nb_subfr ); 197885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 198885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for( i = 0; i < nb_subfr * LTP_ORDER; i++ ) { 199885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org B[ i ] = (silk_float)B_Q14[ i ] * ( 1.0f / 16384.0f ); 200885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 201885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org} 202