From fcf95bac9330e8e6db1184496ae33007a7c7a9cf Mon Sep 17 00:00:00 2001 From: Koen Vos <koen.vos@skype.net> Date: Wed, 27 Apr 2011 00:49:40 -0400 Subject: [PATCH] Squashed commit of the following: commit c44b37355295df2963daa724649ff1876b690488 Author: Jean-Marc Valin <jean-marc.valin@usherbrooke.ca> Date: Wed Apr 27 00:33:12 2011 -0400 decoder size fix commit 78f864e9ddacd94d03d717d79a6e606712e25edd Author: Jean-Marc Valin <jean-marc.valin@usherbrooke.ca> Date: Tue Apr 26 23:26:14 2011 -0400 Makefile fix commit a0e884e463af88bcaa2f410ea8cc85e5bebd2c3b Author: Jean-Marc Valin <jean-marc.valin@usherbrooke.ca> Date: Tue Apr 26 22:53:27 2011 -0400 Making some progress commit 9e30457f2199bba7b5e37bb577ff75dc85ba9306 Author: Koen Vos <koen.vos@skype.net> Date: Tue Apr 26 22:29:42 2011 -0400 SILK update with stereo support --- Makefile.am | 26 +- autogen.sh | 0 interface/SKP_Silk_SDK_API.h | 11 - interface/SKP_Silk_control.h | 11 + interface/SKP_Silk_errors.h | 3 + src_FIX/SKP_Silk_LTP_scale_ctrl_FIX.c | 43 +- src_FIX/SKP_Silk_encode_frame_FIX.c | 75 +- src_FIX/SKP_Silk_main_FIX.h | 21 +- src_FIX/SKP_Silk_noise_shape_analysis_FIX.c | 16 +- src_FIX/SKP_Silk_process_gains_FIX.c | 16 +- src_FIX/SKP_Silk_structs_FIX.h | 6 - src_FIX/src_FIX.vcxproj | 2 - src_FIX/src_FIX.vcxproj.filters | 6 - src_FLP/SKP_Silk_LTP_scale_ctrl_FLP.c | 51 +- src_FLP/SKP_Silk_control_codec_FLP.c | 317 ------ src_FLP/SKP_Silk_encode_frame_FLP.c | 71 +- src_FLP/SKP_Silk_init_encoder_FLP.c | 52 - src_FLP/SKP_Silk_main_FLP.h | 15 +- src_FLP/SKP_Silk_noise_shape_analysis_FLP.c | 16 +- src_FLP/SKP_Silk_process_gains_FLP.c | 2 +- src_FLP/SKP_Silk_structs_FLP.h | 7 +- src_FLP/src_FLP.vcxproj | 2 - src_FLP/src_FLP.vcxproj.filters | 6 - src_SigProc_FIX/SKP_Silk_SigProc_FIX.h | 49 +- src_SigProc_FIX/SKP_Silk_allpass_int.c | 69 -- src_SigProc_FIX/SKP_Silk_autocorr.c | 9 - src_SigProc_FIX/SKP_Silk_debug.c | 4 +- src_SigProc_FIX/SKP_Silk_inner_prod_aligned.c | 40 +- src_SigProc_FIX/SKP_Silk_lowpass_int.c | 61 -- .../SKP_Silk_resampler_private_up2_HQ.c | 8 - .../SKP_Silk_resampler_private_up4.c | 10 +- src_SigProc_FIX/SKP_Silk_resampler_rom.h | 12 - src_SigProc_FIX/SKP_Silk_resampler_structs.h | 2 +- src_SigProc_FIX/SKP_Silk_scale_vector.c | 65 -- src_SigProc_FIX/SKP_Silk_schur64.c | 11 +- src_SigProc_FIX/SKP_Silk_sum_sqr_shift.c | 35 +- src_SigProc_FLP/SKP_Silk_SigProc_FLP.h | 7 - src_SigProc_FLP/SKP_Silk_sort_FLP.c | 68 -- src_common/SKP_Silk_LBRR_embed.c | 59 -- src_common/SKP_Silk_LP_variable_cutoff.c | 5 +- src_common/SKP_Silk_NLSF_MSVQ_decode.c | 106 -- src_common/SKP_Silk_NLSF_MSVQ_encode.c | 238 ----- src_common/SKP_Silk_NLSF_VQ_rate_distortion.c | 62 -- src_common/SKP_Silk_NLSF_VQ_sum_error.c | 107 -- src_common/SKP_Silk_PLC.c | 24 +- src_common/SKP_Silk_PLC.h | 2 +- src_common/SKP_Silk_check_control_input.c | 89 ++ .../SKP_Silk_control_SNR.c | 71 +- src_common/SKP_Silk_control_audio_bandwidth.c | 47 +- .../SKP_Silk_control_codec.c | 247 +++-- src_common/SKP_Silk_dec_API.c | 266 +++-- src_common/SKP_Silk_decode_frame.c | 77 +- src_common/SKP_Silk_decode_indices.c | 11 +- src_common/SKP_Silk_decoder_set_fs.c | 6 - src_common/SKP_Silk_define.h | 45 +- src_common/SKP_Silk_enc_API.c | 356 ++++--- src_common/SKP_Silk_encode_indices.c | 5 +- .../SKP_Silk_init_encoder.c | 13 +- src_common/SKP_Silk_main.h | 41 +- src_common/SKP_Silk_process_NLSFs.c | 6 +- src_common/SKP_Silk_setup.h | 143 --- src_common/SKP_Silk_stereo_LR_to_MS.c | 94 ++ src_common/SKP_Silk_stereo_MS_to_LR.c | 72 ++ src_common/SKP_Silk_structs.h | 16 +- src_common/SKP_Silk_tables.h | 29 +- src_common/SKP_Silk_tables_NLSF_CB.h | 63 -- src_common/SKP_Silk_tables_NLSF_CB0_10.c | 926 ----------------- src_common/SKP_Silk_tables_NLSF_CB0_16.c | 942 ------------------ src_common/SKP_Silk_tables_NLSF_CB1_10.c | 614 ------------ src_common/SKP_Silk_tables_NLSF_CB1_16.c | 678 ------------- src_common/SKP_Silk_tables_other.c | 30 +- src_common/SKP_Silk_tuning_parameters.h | 2 +- src_common/src_common.vcxproj | 10 +- src_common/src_common.vcxproj.filters | 26 +- test/Decoder.c | 453 --------- test/Encoder.c | 355 ------- test/signalCompare.c | 373 ------- 77 files changed, 1178 insertions(+), 6756 deletions(-) mode change 100755 => 100644 autogen.sh delete mode 100644 src_FLP/SKP_Silk_control_codec_FLP.c delete mode 100644 src_FLP/SKP_Silk_init_encoder_FLP.c delete mode 100644 src_SigProc_FIX/SKP_Silk_allpass_int.c delete mode 100644 src_SigProc_FIX/SKP_Silk_lowpass_int.c delete mode 100644 src_common/SKP_Silk_LBRR_embed.c delete mode 100644 src_common/SKP_Silk_NLSF_MSVQ_decode.c delete mode 100644 src_common/SKP_Silk_NLSF_MSVQ_encode.c delete mode 100644 src_common/SKP_Silk_NLSF_VQ_rate_distortion.c delete mode 100644 src_common/SKP_Silk_NLSF_VQ_sum_error.c create mode 100644 src_common/SKP_Silk_check_control_input.c rename src_SigProc_FIX/SKP_Silk_lowpass_short.c => src_common/SKP_Silk_control_SNR.c (51%) rename src_FIX/SKP_Silk_control_codec_FIX.c => src_common/SKP_Silk_control_codec.c (55%) rename src_FIX/SKP_Silk_init_encoder_FIX.c => src_common/SKP_Silk_init_encoder.c (85%) delete mode 100644 src_common/SKP_Silk_setup.h create mode 100644 src_common/SKP_Silk_stereo_LR_to_MS.c create mode 100644 src_common/SKP_Silk_stereo_MS_to_LR.c delete mode 100644 src_common/SKP_Silk_tables_NLSF_CB.h delete mode 100644 src_common/SKP_Silk_tables_NLSF_CB0_10.c delete mode 100644 src_common/SKP_Silk_tables_NLSF_CB0_16.c delete mode 100644 src_common/SKP_Silk_tables_NLSF_CB1_10.c delete mode 100644 src_common/SKP_Silk_tables_NLSF_CB1_16.c delete mode 100644 test/Decoder.c delete mode 100644 test/Encoder.c delete mode 100644 test/signalCompare.c diff --git a/Makefile.am b/Makefile.am index cd8082e4e..0ea06d7d4 100644 --- a/Makefile.am +++ b/Makefile.am @@ -10,9 +10,6 @@ src_FLP/src_FLP.vcxproj \ src_FLP/src_FLP.vcxproj.filters \ src_common/src_common.vcxproj \ src_common/src_common.vcxproj.filters \ -test/Encoder.c \ -test/Decoder.c \ -test/signalCompare.c \ src_SigProc_FLP/src_SigProc_FLP.vcxproj \ src_SigProc_FLP/src_SigProc_FLP.vcxproj.filters \ src_SigProc_FIX/src_SigProc_FIX.vcxproj \ @@ -39,7 +36,6 @@ src_common/SKP_Silk_encode_indices.c \ src_common/SKP_Silk_encode_pulses.c \ src_common/SKP_Silk_gain_quant.c \ src_common/SKP_Silk_interpolate.c \ -src_common/SKP_Silk_LBRR_embed.c \ src_common/SKP_Silk_LP_variable_cutoff.c \ src_common/SKP_Silk_NLSF2A_stable.c \ src_common/SKP_Silk_NLSF_decode.c \ @@ -64,6 +60,12 @@ src_common/SKP_Silk_NLSF_VQ.c \ src_common/SKP_Silk_NLSF_unpack.c \ src_common/SKP_Silk_NLSF_del_dec_quant.c \ src_common/SKP_Silk_process_NLSFs.c \ +src_common/SKP_Silk_stereo_LR_to_MS.c \ +src_common/SKP_Silk_stereo_MS_to_LR.c \ +src_common/SKP_Silk_control_SNR.c \ +src_common/SKP_Silk_init_encoder.c \ +src_common/SKP_Silk_control_codec.c \ +src_common/SKP_Silk_check_control_input.c \ src_SigProc_FIX/SKP_Silk_A2NLSF.c \ src_SigProc_FIX/SKP_Silk_ana_filt_bank_1.c \ src_SigProc_FIX/SKP_Silk_apply_sine_window.c \ @@ -149,14 +151,12 @@ src_FIX/SKP_Silk_warped_autocorrelation_FIX.c else libSKP_SILK_SDK_la_SOURCES += \ src_FLP/SKP_Silk_apply_sine_window_FLP.c \ -src_FLP/SKP_Silk_control_codec_FLP.c \ src_FLP/SKP_Silk_corrMatrix_FLP.c \ src_FLP/SKP_Silk_encode_frame_FLP.c \ src_FLP/SKP_Silk_find_LPC_FLP.c \ src_FLP/SKP_Silk_find_LTP_FLP.c \ src_FLP/SKP_Silk_find_pitch_lags_FLP.c \ src_FLP/SKP_Silk_find_pred_coefs_FLP.c \ -src_FLP/SKP_Silk_init_encoder_FLP.c \ src_FLP/SKP_Silk_LPC_analysis_filter_FLP.c \ src_FLP/SKP_Silk_LTP_analysis_filter_FLP.c \ src_FLP/SKP_Silk_LTP_scale_ctrl_FLP.c \ @@ -185,7 +185,6 @@ src_common/SKP_Silk_PLC.h \ src_common/SKP_Silk_structs.h \ src_common/SKP_Silk_tables.h \ src_common/SKP_Silk_tuning_parameters.h \ -src_common/SKP_Silk_setup.h \ src_FIX/SKP_Silk_main_FIX.h \ src_FIX/SKP_Silk_structs_FIX.h \ src_FLP/SKP_Silk_assembler_FLP.h \ @@ -202,17 +201,4 @@ src_SigProc_FIX/SKP_Silk_resampler_structs.h \ src_SigProc_FIX/SKP_Silk_SigProc_FIX.h \ src_SigProc_FLP/SKP_Silk_SigProc_FLP.h -bin_PROGRAMS = Encoder Decoder signalCompare -Encoder_SOURCES = test/Encoder.c $(top_builddir)/interface/SKP_Silk_SDK_API.h -Encoder_LDADD = $(lib_LTLIBRARIES) -Encoder_LDFLAGS = $(LIBS) - -Decoder_SOURCES = test/Decoder.c $(top_builddir)/interface/SKP_Silk_SDK_API.h -Decoder_LDADD = $(lib_LTLIBRARIES) -Decoder_LDFLAGS = $(LIBS) - -signalCompare_SOURCES = test/signalCompare.c $(top_builddir)/interface/SKP_Silk_SDK_API.h -signalCompare_LDADD = $(lib_LTLIBRARIES) -signalCompare_LDFLAGS = $(LIBS) - LIBS = ../celt/libcelt/libcelt0.la diff --git a/autogen.sh b/autogen.sh old mode 100755 new mode 100644 diff --git a/interface/SKP_Silk_SDK_API.h b/interface/SKP_Silk_SDK_API.h index 166700b84..fcbfc7fa1 100644 --- a/interface/SKP_Silk_SDK_API.h +++ b/interface/SKP_Silk_SDK_API.h @@ -108,16 +108,6 @@ SKP_int SKP_Silk_SDK_InitDecoder( /* O: Returns error co void *decState /* I/O: State */ ); -/************************************************************************************************/ -/* Prefill LPC synthesis buffer, HP filter and upsampler. Input must be exactly 10 ms of audio. */ -/************************************************************************************************/ -SKP_int SKP_Silk_SDK_Decoder_prefill_buffers( /* O: Returns error code */ - void* decState, /* I/O: State */ - SKP_SILK_SDK_DecControlStruct* decControl, /* I/O: Control Structure */ - const SKP_int16 *samplesIn, /* I: Speech sample input vector (10 ms) */ - SKP_int nSamplesIn /* I: Number of samples in input vector */ -); - /******************/ /* Decode a frame */ /******************/ @@ -127,7 +117,6 @@ SKP_int SKP_Silk_SDK_Decode( /* O: Returns error co SKP_int lostFlag, /* I: 0: no loss, 1 loss, 2 decode fec */ SKP_int newPacketFlag, /* I: Indicates first decoder call for this packet */ ec_dec *psRangeDec, /* I/O Compressor data structure */ - const SKP_int nBytesIn, /* I: Number of input bytes */ SKP_int16 *samplesOut, /* O: Decoded output speech vector */ SKP_int32 *nSamplesOut /* O: Number of samples decoded */ ); diff --git a/interface/SKP_Silk_control.h b/interface/SKP_Silk_control.h index 0e283fb5a..6d81af07e 100644 --- a/interface/SKP_Silk_control.h +++ b/interface/SKP_Silk_control.h @@ -35,10 +35,18 @@ extern "C" { #endif +/* Decoder API flags */ +#define FLAG_DECODE_NORMAL 0 +#define FLAG_PACKET_LOST 1 +#define FLAG_DECODE_LBRR 2 + /***********************************************/ /* Structure for controlling encoder operation */ /***********************************************/ typedef struct { + /* I: Number of channels; 1/2 */ + SKP_int32 nChannels; + /* I: Input signal sampling rate in Hertz; 8000/12000/16000/24000/32000/44100/48000 */ SKP_int32 API_sampleRate; @@ -77,6 +85,9 @@ typedef struct { /* Structure for controlling decoder operation and reading decoder status */ /**************************************************************************/ typedef struct { + /* I: Number of channels; 1/2 */ + SKP_int32 nChannels; + /* I: Output signal sampling rate in Hertz; 8000/12000/16000/24000/32000/44100/48000 */ SKP_int32 API_sampleRate; diff --git a/interface/SKP_Silk_errors.h b/interface/SKP_Silk_errors.h index c751d9beb..b7f194fa4 100644 --- a/interface/SKP_Silk_errors.h +++ b/interface/SKP_Silk_errors.h @@ -72,6 +72,9 @@ extern "C" /* Internal encoder error */ #define SKP_SILK_ENC_INTERNAL_ERROR -110 +/* Internal encoder error */ +#define SKP_SILK_ENC_INVALID_NUMBER_OF_CHANNELS_ERROR -111 + /**************************/ /* Decoder error messages */ /**************************/ diff --git a/src_FIX/SKP_Silk_LTP_scale_ctrl_FIX.c b/src_FIX/SKP_Silk_LTP_scale_ctrl_FIX.c index 090e003c0..08516050d 100644 --- a/src_FIX/SKP_Silk_LTP_scale_ctrl_FIX.c +++ b/src_FIX/SKP_Silk_LTP_scale_ctrl_FIX.c @@ -27,53 +27,26 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "SKP_Silk_main_FIX.h" -#define NB_THRESHOLDS 11 - -/* Table containing trained thresholds for LTP scaling */ -static const SKP_int16 LTPScaleThresholds_Q15[ NB_THRESHOLDS ] = -{ - 31129, 26214, 16384, 13107, 9830, 6554, - 4915, 3276, 2621, 2458, 0 -}; - void SKP_Silk_LTP_scale_ctrl_FIX( SKP_Silk_encoder_state_FIX *psEnc, /* I/O encoder state FIX */ SKP_Silk_encoder_control_FIX *psEncCtrl /* I/O encoder control FIX */ ) { SKP_int round_loss; - SKP_int g_out_Q5, g_limit_Q15, thrld1_Q15, thrld2_Q15; /* 1st order high-pass filter */ - psEnc->HPLTPredCodGain_Q7 = SKP_max_int( psEncCtrl->LTPredCodGain_Q7 - psEnc->prevLTPredCodGain_Q7, 0 ) - + SKP_RSHIFT_ROUND( psEnc->HPLTPredCodGain_Q7, 1 ); - + psEnc->HPLTPredCodGain_Q7 = SKP_max_int( psEncCtrl->LTPredCodGain_Q7 - SKP_RSHIFT( psEnc->prevLTPredCodGain_Q7, 1 ), 0 ) + + SKP_RSHIFT( psEnc->HPLTPredCodGain_Q7, 1 ); psEnc->prevLTPredCodGain_Q7 = psEncCtrl->LTPredCodGain_Q7; - /* combine input and filtered input */ - g_out_Q5 = SKP_RSHIFT_ROUND( SKP_RSHIFT( psEncCtrl->LTPredCodGain_Q7, 1 ) + SKP_RSHIFT( psEnc->HPLTPredCodGain_Q7, 1 ), 3 ); - g_limit_Q15 = SKP_Silk_sigm_Q15( g_out_Q5 - ( 3 << 5 ) ); - - /* Default is minimum scaling */ - psEnc->sCmn.indices.LTP_scaleIndex = 0; - - /* Round the loss measure to whole pct */ - round_loss = ( SKP_int )psEnc->sCmn.PacketLoss_perc; - /* Only scale if first frame in packet */ if( psEnc->sCmn.nFramesAnalyzed == 0 ) { - - round_loss += psEnc->sCmn.nFramesPerPacket - 1; - thrld1_Q15 = LTPScaleThresholds_Q15[ SKP_min_int( round_loss, NB_THRESHOLDS - 1 ) ]; - thrld2_Q15 = LTPScaleThresholds_Q15[ SKP_min_int( round_loss + 1, NB_THRESHOLDS - 1 ) ]; - - if( g_limit_Q15 > thrld1_Q15 ) { - /* Maximum scaling */ - psEnc->sCmn.indices.LTP_scaleIndex = 2; - } else if( g_limit_Q15 > thrld2_Q15 ) { - /* Medium scaling */ - psEnc->sCmn.indices.LTP_scaleIndex = 1; - } + round_loss = psEnc->sCmn.PacketLoss_perc + psEnc->sCmn.nFramesPerPacket - 1; + psEnc->sCmn.indices.LTP_scaleIndex = (SKP_int8)SKP_LIMIT( + SKP_SMULWB( SKP_SMULBB( round_loss, psEnc->HPLTPredCodGain_Q7 ), SKP_FIX_CONST( 0.1, 9 ) ), 0, 2 ); + } else { + /* Default is minimum scaling */ + psEnc->sCmn.indices.LTP_scaleIndex = 0; } psEncCtrl->LTP_scale_Q14 = SKP_Silk_LTPScales_table_Q14[ psEnc->sCmn.indices.LTP_scaleIndex ]; } diff --git a/src_FIX/SKP_Silk_encode_frame_FIX.c b/src_FIX/SKP_Silk_encode_frame_FIX.c index 057d3b406..e9003fcf0 100644 --- a/src_FIX/SKP_Silk_encode_frame_FIX.c +++ b/src_FIX/SKP_Silk_encode_frame_FIX.c @@ -38,8 +38,7 @@ SKP_int SKP_Silk_encode_frame_FIX( ) { SKP_Silk_encoder_control_FIX sEncCtrl; - SKP_int i, nBits, ret = 0; - SKP_uint8 flags; + SKP_int ret = 0; SKP_int16 *x_frame, *res_pitch_frame; SKP_int16 xfw[ MAX_FRAME_LENGTH ]; SKP_int16 res_pitch[ 2 * MAX_FRAME_LENGTH + LA_PITCH_MAX ]; @@ -65,14 +64,16 @@ TOC(VAD) /**************************************************/ /* Convert speech activity into VAD and DTX flags */ /**************************************************/ + if( psEnc->sCmn.nFramesAnalyzed == 0 ) { + psEnc->sCmn.inDTX = psEnc->sCmn.useDTX; + } if( psEnc->sCmn.speech_activity_Q8 < SKP_FIX_CONST( SPEECH_ACTIVITY_DTX_THRES, 8 ) ) { psEnc->sCmn.indices.signalType = TYPE_NO_VOICE_ACTIVITY; psEnc->sCmn.noSpeechCounter++; - if( psEnc->sCmn.noSpeechCounter > NO_SPEECH_FRAMES_BEFORE_DTX ) { - psEnc->sCmn.inDTX = 1; - } - if( psEnc->sCmn.noSpeechCounter > MAX_CONSECUTIVE_DTX ) { - psEnc->sCmn.noSpeechCounter = 0; + if( psEnc->sCmn.noSpeechCounter < NB_SPEECH_FRAMES_BEFORE_DTX ) { + psEnc->sCmn.inDTX = 0; + } else if( psEnc->sCmn.noSpeechCounter > MAX_CONSECUTIVE_DTX + NB_SPEECH_FRAMES_BEFORE_DTX ) { + psEnc->sCmn.noSpeechCounter = NB_SPEECH_FRAMES_BEFORE_DTX; psEnc->sCmn.inDTX = 0; } psEnc->sCmn.VAD_flags[ psEnc->sCmn.nFramesAnalyzed ] = 0; @@ -83,24 +84,6 @@ TOC(VAD) psEnc->sCmn.VAD_flags[ psEnc->sCmn.nFramesAnalyzed ] = 1; } - if( psEnc->sCmn.nFramesAnalyzed == 0 && !psEnc->sCmn.prefillFlag && !( psEnc->sCmn.useDTX && psEnc->sCmn.inDTX ) ) { - /* Create space at start of payload for VAD and FEC flags */ - SKP_uint8 iCDF[ 2 ] = { 0, 0 }; - iCDF[ 0 ] = 256 - SKP_RSHIFT( 256, psEnc->sCmn.nFramesPerPacket + 1 ); - ec_enc_icdf( psRangeEnc, 0, iCDF, 8 ); - - /* Encode any LBRR data from previous packet */ - SKP_Silk_LBRR_embed( &psEnc->sCmn, psRangeEnc ); - - /* Reduce coding SNR depending on how many bits used by LBRR */ - nBits = ec_tell( psRangeEnc ); - psEnc->inBandFEC_SNR_comp_Q7 = SKP_DIV32_16( SKP_SMULBB( SKP_FIX_CONST( 6.0f, 7 ), nBits ), - SKP_SMULBB( psEnc->sCmn.nFramesPerPacket, psEnc->sCmn.frame_length ) ); - - /* Reset LBRR flags */ - SKP_memset( psEnc->sCmn.LBRR_flags, 0, sizeof( psEnc->sCmn.LBRR_flags ) ); - } - /*******************************************/ /* High-pass filtering of the input signal */ /*******************************************/ @@ -108,10 +91,8 @@ TIC(HP_IN) SKP_Silk_HP_variable_cutoff( &psEnc->sCmn, x_frame + LA_SHAPE_MS * psEnc->sCmn.fs_kHz, psEnc->sCmn.inputBuf, psEnc->sCmn.frame_length ); TOC(HP_IN) -#if SWITCH_TRANSITION_FILTERING /* Ensure smooth bandwidth transitions */ SKP_Silk_LP_variable_cutoff( &psEnc->sCmn.sLP, x_frame + LA_SHAPE_MS * psEnc->sCmn.fs_kHz, psEnc->sCmn.frame_length ); -#endif /*****************************************/ /* Find pitch lags, initial LPC analysis */ @@ -179,7 +160,7 @@ TOC(NSQ) psEnc->sCmn.prevSignalType = psEnc->sCmn.indices.signalType; /* Exit without entropy coding */ - if( psEnc->sCmn.prefillFlag || ( psEnc->sCmn.useDTX && psEnc->sCmn.inDTX ) ) { + if( psEnc->sCmn.prefillFlag ) { /* No payload */ *pnBytesOut = 0; return ret; @@ -200,37 +181,16 @@ TIC(ENCODE_PULSES) psEnc->sCmn.pulses, psEnc->sCmn.frame_length ); TOC(ENCODE_PULSES) - /****************************************/ - /* Simulate network buffer delay caused */ - /* by exceeding TargetRate */ - /****************************************/ - nBits = ec_tell( psRangeEnc ); - psEnc->BufferedInChannel_ms += SKP_DIV32( SKP_SMULBB( 1000, nBits - psEnc->sCmn.prev_nBits ), psEnc->sCmn.TargetRate_bps ); - psEnc->BufferedInChannel_ms -= psEnc->sCmn.PacketSize_ms; - psEnc->BufferedInChannel_ms = SKP_LIMIT_int( psEnc->BufferedInChannel_ms, 0, 100 ); - psEnc->sCmn.prev_nBits = nBits; - psEnc->sCmn.first_frame_after_reset = 0; - /****************************************/ /* Finalize payload */ /****************************************/ + psEnc->sCmn.first_frame_after_reset = 0; if( ++psEnc->sCmn.nFramesAnalyzed >= psEnc->sCmn.nFramesPerPacket ) { - /* Insert VAD flags and FEC flag at beginning of bitstream */ - flags = 0; - for( i = 0; i < psEnc->sCmn.nFramesPerPacket; i++ ) { - flags |= psEnc->sCmn.VAD_flags[i]; - flags = SKP_LSHIFT( flags, 1 ); - } - flags |= psEnc->sCmn.LBRR_flag; - ec_enc_patch_initial_bits( psRangeEnc, flags, psEnc->sCmn.nFramesPerPacket + 1 ); - /* Payload size */ - nBits = ec_tell( psRangeEnc ); - *pnBytesOut = SKP_RSHIFT( nBits + 7, 3 ); + *pnBytesOut = SKP_RSHIFT( ec_tell( psRangeEnc ) + 7, 3 ); /* Reset the number of frames in payload buffer */ psEnc->sCmn.nFramesAnalyzed = 0; - psEnc->sCmn.prev_nBits = 0; } else { /* No payload this time */ *pnBytesOut = 0; @@ -241,9 +201,9 @@ TOC(ENCODE_FRAME) { SKP_float tmp[ MAX_NB_SUBFR * LTP_ORDER ]; int i; - DEBUG_STORE_DATA( xf.dat, x_frame + LA_SHAPE_MS * psEnc->sCmn.fs_kHz, psEnc->sCmn.frame_length * sizeof( SKP_int16 ) ); + DEBUG_STORE_DATA( xf.dat, x_frame + LA_SHAPE_MS * psEnc->sCmn.fs_kHz, psEnc->sCmn.frame_length * sizeof( SKP_int16 ) ); DEBUG_STORE_DATA( xfw.dat, xfw, psEnc->sCmn.frame_length * sizeof( SKP_int16 ) ); - DEBUG_STORE_DATA( pitchL.dat, sEncCtrl.pitchL, psEnc->sCmn.nb_subfr * sizeof( SKP_int ) ); + DEBUG_STORE_DATA( pitchL.dat, sEncCtrl.pitchL, psEnc->sCmn.nb_subfr * sizeof( SKP_int ) ); for( i = 0; i < psEnc->sCmn.nb_subfr * LTP_ORDER; i++ ) { tmp[ i ] = (SKP_float)sEncCtrl.LTPCoef_Q14[ i ] / 16384.0f; } @@ -263,17 +223,16 @@ TOC(ENCODE_FRAME) tmp[ i ] = (SKP_float)sEncCtrl.Gains_Q16[ i ] / 65536.0f; } DEBUG_STORE_DATA( gains.dat, tmp, psEnc->sCmn.nb_subfr * sizeof( SKP_float ) ); - DEBUG_STORE_DATA( gains_indices.dat, &psEnc->sCmn.indices.GainsIndices, psEnc->sCmn.nb_subfr * sizeof( SKP_int ) ); - DEBUG_STORE_DATA( nBits.dat, &nBits, sizeof( SKP_int ) ); + DEBUG_STORE_DATA( gains_indices.dat, &psEnc->sCmn.indices.GainsIndices, psEnc->sCmn.nb_subfr * sizeof( SKP_int ) ); tmp[ 0 ] = (SKP_float)sEncCtrl.current_SNR_dB_Q7 / 128.0f; DEBUG_STORE_DATA( current_SNR_db.dat, tmp, sizeof( SKP_float ) ); - DEBUG_STORE_DATA( quantOffsetType.dat, &psEnc->sCmn.indices.quantOffsetType, sizeof( SKP_int ) ); + DEBUG_STORE_DATA( quantOffsetType.dat, &psEnc->sCmn.indices.quantOffsetType, sizeof( SKP_int ) ); tmp[ 0 ] = (SKP_float)psEnc->sCmn.speech_activity_Q8 / 256.0f; DEBUG_STORE_DATA( speech_activity.dat, tmp, sizeof( SKP_float ) ); for( i = 0; i < VAD_N_BANDS; i++ ) { tmp[ i ] = (SKP_float)psEnc->sCmn.input_quality_bands_Q15[ i ] / 32768.0f; } - DEBUG_STORE_DATA( input_quality_bands.dat, tmp, VAD_N_BANDS * sizeof( SKP_float ) ); + DEBUG_STORE_DATA( input_quality_bands.dat, tmp, VAD_N_BANDS * sizeof( SKP_float ) ); DEBUG_STORE_DATA( signalType.dat, &psEnc->sCmn.indices.signalType, sizeof( SKP_int8) ); DEBUG_STORE_DATA( lag_index.dat, &psEnc->sCmn.indices.lagIndex, sizeof( SKP_int16 ) ); DEBUG_STORE_DATA( contour_index.dat, &psEnc->sCmn.indices.contourIndex, sizeof( SKP_int8 ) ); @@ -336,7 +295,7 @@ void SKP_Silk_LBRR_encode_FIX( psEncCtrl->Gains_Q16, psEncCtrl->pitchL, psEncCtrl->Lambda_Q10, psEncCtrl->LTP_scale_Q14 ); } - /* Restore original Gains */ + /* Restore original gains */ SKP_memcpy( psEncCtrl->Gains_Q16, TempGains_Q16, psEnc->sCmn.nb_subfr * sizeof( SKP_int32 ) ); } } diff --git a/src_FIX/SKP_Silk_main_FIX.h b/src_FIX/SKP_Silk_main_FIX.h index e0b7871b0..5dba8e6a3 100644 --- a/src_FIX/SKP_Silk_main_FIX.h +++ b/src_FIX/SKP_Silk_main_FIX.h @@ -30,6 +30,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "SKP_Silk_SigProc_FIX.h" #include "SKP_Silk_structs_FIX.h" +#include "SKP_Silk_control.h" #include "SKP_Silk_main.h" #include "SKP_Silk_PLC.h" #include "SKP_debug.h" @@ -55,23 +56,21 @@ SKP_int SKP_Silk_encode_frame_FIX( /* Low Bitrate Redundancy (LBRR) encoding. Reuse all parameters but encode with lower bitrate */ void SKP_Silk_LBRR_encode_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk FIX encoder state */ - SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O Pointer to Silk FIX encoder control struct */ - const SKP_int16 xfw[] /* I Input signal */ + SKP_Silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk FIX encoder state */ + SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O Pointer to Silk FIX encoder control struct */ + const SKP_int16 xfw[] /* I Input signal */ ); /* Initializes the Silk encoder state */ -SKP_int SKP_Silk_init_encoder_FIX( - SKP_Silk_encoder_state_FIX *psEnc /* I/O Pointer to Silk FIX encoder state */ +SKP_int SKP_Silk_init_encoder( + SKP_Silk_encoder_state_FIX *psEnc /* I/O Pointer to Silk FIX encoder state */ ); /* Control the Silk encoder */ -SKP_int SKP_Silk_control_encoder_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk encoder state */ - const SKP_int PacketSize_ms, /* I Packet length (ms) */ - const SKP_int32 TargetRate_bps, /* I Target max bitrate (bps) */ - const SKP_int PacketLoss_perc, /* I Packet loss rate (in percent) */ - const SKP_int Complexity /* I Complexity (0-10) */ +SKP_int SKP_Silk_control_encoder( + SKP_Silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk encoder state */ + SKP_SILK_SDK_EncControlStruct *encControl, /* I: Control structure */ + const SKP_int32 TargetRate_bps /* I Target max bitrate (bps) */ ); /****************/ diff --git a/src_FIX/SKP_Silk_noise_shape_analysis_FIX.c b/src_FIX/SKP_Silk_noise_shape_analysis_FIX.c index e43e25326..b8d804c9a 100644 --- a/src_FIX/SKP_Silk_noise_shape_analysis_FIX.c +++ b/src_FIX/SKP_Silk_noise_shape_analysis_FIX.c @@ -157,28 +157,20 @@ void SKP_Silk_noise_shape_analysis_FIX( /* Point to start of first LPC analysis block */ x_ptr = x - psEnc->sCmn.la_shape; - /****************/ - /* CONTROL SNR */ - /****************/ - /* Reduce SNR_dB values if recent bitstream has exceeded TargetRate */ - psEncCtrl->current_SNR_dB_Q7 = psEnc->SNR_dB_Q7 - SKP_SMULBB( psEnc->BufferedInChannel_ms, SKP_FIX_CONST( 0.1, 7 ) ); - - /* Reduce SNR_dB because of any inband FEC used */ - psEncCtrl->current_SNR_dB_Q7 -= psEnc->inBandFEC_SNR_comp_Q7; - /****************/ /* GAIN CONTROL */ /****************/ + SNR_adj_dB_Q7 = psEnc->sCmn.SNR_dB_Q7; + /* Input quality is the average of the quality in the lowest two VAD bands */ psEncCtrl->input_quality_Q14 = ( SKP_int )SKP_RSHIFT( ( SKP_int32 )psEnc->sCmn.input_quality_bands_Q15[ 0 ] + psEnc->sCmn.input_quality_bands_Q15[ 1 ], 2 ); /* Coding quality level, between 0.0_Q0 and 1.0_Q0, but in Q14 */ - psEncCtrl->coding_quality_Q14 = SKP_RSHIFT( SKP_Silk_sigm_Q15( SKP_RSHIFT_ROUND( psEncCtrl->current_SNR_dB_Q7 - + psEncCtrl->coding_quality_Q14 = SKP_RSHIFT( SKP_Silk_sigm_Q15( SKP_RSHIFT_ROUND( SNR_adj_dB_Q7 - SKP_FIX_CONST( 18.0, 7 ), 4 ) ), 1 ); /* Reduce coding SNR during low speech activity */ - SNR_adj_dB_Q7 = psEncCtrl->current_SNR_dB_Q7; if( psEnc->sCmn.useCBR == 0 ) { b_Q8 = SKP_FIX_CONST( 1.0, 8 ) - psEnc->sCmn.speech_activity_Q8; b_Q8 = SKP_SMULWB( SKP_LSHIFT( b_Q8, 8 ), b_Q8 ); @@ -193,7 +185,7 @@ void SKP_Silk_noise_shape_analysis_FIX( } else { /* For unvoiced signals and low-quality input, adjust the quality slower than SNR_dB setting */ SNR_adj_dB_Q7 = SKP_SMLAWB( SNR_adj_dB_Q7, - SKP_SMLAWB( SKP_FIX_CONST( 6.0, 9 ), -SKP_FIX_CONST( 0.4, 18 ), psEncCtrl->current_SNR_dB_Q7 ), + SKP_SMLAWB( SKP_FIX_CONST( 6.0, 9 ), -SKP_FIX_CONST( 0.4, 18 ), psEnc->sCmn.SNR_dB_Q7 ), SKP_FIX_CONST( 1.0, 14 ) - psEncCtrl->input_quality_Q14 ); } diff --git a/src_FIX/SKP_Silk_process_gains_FIX.c b/src_FIX/SKP_Silk_process_gains_FIX.c index f8bb29597..c11502b07 100644 --- a/src_FIX/SKP_Silk_process_gains_FIX.c +++ b/src_FIX/SKP_Silk_process_gains_FIX.c @@ -48,21 +48,18 @@ void SKP_Silk_process_gains_FIX( } /* Limit the quantized signal */ + /* InvMaxSqrVal = pow( 2.0f, 0.33f * ( 21.0f - SNR_dB ) ) / subfr_length; */ InvMaxSqrVal_Q16 = SKP_DIV32_16( SKP_Silk_log2lin( - SKP_SMULWB( SKP_FIX_CONST( 70.0, 7 ) - psEncCtrl->current_SNR_dB_Q7, SKP_FIX_CONST( 0.33, 16 ) ) ), psEnc->sCmn.subfr_length ); + SKP_SMULWB( SKP_FIX_CONST( 21 + 16 / 0.33, 7 ) - psEnc->sCmn.SNR_dB_Q7, SKP_FIX_CONST( 0.33, 16 ) ) ), psEnc->sCmn.subfr_length ); for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { /* Soft limit on ratio residual energy and squared gains */ ResNrg = psEncCtrl->ResNrg[ k ]; ResNrgPart = SKP_SMULWW( ResNrg, InvMaxSqrVal_Q16 ); if( psEncCtrl->ResNrgQ[ k ] > 0 ) { - if( psEncCtrl->ResNrgQ[ k ] < 32 ) { - ResNrgPart = SKP_RSHIFT_ROUND( ResNrgPart, psEncCtrl->ResNrgQ[ k ] ); - } else { - ResNrgPart = 0; - } - } else if( psEncCtrl->ResNrgQ[k] != 0 ) { - if( ResNrgPart > SKP_RSHIFT( SKP_int32_MAX, -psEncCtrl->ResNrgQ[ k ] ) ) { + ResNrgPart = SKP_RSHIFT_ROUND( ResNrgPart, psEncCtrl->ResNrgQ[ k ] ); + } else { + if( ResNrgPart >= SKP_RSHIFT( SKP_int32_MAX, -psEncCtrl->ResNrgQ[ k ] ) ) { ResNrgPart = SKP_int32_MAX; } else { ResNrgPart = SKP_LSHIFT( ResNrgPart, -psEncCtrl->ResNrgQ[ k ] ); @@ -75,9 +72,11 @@ void SKP_Silk_process_gains_FIX( gain_squared = SKP_SMLAWW( SKP_LSHIFT( ResNrgPart, 16 ), gain, gain ); SKP_assert( gain_squared > 0 ); gain = SKP_Silk_SQRT_APPROX( gain_squared ); /* Q8 */ + gain = SKP_min( gain, SKP_int32_MAX >> 8 ); psEncCtrl->Gains_Q16[ k ] = SKP_LSHIFT_SAT32( gain, 8 ); /* Q16 */ } else { gain = SKP_Silk_SQRT_APPROX( gain_squared ); /* Q0 */ + gain = SKP_min( gain, SKP_int32_MAX >> 16 ); psEncCtrl->Gains_Q16[ k ] = SKP_LSHIFT_SAT32( gain, 16 ); /* Q16 */ } } @@ -85,6 +84,7 @@ void SKP_Silk_process_gains_FIX( /* Noise shaping quantization */ SKP_Silk_gains_quant( psEnc->sCmn.indices.GainsIndices, psEncCtrl->Gains_Q16, &psShapeSt->LastGainIndex, psEnc->sCmn.nFramesAnalyzed, psEnc->sCmn.nb_subfr ); + /* Set quantizer offset for voiced signals. Larger offset when LTP coding gain is low or tilt is high (ie low-pass) */ if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { if( psEncCtrl->LTPredCodGain_Q7 + SKP_RSHIFT( psEnc->sCmn.input_tilt_Q15, 8 ) > SKP_FIX_CONST( 1.0, 7 ) ) { diff --git a/src_FIX/SKP_Silk_structs_FIX.h b/src_FIX/SKP_Silk_structs_FIX.h index 9f6047714..f7e91d2df 100644 --- a/src_FIX/SKP_Silk_structs_FIX.h +++ b/src_FIX/SKP_Silk_structs_FIX.h @@ -72,15 +72,10 @@ typedef struct { /* Buffer for find pitch and noise shape analysis */ SKP_DWORD_ALIGN SKP_int16 x_buf[ 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ]; SKP_int LTPCorr_Q15; /* Normalized correlation from pitch lag estimator */ - SKP_int32 SNR_dB_Q7; /* Quality setting */ - SKP_int BufferedInChannel_ms; /* Simulated number of ms buffer because of exceeded TargetRate_bps */ /* Parameters For LTP scaling Control */ SKP_int prevLTPredCodGain_Q7; SKP_int HPLTPredCodGain_Q7; - - SKP_int32 inBandFEC_SNR_comp_Q7; /* Compensation to SNR_dB when using inband FEC Voiced */ - } SKP_Silk_encoder_state_FIX; /************************/ @@ -106,7 +101,6 @@ typedef struct { SKP_int Lambda_Q10; SKP_int input_quality_Q14; SKP_int coding_quality_Q14; - SKP_int current_SNR_dB_Q7; /* measures */ SKP_int sparseness_Q8; diff --git a/src_FIX/src_FIX.vcxproj b/src_FIX/src_FIX.vcxproj index ece080ec7..3b885a46b 100644 --- a/src_FIX/src_FIX.vcxproj +++ b/src_FIX/src_FIX.vcxproj @@ -78,14 +78,12 @@ <ClInclude Include="SKP_Silk_structs_FIX.h" /> </ItemGroup> <ItemGroup> - <ClCompile Include="SKP_Silk_control_codec_FIX.c" /> <ClCompile Include="SKP_Silk_corrMatrix_FIX.c" /> <ClCompile Include="SKP_Silk_encode_frame_FIX.c" /> <ClCompile Include="SKP_Silk_find_LPC_FIX.c" /> <ClCompile Include="SKP_Silk_find_LTP_FIX.c" /> <ClCompile Include="SKP_Silk_find_pitch_lags_FIX.c" /> <ClCompile Include="SKP_Silk_find_pred_coefs_FIX.c" /> - <ClCompile Include="SKP_Silk_init_encoder_FIX.c" /> <ClCompile Include="SKP_Silk_LTP_analysis_filter_FIX.c" /> <ClCompile Include="SKP_Silk_LTP_scale_ctrl_FIX.c" /> <ClCompile Include="SKP_Silk_noise_shape_analysis_FIX.c" /> diff --git a/src_FIX/src_FIX.vcxproj.filters b/src_FIX/src_FIX.vcxproj.filters index 1718e615c..d640244e4 100644 --- a/src_FIX/src_FIX.vcxproj.filters +++ b/src_FIX/src_FIX.vcxproj.filters @@ -26,9 +26,6 @@ </ClInclude> </ItemGroup> <ItemGroup> - <ClCompile Include="SKP_Silk_control_codec_FIX.c"> - <Filter>Source Files</Filter> - </ClCompile> <ClCompile Include="SKP_Silk_corrMatrix_FIX.c"> <Filter>Source Files</Filter> </ClCompile> @@ -47,9 +44,6 @@ <ClCompile Include="SKP_Silk_find_pred_coefs_FIX.c"> <Filter>Source Files</Filter> </ClCompile> - <ClCompile Include="SKP_Silk_init_encoder_FIX.c"> - <Filter>Source Files</Filter> - </ClCompile> <ClCompile Include="SKP_Silk_LTP_analysis_filter_FIX.c"> <Filter>Source Files</Filter> </ClCompile> diff --git a/src_FLP/SKP_Silk_LTP_scale_ctrl_FLP.c b/src_FLP/SKP_Silk_LTP_scale_ctrl_FLP.c index b94d2fe4e..4d9345d96 100644 --- a/src_FLP/SKP_Silk_LTP_scale_ctrl_FLP.c +++ b/src_FLP/SKP_Silk_LTP_scale_ctrl_FLP.c @@ -27,57 +27,26 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "SKP_Silk_main_FLP.h" -#define NB_THRESHOLDS 11 - -/* Table containing trained thresholds for LTP scaling */ -static const SKP_float LTPScaleThresholds[ NB_THRESHOLDS ] = -{ - 0.95f, 0.8f, 0.50f, 0.400f, 0.3f, 0.2f, - 0.15f, 0.1f, 0.08f, 0.075f, 0.0f -}; - - void SKP_Silk_LTP_scale_ctrl_FLP( SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ SKP_Silk_encoder_control_FLP *psEncCtrl /* I/O Encoder control FLP */ ) { - SKP_int round_loss; - SKP_float g_out, g_limit, thrld1, thrld2; + SKP_int round_loss; /* 1st order high-pass filter */ - //g_HP(n) = g(n) - g(n-1) + 0.5 * g_HP(n-1); // tune the 0.5: higher means longer impact of jump - psEnc->HPLTPredCodGain = SKP_max_float( psEncCtrl->LTPredCodGain - psEnc->prevLTPredCodGain, 0.0f ) + //g_HP(n) = g(n) - 0.5 * g(n-1) + 0.5 * g_HP(n-1); + psEnc->HPLTPredCodGain = SKP_max_float( psEncCtrl->LTPredCodGain - 0.5 * psEnc->prevLTPredCodGain, 0.0f ) + 0.5f * psEnc->HPLTPredCodGain; - psEnc->prevLTPredCodGain = psEncCtrl->LTPredCodGain; - /* Combine input and filtered input */ - g_out = 0.5f * psEncCtrl->LTPredCodGain + ( 1.0f - 0.5f ) * psEnc->HPLTPredCodGain; - g_limit = SKP_sigmoid( 0.5f * ( g_out - 6 ) ); - - - /* Default is minimum scaling */ - psEnc->sCmn.indices.LTP_scaleIndex = 0; - - /* Round the loss measure to whole pct */ - round_loss = ( SKP_int )( psEnc->sCmn.PacketLoss_perc ); - round_loss = SKP_max( 0, round_loss ); - /* Only scale if first frame in packet */ - if( psEnc->sCmn.nFramesAnalyzed == 0 ){ - - round_loss += psEnc->sCmn.nFramesPerPacket - 1; - thrld1 = LTPScaleThresholds[ SKP_min_int( round_loss, NB_THRESHOLDS - 1 ) ]; - thrld2 = LTPScaleThresholds[ SKP_min_int( round_loss + 1, NB_THRESHOLDS - 1 ) ]; - - if( g_limit > thrld1 ) { - /* High Scaling */ - psEnc->sCmn.indices.LTP_scaleIndex = 2; - } else if( g_limit > thrld2 ) { - /* Middle Scaling */ - psEnc->sCmn.indices.LTP_scaleIndex = 1; - } + if( psEnc->sCmn.nFramesAnalyzed == 0 ) { + round_loss = psEnc->sCmn.PacketLoss_perc + psEnc->sCmn.nFramesPerPacket; + psEnc->sCmn.indices.LTP_scaleIndex = (SKP_int8)SKP_LIMIT( round_loss * psEnc->HPLTPredCodGain * 0.1f, 0.0f, 2.0f ); + } else { + /* Default is minimum scaling */ + psEnc->sCmn.indices.LTP_scaleIndex = 0; } - psEncCtrl->LTP_scale = ( SKP_float)SKP_Silk_LTPScales_table_Q14[ psEnc->sCmn.indices.LTP_scaleIndex ] / 16384.0f; + psEncCtrl->LTP_scale = (SKP_float)SKP_Silk_LTPScales_table_Q14[ psEnc->sCmn.indices.LTP_scaleIndex ] / 16384.0f; } diff --git a/src_FLP/SKP_Silk_control_codec_FLP.c b/src_FLP/SKP_Silk_control_codec_FLP.c deleted file mode 100644 index 06b3fd280..000000000 --- a/src_FLP/SKP_Silk_control_codec_FLP.c +++ /dev/null @@ -1,317 +0,0 @@ -/*********************************************************************** -Copyright (c) 2006-2011, Skype Limited. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, (subject to the limitations in the disclaimer below) -are permitted provided that the following conditions are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Skype Limited, nor the names of specific -contributors, may be used to endorse or promote products derived from -this software without specific prior written permission. -NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED -BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND -CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -#include "SKP_Silk_main_FLP.h" -#include "SKP_Silk_setup.h" - -SKP_INLINE SKP_int SKP_Silk_setup_resamplers( - SKP_Silk_encoder_state_FLP *psEnc, /* I/O Pointer to Silk encoder state FLP */ - SKP_int fs_kHz /* I Internal sampling rate (kHz) */ -); - -SKP_INLINE SKP_int SKP_Silk_setup_fs( - SKP_Silk_encoder_state_FLP *psEnc, /* I/O */ - SKP_int fs_kHz, /* I */ - SKP_int PacketSize_ms /* I */ -); - -SKP_INLINE SKP_int SKP_Silk_setup_rate( - SKP_Silk_encoder_state_FLP *psEnc, /* I/O Pointer to Silk encoder state FLP */ - SKP_int32 TargetRate_bps /* I Target max bitrate */ -); - -/* Control encoder */ -SKP_int SKP_Silk_control_encoder_FLP( - SKP_Silk_encoder_state_FLP *psEnc, /* I/O Pointer to Silk encoder state FLP */ - const SKP_int PacketSize_ms, /* I Packet length (ms) */ - const SKP_int32 TargetRate_bps, /* I Target max bitrate (bps) */ - const SKP_int PacketLoss_perc, /* I Packet loss rate (in percent) */ - const SKP_int Complexity /* I Complexity (0-10) */ -) -{ - SKP_int fs_kHz, ret = 0; - - if( psEnc->sCmn.controlled_since_last_payload != 0 && psEnc->sCmn.prefillFlag == 0 ) { - if( psEnc->sCmn.API_fs_Hz != psEnc->sCmn.prev_API_fs_Hz && psEnc->sCmn.fs_kHz > 0 ) { - /* Change in API sampling rate in the middle of encoding a packet */ - ret += SKP_Silk_setup_resamplers( psEnc, psEnc->sCmn.fs_kHz ); - } - return ret; - } - - /* Beyond this point we know that there are no previously coded frames in the payload buffer */ - - /********************************************/ - /* Determine internal sampling rate */ - /********************************************/ - fs_kHz = SKP_Silk_control_audio_bandwidth( &psEnc->sCmn, TargetRate_bps ); - - /********************************************/ - /* Prepare resampler and buffered data */ - /********************************************/ - ret += SKP_Silk_setup_resamplers( psEnc, fs_kHz ); - - /********************************************/ - /* Set internal sampling frequency */ - /********************************************/ - ret += SKP_Silk_setup_fs( psEnc, fs_kHz, PacketSize_ms ); - - /********************************************/ - /* Set encoding complexity */ - /********************************************/ - ret += SKP_Silk_setup_complexity( &psEnc->sCmn, Complexity ); - - /********************************************/ - /* Set bitrate/coding quality */ - /********************************************/ - ret += SKP_Silk_setup_rate( psEnc, TargetRate_bps ); - - /********************************************/ - /* Set packet loss rate measured by farend */ - /********************************************/ - if( ( PacketLoss_perc < 0 ) || ( PacketLoss_perc > 100 ) ) { - ret = SKP_SILK_ENC_INVALID_LOSS_RATE; - } - psEnc->sCmn.PacketLoss_perc = PacketLoss_perc; - - /********************************************/ - /* Set LBRR usage */ - /********************************************/ - ret += SKP_Silk_setup_LBRR( &psEnc->sCmn ); - - psEnc->sCmn.controlled_since_last_payload = 1; - - return ret; -} - -SKP_INLINE SKP_int SKP_Silk_setup_resamplers( - SKP_Silk_encoder_state_FLP *psEnc, /* I/O Pointer to Silk encoder state FLP */ - SKP_int fs_kHz /* I External (API) sampling rate (Hz) */ -) -{ - SKP_int ret = SKP_SILK_NO_ERROR; - - if( psEnc->sCmn.fs_kHz != fs_kHz || psEnc->sCmn.prev_API_fs_Hz != psEnc->sCmn.API_fs_Hz ) { - - if( psEnc->sCmn.fs_kHz == 0 ) { - /* Initialize the resampler for enc_API.c preparing resampling from API_fs_Hz to fs_kHz */ - ret += SKP_Silk_resampler_init( &psEnc->sCmn.resampler_state, psEnc->sCmn.API_fs_Hz, fs_kHz * 1000 ); - } else { - /* Allocate space for worst case temporary upsampling, 8 to 48 kHz, so a factor 6 */ - SKP_int16 x_buf_API_fs_Hz[ ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) * ( MAX_API_FS_KHZ / 8 ) ]; - SKP_int16 x_bufFIX[ 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ]; - - SKP_int32 nSamples_temp = 2 * psEnc->sCmn.frame_length + LA_SHAPE_MS * psEnc->sCmn.fs_kHz; - - SKP_float2short_array( x_bufFIX, psEnc->x_buf, nSamples_temp ); - - if( fs_kHz * 1000 < psEnc->sCmn.API_fs_Hz && psEnc->sCmn.fs_kHz != 0 ) { - /* Resample buffered data in x_buf to API_fs_Hz */ - - SKP_Silk_resampler_state_struct temp_resampler_state; - - /* Initialize resampler for temporary resampling of x_buf data to API_fs_Hz */ - ret += SKP_Silk_resampler_init( &temp_resampler_state, psEnc->sCmn.fs_kHz * 1000, psEnc->sCmn.API_fs_Hz ); - - /* Temporary resampling of x_buf data to API_fs_Hz */ - ret += SKP_Silk_resampler( &temp_resampler_state, x_buf_API_fs_Hz, x_bufFIX, nSamples_temp ); - - /* Calculate number of samples that has been temporarily upsampled */ - nSamples_temp = SKP_DIV32_16( nSamples_temp * psEnc->sCmn.API_fs_Hz, psEnc->sCmn.fs_kHz * 1000 ); - - /* Initialize the resampler for enc_API.c preparing resampling from API_fs_Hz to fs_kHz */ - ret += SKP_Silk_resampler_init( &psEnc->sCmn.resampler_state, psEnc->sCmn.API_fs_Hz, fs_kHz * 1000 ); - - } else { - /* Copy data */ - SKP_memcpy( x_buf_API_fs_Hz, x_bufFIX, nSamples_temp * sizeof( SKP_int16 ) ); - } - - if( 1000 * fs_kHz != psEnc->sCmn.API_fs_Hz ) { - /* Correct resampler state (unless resampling by a factor 1) by resampling buffered data from API_fs_Hz to fs_kHz */ - ret += SKP_Silk_resampler( &psEnc->sCmn.resampler_state, x_bufFIX, x_buf_API_fs_Hz, nSamples_temp ); - } - SKP_short2float_array( psEnc->x_buf, x_bufFIX, ( 2 * MAX_FRAME_LENGTH_MS + LA_SHAPE_MS ) * fs_kHz ); - } - } - - psEnc->sCmn.prev_API_fs_Hz = psEnc->sCmn.API_fs_Hz; - - return(ret); -} - -SKP_INLINE SKP_int SKP_Silk_setup_fs( - SKP_Silk_encoder_state_FLP *psEnc, /* I/O */ - SKP_int fs_kHz, /* I */ - SKP_int PacketSize_ms /* I */ -) -{ - SKP_int ret = SKP_SILK_NO_ERROR; - - /* Set packet size */ - if( PacketSize_ms != psEnc->sCmn.PacketSize_ms ) { - if( ( PacketSize_ms != 10 ) && - ( PacketSize_ms != 20 ) && - ( PacketSize_ms != 40 ) && - ( PacketSize_ms != 60 ) ) { - ret = SKP_SILK_ENC_PACKET_SIZE_NOT_SUPPORTED; - } - if( PacketSize_ms <= 10 ) { - psEnc->sCmn.nFramesPerPacket = 1; - psEnc->sCmn.nb_subfr = PacketSize_ms == 10 ? 2 : 1; - psEnc->sCmn.frame_length = PacketSize_ms * fs_kHz; - psEnc->sCmn.pitch_LPC_win_length = SKP_SMULBB( FIND_PITCH_LPC_WIN_MS_2_SF, fs_kHz ); - if( psEnc->sCmn.fs_kHz == 8 ) { - psEnc->sCmn.pitch_contour_iCDF = SKP_Silk_pitch_contour_10_ms_NB_iCDF; - } else { - psEnc->sCmn.pitch_contour_iCDF = SKP_Silk_pitch_contour_10_ms_iCDF; - } - } else { - psEnc->sCmn.nFramesPerPacket = SKP_DIV32_16( PacketSize_ms, MAX_FRAME_LENGTH_MS ); - psEnc->sCmn.nb_subfr = MAX_NB_SUBFR; - psEnc->sCmn.frame_length = 20 * fs_kHz; - psEnc->sCmn.pitch_LPC_win_length = SKP_SMULBB( FIND_PITCH_LPC_WIN_MS, fs_kHz ); - if( psEnc->sCmn.fs_kHz == 8 ) { - psEnc->sCmn.pitch_contour_iCDF = SKP_Silk_pitch_contour_NB_iCDF; - } else { - psEnc->sCmn.pitch_contour_iCDF = SKP_Silk_pitch_contour_iCDF; - } - } - psEnc->sCmn.PacketSize_ms = PacketSize_ms; - psEnc->sCmn.TargetRate_bps = 0; /* trigger new SNR computation */ - } - - /* Set internal sampling frequency */ - SKP_assert( fs_kHz == 8 || fs_kHz == 12 || fs_kHz == 16 ); - SKP_assert( psEnc->sCmn.nb_subfr == 2 || psEnc->sCmn.nb_subfr == 4 ); - if( psEnc->sCmn.fs_kHz != fs_kHz ) { - /* reset part of the state */ - SKP_memset( &psEnc->sShape, 0, sizeof( SKP_Silk_shape_state_FLP ) ); - SKP_memset( &psEnc->sPrefilt, 0, sizeof( SKP_Silk_prefilter_state_FLP ) ); - SKP_memset( &psEnc->sCmn.sNSQ, 0, sizeof( SKP_Silk_nsq_state ) ); - SKP_memset( psEnc->sCmn.prev_NLSFq_Q15, 0, sizeof( psEnc->sCmn.prev_NLSFq_Q15 ) ); - SKP_memset( &psEnc->sCmn.sLP.In_LP_State, 0, sizeof( psEnc->sCmn.sLP.In_LP_State ) ); - psEnc->sCmn.inputBufIx = 0; - psEnc->sCmn.nFramesAnalyzed = 0; - psEnc->sCmn.TargetRate_bps = 0; /* Ensures that psEnc->SNR_dB is recomputed */ - - /* Initialize non-zero parameters */ - psEnc->sCmn.prevLag = 100; - psEnc->sCmn.first_frame_after_reset = 1; - psEnc->sPrefilt.lagPrev = 100; - psEnc->sShape.LastGainIndex = 10; - psEnc->sCmn.sNSQ.lagPrev = 100; - psEnc->sCmn.sNSQ.prev_inv_gain_Q16 = 65536; - - psEnc->sCmn.fs_kHz = fs_kHz; - if( psEnc->sCmn.fs_kHz == 8 ) { - if( psEnc->sCmn.nb_subfr == MAX_NB_SUBFR ) { - psEnc->sCmn.pitch_contour_iCDF = SKP_Silk_pitch_contour_NB_iCDF; - } else { - psEnc->sCmn.pitch_contour_iCDF = SKP_Silk_pitch_contour_10_ms_NB_iCDF; - } - } else { - if( psEnc->sCmn.nb_subfr == MAX_NB_SUBFR ) { - psEnc->sCmn.pitch_contour_iCDF = SKP_Silk_pitch_contour_iCDF; - } else { - psEnc->sCmn.pitch_contour_iCDF = SKP_Silk_pitch_contour_10_ms_iCDF; - } - } - if( psEnc->sCmn.fs_kHz == 8 || psEnc->sCmn.fs_kHz == 12 ) { - psEnc->sCmn.predictLPCOrder = MIN_LPC_ORDER; - psEnc->sCmn.psNLSF_CB = &SKP_Silk_NLSF_CB_NB_MB; - } else { - psEnc->sCmn.predictLPCOrder = MAX_LPC_ORDER; - psEnc->sCmn.psNLSF_CB = &SKP_Silk_NLSF_CB_WB; - } - psEnc->sCmn.subfr_length = SUB_FRAME_LENGTH_MS * fs_kHz; - psEnc->sCmn.frame_length = psEnc->sCmn.subfr_length * psEnc->sCmn.nb_subfr; - psEnc->sCmn.ltp_mem_length = LTP_MEM_LENGTH_MS * fs_kHz; - psEnc->sCmn.la_pitch = LA_PITCH_MS * fs_kHz; - psEnc->sCmn.max_pitch_lag = 18 * fs_kHz; - if( psEnc->sCmn.nb_subfr == MAX_NB_SUBFR ) { - psEnc->sCmn.pitch_LPC_win_length = SKP_SMULBB( FIND_PITCH_LPC_WIN_MS, fs_kHz ); - } else { - psEnc->sCmn.pitch_LPC_win_length = SKP_SMULBB( FIND_PITCH_LPC_WIN_MS_2_SF, fs_kHz ); - } - if( psEnc->sCmn.fs_kHz == 16 ) { - psEnc->sCmn.mu_LTP_Q9 = SKP_FIX_CONST( MU_LTP_QUANT_WB, 9 ); - psEnc->sCmn.pitch_lag_low_bits_iCDF = SKP_Silk_uniform8_iCDF; - } else if( psEnc->sCmn.fs_kHz == 12 ) { - psEnc->sCmn.mu_LTP_Q9 = SKP_FIX_CONST( MU_LTP_QUANT_MB, 9 ); - psEnc->sCmn.pitch_lag_low_bits_iCDF = SKP_Silk_uniform6_iCDF; - } else { - psEnc->sCmn.mu_LTP_Q9 = SKP_FIX_CONST( MU_LTP_QUANT_NB, 9 ); - psEnc->sCmn.pitch_lag_low_bits_iCDF = SKP_Silk_uniform4_iCDF; - } - } - - /* Check that settings are valid */ - SKP_assert( ( psEnc->sCmn.subfr_length * psEnc->sCmn.nb_subfr ) == psEnc->sCmn.frame_length ); - - return( ret ); -} - -SKP_INLINE SKP_int SKP_Silk_setup_rate( - SKP_Silk_encoder_state_FLP *psEnc, /* I/O Pointer to Silk encoder state FLP */ - SKP_int32 TargetRate_bps /* I Target max bitrate */ -) -{ - SKP_int k, ret = SKP_SILK_NO_ERROR; - SKP_float frac; - const SKP_int32 *rateTable; - - /* Set bitrate/coding quality */ - if( TargetRate_bps != psEnc->sCmn.TargetRate_bps ) { - psEnc->sCmn.TargetRate_bps = TargetRate_bps; - - /* If new TargetRate_bps, translate to SNR_dB value */ - if( psEnc->sCmn.fs_kHz == 8 ) { - rateTable = TargetRate_table_NB; - } else if( psEnc->sCmn.fs_kHz == 12 ) { - rateTable = TargetRate_table_MB; - } else if( psEnc->sCmn.fs_kHz == 16 ) { - rateTable = TargetRate_table_WB; - } else { - SKP_assert( 0 ); - } - /* Reduce bitrate for 10 ms modes in these calculations */ - if( psEnc->sCmn.nb_subfr == 2 ) { - TargetRate_bps -= REDUCE_BITRATE_10_MS_BPS; - } - for( k = 1; k < TARGET_RATE_TAB_SZ; k++ ) { - /* Find bitrate interval in table and interpolate */ - if( TargetRate_bps <= rateTable[ k ] ) { - frac = (SKP_float)( TargetRate_bps - rateTable[ k - 1 ] ) / - (SKP_float)( rateTable[ k ] - rateTable[ k - 1 ] ); - psEnc->SNR_dB = 0.5f * ( SNR_table_Q1[ k - 1 ] + frac * ( SNR_table_Q1[ k ] - SNR_table_Q1[ k - 1 ] ) ); - break; - } - } - } - return( ret ); -} diff --git a/src_FLP/SKP_Silk_encode_frame_FLP.c b/src_FLP/SKP_Silk_encode_frame_FLP.c index 2bc74a6f0..43b5283b7 100644 --- a/src_FLP/SKP_Silk_encode_frame_FLP.c +++ b/src_FLP/SKP_Silk_encode_frame_FLP.c @@ -38,8 +38,7 @@ SKP_int SKP_Silk_encode_frame_FLP( ) { SKP_Silk_encoder_control_FLP sEncCtrl; - SKP_int i, nBits, ret = 0; - SKP_uint8 flags; + SKP_int i, ret = 0; SKP_float *x_frame, *res_pitch_frame; SKP_int16 pIn_HP[ MAX_FRAME_LENGTH ]; SKP_float xfw[ MAX_FRAME_LENGTH ]; @@ -66,42 +65,26 @@ TOC(VAD) /**************************************************/ /* Convert speech activity into VAD and DTX flags */ /**************************************************/ + if( psEnc->sCmn.nFramesAnalyzed == 0 ) { + psEnc->sCmn.inDTX = psEnc->sCmn.useDTX; + } if( psEnc->sCmn.speech_activity_Q8 < SKP_FIX_CONST( SPEECH_ACTIVITY_DTX_THRES, 8 ) ) { psEnc->sCmn.indices.signalType = TYPE_NO_VOICE_ACTIVITY; psEnc->sCmn.noSpeechCounter++; - if( psEnc->sCmn.noSpeechCounter > NO_SPEECH_FRAMES_BEFORE_DTX ) { - psEnc->sCmn.inDTX = 1; - } - if( psEnc->sCmn.noSpeechCounter > MAX_CONSECUTIVE_DTX ) { - psEnc->sCmn.noSpeechCounter = 0; + if( psEnc->sCmn.noSpeechCounter < NB_SPEECH_FRAMES_BEFORE_DTX ) { + psEnc->sCmn.inDTX = 0; + } else if( psEnc->sCmn.noSpeechCounter > MAX_CONSECUTIVE_DTX + NB_SPEECH_FRAMES_BEFORE_DTX ) { + psEnc->sCmn.noSpeechCounter = NB_SPEECH_FRAMES_BEFORE_DTX; psEnc->sCmn.inDTX = 0; } psEnc->sCmn.VAD_flags[ psEnc->sCmn.nFramesAnalyzed ] = 0; } else { - psEnc->sCmn.noSpeechCounter = 0; - psEnc->sCmn.inDTX = 0; + psEnc->sCmn.noSpeechCounter = 0; + psEnc->sCmn.inDTX = 0; psEnc->sCmn.indices.signalType = TYPE_UNVOICED; psEnc->sCmn.VAD_flags[ psEnc->sCmn.nFramesAnalyzed ] = 1; } - if( psEnc->sCmn.nFramesAnalyzed == 0 && !psEnc->sCmn.prefillFlag && !( psEnc->sCmn.useDTX && psEnc->sCmn.inDTX ) ) { - /* Create space at start of payload for VAD and FEC flags */ - SKP_uint8 iCDF[ 2 ] = { 0, 0 }; - iCDF[ 0 ] = 256 - SKP_RSHIFT( 256, psEnc->sCmn.nFramesPerPacket + 1 ); - ec_enc_icdf( psRangeEnc, 0, iCDF, 8 ); - - /* Encode any LBRR data from previous packet */ - SKP_Silk_LBRR_embed( &psEnc->sCmn, psRangeEnc ); - - /* Reduce coding SNR depending on how many bits used by LBRR */ - nBits = ec_tell( psRangeEnc ); - psEnc->inBandFEC_SNR_comp = ( 6.0f * nBits ) / - ( psEnc->sCmn.nFramesPerPacket * psEnc->sCmn.frame_length ); - - /* Reset LBRR flags */ - SKP_memset( psEnc->sCmn.LBRR_flags, 0, sizeof( psEnc->sCmn.LBRR_flags ) ); - } - /*******************************************/ /* High-pass filtering of the input signal */ /*******************************************/ @@ -109,10 +92,8 @@ TIC(HP_IN) SKP_Silk_HP_variable_cutoff( &psEnc->sCmn, pIn_HP, psEnc->sCmn.inputBuf, psEnc->sCmn.frame_length ); TOC(HP_IN) -#if SWITCH_TRANSITION_FILTERING /* Ensure smooth bandwidth transitions */ SKP_Silk_LP_variable_cutoff( &psEnc->sCmn.sLP, pIn_HP, psEnc->sCmn.frame_length ); -#endif /*******************************************/ /* Copy new frame to front of input buffer */ @@ -182,7 +163,7 @@ TOC(NSQ) psEnc->sCmn.prevSignalType = psEnc->sCmn.indices.signalType; /* Exit without entropy coding */ - if( psEnc->sCmn.prefillFlag || ( psEnc->sCmn.useDTX && psEnc->sCmn.inDTX ) ) { + if( psEnc->sCmn.prefillFlag ) { /* No payload */ *pnBytesOut = 0; return ret; @@ -203,37 +184,16 @@ TIC(ENCODE_PULSES) psEnc->sCmn.pulses, psEnc->sCmn.frame_length ); TOC(ENCODE_PULSES) - /****************************************/ - /* Simulate network buffer delay caused */ - /* by exceeding TargetRate */ - /****************************************/ - nBits = ec_tell( psRangeEnc ); - psEnc->BufferedInChannel_ms += 1000.0f * ( nBits - psEnc->sCmn.prev_nBits ) / psEnc->sCmn.TargetRate_bps; - psEnc->BufferedInChannel_ms -= psEnc->sCmn.nb_subfr * SUB_FRAME_LENGTH_MS; - psEnc->BufferedInChannel_ms = SKP_LIMIT_float( psEnc->BufferedInChannel_ms, 0.0f, 100.0f ); - psEnc->sCmn.prev_nBits = nBits; - psEnc->sCmn.first_frame_after_reset = 0; - /****************************************/ /* Finalize payload */ /****************************************/ + psEnc->sCmn.first_frame_after_reset = 0; if( ++psEnc->sCmn.nFramesAnalyzed >= psEnc->sCmn.nFramesPerPacket ) { - /* Insert VAD flags and FEC flag at beginning of bitstream */ - flags = 0; - for( i = 0; i < psEnc->sCmn.nFramesPerPacket; i++ ) { - flags |= psEnc->sCmn.VAD_flags[i]; - flags = SKP_LSHIFT( flags, 1 ); - } - flags |= psEnc->sCmn.LBRR_flag; - ec_enc_patch_initial_bits( psRangeEnc, flags, psEnc->sCmn.nFramesPerPacket + 1 ); - /* Payload size */ - nBits = ec_tell( psRangeEnc ); - *pnBytesOut = SKP_RSHIFT( nBits + 7, 3 ); + *pnBytesOut = SKP_RSHIFT( ec_tell( psRangeEnc ) + 7, 3 ); /* Reset the number of frames in payload buffer */ psEnc->sCmn.nFramesAnalyzed = 0; - psEnc->sCmn.prev_nBits = 0; } else { /* No payload this time */ *pnBytesOut = 0; @@ -248,8 +208,6 @@ TOC(ENCODE_FRAME) DEBUG_STORE_DATA( LTPcorr.dat, &psEnc->LTPCorr, sizeof( SKP_float ) ); DEBUG_STORE_DATA( gains.dat, sEncCtrl.Gains, psEnc->sCmn.nb_subfr * sizeof( SKP_float ) ); DEBUG_STORE_DATA( gains_indices.dat, &psEnc->sCmn.indices.GainsIndices, psEnc->sCmn.nb_subfr * sizeof( SKP_int8 ) ); - DEBUG_STORE_DATA( nBits.dat, &nBits, sizeof( SKP_int ) ); - DEBUG_STORE_DATA( current_SNR_db.dat, &sEncCtrl.current_SNR_dB, sizeof( SKP_float ) ); DEBUG_STORE_DATA( quantOffsetType.dat, &psEnc->sCmn.indices.quantOffsetType, sizeof( SKP_int8 ) ); DEBUG_STORE_DATA( speech_activity_q8.dat, &psEnc->sCmn.speech_activity_Q8, sizeof( SKP_int ) ); DEBUG_STORE_DATA( signalType.dat, &psEnc->sCmn.indices.signalType, sizeof( SKP_int8 ) ); @@ -289,7 +247,6 @@ void SKP_Silk_LBRR_encode_FLP( /* Save original gains */ SKP_memcpy( TempGains, psEncCtrl->Gains, psEnc->sCmn.nb_subfr * sizeof( SKP_float ) ); - if( psEnc->sCmn.nFramesAnalyzed == 0 || psEnc->sCmn.LBRR_flags[ psEnc->sCmn.nFramesAnalyzed - 1 ] == 0 ) { /* First frame in packet or previous frame not LBRR coded */ psEnc->sCmn.LBRRprevLastGainIndex = psEnc->sShape.LastGainIndex; @@ -314,7 +271,7 @@ void SKP_Silk_LBRR_encode_FLP( SKP_Silk_NSQ_wrapper_FLP( psEnc, psEncCtrl, psIndices_LBRR, &sNSQ_LBRR, psEnc->sCmn.pulses_LBRR[ psEnc->sCmn.nFramesAnalyzed ], xfw ); - /* Restore original Gains */ + /* Restore original gains */ SKP_memcpy( psEncCtrl->Gains, TempGains, psEnc->sCmn.nb_subfr * sizeof( SKP_float ) ); } } diff --git a/src_FLP/SKP_Silk_init_encoder_FLP.c b/src_FLP/SKP_Silk_init_encoder_FLP.c deleted file mode 100644 index 1a444d0b8..000000000 --- a/src_FLP/SKP_Silk_init_encoder_FLP.c +++ /dev/null @@ -1,52 +0,0 @@ -/*********************************************************************** -Copyright (c) 2006-2011, Skype Limited. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, (subject to the limitations in the disclaimer below) -are permitted provided that the following conditions are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Skype Limited, nor the names of specific -contributors, may be used to endorse or promote products derived from -this software without specific prior written permission. -NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED -BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND -CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -#include <stdlib.h> -#include "SKP_Silk_main_FLP.h" - -/*********************************/ -/* Initialize Silk Encoder state */ -/*********************************/ -SKP_int SKP_Silk_init_encoder_FLP( - SKP_Silk_encoder_state_FLP *psEnc /* I/O Encoder state FLP */ -) { - SKP_int ret = 0; - - /* Clear the entire encoder state */ - SKP_memset( psEnc, 0, sizeof( SKP_Silk_encoder_state_FLP ) ); - - psEnc->sCmn.variable_HP_smth1_Q15 = 200844; /* = SKP_Silk_log2(70)_Q0; */ - psEnc->sCmn.variable_HP_smth2_Q15 = 200844; /* = SKP_Silk_log2(70)_Q0; */ - - /* Used to deactivate e.g. LSF interpolation and fluctuation reduction */ - psEnc->sCmn.first_frame_after_reset = 1; - - /* Initialize Silk VAD */ - ret += SKP_Silk_VAD_Init( &psEnc->sCmn.sVAD ); - - return( ret ); -} diff --git a/src_FLP/SKP_Silk_main_FLP.h b/src_FLP/SKP_Silk_main_FLP.h index dda5bf845..4447a8aee 100644 --- a/src_FLP/SKP_Silk_main_FLP.h +++ b/src_FLP/SKP_Silk_main_FLP.h @@ -36,9 +36,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "SKP_debug.h" #include "entenc.h" -/* uncomment to compile without SSE optimizations */ -//#undef SKP_USE_SSE - #ifdef __cplusplus extern "C" { @@ -63,17 +60,15 @@ void SKP_Silk_LBRR_encode_FLP( ); /* Initializes the Silk encoder state */ -SKP_int SKP_Silk_init_encoder_FLP( +SKP_int SKP_Silk_init_encoder( SKP_Silk_encoder_state_FLP *psEnc /* I/O Encoder state FLP */ ); /* Control the Silk encoder */ -SKP_int SKP_Silk_control_encoder_FLP( - SKP_Silk_encoder_state_FLP *psEnc, /* I/O Pointer to Silk encoder state FLP */ - const SKP_int PacketSize_ms, /* I Packet length (ms) */ - const SKP_int32 TargetRate_bps, /* I Target max bitrate (bps) */ - const SKP_int PacketLoss_perc, /* I Packet loss rate (in percent) */ - const SKP_int Complexity /* I Complexity (0-10) */ +SKP_int SKP_Silk_control_encoder( + SKP_Silk_encoder_state_FLP *psEnc, /* I/O Pointer to Silk encoder state FLP */ + SKP_SILK_SDK_EncControlStruct *encControl, /* I: Control structure */ + const SKP_int32 TargetRate_bps /* I Target max bitrate (bps) */ ); /****************/ diff --git a/src_FLP/SKP_Silk_noise_shape_analysis_FLP.c b/src_FLP/SKP_Silk_noise_shape_analysis_FLP.c index 001c3ac5c..05f98fa8a 100644 --- a/src_FLP/SKP_Silk_noise_shape_analysis_FLP.c +++ b/src_FLP/SKP_Silk_noise_shape_analysis_FLP.c @@ -138,25 +138,17 @@ void SKP_Silk_noise_shape_analysis_FLP( /* Point to start of first LPC analysis block */ x_ptr = x - psEnc->sCmn.la_shape; - /****************/ - /* CONTROL SNR */ - /****************/ - /* Reduce SNR_dB values if recent bitstream has exceeded TargetRate */ - psEncCtrl->current_SNR_dB = psEnc->SNR_dB - 0.1f * psEnc->BufferedInChannel_ms; - - /* Reduce SNR_dB because of any inband FEC used */ - psEncCtrl->current_SNR_dB -= psEnc->inBandFEC_SNR_comp; - /****************/ /* GAIN CONTROL */ /****************/ + SNR_adj_dB = psEnc->sCmn.SNR_dB_Q7 * ( 1 / 128.0f ); + /* Input quality is the average of the quality in the lowest two VAD bands */ psEncCtrl->input_quality = 0.5f * ( psEnc->sCmn.input_quality_bands_Q15[ 0 ] + psEnc->sCmn.input_quality_bands_Q15[ 1 ] ) * ( 1.0f / 32768.0f ); /* Coding quality level, between 0.0 and 1.0 */ - psEncCtrl->coding_quality = SKP_sigmoid( 0.25f * ( psEncCtrl->current_SNR_dB - 18.0f ) ); + psEncCtrl->coding_quality = SKP_sigmoid( 0.25f * ( SNR_adj_dB - 18.0f ) ); - SNR_adj_dB = psEncCtrl->current_SNR_dB; if( psEnc->sCmn.useCBR == 0 ) { /* Reduce coding SNR during low speech activity */ b = 1.0f - psEnc->sCmn.speech_activity_Q8 * ( 1.0f / 256.0f ); @@ -168,7 +160,7 @@ void SKP_Silk_noise_shape_analysis_FLP( SNR_adj_dB += HARM_SNR_INCR_dB * psEnc->LTPCorr; } else { /* For unvoiced signals and low-quality input, adjust the quality slower than SNR_dB setting */ - SNR_adj_dB += ( -0.4f * psEncCtrl->current_SNR_dB + 6.0f ) * ( 1.0f - psEncCtrl->input_quality ); + SNR_adj_dB += ( -0.4f * psEnc->sCmn.SNR_dB_Q7 * ( 1 / 128.0f ) + 6.0f ) * ( 1.0f - psEncCtrl->input_quality ); } /*************************/ diff --git a/src_FLP/SKP_Silk_process_gains_FLP.c b/src_FLP/SKP_Silk_process_gains_FLP.c index 7090933c1..4f0a2089e 100644 --- a/src_FLP/SKP_Silk_process_gains_FLP.c +++ b/src_FLP/SKP_Silk_process_gains_FLP.c @@ -48,7 +48,7 @@ void SKP_Silk_process_gains_FLP( } /* Limit the quantized signal */ - InvMaxSqrVal = ( SKP_float )( pow( 2.0f, 0.33f * ( 21.0f - psEncCtrl->current_SNR_dB ) ) / psEnc->sCmn.subfr_length ); + InvMaxSqrVal = ( SKP_float )( pow( 2.0f, 0.33f * ( 21.0f - psEnc->sCmn.SNR_dB_Q7 * ( 1 / 128.0f ) ) ) / psEnc->sCmn.subfr_length ); for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { /* Soft limit on ratio residual energy and squared gains */ diff --git a/src_FLP/SKP_Silk_structs_FLP.h b/src_FLP/SKP_Silk_structs_FLP.h index 8dbf7345e..2b57a02b5 100644 --- a/src_FLP/SKP_Silk_structs_FLP.h +++ b/src_FLP/SKP_Silk_structs_FLP.h @@ -30,6 +30,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "SKP_Silk_typedef.h" #include "SKP_Silk_main.h" +#include "SKP_Silk_structs.h" #ifdef __cplusplus extern "C" @@ -71,17 +72,12 @@ typedef struct { /* Buffer for find pitch and noise shape analysis */ SKP_float x_buf[ 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ];/* Buffer for find pitch and noise shape analysis */ SKP_float LTPCorr; /* Normalized correlation from pitch lag estimator */ - SKP_float SNR_dB; /* Quality setting */ - SKP_float BufferedInChannel_ms; /* Simulated number of ms buffer in channel because of exceeded TargetRate_bps */ /* Parameters for LTP scaling control */ SKP_float prevLTPredCodGain; SKP_float HPLTPredCodGain; - - SKP_float inBandFEC_SNR_comp; /* Compensation to SNR_DB when using inband FEC Voiced */ } SKP_Silk_encoder_state_FLP; - /************************/ /* Encoder control FLP */ /************************/ @@ -105,7 +101,6 @@ typedef struct { SKP_float Lambda; SKP_float input_quality; SKP_float coding_quality; - SKP_float current_SNR_dB; /* Measures */ SKP_float sparseness; diff --git a/src_FLP/src_FLP.vcxproj b/src_FLP/src_FLP.vcxproj index 576fe4fc8..6310247e9 100644 --- a/src_FLP/src_FLP.vcxproj +++ b/src_FLP/src_FLP.vcxproj @@ -80,14 +80,12 @@ </ItemGroup> <ItemGroup> <ClCompile Include="SKP_Silk_apply_sine_window_FLP.c" /> - <ClCompile Include="SKP_Silk_control_codec_FLP.c" /> <ClCompile Include="SKP_Silk_corrMatrix_FLP.c" /> <ClCompile Include="SKP_Silk_encode_frame_FLP.c" /> <ClCompile Include="SKP_Silk_find_LPC_FLP.c" /> <ClCompile Include="SKP_Silk_find_LTP_FLP.c" /> <ClCompile Include="SKP_Silk_find_pitch_lags_FLP.c" /> <ClCompile Include="SKP_Silk_find_pred_coefs_FLP.c" /> - <ClCompile Include="SKP_Silk_init_encoder_FLP.c" /> <ClCompile Include="SKP_Silk_LPC_analysis_filter_FLP.c" /> <ClCompile Include="SKP_Silk_LTP_analysis_filter_FLP.c" /> <ClCompile Include="SKP_Silk_LTP_scale_ctrl_FLP.c" /> diff --git a/src_FLP/src_FLP.vcxproj.filters b/src_FLP/src_FLP.vcxproj.filters index d55e6073b..92d93ea6e 100644 --- a/src_FLP/src_FLP.vcxproj.filters +++ b/src_FLP/src_FLP.vcxproj.filters @@ -32,9 +32,6 @@ <ClCompile Include="SKP_Silk_apply_sine_window_FLP.c"> <Filter>Source Files</Filter> </ClCompile> - <ClCompile Include="SKP_Silk_control_codec_FLP.c"> - <Filter>Source Files</Filter> - </ClCompile> <ClCompile Include="SKP_Silk_corrMatrix_FLP.c"> <Filter>Source Files</Filter> </ClCompile> @@ -53,9 +50,6 @@ <ClCompile Include="SKP_Silk_find_pred_coefs_FLP.c"> <Filter>Source Files</Filter> </ClCompile> - <ClCompile Include="SKP_Silk_init_encoder_FLP.c"> - <Filter>Source Files</Filter> - </ClCompile> <ClCompile Include="SKP_Silk_LPC_analysis_filter_FLP.c"> <Filter>Source Files</Filter> </ClCompile> diff --git a/src_SigProc_FIX/SKP_Silk_SigProc_FIX.h b/src_SigProc_FIX/SKP_Silk_SigProc_FIX.h index bfa84493c..56782b3a1 100644 --- a/src_SigProc_FIX/SKP_Silk_SigProc_FIX.h +++ b/src_SigProc_FIX/SKP_Silk_SigProc_FIX.h @@ -399,13 +399,6 @@ void SKP_Silk_burg_modified( const SKP_int D /* I order */ ); -/* Multiply a vector by a constant */ -void SKP_Silk_scale_vector16_Q14( - SKP_int16 *data1, - SKP_int gain_Q14, /* Gain in Q14 */ - SKP_int dataSize -); - /* Copy and multiply a vector by a constant */ void SKP_Silk_scale_copy_vector16( SKP_int16 *data_out, @@ -414,19 +407,6 @@ void SKP_Silk_scale_copy_vector16( const SKP_int dataSize /* I: length */ ); -void SKP_Silk_scale_vector32_16_Q14( - SKP_int32 *data1, /* I/O: Q0/Q0 */ - SKP_int gain_Q14, /* I: Q14 */ - SKP_int dataSize /* I: length */ -); - -/* Multiply a vector by a constant, does not saturate output data */ -void SKP_Silk_scale_vector32_Q16( - SKP_int32 *data1, /* I/O: Q0/Q0 */ - SKP_int32 gain_Q16, /* I: gain in Q16 ( SKP_int16_MIN <= gain_Q16 <= SKP_int16_MAX + 65536 ) */ - const SKP_int dataSize /* I: length */ -); - /* Some for the LTP related function requires Q26 to work.*/ void SKP_Silk_scale_vector32_Q26_lshift_18( SKP_int32 *data1, /* I/O: Q0/Q18 */ @@ -439,30 +419,25 @@ void SKP_Silk_scale_vector32_Q26_lshift_18( /********************************************************************/ /* return sum(inVec1[i]*inVec2[i]) */ -/* inVec1 and inVec2 should be increasing ordered, and starting address should be 4 byte aligned. (a factor of 4)*/ SKP_int32 SKP_Silk_inner_prod_aligned( - const SKP_int16* const inVec1, /* I input vector 1 */ - const SKP_int16* const inVec2, /* I input vector 2 */ - const SKP_int len /* I vector lengths */ + const SKP_int16 *const inVec1, /* I input vector 1 */ + const SKP_int16 *const inVec2, /* I input vector 2 */ + const SKP_int len /* I vector lengths */ ); -SKP_int32 SKP_Silk_inner_prod16_aligned_sat( - const SKP_int16* const inVec1, /* I input vector 1 */ - const SKP_int16* const inVec2, /* I input vector 2 */ - const SKP_int len /* I vector lengths */ -); - -SKP_int64 SKP_Silk_inner_prod_aligned_64( - const SKP_int32 *inVec1, /* I input vector 1 */ - const SKP_int32 *inVec2, /* I input vector 2 */ - const SKP_int len /* I vector lengths */ +SKP_int32 SKP_Silk_inner_prod_aligned_scale( + const SKP_int16 *const inVec1, /* I input vector 1 */ + const SKP_int16 *const inVec2, /* I input vector 2 */ + const SKP_int scale, /* I number of bits to shift */ + const SKP_int len /* I vector lengths */ ); SKP_int64 SKP_Silk_inner_prod16_aligned_64( - const SKP_int16 *inVec1, /* I input vector 1 */ - const SKP_int16 *inVec2, /* I input vector 2 */ - const SKP_int len /* I vector lengths */ + const SKP_int16 *inVec1, /* I input vector 1 */ + const SKP_int16 *inVec2, /* I input vector 2 */ + const SKP_int len /* I vector lengths */ ); + /********************************************************************/ /* MACROS */ /********************************************************************/ diff --git a/src_SigProc_FIX/SKP_Silk_allpass_int.c b/src_SigProc_FIX/SKP_Silk_allpass_int.c deleted file mode 100644 index bc2f7cea2..000000000 --- a/src_SigProc_FIX/SKP_Silk_allpass_int.c +++ /dev/null @@ -1,69 +0,0 @@ -/*********************************************************************** -Copyright (c) 2006-2011, Skype Limited. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, (subject to the limitations in the disclaimer below) -are permitted provided that the following conditions are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Skype Limited, nor the names of specific -contributors, may be used to endorse or promote products derived from -this software without specific prior written permission. -NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED -BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND -CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -/* * - * SKP_Silk_allpass_int.c * - * * - * First-order allpass filter with * - * transfer function: * - * * - * A + Z^(-1) * - * H(z) = ------------ * - * 1 + A*Z^(-1) * - * * - * Implemented using minimum multiplier filter design. * - * * - * Reference: http://www.univ.trieste.it/~ramponi/teaching/ * - * DSP/materiale/Ch6(2).pdf * - * * - * Copyright 2007 (c), Skype Limited * - * Date: 070525 * - * */ -#include "SKP_Silk_SigProc_FIX.h" - - -/* First-order allpass filter */ -void SKP_Silk_allpass_int( - const SKP_int32 *in, /* I: Q25 input signal [len] */ - SKP_int32 *S, /* I/O: Q25 state [1] */ - SKP_int A, /* I: Q15 coefficient (0 <= A < 32768) */ - SKP_int32 *out, /* O: Q25 output signal [len] */ - const SKP_int32 len /* I: Number of samples */ -) -{ - SKP_int32 Y2, X2, S0; - SKP_int k; - - S0 = S[ 0 ]; - for( k = len - 1; k >= 0; k-- ) { - Y2 = *in - S0; - X2 = ( Y2 >> 15 ) * A + ( ( ( Y2 & 0x00007FFF ) * A ) >> 15 ); - ( *out++ ) = S0 + X2; - S0 = ( *in++ ) + X2; - } - S[ 0 ] = S0; -} diff --git a/src_SigProc_FIX/SKP_Silk_autocorr.c b/src_SigProc_FIX/SKP_Silk_autocorr.c index f7862b894..c7f8b2926 100644 --- a/src_SigProc_FIX/SKP_Silk_autocorr.c +++ b/src_SigProc_FIX/SKP_Silk_autocorr.c @@ -25,15 +25,6 @@ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ -/* * - * SKP_Silk_autocorr.c * - * * - * Calculates the autocorrelation * - * The result has 29 non-zero bits for the first correlation, to leave * - * some room for adding white noise fractions etc. * - * * - * Copyright 2008 (c), Skype Limited * - * */ #include "SKP_Silk_SigProc_FIX.h" /* Compute autocorrelation */ diff --git a/src_SigProc_FIX/SKP_Silk_debug.c b/src_SigProc_FIX/SKP_Silk_debug.c index 2e3f691e9..c8c9b609c 100644 --- a/src_SigProc_FIX/SKP_Silk_debug.c +++ b/src_SigProc_FIX/SKP_Silk_debug.c @@ -37,6 +37,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "SKP_debug.h" #include "../src_SigProc_FIX/SKP_Silk_SigProc_FIX.h" +#if SKP_TIC_TOC + #ifdef _WIN32 #if (defined(_WIN32) || defined(_WINCE)) @@ -65,8 +67,6 @@ unsigned long GetHighResolutionTime(void) /* O: time in usec*/ } #endif -#if SKP_TIC_TOC - int SKP_Timer_nTimers = 0; int SKP_Timer_depth_ctr = 0; char SKP_Timer_tags[SKP_NUM_TIMERS_MAX][SKP_NUM_TIMERS_MAX_TAG_LEN]; diff --git a/src_SigProc_FIX/SKP_Silk_inner_prod_aligned.c b/src_SigProc_FIX/SKP_Silk_inner_prod_aligned.c index 98025c752..cc0364feb 100644 --- a/src_SigProc_FIX/SKP_Silk_inner_prod_aligned.c +++ b/src_SigProc_FIX/SKP_Silk_inner_prod_aligned.c @@ -34,9 +34,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* * only when len>6, memory access can be reduced by half. */ SKP_int32 SKP_Silk_inner_prod_aligned( - const SKP_int16* const inVec1, /* I input vector 1 */ - const SKP_int16* const inVec2, /* I input vector 2 */ - const SKP_int len /* I vector lengths */ + const SKP_int16 *const inVec1, /* I input vector 1 */ + const SKP_int16 *const inVec2, /* I input vector 2 */ + const SKP_int len /* I vector lengths */ ) { SKP_int i; @@ -47,23 +47,25 @@ SKP_int32 SKP_Silk_inner_prod_aligned( return sum; } -SKP_int64 SKP_Silk_inner_prod_aligned_64( - const SKP_int32 *inVec1, /* I input vector 1 */ - const SKP_int32 *inVec2, /* I input vector 2 */ - const SKP_int len /* I vector lengths */ +SKP_int32 SKP_Silk_inner_prod_aligned_scale( + const SKP_int16 *const inVec1, /* I input vector 1 */ + const SKP_int16 *const inVec2, /* I input vector 2 */ + const SKP_int scale, /* I number of bits to shift */ + const SKP_int len /* I vector lengths */ ) { SKP_int i; - SKP_int64 sum = 0; + SKP_int32 sum = 0; for( i = 0; i < len; i++ ) { - sum = SKP_SMLAL( sum, inVec1[ i ], inVec2[ i ] ); + sum = SKP_ADD_RSHIFT32( sum, SKP_SMULBB( inVec1[ i ], inVec2[ i ] ), scale ); } return sum; } + SKP_int64 SKP_Silk_inner_prod16_aligned_64( - const SKP_int16 *inVec1, /* I input vector 1 */ - const SKP_int16 *inVec2, /* I input vector 2 */ - const SKP_int len /* I vector lengths */ + const SKP_int16 *inVec1, /* I input vector 1 */ + const SKP_int16 *inVec2, /* I input vector 2 */ + const SKP_int len /* I vector lengths */ ) { SKP_int i; @@ -73,17 +75,3 @@ SKP_int64 SKP_Silk_inner_prod16_aligned_64( } return sum; } - -SKP_int32 SKP_Silk_inner_prod16_aligned_sat( - const SKP_int16* const inVec1, /* I input vector 1 */ - const SKP_int16* const inVec2, /* I input vector 2 */ - const SKP_int len /* I vector lengths */ -) -{ - SKP_int i; - SKP_int32 sum = 0; - for( i = 0; i < len; i++ ) { - sum = SKP_ADD_SAT32( sum, SKP_SMULBB( inVec1[ i ], inVec2[ i ] ) ); - } - return sum; -} diff --git a/src_SigProc_FIX/SKP_Silk_lowpass_int.c b/src_SigProc_FIX/SKP_Silk_lowpass_int.c deleted file mode 100644 index ac254551c..000000000 --- a/src_SigProc_FIX/SKP_Silk_lowpass_int.c +++ /dev/null @@ -1,61 +0,0 @@ -/*********************************************************************** -Copyright (c) 2006-2011, Skype Limited. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, (subject to the limitations in the disclaimer below) -are permitted provided that the following conditions are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Skype Limited, nor the names of specific -contributors, may be used to endorse or promote products derived from -this software without specific prior written permission. -NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED -BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND -CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -/* * - * SKP_Silk_lowpass_int.c * - * * - * First order low-pass filter, with input as SKP_int32, running at * - * 48 kHz * - * * - * Copyright 2006 (c), Skype Limited * - * Date: 060221 * - * */ -#include "SKP_Silk_SigProc_FIX.h" - -/* First order low-pass filter, with input as SKP_int32, running at 48 kHz */ -void SKP_Silk_lowpass_int( - const SKP_int32 *in, /* I: Q25 48 kHz signal; length = len */ - SKP_int32 *S, /* I/O: Q25 state; length = 1 */ - SKP_int32 *out, /* O: Q25 48 kHz signal; length = len */ - const SKP_int32 len /* I: Number of samples */ -) -{ - SKP_int k; - SKP_int32 in_tmp, out_tmp, state; - - state = S[ 0 ]; - for( k = len; k > 0; k-- ) { - in_tmp = *in++; - in_tmp -= SKP_RSHIFT( in_tmp, 2 ); /* multiply by 0.75 */ - out_tmp = state + in_tmp; /* zero at nyquist */ - state = in_tmp - SKP_RSHIFT( out_tmp, 1 ); /* pole */ - *out++ = out_tmp; - } - S[ 0 ] = state; -} - - diff --git a/src_SigProc_FIX/SKP_Silk_resampler_private_up2_HQ.c b/src_SigProc_FIX/SKP_Silk_resampler_private_up2_HQ.c index afb4a12f0..b161f92da 100644 --- a/src_SigProc_FIX/SKP_Silk_resampler_private_up2_HQ.c +++ b/src_SigProc_FIX/SKP_Silk_resampler_private_up2_HQ.c @@ -25,14 +25,6 @@ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ -/* * - * SKP_Silk_resampler_private_up2_HQ.c * - * * - * Upsample by a factor 2, high quality * - * * - * Copyright 2010 (c), Skype Limited * - * */ - #include "SKP_Silk_SigProc_FIX.h" #include "SKP_Silk_resampler_private.h" diff --git a/src_SigProc_FIX/SKP_Silk_resampler_private_up4.c b/src_SigProc_FIX/SKP_Silk_resampler_private_up4.c index 9c63d400e..c099893db 100644 --- a/src_SigProc_FIX/SKP_Silk_resampler_private_up4.c +++ b/src_SigProc_FIX/SKP_Silk_resampler_private_up4.c @@ -25,18 +25,10 @@ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ -/* * - * SKP_Silk_resampler_private_up4.c * - * * - * Upsample by a factor 4, low quality * - * * - * Copyright 2010 (c), Skype Limited * - * */ - #include "SKP_Silk_SigProc_FIX.h" #include "SKP_Silk_resampler_private.h" -/* Upsample by a factor 4, Note: very low quality, only use with output sampling rates above 96 kHz. */ +/* Upsample by a factor 4, Note: low quality, only use with output sampling rates above 96 kHz. */ void SKP_Silk_resampler_private_up4( SKP_int32 *S, /* I/O: State vector [ 2 ] */ SKP_int16 *out, /* O: Output signal [ 4 * len ] */ diff --git a/src_SigProc_FIX/SKP_Silk_resampler_rom.h b/src_SigProc_FIX/SKP_Silk_resampler_rom.h index e08f83ab9..e541f5081 100644 --- a/src_SigProc_FIX/SKP_Silk_resampler_rom.h +++ b/src_SigProc_FIX/SKP_Silk_resampler_rom.h @@ -25,18 +25,6 @@ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ -/* * - * File Name: SKP_Silk_resample_rom.h * - * * - * Description: Header file for FIR resampling of * - * 32 and 44 kHz input * - * * - * Copyright 2007 (c), Skype Limited * - * All rights reserved. * - * * - * Date: 070807 * - * */ - #ifndef _SKP_SILK_FIX_RESAMPLER_ROM_H_ #define _SKP_SILK_FIX_RESAMPLER_ROM_H_ diff --git a/src_SigProc_FIX/SKP_Silk_resampler_structs.h b/src_SigProc_FIX/SKP_Silk_resampler_structs.h index e4513e3e0..292422b72 100644 --- a/src_SigProc_FIX/SKP_Silk_resampler_structs.h +++ b/src_SigProc_FIX/SKP_Silk_resampler_structs.h @@ -43,7 +43,7 @@ extern "C" { #endif /* Flag to enable support for input/output sampling rates above 48 kHz. Turn off for embedded devices */ -#define RESAMPLER_SUPPORT_ABOVE_48KHZ 1 +#define RESAMPLER_SUPPORT_ABOVE_48KHZ 1 #define SKP_Silk_RESAMPLER_MAX_FIR_ORDER 16 #define SKP_Silk_RESAMPLER_MAX_IIR_ORDER 6 diff --git a/src_SigProc_FIX/SKP_Silk_scale_vector.c b/src_SigProc_FIX/SKP_Silk_scale_vector.c index a3615e7a6..a6734183b 100644 --- a/src_SigProc_FIX/SKP_Silk_scale_vector.c +++ b/src_SigProc_FIX/SKP_Silk_scale_vector.c @@ -27,25 +27,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "SKP_Silk_SigProc_FIX.h" -/* Multiply a vector by a constant */ -void SKP_Silk_scale_vector16_Q14( - SKP_int16 *data1, - SKP_int gain_Q14, /* Gain in Q14 */ - SKP_int dataSize -) -{ - SKP_int i; - SKP_int32 gain_Q16; - - SKP_assert( gain_Q14 < 32768 ); - SKP_assert( gain_Q14 >= -32768 ); - - gain_Q16 = SKP_LSHIFT( gain_Q14, 2 ); - for( i = 0; i < dataSize; i ++ ) { - data1[ i ] = SKP_SMULWB( gain_Q16, data1[ i ] ); - } -} - /* Multiply a vector by a constant */ void SKP_Silk_scale_vector32_Q26_lshift_18( SKP_int32 *data1, /* (I/O): Q0/Q18 */ @@ -59,49 +40,3 @@ void SKP_Silk_scale_vector32_Q26_lshift_18( data1[ i ] = (SKP_int32)SKP_CHECK_FIT32( SKP_RSHIFT64( SKP_SMULL( data1[ i ], gain_Q26 ), 8 ) );// OUTPUT: Q18 } } - -/* Multiply a vector by a constant */ -void SKP_Silk_scale_vector32_16_Q14( - SKP_int32 *data1, /* (I/O): Q0/Q0 */ - SKP_int gain_Q14, /* (I): Q14 */ - SKP_int dataSize /* (I): length */ -) -{ - SKP_int i, gain_Q16; - - if( gain_Q14 < ( SKP_int16_MAX >> 2 ) ) { - gain_Q16 = SKP_LSHIFT( gain_Q14, 2 ); - for( i = 0; i < dataSize; i++ ) { - data1[ i ] = SKP_SMULWB( data1[ i ], gain_Q16 ); - } - } else { - SKP_assert( gain_Q14 >= SKP_int16_MIN ); - for( i = 0; i < dataSize; i++ ) { - data1[ i ] = SKP_LSHIFT( SKP_SMULWB( data1[ i ], gain_Q14 ), 2 ); - } - } -} - -/* Multiply a vector by a constant, does not saturate output data */ -void SKP_Silk_scale_vector32_Q16( - SKP_int32 *data1, /* (I/O): Q0/Q0 */ - SKP_int32 gain_Q16, /* (I): gain in Q16 ( SKP_int16_MIN <= gain_Q16 <= SKP_int16_MAX + 65536 ) */ - const SKP_int dataSize /* (I): length */ -) -{ - SKP_int i; - - SKP_assert( gain_Q16 <= SKP_int16_MAX + 65536 ); - SKP_assert( gain_Q16 >= SKP_int16_MIN ); - - if( gain_Q16 > SKP_int16_MAX ) { - gain_Q16 -= 65536; - for( i = 0; i < dataSize; i++ ) { - data1[ i ] = SKP_SMLAWB( data1[ i ], data1[ i ], gain_Q16 ); - } - } else { - for( i = 0; i < dataSize; i++ ) { - data1[ i ] = SKP_SMULWB( data1[ i ], gain_Q16 ); - } - } -} diff --git a/src_SigProc_FIX/SKP_Silk_schur64.c b/src_SigProc_FIX/SKP_Silk_schur64.c index 891b59a51..f2cc70ac3 100644 --- a/src_SigProc_FIX/SKP_Silk_schur64.c +++ b/src_SigProc_FIX/SKP_Silk_schur64.c @@ -25,20 +25,11 @@ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ -/* * - * SKP_Silk_schur64.c * - * * - * Calculates the reflection coefficients from the correlation sequence * - * using extra precision * - * * - * Copyright 2008 (c), Skype Limited * - * Date: 080103 * - * */ #include "SKP_Silk_SigProc_FIX.h" /* Slower than schur(), but more accurate. */ /* Uses SMULL(), available on armv4 */ -SKP_int32 SKP_Silk_schur64( /* O: Returns residual energy */ +SKP_int32 SKP_Silk_schur64( /* O: Returns residual energy */ SKP_int32 rc_Q16[], /* O: Reflection coefficients [order] Q16 */ const SKP_int32 c[], /* I: Correlations [order+1] */ SKP_int32 order /* I: Prediction order */ diff --git a/src_SigProc_FIX/SKP_Silk_sum_sqr_shift.c b/src_SigProc_FIX/SKP_Silk_sum_sqr_shift.c index a7cd69154..d1848ef26 100644 --- a/src_SigProc_FIX/SKP_Silk_sum_sqr_shift.c +++ b/src_SigProc_FIX/SKP_Silk_sum_sqr_shift.c @@ -25,15 +25,8 @@ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ -/* * - * SKP_Silk_sum_sqr_shift.c * - * * - * compute number of bits to right shift the sum of squares of a vector * - * of int16s to make it fit in an int32 * - * * - * Copyright 2006-2008 (c), Skype Limited * - * */ #include "SKP_Silk_SigProc_FIX.h" + /* Compute number of bits to right shift the sum of squares of a vector */ /* of int16s to make it fit in an int32 */ void SKP_Silk_sum_sqr_shift( @@ -44,24 +37,14 @@ void SKP_Silk_sum_sqr_shift( ) { SKP_int i, shft; - SKP_int32 in32, nrg_tmp, nrg; + SKP_int32 nrg_tmp, nrg; - if( (SKP_int32)( (SKP_int_ptr_size)x & 2 ) != 0 ) { - /* Input is not 4-byte aligned */ - nrg = SKP_SMULBB( x[ 0 ], x[ 0 ] ); - i = 1; - } else { - nrg = 0; - i = 0; - } + nrg = 0; shft = 0; len--; - while( i < len ) { - /* Load two values at once */ - in32 = *( (SKP_int32 *)&x[ i ] ); - nrg = SKP_SMLABB_ovflw( nrg, in32, in32 ); - nrg = SKP_SMLATT_ovflw( nrg, in32, in32 ); - i += 2; + for( i = 0; i < len; i += 2 ) { + nrg = SKP_SMLABB_ovflw( nrg, x[ i ], x[ i ] ); + nrg = SKP_SMLABB_ovflw( nrg, x[ i + 1 ], x[ i + 1 ] ); if( nrg < 0 ) { /* Scale down */ nrg = (SKP_int32)SKP_RSHIFT_uint( (SKP_uint32)nrg, 2 ); @@ -70,10 +53,8 @@ void SKP_Silk_sum_sqr_shift( } } for( ; i < len; i += 2 ) { - /* Load two values at once */ - in32 = *( (SKP_int32 *)&x[ i ] ); - nrg_tmp = SKP_SMULBB( in32, in32 ); - nrg_tmp = SKP_SMLATT_ovflw( nrg_tmp, in32, in32 ); + nrg_tmp = SKP_SMULBB( x[ i ], x[ i ] ); + nrg_tmp = SKP_SMLABB_ovflw( nrg_tmp, x[ i + 1 ], x[ i + 1 ] ); nrg = (SKP_int32)SKP_ADD_RSHIFT_uint( nrg, (SKP_uint32)nrg_tmp, shft ); if( nrg < 0 ) { /* Scale down */ diff --git a/src_SigProc_FLP/SKP_Silk_SigProc_FLP.h b/src_SigProc_FLP/SKP_Silk_SigProc_FLP.h index 9c37d6957..97067bd1f 100644 --- a/src_SigProc_FLP/SKP_Silk_SigProc_FLP.h +++ b/src_SigProc_FLP/SKP_Silk_SigProc_FLP.h @@ -113,13 +113,6 @@ void SKP_Silk_insertion_sort_decreasing_FLP( const SKP_int K /* I: Number of correctly sorted positions */ ); -void SKP_Silk_insertion_sort_increasing_FLP( - SKP_float *a, /* I/O: Unsorted / Sorted vector */ - SKP_int *index, /* O: Index vector for the sorted elements */ - const SKP_int L, /* I: Vector length */ - const SKP_int K /* I: Number of correctly sorted positions */ -); - /* Compute reflection coefficients from input signal */ SKP_float SKP_Silk_burg_modified_FLP( /* O returns residual energy */ SKP_float A[], /* O prediction coefficients (length order) */ diff --git a/src_SigProc_FLP/SKP_Silk_sort_FLP.c b/src_SigProc_FLP/SKP_Silk_sort_FLP.c index fa592de2b..20d3f7d5b 100644 --- a/src_SigProc_FLP/SKP_Silk_sort_FLP.c +++ b/src_SigProc_FLP/SKP_Silk_sort_FLP.c @@ -32,52 +32,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "SKP_Silk_typedef.h" #include "SKP_Silk_SigProc_FLP.h" -void SKP_Silk_insertion_sort_increasing_FLP( - SKP_float *a, /* I/O: Unsorted / Sorted vector */ - SKP_int *index, /* O: Index vector for the sorted elements */ - const SKP_int L, /* I: Vector length */ - const SKP_int K /* I: Number of correctly sorted positions */ -) -{ - SKP_float value; - SKP_int i, j; - - /* Safety checks */ - SKP_assert( K > 0 ); - SKP_assert( L > 0 ); - SKP_assert( L >= K ); - - /* Write start indices in index vector */ - for( i = 0; i < K; i++ ) { - index[ i ] = i; - } - - /* Sort vector elements by value, increasing order */ - for( i = 1; i < K; i++ ) { - value = a[ i ]; - for( j = i - 1; ( j >= 0 ) && ( value < a[ j ] ); j-- ) { - a[ j + 1 ] = a[ j ]; /* Shift value */ - index[ j + 1 ] = index[ j ]; /* Shift index */ - } - a[ j + 1 ] = value; /* Write value */ - index[ j + 1 ] = i; /* Write index */ - } - - /* If less than L values are asked check the remaining values, */ - /* but only spend CPU to ensure that the K first values are correct */ - for( i = K; i < L; i++ ) { - value = a[ i ]; - if( value < a[ K - 1 ] ) { - for( j = K - 2; ( j >= 0 ) && ( value < a[ j ] ); j-- ) { - a[ j + 1 ] = a[ j ]; /* Shift value */ - index[ j + 1 ] = index[ j ]; /* Shift index */ - } - a[ j + 1 ] = value; /* Write value */ - index[ j + 1 ] = i; /* Write index */ - } - } -} - void SKP_Silk_insertion_sort_decreasing_FLP( SKP_float *a, /* I/O: Unsorted / Sorted vector */ SKP_int *index, /* O: Index vector for the sorted elements */ @@ -123,25 +77,3 @@ void SKP_Silk_insertion_sort_decreasing_FLP( } } } - -void SKP_Silk_insertion_sort_increasing_all_values_FLP( - SKP_float *a, /* I/O: Unsorted / Sorted vector */ - const SKP_int L /* I: Vector length */ -) -{ - SKP_float value; - SKP_int i, j; - - /* Safety checks */ - SKP_assert( L > 0 ); - - /* Sort vector elements by value, increasing order */ - for( i = 1; i < L; i++ ) { - value = a[ i ]; - for( j = i - 1; ( j >= 0 ) && ( value < a[ j ] ); j-- ) { - a[ j + 1 ] = a[ j ]; /* Shift value */ - } - a[ j + 1 ] = value; /* Write value */ - } -} - diff --git a/src_common/SKP_Silk_LBRR_embed.c b/src_common/SKP_Silk_LBRR_embed.c deleted file mode 100644 index c5080d15d..000000000 --- a/src_common/SKP_Silk_LBRR_embed.c +++ /dev/null @@ -1,59 +0,0 @@ -/*********************************************************************** -Copyright (c) 2006-2011, Skype Limited. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, (subject to the limitations in the disclaimer below) -are permitted provided that the following conditions are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Skype Limited, nor the names of specific -contributors, may be used to endorse or promote products derived from -this software without specific prior written permission. -NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED -BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND -CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -#include "SKP_Silk_main.h" - -/*******************************************/ -/* Encode LBRR side info and excitation */ -/*******************************************/ -void SKP_Silk_LBRR_embed( - SKP_Silk_encoder_state *psEncC, /* I/O Encoder state */ - ec_enc *psRangeEnc /* I/O Compressor data structure */ -) -{ - SKP_int i; - SKP_int32 LBRR_symbol; - - /* Encode LBRR flags */ - LBRR_symbol = 0; - for( i = 0; i < psEncC->nFramesPerPacket; i++ ) { - LBRR_symbol |= SKP_LSHIFT( psEncC->LBRR_flags[ i ], i ); - } - psEncC->LBRR_flag = LBRR_symbol > 0 ? 1 : 0; - if( LBRR_symbol && psEncC->nFramesPerPacket > 1 ) { - ec_enc_icdf( psRangeEnc, LBRR_symbol - 1, SKP_Silk_LBRR_flags_iCDF_ptr[ psEncC->nFramesPerPacket - 2 ], 8 ); - } - - /* Code indices and excitation signals */ - for( i = 0; i < psEncC->nFramesPerPacket; i++ ) { - if( psEncC->LBRR_flags[ i ] ) { - SKP_Silk_encode_indices( psEncC, psRangeEnc, i, 1 ); - SKP_Silk_encode_pulses( psRangeEnc, psEncC->indices_LBRR[i].signalType, - psEncC->indices_LBRR[i].quantOffsetType, psEncC->pulses_LBRR[ i ], psEncC->frame_length ); - } - } -} diff --git a/src_common/SKP_Silk_LP_variable_cutoff.c b/src_common/SKP_Silk_LP_variable_cutoff.c index 57c5939e5..f95bbc91d 100644 --- a/src_common/SKP_Silk_LP_variable_cutoff.c +++ b/src_common/SKP_Silk_LP_variable_cutoff.c @@ -34,9 +34,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "SKP_Silk_main.h" -#if SWITCH_TRANSITION_FILTERING - -/* Helper function, that interpolates the filter taps */ +/* Helper function, interpolates the filter taps */ SKP_INLINE void SKP_Silk_LP_interpolate_filter_taps( SKP_int32 B_Q28[ TRANSITION_NB ], SKP_int32 A_Q28[ TRANSITION_NA ], @@ -133,4 +131,3 @@ void SKP_Silk_LP_variable_cutoff( SKP_Silk_biquad_alt( signal, B_Q28, A_Q28, psLP->In_LP_State, signal, frame_length ); } } -#endif diff --git a/src_common/SKP_Silk_NLSF_MSVQ_decode.c b/src_common/SKP_Silk_NLSF_MSVQ_decode.c deleted file mode 100644 index a48448fae..000000000 --- a/src_common/SKP_Silk_NLSF_MSVQ_decode.c +++ /dev/null @@ -1,106 +0,0 @@ -/*********************************************************************** -Copyright (c) 2006-2011, Skype Limited. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, (subject to the limitations in the disclaimer below) -are permitted provided that the following conditions are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Skype Limited, nor the names of specific -contributors, may be used to endorse or promote products derived from -this software without specific prior written permission. -NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED -BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND -CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -#include "SKP_Silk_main.h" - -/* NLSF vector decoder */ -void SKP_Silk_NLSF_MSVQ_decode( - SKP_int *pNLSF_Q15, /* O Pointer to decoded output vector [LPC_ORDER x 1] */ - const SKP_Silk_NLSF_CB_struct *psNLSF_CB, /* I Pointer to NLSF codebook struct */ - const SKP_int8 *NLSFIndices, /* I Pointer to NLSF indices [nStages x 1] */ - const SKP_int LPC_order /* I LPC order used */ -) -{ - const SKP_int8 *pCB_element; - SKP_int i, s; - SKP_int pNLSF_Q8[ MAX_LPC_ORDER ]; - - /* Check that index is within valid range */ - SKP_assert( 0 <= NLSFIndices[ 0 ] && NLSFIndices[ 0 ] < psNLSF_CB->CBStages[ 0 ].nVectors ); - - /* Point to the first vector element */ - pCB_element = &psNLSF_CB->CBStages[ 0 ].CB_NLSF_Q8[ SKP_SMULBB( (SKP_int16)NLSFIndices[ 0 ], LPC_order ) ]; - - /* Initialize with the codebook vector from stage 0 */ - for( i = 0; i < LPC_order; i++ ) { - pNLSF_Q8[ i ] = SKP_LSHIFT( ( SKP_int )pCB_element[ i ], NLSF_Q_DOMAIN_STAGE_2_TO_LAST - NLSF_Q_DOMAIN_STAGE_0 ); - } - - if( LPC_order == 16 ) { - for( s = 1; s < psNLSF_CB->nStages; s++ ) { - /* Check that each index is within valid range */ - SKP_assert( 0 <= NLSFIndices[ s ] && NLSFIndices[ s ] < psNLSF_CB->CBStages[ s ].nVectors ); - - /* Point to the first vector element */ - pCB_element = &psNLSF_CB->CBStages[ s ].CB_NLSF_Q8[ 16 * (SKP_int16)NLSFIndices[ s ] ]; - - /* Add the codebook vector from the current stage */ - pNLSF_Q8[ 0 ] += ( SKP_int )pCB_element[ 0 ]; - pNLSF_Q8[ 1 ] += ( SKP_int )pCB_element[ 1 ]; - pNLSF_Q8[ 2 ] += ( SKP_int )pCB_element[ 2 ]; - pNLSF_Q8[ 3 ] += ( SKP_int )pCB_element[ 3 ]; - pNLSF_Q8[ 4 ] += ( SKP_int )pCB_element[ 4 ]; - pNLSF_Q8[ 5 ] += ( SKP_int )pCB_element[ 5 ]; - pNLSF_Q8[ 6 ] += ( SKP_int )pCB_element[ 6 ]; - pNLSF_Q8[ 7 ] += ( SKP_int )pCB_element[ 7 ]; - pNLSF_Q8[ 8 ] += ( SKP_int )pCB_element[ 8 ]; - pNLSF_Q8[ 9 ] += ( SKP_int )pCB_element[ 9 ]; - pNLSF_Q8[ 10 ] += ( SKP_int )pCB_element[ 10 ]; - pNLSF_Q8[ 11 ] += ( SKP_int )pCB_element[ 11 ]; - pNLSF_Q8[ 12 ] += ( SKP_int )pCB_element[ 12 ]; - pNLSF_Q8[ 13 ] += ( SKP_int )pCB_element[ 13 ]; - pNLSF_Q8[ 14 ] += ( SKP_int )pCB_element[ 14 ]; - pNLSF_Q8[ 15 ] += ( SKP_int )pCB_element[ 15 ]; - } - } else { - SKP_assert( LPC_order == 10 ); - for( s = 1; s < psNLSF_CB->nStages; s++ ) { - /* Point to the first vector element */ - pCB_element = &psNLSF_CB->CBStages[ s ].CB_NLSF_Q8[ SKP_SMULBB( (SKP_int16)NLSFIndices[ s ], LPC_order ) ]; - - /* Add the codebook vector from the current stage */ - pNLSF_Q8[ 0 ] += ( SKP_int )pCB_element[ 0 ]; - pNLSF_Q8[ 1 ] += ( SKP_int )pCB_element[ 1 ]; - pNLSF_Q8[ 2 ] += ( SKP_int )pCB_element[ 2 ]; - pNLSF_Q8[ 3 ] += ( SKP_int )pCB_element[ 3 ]; - pNLSF_Q8[ 4 ] += ( SKP_int )pCB_element[ 4 ]; - pNLSF_Q8[ 5 ] += ( SKP_int )pCB_element[ 5 ]; - pNLSF_Q8[ 6 ] += ( SKP_int )pCB_element[ 6 ]; - pNLSF_Q8[ 7 ] += ( SKP_int )pCB_element[ 7 ]; - pNLSF_Q8[ 8 ] += ( SKP_int )pCB_element[ 8 ]; - pNLSF_Q8[ 9 ] += ( SKP_int )pCB_element[ 9 ]; - } - } - - /* Add 1/2 in Q15 */ - for( i = 0; i < LPC_order; i++ ) { - pNLSF_Q15[ i ] = SKP_LSHIFT16( pNLSF_Q8[ i ], 15 - NLSF_Q_DOMAIN_STAGE_2_TO_LAST ) + SKP_FIX_CONST( 0.5f, 15 ); - } - - /* NLSF stabilization */ - SKP_Silk_NLSF_stabilize( pNLSF_Q15, psNLSF_CB->NDeltaMin_Q15, LPC_order ); -} diff --git a/src_common/SKP_Silk_NLSF_MSVQ_encode.c b/src_common/SKP_Silk_NLSF_MSVQ_encode.c deleted file mode 100644 index 343e1fd80..000000000 --- a/src_common/SKP_Silk_NLSF_MSVQ_encode.c +++ /dev/null @@ -1,238 +0,0 @@ -/*********************************************************************** -Copyright (c) 2006-2011, Skype Limited. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, (subject to the limitations in the disclaimer below) -are permitted provided that the following conditions are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Skype Limited, nor the names of specific -contributors, may be used to endorse or promote products derived from -this software without specific prior written permission. -NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED -BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND -CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -#include "SKP_Silk_main.h" - -/***********************/ -/* NLSF vector encoder */ -/***********************/ -void SKP_Silk_NLSF_MSVQ_encode( - SKP_int8 *NLSFIndices, /* O Codebook path vector [ CB_STAGES ] */ - SKP_int *pNLSF_Q15, /* I/O Quantized NLSF vector [ LPC_ORDER ] */ - const SKP_Silk_NLSF_CB_struct *psNLSF_CB, /* I Codebook object */ - const SKP_int *pNLSF_q_Q15_prev, /* I Prev. quantized NLSF vector [LPC_ORDER] */ - const SKP_int *pW_Q5, /* I NLSF weight vector [ LPC_ORDER ] */ - const SKP_int NLSF_mu_Q15, /* I Rate weight for the RD optimization */ - const SKP_int NLSF_mu_fluc_red_Q16, /* I Fluctuation reduction error weight */ - const SKP_int NLSF_MSVQ_Survivors, /* I Max survivors from each stage */ - const SKP_int LPC_order, /* I LPC order */ - const SKP_int deactivate_fluc_red /* I Deactivate fluctuation reduction */ -) -{ - SKP_int i, s, k, cur_survivors = 0, prev_survivors, min_survivors, input_index, cb_index, bestIndex; - SKP_int32 rateDistThreshold_Q18; -#if( NLSF_MSVQ_FLUCTUATION_REDUCTION == 1 ) - SKP_int32 se_Q15, wsse_Q20, bestRateDist_Q20; -#endif - - SKP_int32 pRateDist_Q18[ NLSF_MSVQ_TREE_SEARCH_MAX_VECTORS_EVALUATED ]; - SKP_int32 pRate_Q4[ MAX_NLSF_MSVQ_SURVIVORS ]; - SKP_int32 pRate_new_Q4[ MAX_NLSF_MSVQ_SURVIVORS ]; - SKP_int pTempIndices[ MAX_NLSF_MSVQ_SURVIVORS ]; - SKP_int8 pPath[ MAX_NLSF_MSVQ_SURVIVORS * NLSF_MSVQ_MAX_CB_STAGES ]; - SKP_int8 pPath_new[ MAX_NLSF_MSVQ_SURVIVORS * NLSF_MSVQ_MAX_CB_STAGES ]; - SKP_int16 pRes_Q15[ MAX_NLSF_MSVQ_SURVIVORS * MAX_LPC_ORDER ]; - SKP_int16 pRes_new_Q15[ MAX_NLSF_MSVQ_SURVIVORS * MAX_LPC_ORDER ]; - - const SKP_int16 *pConstInt16; - SKP_int16 *pInt16; - const SKP_int8 *pConstInt8; - SKP_int8 *pInt8; - const SKP_int8 *pCB_element; - const SKP_Silk_NLSF_CBS *pCurrentCBStage; - - SKP_assert( NLSF_MSVQ_Survivors <= MAX_NLSF_MSVQ_SURVIVORS ); - -#ifdef SAVE_ALL_INTERNAL_DATA - DEBUG_STORE_DATA( NLSF.dat, pNLSF_Q15, LPC_order * sizeof( SKP_int ) ); - DEBUG_STORE_DATA( WNLSF.dat, pW_Q5, LPC_order * sizeof( SKP_int ) ); - DEBUG_STORE_DATA( NLSF_mu.dat, &NLSF_mu_Q15, sizeof( SKP_int32 ) ); -#endif - - /****************************************************/ - /* Tree search for the multi-stage vector quantizer */ - /****************************************************/ - - /* Clear accumulated rates */ - SKP_memset( pRate_Q4, 0, NLSF_MSVQ_Survivors * sizeof( SKP_int32 ) ); - - /* Subtract 1/2 from NLSF input vector to create initial residual */ - for( i = 0; i < LPC_order; i++ ) { - pRes_Q15[ i ] = pNLSF_Q15[ i ] - SKP_FIX_CONST( 0.5f, 15 ); - } - - /* Set first stage values */ - prev_survivors = 1; - - /* Minimum number of survivors */ - min_survivors = NLSF_MSVQ_Survivors / 2; - - /* Loop over all stages */ - for( s = 0; s < psNLSF_CB->nStages; s++ ) { - - /* Set a pointer to the current stage codebook */ - pCurrentCBStage = &psNLSF_CB->CBStages[ s ]; - - /* Calculate the number of survivors in the current stage */ - cur_survivors = SKP_min_32( NLSF_MSVQ_Survivors, SKP_SMULBB( prev_survivors, pCurrentCBStage->nVectors ) ); - -#if( NLSF_MSVQ_FLUCTUATION_REDUCTION == 0 ) - /* Find a single best survivor in the last stage, if we */ - /* do not need candidates for fluctuation reduction */ - if( s == psNLSF_CB->nStages - 1 ) { - cur_survivors = 1; - } -#endif - - /* Nearest neighbor clustering for multiple input data vectors */ - SKP_Silk_NLSF_VQ_rate_distortion( pRateDist_Q18, pCurrentCBStage, pRes_Q15, pW_Q5, - pRate_Q4, NLSF_mu_Q15, prev_survivors, s, LPC_order ); - - /* Sort the rate-distortion errors */ - SKP_Silk_insertion_sort_increasing( pRateDist_Q18, pTempIndices, - prev_survivors * pCurrentCBStage->nVectors, cur_survivors ); - - /* Discard survivors with rate-distortion values too far above the best one */ - if( pRateDist_Q18[ 0 ] < SKP_int32_MAX / MAX_NLSF_MSVQ_SURVIVORS ) { - rateDistThreshold_Q18 = SKP_SMLAWB( pRateDist_Q18[ 0 ], - SKP_MUL( NLSF_MSVQ_Survivors, pRateDist_Q18[ 0 ] ), SKP_FIX_CONST( NLSF_MSVQ_SURV_MAX_REL_RD, 16 ) ); - while( pRateDist_Q18[ cur_survivors - 1 ] > rateDistThreshold_Q18 && cur_survivors > min_survivors ) { - cur_survivors--; - } - } - /* Update accumulated codebook contributions for the 'cur_survivors' best codebook indices */ - for( k = 0; k < cur_survivors; k++ ) { - if( s > 0 ) { - /* Find the indices of the input and the codebook vector */ - if( pCurrentCBStage->nVectors == 8 ) { - input_index = SKP_RSHIFT( pTempIndices[ k ], 3 ); - cb_index = pTempIndices[ k ] & 7; - } else { - input_index = SKP_DIV32_16( pTempIndices[ k ], pCurrentCBStage->nVectors ); - cb_index = pTempIndices[ k ] - SKP_SMULBB( input_index, pCurrentCBStage->nVectors ); - } - } else { - /* Find the indices of the input and the codebook vector */ - input_index = 0; - cb_index = pTempIndices[ k ]; - } - - /* Subtract new contribution from the previous residual vector for each of 'cur_survivors' */ - pConstInt16 = &pRes_Q15[ SKP_SMULBB( input_index, LPC_order ) ]; - pCB_element = &pCurrentCBStage->CB_NLSF_Q8[ SKP_SMULBB( cb_index, LPC_order ) ]; - pInt16 = &pRes_new_Q15[ SKP_SMULBB( k, LPC_order ) ]; - for( i = 0; i < LPC_order; i++ ) { - pInt16[ i ] = pConstInt16[ i ] - SKP_LSHIFT16( ( SKP_int16 )pCB_element[ i ], 7 ); - } - - /* Update accumulated rate for stage 1 to the current */ - pRate_new_Q4[ k ] = pRate_Q4[ input_index ] + pCurrentCBStage->Rates_Q4[ cb_index ]; - - /* Copy paths from previous matrix, starting with the best path */ - pConstInt8 = &pPath[ SKP_SMULBB( input_index, psNLSF_CB->nStages ) ]; - pInt8 = &pPath_new[ SKP_SMULBB( k, psNLSF_CB->nStages ) ]; - for( i = 0; i < s; i++ ) { - pInt8[ i ] = pConstInt8[ i ]; - } - /* Write the current stage indices for the 'cur_survivors' to the best path matrix */ - pInt8[ s ] = (SKP_int8)cb_index; - } - - if( s < psNLSF_CB->nStages - 1 ) { - /* Copy NLSF residual matrix for next stage */ - SKP_memcpy( pRes_Q15, pRes_new_Q15, SKP_SMULBB( cur_survivors, LPC_order ) * sizeof( SKP_int16 ) ); - - /* Copy rate vector for next stage */ - SKP_memcpy( pRate_Q4, pRate_new_Q4, cur_survivors * sizeof( SKP_int32 ) ); - - /* Copy best path matrix for next stage */ - SKP_memcpy( pPath, pPath_new, SKP_SMULBB( cur_survivors, psNLSF_CB->nStages ) * sizeof( SKP_int8) ); - } - - prev_survivors = cur_survivors; - } - - /* (Preliminary) index of the best survivor, later to be decoded */ - bestIndex = 0; - -#if( NLSF_MSVQ_FLUCTUATION_REDUCTION == 1 ) - /******************************/ - /* NLSF fluctuation reduction */ - /******************************/ - if( deactivate_fluc_red != 1 ) { - - /* Search among all survivors, now taking also weighted fluctuation errors into account */ - bestRateDist_Q20 = SKP_int32_MAX; - for( s = 0; s < cur_survivors; s++ ) { - /* Decode survivor to compare with previous quantized NLSF vector */ - SKP_Silk_NLSF_MSVQ_decode( pNLSF_Q15, psNLSF_CB, &pPath_new[ SKP_SMULBB( s, psNLSF_CB->nStages ) ], LPC_order ); - - /* Compare decoded NLSF vector with the previously quantized vector */ - wsse_Q20 = 0; - for( i = 0; i < LPC_order; i += 2 ) { - /* Compute weighted squared quantization error for index i */ - se_Q15 = pNLSF_Q15[ i ] - pNLSF_q_Q15_prev[ i ]; // range: [ -32767 : 32767 ] - wsse_Q20 = SKP_SMLAWB( wsse_Q20, SKP_SMULBB( se_Q15, se_Q15 ), pW_Q5[ i ] ); - - /* Compute weighted squared quantization error for index i + 1 */ - se_Q15 = pNLSF_Q15[ i + 1 ] - pNLSF_q_Q15_prev[ i + 1 ]; // range: [ -32767 : 32767 ] - wsse_Q20 = SKP_SMLAWB( wsse_Q20, SKP_SMULBB( se_Q15, se_Q15 ), pW_Q5[ i + 1 ] ); - } - SKP_assert( wsse_Q20 >= 0 ); - - /* Add the fluctuation reduction penalty to the rate distortion error */ - wsse_Q20 = SKP_ADD_POS_SAT32( pRateDist_Q18[ s ], SKP_SMULWB( wsse_Q20, NLSF_mu_fluc_red_Q16 ) ); - - /* Keep index of best survivor */ - if( wsse_Q20 < bestRateDist_Q20 ) { - bestRateDist_Q20 = wsse_Q20; - bestIndex = s; - } - } - } -#endif - - /* Copy best path to output argument */ - SKP_memcpy( NLSFIndices, &pPath_new[ SKP_SMULBB( bestIndex, psNLSF_CB->nStages ) ], psNLSF_CB->nStages * sizeof( SKP_int8 ) ); - - /* Decode and stabilize the best survivor */ - SKP_Silk_NLSF_MSVQ_decode( pNLSF_Q15, psNLSF_CB, NLSFIndices, LPC_order ); - -#ifdef SAVE_ALL_INTERNAL_DATA - { - SKP_float rateBPF_LSF; - SKP_float NLSF_coef; - - rateBPF_LSF = (SKP_float)pRate_new_Q5[ bestIndex ] / 32.0f; // Q5 -> Q0 - DEBUG_STORE_DATA( rateBPF_LSF.dat, &rateBPF_LSF, sizeof( SKP_float )); - for( i = 0; i < LPC_order; i++ ) { - NLSF_coef = ( (SKP_float)pNLSF_Q15[ i ] ) * ( 1.0f / 32768.0f ); - DEBUG_STORE_DATA( NLSFq.dat, &NLSF_coef, sizeof( SKP_float ) ); - } - } -#endif -} diff --git a/src_common/SKP_Silk_NLSF_VQ_rate_distortion.c b/src_common/SKP_Silk_NLSF_VQ_rate_distortion.c deleted file mode 100644 index 7b16fd525..000000000 --- a/src_common/SKP_Silk_NLSF_VQ_rate_distortion.c +++ /dev/null @@ -1,62 +0,0 @@ -/*********************************************************************** -Copyright (c) 2006-2011, Skype Limited. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, (subject to the limitations in the disclaimer below) -are permitted provided that the following conditions are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Skype Limited, nor the names of specific -contributors, may be used to endorse or promote products derived from -this software without specific prior written permission. -NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED -BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND -CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -#include "SKP_Silk_main.h" - -/* Rate-Distortion calculations for multiple input data vectors */ -void SKP_Silk_NLSF_VQ_rate_distortion( - SKP_int32 *pRD_Q19, /* O Rate-distortion values [psNLSF_CBS->nVectors*N] */ - const SKP_Silk_NLSF_CBS *psNLSF_CBS, /* I NLSF codebook stage struct */ - const SKP_int16 *in_Q15, /* I Input vectors to be quantized */ - const SKP_int *w_Q5, /* I Weight vector */ - const SKP_int32 *rate_acc_Q4, /* I Accumulated rates from previous stage */ - const SKP_int mu_Q15, /* I Weight between weighted error and rate */ - const SKP_int N, /* I Number of input vectors to be quantized */ - const SKP_int stage, /* I Stage number */ - const SKP_int LPC_order /* I LPC order */ -) -{ - SKP_int i, n; - SKP_int32 *pRD_vec_Q19; - - /* Compute weighted quantization errors for all input vectors over one codebook stage */ - SKP_Silk_NLSF_VQ_sum_error( pRD_Q19, in_Q15, w_Q5, psNLSF_CBS->CB_NLSF_Q8, - N, psNLSF_CBS->nVectors, stage, LPC_order ); - - /* Loop over input vectors */ - pRD_vec_Q19 = pRD_Q19; - for( n = 0; n < N; n++ ) { - /* Add rate cost to error for each codebook vector */ - for( i = 0; i < psNLSF_CBS->nVectors; i++ ) { - SKP_assert( rate_acc_Q4[ n ] + SKP_LSHIFT32( ( SKP_int32 )psNLSF_CBS->Rates_Q4[ i ], 1 ) >= 0 ); - SKP_assert( rate_acc_Q4[ n ] + SKP_LSHIFT32( ( SKP_int32 )psNLSF_CBS->Rates_Q4[ i ], 1 ) <= SKP_int16_MAX ); - pRD_vec_Q19[ i ] = SKP_SMLABB( pRD_vec_Q19[ i ], rate_acc_Q4[ n ] + psNLSF_CBS->Rates_Q4[ i ], mu_Q15 ); - SKP_assert( pRD_vec_Q19[ i ] >= 0 ); - } - pRD_vec_Q19 += psNLSF_CBS->nVectors; - } -} diff --git a/src_common/SKP_Silk_NLSF_VQ_sum_error.c b/src_common/SKP_Silk_NLSF_VQ_sum_error.c deleted file mode 100644 index bb52c51fd..000000000 --- a/src_common/SKP_Silk_NLSF_VQ_sum_error.c +++ /dev/null @@ -1,107 +0,0 @@ -/*********************************************************************** -Copyright (c) 2006-2011, Skype Limited. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, (subject to the limitations in the disclaimer below) -are permitted provided that the following conditions are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Skype Limited, nor the names of specific -contributors, may be used to endorse or promote products derived from -this software without specific prior written permission. -NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED -BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND -CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -#include "SKP_Silk_main.h" - -/* Compute weighted quantization errors for an LPC_order element input vector, over one codebook stage */ -void SKP_Silk_NLSF_VQ_sum_error( - SKP_int32 *err_Q19, /* O Weighted quantization errors [N*K] */ - const SKP_int16 *in_Q15, /* I Input vectors to be quantized [N*LPC_order] */ - const SKP_int *w_Q5, /* I Weighting vectors [LPC_order] */ - const SKP_int8 *pCB_Q8, /* I Codebook vectors [K*LPC_order] */ - const SKP_int N, /* I Number of input vectors */ - const SKP_int K, /* I Number of codebook vectors */ - const SKP_int stage, /* I Stage number */ - const SKP_int LPC_order /* I Number of LPCs */ -) -{ - SKP_int i, n, m; - SKP_int32 diff_Q15, sum_error, Wtmp_Q5; - SKP_int32 Wcpy_Q5[ MAX_LPC_ORDER / 2 ]; - const SKP_int8 *cb_vec_Q8; - - SKP_assert( LPC_order <= 16 ); - SKP_assert( ( LPC_order & 1 ) == 0 ); - - /* Copy to local stack and pack two weights per int32 */ - for( m = 0; m < SKP_RSHIFT( LPC_order, 1 ); m++ ) { - Wcpy_Q5[ m ] = w_Q5[ 2 * m ] | SKP_LSHIFT( ( SKP_int32 )w_Q5[ 2 * m + 1 ], 16 ); - } - - if( stage == 0 ) { - /* Loop over input vectors */ - for( n = 0; n < N; n++ ) { - /* Loop over codebook */ - cb_vec_Q8 = pCB_Q8; - for( i = 0; i < K; i++ ) { - sum_error = 0; - for( m = 0; m < LPC_order; m += 2 ) { - /* Get two weights packed in an int32 */ - Wtmp_Q5 = Wcpy_Q5[ m >> 1 ]; - - /* Compute weighted squared quantization error for index m */ - diff_Q15 = in_Q15[ m ] - SKP_LSHIFT16( ( SKP_int16 )( *cb_vec_Q8++ ), 15 - NLSF_Q_DOMAIN_STAGE_0 ); // range: [ -32767 : 32767 ] - sum_error = SKP_SMLAWB( sum_error, SKP_SMULBB( diff_Q15, diff_Q15 ), Wtmp_Q5 ); - - /* Compute weighted squared quantization error for index m + 1 */ - diff_Q15 = in_Q15[m + 1] - SKP_LSHIFT16( ( SKP_int16 )( *cb_vec_Q8++ ), 15 - NLSF_Q_DOMAIN_STAGE_0 ); // range: [ -32767 : 32767 ] - sum_error = SKP_SMLAWT( sum_error, SKP_SMULBB( diff_Q15, diff_Q15 ), Wtmp_Q5 ); - } - SKP_assert( sum_error >= 0 ); - err_Q19[ i ] = sum_error; - } - err_Q19 += K; - in_Q15 += LPC_order; - } - } else { - /* Loop over input vectors */ - for( n = 0; n < N; n++ ) { - /* Loop over codebook */ - cb_vec_Q8 = pCB_Q8; - for( i = 0; i < K; i++ ) { - sum_error = 0; - for( m = 0; m < LPC_order; m += 2 ) { - /* Get two weights packed in an int32 */ - Wtmp_Q5 = Wcpy_Q5[ m >> 1 ]; - - /* Compute weighted squared quantization error for index m */ - diff_Q15 = in_Q15[ m ] - SKP_LSHIFT16( ( SKP_int16 )( *cb_vec_Q8++ ), 15 - NLSF_Q_DOMAIN_STAGE_2_TO_LAST ); // range: [ -32767 : 32767 ] - sum_error = SKP_SMLAWB( sum_error, SKP_SMULBB( diff_Q15, diff_Q15 ), Wtmp_Q5 ); - - /* Compute weighted squared quantization error for index m + 1 */ - diff_Q15 = in_Q15[m + 1] - SKP_LSHIFT16( ( SKP_int16 )( *cb_vec_Q8++ ), 15 - NLSF_Q_DOMAIN_STAGE_2_TO_LAST ); // range: [ -32767 : 32767 ] - sum_error = SKP_SMLAWT( sum_error, SKP_SMULBB( diff_Q15, diff_Q15 ), Wtmp_Q5 ); - } - SKP_assert( sum_error >= 0 ); - err_Q19[ i ] = sum_error; - } - err_Q19 += K; - in_Q15 += LPC_order; - } - } -} - diff --git a/src_common/SKP_Silk_PLC.c b/src_common/SKP_Silk_PLC.c index a99ebf8de..c10e42056 100644 --- a/src_common/SKP_Silk_PLC.c +++ b/src_common/SKP_Silk_PLC.c @@ -167,7 +167,7 @@ void SKP_Silk_PLC_conceal( SKP_memmove( psDec->sLTP_Q16, &psDec->sLTP_Q16[ psDec->frame_length ], psDec->ltp_mem_length * sizeof( SKP_int32 ) ); /* LPC concealment. Apply BWE to previous LPC */ - SKP_Silk_bwexpander( psPLC->prevLPC_Q12, psDec->LPC_order, BWE_COEF_Q16 ); + SKP_Silk_bwexpander( psPLC->prevLPC_Q12, psDec->LPC_order, SKP_FIX_CONST( BWE_COEF, 16 ) ); /* Find random noise component */ /* Scale previous excitation signal */ @@ -205,7 +205,7 @@ void SKP_Silk_PLC_conceal( /* First Lost frame */ if( psDec->lossCnt == 0 ) { - rand_scale_Q14 = (1 << 14 ); + rand_scale_Q14 = 1 << 14; /* Reduce random noise Gain for voiced frames */ if( psDec->prevSignalType == TYPE_VOICED ) { @@ -220,8 +220,8 @@ void SKP_Silk_PLC_conceal( SKP_Silk_LPC_inverse_pred_gain( &invGain_Q30, psPLC->prevLPC_Q12, psDec->LPC_order ); - down_scale_Q30 = SKP_min_32( SKP_RSHIFT( ( 1 << 30 ), LOG2_INV_LPC_GAIN_HIGH_THRES ), invGain_Q30 ); - down_scale_Q30 = SKP_max_32( SKP_RSHIFT( ( 1 << 30 ), LOG2_INV_LPC_GAIN_LOW_THRES ), down_scale_Q30 ); + down_scale_Q30 = SKP_min_32( SKP_RSHIFT( 1 << 30, LOG2_INV_LPC_GAIN_HIGH_THRES ), invGain_Q30 ); + down_scale_Q30 = SKP_max_32( SKP_RSHIFT( 1 << 30, LOG2_INV_LPC_GAIN_LOW_THRES ), down_scale_Q30 ); down_scale_Q30 = SKP_LSHIFT( down_scale_Q30, LOG2_INV_LPC_GAIN_HIGH_THRES ); rand_Gain_Q15 = SKP_RSHIFT( SKP_SMULWB( down_scale_Q30, rand_Gain_Q15 ), 14 ); @@ -360,7 +360,7 @@ void SKP_Silk_PLC_glue_frames( /* Fade in the energy difference */ if( energy > psPLC->conc_energy ) { SKP_int32 frac_Q24, LZ; - SKP_int32 gain_Q12, slope_Q12; + SKP_int32 gain_Q16, slope_Q16; LZ = SKP_Silk_CLZ32( psPLC->conc_energy ); LZ = LZ - 1; @@ -369,13 +369,17 @@ void SKP_Silk_PLC_glue_frames( frac_Q24 = SKP_DIV32( psPLC->conc_energy, SKP_max( energy, 1 ) ); - gain_Q12 = SKP_Silk_SQRT_APPROX( frac_Q24 ); - slope_Q12 = SKP_DIV32_16( ( 1 << 12 ) - gain_Q12, length ); + gain_Q16 = SKP_LSHIFT( SKP_Silk_SQRT_APPROX( frac_Q24 ), 4 ); + slope_Q16 = SKP_DIV32_16( ( 1 << 16 ) - gain_Q16, length ); + /* Make slope 4x steeper to avoid missing onsets after DTX */ + slope_Q16 = SKP_LSHIFT( slope_Q16, 2 ); for( i = 0; i < length; i++ ) { - signal[ i ] = SKP_RSHIFT( SKP_MUL( gain_Q12, signal[ i ] ), 12 ); - gain_Q12 += slope_Q12; - gain_Q12 = SKP_min( gain_Q12, ( 1 << 12 ) ); + signal[ i ] = SKP_SMULWB( gain_Q16, signal[ i ] ); + gain_Q16 += slope_Q16; + if( gain_Q16 > 1 << 16 ) { + break; + } } } } diff --git a/src_common/SKP_Silk_PLC.h b/src_common/SKP_Silk_PLC.h index d23f994af..97fc90116 100644 --- a/src_common/SKP_Silk_PLC.h +++ b/src_common/SKP_Silk_PLC.h @@ -30,7 +30,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "SKP_Silk_main.h" -#define BWE_COEF_Q16 64880 /* 0.99 in Q16 */ +#define BWE_COEF 0.99 #define V_PITCH_GAIN_START_MIN_Q14 11469 /* 0.7 in Q14 */ #define V_PITCH_GAIN_START_MAX_Q14 15565 /* 0.95 in Q14 */ #define MAX_PITCH_LAG_MS 18 diff --git a/src_common/SKP_Silk_check_control_input.c b/src_common/SKP_Silk_check_control_input.c new file mode 100644 index 000000000..cbdafc6e2 --- /dev/null +++ b/src_common/SKP_Silk_check_control_input.c @@ -0,0 +1,89 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, (subject to the limitations in the disclaimer below) +are permitted provided that the following conditions are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Skype Limited, nor the names of specific +contributors, may be used to endorse or promote products derived from +this software without specific prior written permission. +NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED +BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#include "SKP_Silk_main.h" +#include "SKP_Silk_control.h" +#include "SKP_Silk_errors.h" + +/* Check encoder control struct */ +SKP_int check_control_input( + SKP_SILK_SDK_EncControlStruct *encControl /* I: Control structure */ +) +{ + SKP_assert( encControl != NULL ); + + if( ( ( encControl->API_sampleRate != 8000 ) && + ( encControl->API_sampleRate != 12000 ) && + ( encControl->API_sampleRate != 16000 ) && + ( encControl->API_sampleRate != 24000 ) && + ( encControl->API_sampleRate != 32000 ) && + ( encControl->API_sampleRate != 44100 ) && + ( encControl->API_sampleRate != 48000 ) ) || + ( ( encControl->maxInternalSampleRate != 8000 ) && + ( encControl->maxInternalSampleRate != 12000 ) && + ( encControl->maxInternalSampleRate != 16000 ) ) || + ( ( encControl->minInternalSampleRate != 8000 ) && + ( encControl->minInternalSampleRate != 12000 ) && + ( encControl->minInternalSampleRate != 16000 ) ) || + ( encControl->minInternalSampleRate > encControl->maxInternalSampleRate ) ) { + SKP_assert( 0 ); + return SKP_SILK_ENC_FS_NOT_SUPPORTED; + } + if( encControl->payloadSize_ms != 10 && + encControl->payloadSize_ms != 20 && + encControl->payloadSize_ms != 40 && + encControl->payloadSize_ms != 60 ) { + SKP_assert( 0 ); + return SKP_SILK_ENC_PACKET_SIZE_NOT_SUPPORTED; + } + if( encControl->packetLossPercentage < 0 || encControl->packetLossPercentage > 100 ) { + SKP_assert( 0 ); + return SKP_SILK_ENC_INVALID_LOSS_RATE; + } + if( encControl->useDTX < 0 || encControl->useDTX > 1 ) { + SKP_assert( 0 ); + return SKP_SILK_ENC_INVALID_DTX_SETTING; + } + if( encControl->useCBR < 0 || encControl->useCBR > 1 ) { + SKP_assert( 0 ); + return SKP_SILK_ENC_INVALID_CBR_SETTING; + } + if( encControl->useInBandFEC < 0 || encControl->useInBandFEC > 1 ) { + SKP_assert( 0 ); + return SKP_SILK_ENC_INVALID_INBAND_FEC_SETTING; + } + if( encControl->nChannels < 1 || encControl->nChannels > ENCODER_NUM_CHANNELS ) { + SKP_assert( 0 ); + return SKP_SILK_ENC_INVALID_NUMBER_OF_CHANNELS_ERROR; + } + if( encControl->complexity < 0 || encControl->complexity > 10 ) { + SKP_assert( 0 ); + return SKP_SILK_ENC_INVALID_COMPLEXITY_SETTING; + } + + return SKP_SILK_NO_ERROR; +} diff --git a/src_SigProc_FIX/SKP_Silk_lowpass_short.c b/src_common/SKP_Silk_control_SNR.c similarity index 51% rename from src_SigProc_FIX/SKP_Silk_lowpass_short.c rename to src_common/SKP_Silk_control_SNR.c index 058822d57..81618c254 100644 --- a/src_SigProc_FIX/SKP_Silk_lowpass_short.c +++ b/src_common/SKP_Silk_control_SNR.c @@ -25,37 +25,50 @@ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ -/* * - * SKP_Silk_lowpass_short.c * - * * - * First order low-pass filter, with input as SKP_int16, running at * - * 48 kHz * - * * - * Copyright 2006 (c), Skype Limited * - * Date: 060221 * - * */ -#include "SKP_Silk_SigProc_FIX.h" +#include "SKP_Silk_main.h" +#include "SKP_Silk_tuning_parameters.h" - -/* First order low-pass filter, with input as SKP_int16, running at 48 kHz */ -void SKP_Silk_lowpass_short( - const SKP_int16 *in, /* I: Q15 48 kHz signal; [len] */ - SKP_int32 *S, /* I/O: Q25 state; length = 1 */ - SKP_int32 *out, /* O: Q25 48 kHz signal; [len] */ - const SKP_int32 len /* O: Signal length */ +/* Control SNR of redidual quantizer */ +SKP_int SKP_Silk_control_SNR( + SKP_Silk_encoder_state *psEncC, /* I/O Pointer to Silk encoder state */ + SKP_int32 TargetRate_bps /* I Target max bitrate (bps) */ ) { - SKP_int k; - SKP_int32 in_tmp, out_tmp, state; - - state = S[ 0 ]; - for( k = 0; k < len; k++ ) { - in_tmp = SKP_MUL( 768, (SKP_int32)in[k] ); /* multiply by 0.75, going from Q15 to Q25 */ - out_tmp = state + in_tmp; /* zero at nyquist */ - state = in_tmp - SKP_RSHIFT( out_tmp, 1 ); /* pole */ - out[ k ] = out_tmp; - } - S[ 0 ] = state; -} + SKP_int k, ret = SKP_SILK_NO_ERROR; + SKP_int32 frac_Q6; + const SKP_int32 *rateTable; + + /* Set bitrate/coding quality */ + TargetRate_bps = SKP_LIMIT( TargetRate_bps, MIN_TARGET_RATE_BPS, MAX_TARGET_RATE_BPS ); + if( TargetRate_bps != psEncC->TargetRate_bps ) { + psEncC->TargetRate_bps = TargetRate_bps; + /* If new TargetRate_bps, translate to SNR_dB value */ + if( psEncC->fs_kHz == 8 ) { + rateTable = TargetRate_table_NB; + } else if( psEncC->fs_kHz == 12 ) { + rateTable = TargetRate_table_MB; + } else if( psEncC->fs_kHz == 16 ) { + rateTable = TargetRate_table_WB; + } else { + SKP_assert( 0 ); + } + /* Reduce bitrate for 10 ms modes in these calculations */ + if( psEncC->nb_subfr == 2 ) { + TargetRate_bps -= REDUCE_BITRATE_10_MS_BPS; + } + + /* Find bitrate interval in table and interpolate */ + for( k = 1; k < TARGET_RATE_TAB_SZ; k++ ) { + if( TargetRate_bps <= rateTable[ k ] ) { + frac_Q6 = SKP_DIV32( SKP_LSHIFT( TargetRate_bps - rateTable[ k - 1 ], 6 ), + rateTable[ k ] - rateTable[ k - 1 ] ); + psEncC->SNR_dB_Q7 = SKP_LSHIFT( SNR_table_Q1[ k - 1 ], 6 ) + SKP_MUL( frac_Q6, SNR_table_Q1[ k ] - SNR_table_Q1[ k - 1 ] ); + break; + } + } + } + + return ret; +} diff --git a/src_common/SKP_Silk_control_audio_bandwidth.c b/src_common/SKP_Silk_control_audio_bandwidth.c index 552fe07d7..20a1eead8 100644 --- a/src_common/SKP_Silk_control_audio_bandwidth.c +++ b/src_common/SKP_Silk_control_audio_bandwidth.c @@ -34,42 +34,45 @@ SKP_int SKP_Silk_control_audio_bandwidth( SKP_int32 TargetRate_bps /* I Target max bitrate (bps) */ ) { - SKP_int fs_kHz; - - fs_kHz = psEncC->fs_kHz; - + SKP_int fs_kHz; + SKP_int32 fs_Hz; + /* Reduce bitrate for 10 ms modes in these calculations */ if( psEncC->nb_subfr == 2 ) { TargetRate_bps -= REDUCE_BITRATE_10_MS_BPS; } - if( fs_kHz == 0 ) { + fs_kHz = psEncC->fs_kHz; + fs_Hz = SKP_SMULBB( fs_kHz, 1000 ); + if( fs_Hz == 0 ) { /* Encoder has just been initialized */ if( TargetRate_bps >= WB2MB_BITRATE_BPS ) { - fs_kHz = 16; + fs_Hz = 16000; } else if( TargetRate_bps >= MB2NB_BITRATE_BPS ) { - fs_kHz = 12; + fs_Hz = 12000; } else { - fs_kHz = 8; + fs_Hz = 8000; } /* Make sure internal rate is not higher than external rate or maximum allowed, or lower than minimum allowed */ - fs_kHz = SKP_min( fs_kHz, SKP_DIV32_16( psEncC->API_fs_Hz, 1000 ) ); - fs_kHz = SKP_min( fs_kHz, psEncC->maxInternal_fs_kHz ); - fs_kHz = SKP_max( fs_kHz, psEncC->minInternal_fs_kHz ); - } else if( SKP_SMULBB( fs_kHz, 1000 ) > psEncC->API_fs_Hz || fs_kHz > psEncC->maxInternal_fs_kHz || fs_kHz < psEncC->minInternal_fs_kHz ) { + fs_Hz = SKP_min( fs_Hz, psEncC->API_fs_Hz ); + fs_Hz = SKP_min( fs_Hz, psEncC->maxInternal_fs_Hz ); + fs_Hz = SKP_max( fs_Hz, psEncC->minInternal_fs_Hz ); + fs_kHz = SKP_DIV32_16( fs_Hz, 1000 ); + } else if( fs_Hz > psEncC->API_fs_Hz || fs_Hz > psEncC->maxInternal_fs_Hz || fs_Hz < psEncC->minInternal_fs_Hz ) { /* Make sure internal rate is not higher than external rate or maximum allowed, or lower than minimum allowed */ - fs_kHz = SKP_DIV32_16( psEncC->API_fs_Hz, 1000 ); - fs_kHz = SKP_min( fs_kHz, psEncC->maxInternal_fs_kHz ); - fs_kHz = SKP_max( fs_kHz, psEncC->minInternal_fs_kHz ); + fs_Hz = psEncC->API_fs_Hz; + fs_Hz = SKP_min( fs_Hz, psEncC->maxInternal_fs_Hz ); + fs_Hz = SKP_max( fs_Hz, psEncC->minInternal_fs_Hz ); + fs_kHz = SKP_DIV32_16( fs_Hz, 1000 ); } else { /* State machine for the internal sampling rate switching */ - if( psEncC->API_fs_Hz > 8000 && psEncC->prevSignalType == TYPE_NO_VOICE_ACTIVITY ) { /* Low speech activity */ + if( psEncC->API_fs_Hz > 8000 && psEncC->prevSignalType == TYPE_NO_VOICE_ACTIVITY ) { /* Check if we should switch down */ - if( ( psEncC->fs_kHz == 12 && TargetRate_bps < MB2NB_BITRATE_BPS && psEncC->minInternal_fs_kHz <= 8 ) || - ( psEncC->fs_kHz == 16 && TargetRate_bps < WB2MB_BITRATE_BPS && psEncC->minInternal_fs_kHz <= 12 ) ) + if( ( psEncC->fs_kHz == 12 && TargetRate_bps < MB2NB_BITRATE_BPS && psEncC->minInternal_fs_Hz <= 8000 ) || + ( psEncC->fs_kHz == 16 && TargetRate_bps < WB2MB_BITRATE_BPS && psEncC->minInternal_fs_Hz <= 12000 ) ) { /* Switch down */ - if( SWITCH_TRANSITION_FILTERING && psEncC->sLP.mode == 0 ) { + if( psEncC->sLP.mode == 0 ) { /* New transition */ psEncC->sLP.transition_frame_no = TRANSITION_FRAMES; @@ -88,11 +91,11 @@ SKP_int SKP_Silk_control_audio_bandwidth( } } else - if( ( psEncC->fs_kHz == 8 && TargetRate_bps > NB2MB_BITRATE_BPS && psEncC->maxInternal_fs_kHz >= 12 && psEncC->API_fs_Hz >= 12000 ) || - ( psEncC->fs_kHz == 12 && TargetRate_bps > MB2WB_BITRATE_BPS && psEncC->maxInternal_fs_kHz >= 16 && psEncC->API_fs_Hz >= 16000 ) ) + if( ( psEncC->fs_kHz == 8 && TargetRate_bps > NB2MB_BITRATE_BPS && psEncC->maxInternal_fs_Hz >= 12000 && psEncC->API_fs_Hz >= 12000 ) || + ( psEncC->fs_kHz == 12 && TargetRate_bps > MB2WB_BITRATE_BPS && psEncC->maxInternal_fs_Hz >= 16000 && psEncC->API_fs_Hz >= 16000 ) ) { /* Switch up */ - if( SWITCH_TRANSITION_FILTERING && psEncC->sLP.mode == 0 ) { + if( psEncC->sLP.mode == 0 ) { /* Switch to a higher sample frequency */ fs_kHz = psEncC->fs_kHz == 8 ? 12 : 16; diff --git a/src_FIX/SKP_Silk_control_codec_FIX.c b/src_common/SKP_Silk_control_codec.c similarity index 55% rename from src_FIX/SKP_Silk_control_codec_FIX.c rename to src_common/SKP_Silk_control_codec.c index b09246030..c497e19c5 100644 --- a/src_FIX/SKP_Silk_control_codec_FIX.c +++ b/src_common/SKP_Silk_control_codec.c @@ -25,36 +25,53 @@ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ +#include "SKP_Silk_tuning_parameters.h" +#if FIXED_POINT #include "SKP_Silk_main_FIX.h" -#include "SKP_Silk_setup.h" - -SKP_INLINE SKP_int SKP_Silk_setup_resamplers( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O */ +#define SKP_Silk_encoder_state_Fxx SKP_Silk_encoder_state_FIX +#else +#include "SKP_Silk_main_FLP.h" +#define SKP_Silk_encoder_state_Fxx SKP_Silk_encoder_state_FLP +#endif + +SKP_int SKP_Silk_setup_resamplers( + SKP_Silk_encoder_state_Fxx *psEnc, /* I/O */ SKP_int fs_kHz /* I */ ); -SKP_INLINE SKP_int SKP_Silk_setup_fs( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O */ +SKP_int SKP_Silk_setup_fs( + SKP_Silk_encoder_state_Fxx *psEnc, /* I/O */ SKP_int fs_kHz, /* I */ SKP_int PacketSize_ms /* I */ ); -SKP_INLINE SKP_int SKP_Silk_setup_rate( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O */ - SKP_int32 TargetRate_bps /* I */ +SKP_int SKP_Silk_setup_complexity( + SKP_Silk_encoder_state *psEncC, /* I/O */ + SKP_int Complexity /* I */ +); + +static SKP_int SKP_Silk_setup_LBRR( + SKP_Silk_encoder_state *psEncC, /* I/O */ + const SKP_int32 TargetRate_bps /* I */ ); -/* Control encoder SNR */ -SKP_int SKP_Silk_control_encoder_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk encoder state */ - const SKP_int PacketSize_ms, /* I Packet length (ms) */ - const SKP_int32 TargetRate_bps, /* I Target max bitrate (bps) */ - const SKP_int PacketLoss_perc, /* I Packet loss rate (in percent) */ - const SKP_int Complexity /* I Complexity (0-10) */ + +/* Control encoder */ +SKP_int SKP_Silk_control_encoder( + SKP_Silk_encoder_state_Fxx *psEnc, /* I/O Pointer to Silk encoder state */ + SKP_SILK_SDK_EncControlStruct *encControl, /* I: Control structure */ + const SKP_int32 TargetRate_bps /* I Target max bitrate (bps) */ ) { SKP_int fs_kHz, ret = 0; + psEnc->sCmn.useDTX = encControl->useDTX; + psEnc->sCmn.useCBR = encControl->useCBR; + psEnc->sCmn.API_fs_Hz = encControl->API_sampleRate; + psEnc->sCmn.maxInternal_fs_Hz = encControl->maxInternalSampleRate; + psEnc->sCmn.minInternal_fs_Hz = encControl->minInternalSampleRate; + psEnc->sCmn.useInBandFEC = encControl->useInBandFEC; + if( psEnc->sCmn.controlled_since_last_payload != 0 && psEnc->sCmn.prefillFlag == 0 ) { if( psEnc->sCmn.API_fs_Hz != psEnc->sCmn.prev_API_fs_Hz && psEnc->sCmn.fs_kHz > 0 ) { /* Change in API sampling rate in the middle of encoding a packet */ @@ -78,53 +95,55 @@ SKP_int SKP_Silk_control_encoder_FIX( /********************************************/ /* Set internal sampling frequency */ /********************************************/ - ret += SKP_Silk_setup_fs( psEnc, fs_kHz, PacketSize_ms ); + ret += SKP_Silk_setup_fs( psEnc, fs_kHz, encControl->payloadSize_ms ); /********************************************/ /* Set encoding complexity */ /********************************************/ - ret += SKP_Silk_setup_complexity( &psEnc->sCmn, Complexity ); - - /********************************************/ - /* Set bitrate/coding quality */ - /********************************************/ - ret += SKP_Silk_setup_rate( psEnc, TargetRate_bps ); + ret += SKP_Silk_setup_complexity( &psEnc->sCmn, encControl->complexity ); /********************************************/ /* Set packet loss rate measured by farend */ /********************************************/ - if( ( PacketLoss_perc < 0 ) || ( PacketLoss_perc > 100 ) ) { - ret = SKP_SILK_ENC_INVALID_LOSS_RATE; - } - psEnc->sCmn.PacketLoss_perc = PacketLoss_perc; + psEnc->sCmn.PacketLoss_perc = encControl->packetLossPercentage; /********************************************/ /* Set LBRR usage */ /********************************************/ - ret += SKP_Silk_setup_LBRR( &psEnc->sCmn ); + ret += SKP_Silk_setup_LBRR( &psEnc->sCmn, TargetRate_bps ); psEnc->sCmn.controlled_since_last_payload = 1; return ret; } -SKP_INLINE SKP_int SKP_Silk_setup_resamplers( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O */ +SKP_int SKP_Silk_setup_resamplers( + SKP_Silk_encoder_state_Fxx *psEnc, /* I/O */ SKP_int fs_kHz /* I */ ) { - SKP_int ret = SKP_SILK_NO_ERROR; + SKP_int ret = SKP_SILK_NO_ERROR; + SKP_int32 nSamples_temp; - if( psEnc->sCmn.fs_kHz != fs_kHz || psEnc->sCmn.prev_API_fs_Hz != psEnc->sCmn.API_fs_Hz ) { - + if( psEnc->sCmn.fs_kHz != fs_kHz || psEnc->sCmn.prev_API_fs_Hz != psEnc->sCmn.API_fs_Hz ) + { if( psEnc->sCmn.fs_kHz == 0 ) { /* Initialize the resampler for enc_API.c preparing resampling from API_fs_Hz to fs_kHz */ ret += SKP_Silk_resampler_init( &psEnc->sCmn.resampler_state, psEnc->sCmn.API_fs_Hz, fs_kHz * 1000 ); } else { /* Allocate space for worst case temporary upsampling, 8 to 48 kHz, so a factor 6 */ SKP_int16 x_buf_API_fs_Hz[ ( 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ) * ( MAX_API_FS_KHZ / 8 ) ]; +#if FIXED_POINT + SKP_int16 *x_bufFIX = psEnc->x_buf; +#else + SKP_int16 x_bufFIX[ 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ]; +#endif + + nSamples_temp = SKP_LSHIFT( psEnc->sCmn.frame_length, 1 ) + LA_SHAPE_MS * psEnc->sCmn.fs_kHz; - SKP_int32 nSamples_temp = SKP_LSHIFT( psEnc->sCmn.frame_length, 1 ) + LA_SHAPE_MS * psEnc->sCmn.fs_kHz; +#if !FIXED_POINT + SKP_float2short_array( x_bufFIX, psEnc->x_buf, nSamples_temp ); +#endif if( SKP_SMULBB( fs_kHz, 1000 ) < psEnc->sCmn.API_fs_Hz && psEnc->sCmn.fs_kHz != 0 ) { /* Resample buffered data in x_buf to API_fs_Hz */ @@ -135,7 +154,7 @@ SKP_INLINE SKP_int SKP_Silk_setup_resamplers( ret += SKP_Silk_resampler_init( &temp_resampler_state, SKP_SMULBB( psEnc->sCmn.fs_kHz, 1000 ), psEnc->sCmn.API_fs_Hz ); /* Temporary resampling of x_buf data to API_fs_Hz */ - ret += SKP_Silk_resampler( &temp_resampler_state, x_buf_API_fs_Hz, psEnc->x_buf, nSamples_temp ); + ret += SKP_Silk_resampler( &temp_resampler_state, x_buf_API_fs_Hz, x_bufFIX, nSamples_temp ); /* Calculate number of samples that has been temporarily upsampled */ nSamples_temp = SKP_DIV32_16( nSamples_temp * psEnc->sCmn.API_fs_Hz, SKP_SMULBB( psEnc->sCmn.fs_kHz, 1000 ) ); @@ -145,23 +164,26 @@ SKP_INLINE SKP_int SKP_Silk_setup_resamplers( } else { /* Copy data */ - SKP_memcpy( x_buf_API_fs_Hz, psEnc->x_buf, nSamples_temp * sizeof( SKP_int16 ) ); + SKP_memcpy( x_buf_API_fs_Hz, x_bufFIX, nSamples_temp * sizeof( SKP_int16 ) ); } if( 1000 * fs_kHz != psEnc->sCmn.API_fs_Hz ) { /* Correct resampler state (unless resampling by a factor 1) by resampling buffered data from API_fs_Hz to fs_kHz */ - ret += SKP_Silk_resampler( &psEnc->sCmn.resampler_state, psEnc->x_buf, x_buf_API_fs_Hz, nSamples_temp ); + ret += SKP_Silk_resampler( &psEnc->sCmn.resampler_state, x_bufFIX, x_buf_API_fs_Hz, nSamples_temp ); } +#if !FIXED_POINT + SKP_short2float_array( psEnc->x_buf, x_bufFIX, ( 2 * MAX_FRAME_LENGTH_MS + LA_SHAPE_MS ) * fs_kHz ); +#endif } } psEnc->sCmn.prev_API_fs_Hz = psEnc->sCmn.API_fs_Hz; - return(ret); + return ret; } -SKP_INLINE SKP_int SKP_Silk_setup_fs( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O */ +SKP_int SKP_Silk_setup_fs( + SKP_Silk_encoder_state_Fxx *psEnc, /* I/O */ SKP_int fs_kHz, /* I */ SKP_int PacketSize_ms /* I */ ) @@ -206,14 +228,19 @@ SKP_INLINE SKP_int SKP_Silk_setup_fs( SKP_assert( psEnc->sCmn.nb_subfr == 2 || psEnc->sCmn.nb_subfr == 4 ); if( psEnc->sCmn.fs_kHz != fs_kHz ) { /* reset part of the state */ +#if FIXED_POINT SKP_memset( &psEnc->sShape, 0, sizeof( SKP_Silk_shape_state_FIX ) ); SKP_memset( &psEnc->sPrefilt, 0, sizeof( SKP_Silk_prefilter_state_FIX ) ); +#else + SKP_memset( &psEnc->sShape, 0, sizeof( SKP_Silk_shape_state_FLP ) ); + SKP_memset( &psEnc->sPrefilt, 0, sizeof( SKP_Silk_prefilter_state_FLP ) ); +#endif SKP_memset( &psEnc->sCmn.sNSQ, 0, sizeof( SKP_Silk_nsq_state ) ); SKP_memset( psEnc->sCmn.prev_NLSFq_Q15, 0, sizeof( psEnc->sCmn.prev_NLSFq_Q15 ) ); SKP_memset( &psEnc->sCmn.sLP.In_LP_State, 0, sizeof( psEnc->sCmn.sLP.In_LP_State ) ); psEnc->sCmn.inputBufIx = 0; psEnc->sCmn.nFramesAnalyzed = 0; - psEnc->sCmn.TargetRate_bps = 0; /* Ensures that psEnc->SNR_dB is recomputed */ + psEnc->sCmn.TargetRate_bps = 0; /* trigger new SNR computation */ /* Initialize non-zero parameters */ psEnc->sCmn.prevLag = 100; @@ -269,45 +296,115 @@ SKP_INLINE SKP_int SKP_Silk_setup_fs( /* Check that settings are valid */ SKP_assert( ( psEnc->sCmn.subfr_length * psEnc->sCmn.nb_subfr ) == psEnc->sCmn.frame_length ); - return( ret ); + return ret; } -SKP_INLINE SKP_int SKP_Silk_setup_rate( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O */ - SKP_int32 TargetRate_bps /* I */ +SKP_int SKP_Silk_setup_complexity( + SKP_Silk_encoder_state *psEncC, /* I/O */ + SKP_int Complexity /* I */ ) { - SKP_int k, ret = SKP_SILK_NO_ERROR; - SKP_int32 frac_Q6; - const SKP_int32 *rateTable; + SKP_int ret = 0; + + /* Set encoding complexity */ + SKP_assert( Complexity >= 0 && Complexity <= 10 ); + if( Complexity < 2 ) { + psEncC->pitchEstimationComplexity = SKP_Silk_PE_MIN_COMPLEX; + psEncC->pitchEstimationThreshold_Q16 = SKP_FIX_CONST( 0.8, 16 ); + psEncC->pitchEstimationLPCOrder = 6; + psEncC->shapingLPCOrder = 8; + psEncC->la_shape = 3 * psEncC->fs_kHz; + psEncC->nStatesDelayedDecision = 1; + psEncC->useInterpolatedNLSFs = 0; + psEncC->LTPQuantLowComplexity = 1; + psEncC->NLSF_MSVQ_Survivors = 2; + psEncC->warping_Q16 = 0; + } else if( Complexity < 4 ) { + psEncC->pitchEstimationComplexity = SKP_Silk_PE_MID_COMPLEX; + psEncC->pitchEstimationThreshold_Q16 = SKP_FIX_CONST( 0.76, 16 ); + psEncC->pitchEstimationLPCOrder = 8; + psEncC->shapingLPCOrder = 10; + psEncC->la_shape = 5 * psEncC->fs_kHz; + psEncC->nStatesDelayedDecision = 1; + psEncC->useInterpolatedNLSFs = 1; + psEncC->LTPQuantLowComplexity = 0; + psEncC->NLSF_MSVQ_Survivors = 4; + psEncC->warping_Q16 = 0; + } else if( Complexity < 6 ) { + psEncC->pitchEstimationComplexity = SKP_Silk_PE_MID_COMPLEX; + psEncC->pitchEstimationThreshold_Q16 = SKP_FIX_CONST( 0.74, 16 ); + psEncC->pitchEstimationLPCOrder = 10; + psEncC->shapingLPCOrder = 12; + psEncC->la_shape = 5 * psEncC->fs_kHz; + psEncC->nStatesDelayedDecision = 2; + psEncC->useInterpolatedNLSFs = 0; + psEncC->LTPQuantLowComplexity = 0; + psEncC->NLSF_MSVQ_Survivors = 6; + psEncC->warping_Q16 = psEncC->fs_kHz * SKP_FIX_CONST( WARPING_MULTIPLIER, 16 ); + } else if( Complexity < 8 ) { + psEncC->pitchEstimationComplexity = SKP_Silk_PE_MID_COMPLEX; + psEncC->pitchEstimationThreshold_Q16 = SKP_FIX_CONST( 0.72, 16 ); + psEncC->pitchEstimationLPCOrder = 12; + psEncC->shapingLPCOrder = 14; + psEncC->la_shape = 5 * psEncC->fs_kHz; + psEncC->nStatesDelayedDecision = 3; + psEncC->useInterpolatedNLSFs = 0; + psEncC->LTPQuantLowComplexity = 0; + psEncC->NLSF_MSVQ_Survivors = 8; + psEncC->warping_Q16 = psEncC->fs_kHz * SKP_FIX_CONST( WARPING_MULTIPLIER, 16 ); + } else { + psEncC->pitchEstimationComplexity = SKP_Silk_PE_MAX_COMPLEX; + psEncC->pitchEstimationThreshold_Q16 = SKP_FIX_CONST( 0.7, 16 ); + psEncC->pitchEstimationLPCOrder = 16; + psEncC->shapingLPCOrder = 16; + psEncC->la_shape = 5 * psEncC->fs_kHz; + psEncC->nStatesDelayedDecision = MAX_DEL_DEC_STATES; + psEncC->useInterpolatedNLSFs = 1; + psEncC->LTPQuantLowComplexity = 0; + psEncC->NLSF_MSVQ_Survivors = 16; + psEncC->warping_Q16 = psEncC->fs_kHz * SKP_FIX_CONST( WARPING_MULTIPLIER, 16 ); + } - /* Set bitrate/coding quality */ - if( TargetRate_bps != psEnc->sCmn.TargetRate_bps ) { - psEnc->sCmn.TargetRate_bps = TargetRate_bps; + /* Do not allow higher pitch estimation LPC order than predict LPC order */ + psEncC->pitchEstimationLPCOrder = SKP_min_int( psEncC->pitchEstimationLPCOrder, psEncC->predictLPCOrder ); + psEncC->shapeWinLength = SUB_FRAME_LENGTH_MS * psEncC->fs_kHz + 2 * psEncC->la_shape; - /* If new TargetRate_bps, translate to SNR_dB value */ - if( psEnc->sCmn.fs_kHz == 8 ) { - rateTable = TargetRate_table_NB; - } else if( psEnc->sCmn.fs_kHz == 12 ) { - rateTable = TargetRate_table_MB; - } else if( psEnc->sCmn.fs_kHz == 16 ) { - rateTable = TargetRate_table_WB; - } else { - SKP_assert( 0 ); - } - /* Reduce bitrate for 10 ms modes in these calculations */ - if( psEnc->sCmn.nb_subfr == 2 ) { - TargetRate_bps -= REDUCE_BITRATE_10_MS_BPS; - } - for( k = 1; k < TARGET_RATE_TAB_SZ; k++ ) { - /* Find bitrate interval in table and interpolate */ - if( TargetRate_bps <= rateTable[ k ] ) { - frac_Q6 = SKP_DIV32( SKP_LSHIFT( TargetRate_bps - rateTable[ k - 1 ], 6 ), - rateTable[ k ] - rateTable[ k - 1 ] ); - psEnc->SNR_dB_Q7 = SKP_LSHIFT( SNR_table_Q1[ k - 1 ], 6 ) + SKP_MUL( frac_Q6, SNR_table_Q1[ k ] - SNR_table_Q1[ k - 1 ] ); - break; - } - } + SKP_assert( psEncC->pitchEstimationLPCOrder <= MAX_FIND_PITCH_LPC_ORDER ); + SKP_assert( psEncC->shapingLPCOrder <= MAX_SHAPE_LPC_ORDER ); + SKP_assert( psEncC->nStatesDelayedDecision <= MAX_DEL_DEC_STATES ); + SKP_assert( psEncC->warping_Q16 <= 32767 ); + SKP_assert( psEncC->la_shape <= LA_SHAPE_MAX ); + SKP_assert( psEncC->shapeWinLength <= SHAPE_LPC_WIN_MAX ); + SKP_assert( psEncC->NLSF_MSVQ_Survivors <= NLSF_VQ_MAX_SURVIVORS ); + + return ret; +} + +SKP_INLINE SKP_int SKP_Silk_setup_LBRR( + SKP_Silk_encoder_state *psEncC, /* I/O */ + const SKP_int32 TargetRate_bps /* I */ +) +{ + SKP_int ret = SKP_SILK_NO_ERROR; + SKP_int32 LBRRRate_thres_bps; + + SKP_assert( psEncC->fs_kHz == 8 || psEncC->fs_kHz == 12 || psEncC->fs_kHz == 16 ); + if( psEncC->fs_kHz == 8 ) { + LBRRRate_thres_bps = LBRR_NB_MIN_RATE_BPS; + } else if( psEncC->fs_kHz == 12 ) { + LBRRRate_thres_bps = LBRR_MB_MIN_RATE_BPS; + } else { + LBRRRate_thres_bps = LBRR_WB_MIN_RATE_BPS; } - return( ret ); + + LBRRRate_thres_bps = SKP_RSHIFT( SKP_SMULBB( LBRRRate_thres_bps, 7 - psEncC->PacketLoss_perc ), 2 ); + if( psEncC->useInBandFEC && TargetRate_bps >= LBRRRate_thres_bps && psEncC->PacketLoss_perc > 0 ) { + /* Set gain increase / rate reduction for LBRR usage */ + psEncC->LBRR_GainIncreases = SKP_max_int( 7 - SKP_SMULWB( psEncC->PacketLoss_perc, SKP_FIX_CONST( 0.4, 16 ) ), 2 ); + psEncC->LBRR_enabled = 1; + } else { + psEncC->LBRR_enabled = 0; + } + + return ret; } diff --git a/src_common/SKP_Silk_dec_API.c b/src_common/SKP_Silk_dec_API.c index ce03b9ede..7d046f4c2 100644 --- a/src_common/SKP_Silk_dec_API.c +++ b/src_common/SKP_Silk_dec_API.c @@ -31,6 +31,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "SKP_Silk_SDK_API.h" #include "SKP_Silk_main.h" +/* Decoder Super Struct */ +typedef struct { + SKP_Silk_decoder_state channel_state[ DECODER_NUM_CHANNELS ]; + stereo_state sStereo; + SKP_int nChannels; +} SKP_Silk_decoder; + + /*********************/ /* Decoder functions */ /*********************/ @@ -39,7 +47,7 @@ SKP_int SKP_Silk_SDK_Get_Decoder_Size( SKP_int32 *decSizeBytes ) { SKP_int ret = SKP_SILK_NO_ERROR; - *decSizeBytes = sizeof( SKP_Silk_decoder_state ); + *decSizeBytes = sizeof( SKP_Silk_decoder ); return ret; } @@ -49,61 +57,13 @@ SKP_int SKP_Silk_SDK_InitDecoder( void* decState /* I/O: State */ ) { - SKP_int ret = SKP_SILK_NO_ERROR; - SKP_Silk_decoder_state *struc; - - struc = (SKP_Silk_decoder_state *)decState; + SKP_int n, ret = SKP_SILK_NO_ERROR; + SKP_Silk_decoder_state *channel_state = ((SKP_Silk_decoder *)decState)->channel_state; - ret = SKP_Silk_init_decoder( struc ); - - return ret; -} - -/* Prefill LPC synthesis buffer, HP filter and upsampler. Input must be exactly 10 ms of audio. */ -SKP_int SKP_Silk_SDK_Decoder_prefill_buffers( /* O: Returns error code */ - void* decState, /* I/O: State */ - SKP_SILK_SDK_DecControlStruct* decControl, /* I/O: Control Structure */ - const SKP_int16 *samplesIn, /* I: Speech sample input vector (10 ms) */ - SKP_int nSamplesIn /* I: Number of samples in input vector */ -) -{ - SKP_int i, nSamples, ret = 0; - SKP_Silk_decoder_state *psDec = ( SKP_Silk_decoder_state *)decState; - SKP_Silk_resampler_state_struct resampler_state; - SKP_int16 buf[ 10 * MAX_FS_KHZ ]; - SKP_int16 buf_out[ 10 * MAX_API_FS_KHZ ]; - const SKP_int16 *in_ptr; - - /* Compute some numbers at API sampling rate */ - if( nSamplesIn != SKP_DIV32_16( decControl->API_sampleRate, 100 ) ) { - return -1; + for( n = 0; n < DECODER_NUM_CHANNELS; n++ ) { + ret = SKP_Silk_init_decoder( &channel_state[ n ] ); } - /* Resample input if necessary */ - if( decControl->API_sampleRate != SKP_SMULBB( 1000, psDec->fs_kHz ) ) { - ret += SKP_Silk_resampler_init( &resampler_state, decControl->API_sampleRate, SKP_SMULBB( 1000, psDec->fs_kHz ) ); - ret += SKP_Silk_resampler( &resampler_state, buf, samplesIn, nSamplesIn ); - in_ptr = buf; - nSamples = SKP_SMULBB( 10, psDec->fs_kHz ); - } else { - in_ptr = samplesIn; - nSamples = nSamplesIn; - } - - /* Set synthesis filter state */ - for( i = 0; i < psDec->LPC_order; i++ ) { - psDec->sLPC_Q14[ MAX_LPC_ORDER - i ] = SKP_LSHIFT( SKP_SMULWB( psDec->prev_inv_gain_Q16, in_ptr[ nSamples - i ] ), 14 ); - } - - /* HP filter */ - SKP_Silk_biquad_alt( in_ptr, psDec->HP_B, psDec->HP_A, psDec->HPState, buf, nSamples ); - - /* Output upsampler */ - SKP_Silk_resampler( &psDec->resampler_state, buf_out, buf, nSamples ); - - /* Avoid using LSF interpolation or pitch prediction in first next frame */ - psDec->first_frame_after_reset = 1; - return ret; } @@ -111,89 +71,182 @@ SKP_int SKP_Silk_SDK_Decoder_prefill_buffers( /* O: Returns error co SKP_int SKP_Silk_SDK_Decode( void* decState, /* I/O: State */ SKP_SILK_SDK_DecControlStruct* decControl, /* I/O: Control Structure */ - SKP_int lostFlag, /* I: 0: no loss, 1 loss, 2 decode fec */ + SKP_int lostFlag, /* I: 0: no loss, 1 loss, 2 decode FEC */ SKP_int newPacketFlag, /* I: Indicates first decoder call for this packet */ ec_dec *psRangeDec, /* I/O Compressor data structure */ - const SKP_int nBytesIn, /* I: Number of input bytes */ SKP_int16 *samplesOut, /* O: Decoded output speech vector */ SKP_int32 *nSamplesOut /* O: Number of samples decoded */ ) { - SKP_int ret = SKP_SILK_NO_ERROR, prev_fs_kHz; - SKP_Silk_decoder_state *psDec; - - psDec = (SKP_Silk_decoder_state *)decState; + SKP_int i, n, prev_fs_kHz, doResample, flags, nFlags, MS_predictorIx, ret = SKP_SILK_NO_ERROR; + SKP_int32 nSamplesOutDec, LBRR_symbol; + SKP_int16 samplesOut1_tmp[ 2 * MAX_FS_KHZ * MAX_FRAME_LENGTH_MS ]; + SKP_int16 samplesOut2_tmp[ MAX_API_FS_KHZ * MAX_FRAME_LENGTH_MS ]; + SKP_int16 *dec_out_ptr, *resample_out_ptr; + SKP_Silk_decoder *psDec = ( SKP_Silk_decoder * )decState; + SKP_Silk_decoder_state *channel_state = psDec->channel_state; /**********************************/ /* Test if first frame in payload */ /**********************************/ if( newPacketFlag ) { - /* First Frame in Payload */ - psDec->nFramesDecoded = 0; /* Used to count frames in packet */ + for( n = 0; n < decControl->nChannels; n++ ) { + channel_state[ n ].nFramesDecoded = 0; /* Used to count frames in packet */ + } } /* Save previous sample frequency */ - prev_fs_kHz = psDec->fs_kHz; - - if( psDec->nFramesDecoded == 0 ) { - SKP_int fs_kHz_dec; - if( decControl->payloadSize_ms == 10 ) { - psDec->nFramesPerPacket = 1; - psDec->nb_subfr = 2; - } else if( decControl->payloadSize_ms == 20 ) { - psDec->nFramesPerPacket = 1; - psDec->nb_subfr = 4; - } else if( decControl->payloadSize_ms == 40 ) { - psDec->nFramesPerPacket = 2; - psDec->nb_subfr = 4; - } else if( decControl->payloadSize_ms == 60 ) { - psDec->nFramesPerPacket = 3; - psDec->nb_subfr = 4; - } else { - SKP_assert( 0 ); - return SKP_SILK_DEC_INVALID_FRAME_SIZE; - } - fs_kHz_dec = ( decControl->internalSampleRate >> 10 ) + 1; - if( fs_kHz_dec != 8 && fs_kHz_dec != 12 && fs_kHz_dec != 16 ) { - SKP_assert( 0 ); - return SKP_SILK_DEC_INVALID_SAMPLING_FREQUENCY; + prev_fs_kHz = channel_state[ 0 ].fs_kHz; + + if( decControl->nChannels > psDec->nChannels ) { + /* Mono -> Stereo transition: init state of second channel and stereo state */ + SKP_memset( &psDec->sStereo, 0, sizeof( psDec->sStereo ) ); + ret += SKP_Silk_init_decoder( &channel_state[ 1 ] ); + } + psDec->nChannels = decControl->nChannels; + + for( n = 0; n < decControl->nChannels; n++ ) { + if( channel_state[ n ].nFramesDecoded == 0 ) { + SKP_int fs_kHz_dec; + if( decControl->payloadSize_ms == 10 ) { + channel_state[ n ].nFramesPerPacket = 1; + channel_state[ n ].nb_subfr = 2; + } else if( decControl->payloadSize_ms == 20 ) { + channel_state[ n ].nFramesPerPacket = 1; + channel_state[ n ].nb_subfr = 4; + } else if( decControl->payloadSize_ms == 40 ) { + channel_state[ n ].nFramesPerPacket = 2; + channel_state[ n ].nb_subfr = 4; + } else if( decControl->payloadSize_ms == 60 ) { + channel_state[ n ].nFramesPerPacket = 3; + channel_state[ n ].nb_subfr = 4; + } else { + SKP_assert( 0 ); + return SKP_SILK_DEC_INVALID_FRAME_SIZE; + } + fs_kHz_dec = ( decControl->internalSampleRate >> 10 ) + 1; + if( fs_kHz_dec != 8 && fs_kHz_dec != 12 && fs_kHz_dec != 16 ) { + SKP_assert( 0 ); + return SKP_SILK_DEC_INVALID_SAMPLING_FREQUENCY; + } + SKP_Silk_decoder_set_fs( &channel_state[ n ], fs_kHz_dec ); } - SKP_Silk_decoder_set_fs( psDec, fs_kHz_dec ); } - /* Call decoder for one frame */ - ret += SKP_Silk_decode_frame( psDec, psRangeDec, samplesOut, nSamplesOut, nBytesIn, lostFlag ); - if( decControl->API_sampleRate > MAX_API_FS_KHZ * 1000 || decControl->API_sampleRate < 8000 ) { ret = SKP_SILK_DEC_INVALID_SAMPLING_FREQUENCY; return( ret ); } - /* Resample if needed */ - if( SKP_SMULBB( psDec->fs_kHz, 1000 ) != decControl->API_sampleRate ) { - SKP_int16 samplesOut_tmp[ MAX_API_FS_KHZ * MAX_FRAME_LENGTH_MS ]; - SKP_assert( psDec->fs_kHz <= MAX_API_FS_KHZ ); + doResample = SKP_SMULBB( channel_state[ 0 ].fs_kHz, 1000 ) != decControl->API_sampleRate; + + /* Set up pointers to temp buffers */ + if( doResample || decControl->nChannels == 2 ) { + dec_out_ptr = samplesOut1_tmp; + } else { + dec_out_ptr = samplesOut; + } + if( decControl->nChannels == 2 ) { + resample_out_ptr = samplesOut2_tmp; + } else { + resample_out_ptr = samplesOut; + } - /* Copy to a tmp buffer as the resampling writes to samplesOut */ - SKP_memcpy( samplesOut_tmp, samplesOut, *nSamplesOut * sizeof( SKP_int16 ) ); + if( lostFlag != FLAG_PACKET_LOST && channel_state[ 0 ].nFramesDecoded == 0 ) { + /* First decoder call for this payload */ + nFlags = SKP_SMULBB( decControl->nChannels, channel_state[ 0 ].nFramesPerPacket + 1 ); + flags = SKP_RSHIFT( psRangeDec->buf[ 0 ], 8 - nFlags ) & ( SKP_LSHIFT( 1, nFlags ) - 1 ); + for( i = 0; i < nFlags; i++ ) { + ec_dec_icdf( psRangeDec, SKP_Silk_uniform2_iCDF, 8 ); + } + /* Decode VAD flags and LBRR flag */ + for( n = decControl->nChannels - 1; n >= 0; n-- ) { + channel_state[ n ].LBRR_flag = flags & 1; + flags = SKP_RSHIFT( flags, 1 ); + for( i = channel_state[ n ].nFramesPerPacket - 1; i >= 0 ; i-- ) { + channel_state[ n ].VAD_flags[ i ] = flags & 1; + flags = SKP_RSHIFT( flags, 1 ); + } + } + /* Decode LBRR flags */ + for( n = 0; n < decControl->nChannels; n++ ) { + SKP_memset( channel_state[ n ].LBRR_flags, 0, sizeof( channel_state[ n ].LBRR_flags ) ); + if( channel_state[ n ].LBRR_flag ) { + if( channel_state[ n ].nFramesPerPacket == 1 ) { + channel_state[ n ].LBRR_flags[ 0 ] = 1; + } else { + LBRR_symbol = ec_dec_icdf( psRangeDec, SKP_Silk_LBRR_flags_iCDF_ptr[ channel_state[ n ].nFramesPerPacket - 2 ], 8 ) + 1; + for( i = 0; i < channel_state[ n ].nFramesPerPacket; i++ ) { + channel_state[ n ].LBRR_flags[ i ] = SKP_RSHIFT( LBRR_symbol, i ) & 1; + } + } + } + } - /* (Re-)initialize resampler state when switching internal sampling frequency */ - if( prev_fs_kHz != psDec->fs_kHz || psDec->prev_API_sampleRate != decControl->API_sampleRate ) { - ret = SKP_Silk_resampler_init( &psDec->resampler_state, SKP_SMULBB( psDec->fs_kHz, 1000 ), decControl->API_sampleRate ); + if( lostFlag == FLAG_DECODE_NORMAL ) { + /* Regular decoding: skip all LBRR data */ + for( i = 0; i < channel_state[ 0 ].nFramesPerPacket; i++ ) { + for( n = 0; n < decControl->nChannels; n++ ) { + if( channel_state[ n ].LBRR_flags[ i ] ) { + SKP_int pulses[ MAX_FRAME_LENGTH ]; + SKP_Silk_decode_indices( &channel_state[ n ], psRangeDec, i, 1 ); + SKP_Silk_decode_pulses( psRangeDec, pulses, channel_state[ n ].indices.signalType, + channel_state[ n ].indices.quantOffsetType, channel_state[ n ].frame_length ); + } + } + } } + } + + /* Get MS predictor index */ + if( decControl->nChannels == 2 ) { + MS_predictorIx = ec_dec_icdf( psRangeDec, SKP_Silk_stereo_predictor_iCDF, 8 ); + } + + /* Call decoder for one frame */ + for( n = 0; n < decControl->nChannels; n++ ) { + ret += SKP_Silk_decode_frame( &channel_state[ n ], psRangeDec, &dec_out_ptr[ n * MAX_FS_KHZ * MAX_FRAME_LENGTH_MS ], &nSamplesOutDec, lostFlag ); + } - /* Resample the output to API_sampleRate */ - ret += SKP_Silk_resampler( &psDec->resampler_state, samplesOut, samplesOut_tmp, *nSamplesOut ); + /* Convert Mid/Side to Left/Right */ + if( decControl->nChannels == 2 ) { + SKP_Silk_stereo_MS_to_LR( &psDec->sStereo, dec_out_ptr, &dec_out_ptr[ MAX_FS_KHZ * MAX_FRAME_LENGTH_MS ], MS_predictorIx, channel_state[ 0 ].fs_kHz, nSamplesOutDec ); + } - /* Update the number of output samples */ - *nSamplesOut = SKP_DIV32( ( SKP_int32 )*nSamplesOut * decControl->API_sampleRate, SKP_SMULBB( psDec->fs_kHz, 1000 ) ); + /* Number of output samples */ + if( doResample ) { + *nSamplesOut = SKP_DIV32( nSamplesOutDec * decControl->API_sampleRate, SKP_SMULBB( channel_state[ 0 ].fs_kHz, 1000 ) ); + } else { + *nSamplesOut = nSamplesOutDec; } - psDec->prev_API_sampleRate = decControl->API_sampleRate; + for( n = 0; n < decControl->nChannels; n++ ) { + /* Resample if needed */ + if( doResample ) { + /* Initialize resampler when switching internal or external sampling frequency */ + if( prev_fs_kHz != channel_state[ n ].fs_kHz || channel_state[ n ].prev_API_sampleRate != decControl->API_sampleRate ) { + ret = SKP_Silk_resampler_init( &channel_state[ n ].resampler_state, SKP_SMULBB( channel_state[ n ].fs_kHz, 1000 ), decControl->API_sampleRate ); + } + + /* Resample the output to API_sampleRate */ + ret += SKP_Silk_resampler( &channel_state[ n ].resampler_state, resample_out_ptr, &dec_out_ptr[ n * MAX_FS_KHZ * MAX_FRAME_LENGTH_MS ], nSamplesOutDec ); + } else { + resample_out_ptr = &dec_out_ptr[ n * MAX_FS_KHZ * MAX_FRAME_LENGTH_MS ]; + } + + /* Interleave if needed */ + if( decControl->nChannels == 2 ) { + for( i = 0; i < *nSamplesOut; i++ ) { + samplesOut[ n + 2 * i ] = resample_out_ptr[ i ]; + } + } + + channel_state[ n ].prev_API_sampleRate = decControl->API_sampleRate; + } - /* Copy all parameters that are needed out of internal structure to the control stucture */ - decControl->frameSize = ( SKP_int )*nSamplesOut; - decControl->framesPerPayload = ( SKP_int )psDec->nFramesPerPacket; + /* Copy parameters to control stucture */ + decControl->frameSize = ( SKP_int )*nSamplesOut; + decControl->framesPerPayload = ( SKP_int )channel_state[ n ].nFramesPerPacket; return ret; } @@ -217,6 +270,7 @@ SKP_int SKP_Silk_SDK_get_TOC( SKP_memset( Silk_TOC, 0, sizeof( Silk_TOC ) ); + /* For stereo, extract the flags for the mid channel */ flags = SKP_RSHIFT( payload[ 0 ], 7 - nFramesPerPayload ) & ( SKP_LSHIFT( 1, nFramesPerPayload + 1 ) - 1 ); Silk_TOC->inbandFECFlag = flags & 1; diff --git a/src_common/SKP_Silk_decode_frame.c b/src_common/SKP_Silk_decode_frame.c index b09045026..0db27f81e 100644 --- a/src_common/SKP_Silk_decode_frame.c +++ b/src_common/SKP_Silk_decode_frame.c @@ -28,10 +28,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "SKP_Silk_main.h" #include "SKP_Silk_PLC.h" -#define DECODE_NORMAL 0 -#define PACKET_LOST 1 -#define DECODE_LBRR 2 - /****************/ /* Decode frame */ /****************/ @@ -40,14 +36,11 @@ SKP_int SKP_Silk_decode_frame( ec_dec *psRangeDec, /* I/O Compressor data structure */ SKP_int16 pOut[], /* O Pointer to output speech frame */ SKP_int32 *pN, /* O Pointer to size of output frame */ - const SKP_int nBytes, /* I Payload length */ SKP_int lostFlag /* I 0: no loss, 1 loss, 2 decode fec */ ) { SKP_Silk_decoder_control sDecCtrl; - SKP_int i, L, mv_len, ret = 0; - SKP_int8 flags; - SKP_int32 LBRR_symbol; + SKP_int L, mv_len, ret = 0; SKP_int pulses[ MAX_FRAME_LENGTH ]; TIC(DECODE_FRAME) @@ -58,56 +51,9 @@ TIC(DECODE_FRAME) /* Safety checks */ SKP_assert( L > 0 && L <= MAX_FRAME_LENGTH ); - /********************************************/ - /* Decode Frame if packet is not lost */ - /********************************************/ - if( lostFlag != PACKET_LOST && psDec->nFramesDecoded == 0 ) { - /* First decoder call for this payload */ - /* Decode VAD flags and LBRR flag */ - flags = SKP_RSHIFT( psRangeDec->buf[ 0 ], 7 - psDec->nFramesPerPacket ) & - ( SKP_LSHIFT( 1, psDec->nFramesPerPacket + 1 ) - 1 ); - psDec->LBRR_flag = flags & 1; - for( i = psDec->nFramesPerPacket - 1; i >= 0 ; i-- ) { - flags = SKP_RSHIFT( flags, 1 ); - psDec->VAD_flags[ i ] = flags & 1; - } - for( i = 0; i < psDec->nFramesPerPacket + 1; i++ ) { - ec_dec_icdf( psRangeDec, SKP_Silk_uniform2_iCDF, 8 ); - } - - /* Decode LBRR flags */ - SKP_memset( psDec->LBRR_flags, 0, sizeof( psDec->LBRR_flags ) ); - if( psDec->LBRR_flag ) { - if( psDec->nFramesPerPacket == 1 ) { - psDec->LBRR_flags[ 0 ] = 1; - } else { - LBRR_symbol = ec_dec_icdf( psRangeDec, SKP_Silk_LBRR_flags_iCDF_ptr[ psDec->nFramesPerPacket - 2 ], 8 ) + 1; - for( i = 0; i < psDec->nFramesPerPacket; i++ ) { - psDec->LBRR_flags[ i ] = SKP_RSHIFT( LBRR_symbol, i ) & 1; - } - } - } - - if( lostFlag == DECODE_NORMAL ) { - /* Regular decoding: skip all LBRR data */ - for( i = 0; i < psDec->nFramesPerPacket; i++ ) { - if( psDec->LBRR_flags[ i ] ) { - SKP_Silk_decode_indices( psDec, psRangeDec, i, 1 ); - SKP_Silk_decode_pulses( psRangeDec, pulses, psDec->indices.signalType, - psDec->indices.quantOffsetType, psDec->frame_length ); - } - } - } - - } - - if( lostFlag == DECODE_LBRR && psDec->LBRR_flags[ psDec->nFramesDecoded ] == 0 ) { - /* Treat absent LBRR data as lost frame */ - lostFlag = PACKET_LOST; - psDec->nFramesDecoded++; - } - - if( lostFlag != PACKET_LOST ) { + if( lostFlag == FLAG_DECODE_NORMAL || + ( lostFlag == FLAG_DECODE_LBRR && psDec->LBRR_flags[ psDec->nFramesDecoded ] == 1 ) ) + { /*********************************************/ /* Decode quantization indices of side info */ /*********************************************/ @@ -151,7 +97,6 @@ TOC(decode_core) /* A frame has been decoded without errors */ psDec->first_frame_after_reset = 0; - psDec->nFramesDecoded++; } else { /* Handle packet loss by extrapolation */ SKP_Silk_PLC( psDec, &sDecCtrl, pOut, L, 1 ); @@ -175,20 +120,12 @@ TOC(decode_core) /************************************************/ SKP_Silk_CNG( psDec, &sDecCtrl, pOut, L ); - /********************************************/ - /* HP filter output */ - /********************************************/ -TIC(HP_out) - SKP_Silk_biquad_alt( pOut, psDec->HP_B, psDec->HP_A, psDec->HPState, pOut, L ); -TOC(HP_out) - /* Update some decoder state variables */ psDec->lagPrev = sDecCtrl.pitchL[ psDec->nb_subfr - 1 ]; + psDec->nFramesDecoded++; - /********************************************/ - /* set output frame length */ - /********************************************/ - *pN = ( SKP_int16 )L; + /* Set output frame length */ + *pN = L; TOC(DECODE_FRAME) diff --git a/src_common/SKP_Silk_decode_indices.c b/src_common/SKP_Silk_decode_indices.c index 488bbd2f8..9864eaf55 100644 --- a/src_common/SKP_Silk_decode_indices.c +++ b/src_common/SKP_Silk_decode_indices.c @@ -27,7 +27,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "SKP_Silk_main.h" -/* Decode indices from payload */ +/* Decode side-information parameters from payload */ void SKP_Silk_decode_indices( SKP_Silk_decoder_state *psDec, /* I/O State */ ec_dec *psRangeDec, /* I/O Compressor data structure */ @@ -40,6 +40,7 @@ void SKP_Silk_decode_indices( SKP_int16 ec_ix[ MAX_LPC_ORDER ]; SKP_uint8 pred_Q8[ MAX_LPC_ORDER ]; + /* Use conditional coding if previous frame available */ if( FrameIndex > 0 && ( decode_LBRR == 0 || psDec->LBRR_flags[ FrameIndex - 1 ] == 1 ) ) { condCoding = 1; } else { @@ -60,17 +61,17 @@ void SKP_Silk_decode_indices( /****************/ /* Decode gains */ /****************/ - /* first subframe */ + /* First subframe */ if( condCoding ) { - /* conditional coding */ + /* Conditional coding */ psDec->indices.GainsIndices[ 0 ] = (SKP_int8)ec_dec_icdf( psRangeDec, SKP_Silk_delta_gain_iCDF, 8 ); } else { - /* independent coding, in two stages: MSB bits followed by 3 LSBs */ + /* Independent coding, in two stages: MSB bits followed by 3 LSBs */ psDec->indices.GainsIndices[ 0 ] = (SKP_int8)SKP_LSHIFT( ec_dec_icdf( psRangeDec, SKP_Silk_gain_iCDF[ psDec->indices.signalType ], 8 ), 3 ); psDec->indices.GainsIndices[ 0 ] += (SKP_int8)ec_dec_icdf( psRangeDec, SKP_Silk_uniform8_iCDF, 8 ); } - /* remaining subframes */ + /* Remaining subframes */ for( i = 1; i < psDec->nb_subfr; i++ ) { psDec->indices.GainsIndices[ i ] = (SKP_int8)ec_dec_icdf( psRangeDec, SKP_Silk_delta_gain_iCDF, 8 ); } diff --git a/src_common/SKP_Silk_decoder_set_fs.c b/src_common/SKP_Silk_decoder_set_fs.c index 7142efc86..ea316fc90 100644 --- a/src_common/SKP_Silk_decoder_set_fs.c +++ b/src_common/SKP_Silk_decoder_set_fs.c @@ -76,16 +76,10 @@ void SKP_Silk_decoder_set_fs( psDec->first_frame_after_reset = 1; if( fs_kHz == 16 ) { - psDec->HP_A = SKP_Silk_Dec_A_HP_16; - psDec->HP_B = SKP_Silk_Dec_B_HP_16; psDec->pitch_lag_low_bits_iCDF = SKP_Silk_uniform8_iCDF; } else if( fs_kHz == 12 ) { - psDec->HP_A = SKP_Silk_Dec_A_HP_12; - psDec->HP_B = SKP_Silk_Dec_B_HP_12; psDec->pitch_lag_low_bits_iCDF = SKP_Silk_uniform6_iCDF; } else if( fs_kHz == 8 ) { - psDec->HP_A = SKP_Silk_Dec_A_HP_8; - psDec->HP_B = SKP_Silk_Dec_B_HP_8; psDec->pitch_lag_low_bits_iCDF = SKP_Silk_uniform4_iCDF; } else { /* unsupported sampling rate */ diff --git a/src_common/SKP_Silk_define.h b/src_common/SKP_Silk_define.h index 04b1b1fdd..adefef80a 100644 --- a/src_common/SKP_Silk_define.h +++ b/src_common/SKP_Silk_define.h @@ -40,6 +40,11 @@ extern "C" { #endif +/* Max number of encoder channels (1/2) */ +#define ENCODER_NUM_CHANNELS 2 +/* Number of decoder channels (1/2) */ +#define DECODER_NUM_CHANNELS 2 + #define MAX_FRAMES_PER_PACKET 3 #ifndef FIXED_POINT @@ -51,30 +56,36 @@ extern "C" #define MAX_TARGET_RATE_BPS 80000 #define TARGET_RATE_TAB_SZ 8 +/* Decay time for bitreservoir */ +#define BITRESERVOIR_DECAY_TIME_MS 200 + /* LBRR thresholds */ #define LBRR_NB_MIN_RATE_BPS 9000 #define LBRR_MB_MIN_RATE_BPS 12000 #define LBRR_WB_MIN_RATE_BPS 15000 -/* DTX settings */ -#define NO_SPEECH_FRAMES_BEFORE_DTX 5 /* eq 100 ms */ +/* DTX settings */ +#define NB_SPEECH_FRAMES_BEFORE_DTX 10 /* eq 200 ms */ #define MAX_CONSECUTIVE_DTX 20 /* eq 400 ms */ -/* Activate bandwidth transition filtering for mode switching */ -#define SWITCH_TRANSITION_FILTERING 1 - -/* Decoder Parameters */ -#define DEC_HP_ORDER 2 - /* Maximum sampling frequency, should be 16 for embedded */ #define MAX_FS_KHZ 16 #define MAX_API_FS_KHZ 48 -/* Signal types used by silk */ +/* Signal types */ #define TYPE_NO_VOICE_ACTIVITY 0 #define TYPE_UNVOICED 1 #define TYPE_VOICED 2 +/* Setting for stereo processing */ +#define STEREO_QUANT_STEPS 15 +#define STEREO_QUANT_HYSTERESIS 0.25 +#define STEREO_INTERPOL_LENGTH_MS 10 + +/* Range of pitch lag estimates */ +#define PITCH_EST_MIN_LAG_MS 2 /* 2 ms -> 500 Hz */ +#define PITCH_EST_MAX_LAG_MS 18 /* 18 ms -> 56 Hz */ + /* Number of subframes */ #define MAX_NB_SUBFR 4 @@ -147,20 +158,20 @@ extern "C" #define MAX_DEL_DEC_STATES 4 #define LTP_BUF_LENGTH 512 -#define LTP_MASK (LTP_BUF_LENGTH - 1) +#define LTP_MASK ( LTP_BUF_LENGTH - 1 ) #define DECISION_DELAY 32 -#define DECISION_DELAY_MASK (DECISION_DELAY - 1) +#define DECISION_DELAY_MASK ( DECISION_DELAY - 1 ) -/* number of subframes for excitation entropy coding */ +/* Number of subframes for excitation entropy coding */ #define SHELL_CODEC_FRAME_LENGTH 16 #define LOG2_SHELL_CODEC_FRAME_LENGTH 4 -#define MAX_NB_SHELL_BLOCKS (MAX_FRAME_LENGTH / SHELL_CODEC_FRAME_LENGTH) +#define MAX_NB_SHELL_BLOCKS ( MAX_FRAME_LENGTH / SHELL_CODEC_FRAME_LENGTH ) -/* number of rate levels, for entropy coding of excitation */ +/* Number of rate levels, for entropy coding of excitation */ #define N_RATE_LEVELS 10 -/* maximum sum of pulses per shell coding frame */ +/* Maximum sum of pulses per shell coding frame */ #define MAX_PULSES 16 #define MAX_MATRIX_SIZE MAX_LPC_ORDER /* Max of LPC Order and LTP order */ @@ -206,16 +217,12 @@ extern "C" #define NLSF_QUANT_DEL_DEC_STATES ( 1 << NLSF_QUANT_DEL_DEC_STATES_LOG2 ) /* Transition filtering for mode switching */ -#if SWITCH_TRANSITION_FILTERING # define TRANSITION_TIME_MS 5120 // 5120 = 64 * FRAME_LENGTH_MS * ( TRANSITION_INT_NUM - 1 ) = 64*(20*4) # define TRANSITION_NB 3 /* Hardcoded in tables */ # define TRANSITION_NA 2 /* Hardcoded in tables */ # define TRANSITION_INT_NUM 5 /* Hardcoded in tables */ # define TRANSITION_FRAMES ( TRANSITION_TIME_MS / MAX_FRAME_LENGTH_MS ) // todo: needs to be made flexible for 10 ms frames # define TRANSITION_INT_STEPS ( TRANSITION_FRAMES / ( TRANSITION_INT_NUM - 1 ) ) -#else -# define TRANSITION_FRAMES 0 -#endif /* BWE factors to apply after packet loss */ #define BWE_AFTER_LOSS_Q16 63570 diff --git a/src_common/SKP_Silk_enc_API.c b/src_common/SKP_Silk_enc_API.c index d0e86c0e2..71dd5e916 100644 --- a/src_common/SKP_Silk_enc_API.c +++ b/src_common/SKP_Silk_enc_API.c @@ -34,86 +34,20 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #if FIXED_POINT #include "SKP_Silk_main_FIX.h" #define SKP_Silk_encoder_state_Fxx SKP_Silk_encoder_state_FIX -#define SKP_Silk_init_encoder_Fxx SKP_Silk_init_encoder_FIX -#define SKP_Silk_control_encoder_Fxx SKP_Silk_control_encoder_FIX #define SKP_Silk_encode_frame_Fxx SKP_Silk_encode_frame_FIX #else #include "SKP_Silk_main_FLP.h" #define SKP_Silk_encoder_state_Fxx SKP_Silk_encoder_state_FLP -#define SKP_Silk_init_encoder_Fxx SKP_Silk_init_encoder_FLP -#define SKP_Silk_control_encoder_Fxx SKP_Silk_control_encoder_FLP #define SKP_Silk_encode_frame_Fxx SKP_Silk_encode_frame_FLP #endif -#define SKP_Silk_EncodeControlStruct SKP_SILK_SDK_EncControlStruct -/**************************/ -/* Encode frame with Silk */ -/**************************/ -static SKP_int process_enc_control_struct( - SKP_Silk_encoder_state_Fxx *psEnc, /* I/O: State */ - SKP_Silk_EncodeControlStruct *encControl /* I: Control structure */ -) -{ - SKP_int max_internal_fs_kHz, min_internal_fs_kHz, Complexity, PacketSize_ms, PacketLoss_perc, UseInBandFEC, ret = SKP_SILK_NO_ERROR; - SKP_int32 TargetRate_bps, API_fs_Hz; - - SKP_assert( encControl != NULL ); - - /* Check sampling frequency first, to avoid divide by zero later */ - if( ( ( encControl->API_sampleRate != 8000 ) && - ( encControl->API_sampleRate != 12000 ) && - ( encControl->API_sampleRate != 16000 ) && - ( encControl->API_sampleRate != 24000 ) && - ( encControl->API_sampleRate != 32000 ) && - ( encControl->API_sampleRate != 44100 ) && - ( encControl->API_sampleRate != 48000 ) ) || - ( ( encControl->maxInternalSampleRate != 8000 ) && - ( encControl->maxInternalSampleRate != 12000 ) && - ( encControl->maxInternalSampleRate != 16000 ) ) || - ( ( encControl->minInternalSampleRate != 8000 ) && - ( encControl->minInternalSampleRate != 12000 ) && - ( encControl->minInternalSampleRate != 16000 ) ) || - ( encControl->minInternalSampleRate > encControl->maxInternalSampleRate ) ) { - ret = SKP_SILK_ENC_FS_NOT_SUPPORTED; - SKP_assert( 0 ); - return( ret ); - } - if( encControl->useDTX < 0 || encControl->useDTX > 1 ) { - ret = SKP_SILK_ENC_INVALID_DTX_SETTING; - } - if( encControl->useCBR < 0 || encControl->useCBR > 1 ) { - ret = SKP_SILK_ENC_INVALID_CBR_SETTING; - } - - /* Set encoder parameters from control structure */ - API_fs_Hz = encControl->API_sampleRate; - max_internal_fs_kHz = (SKP_int)( encControl->maxInternalSampleRate >> 10 ) + 1; /* convert Hz -> kHz */ - min_internal_fs_kHz = (SKP_int)( encControl->minInternalSampleRate >> 10 ) + 1; /* convert Hz -> kHz */ - PacketSize_ms = encControl->payloadSize_ms; - TargetRate_bps = encControl->bitRate; - PacketLoss_perc = encControl->packetLossPercentage; - UseInBandFEC = encControl->useInBandFEC; - Complexity = encControl->complexity; - psEnc->sCmn.useDTX = encControl->useDTX; - psEnc->sCmn.useCBR = encControl->useCBR; - - /* Save values in state */ - psEnc->sCmn.API_fs_Hz = API_fs_Hz; - psEnc->sCmn.maxInternal_fs_kHz = max_internal_fs_kHz; - psEnc->sCmn.minInternal_fs_kHz = min_internal_fs_kHz; - psEnc->sCmn.useInBandFEC = UseInBandFEC; - - TargetRate_bps = SKP_LIMIT( TargetRate_bps, MIN_TARGET_RATE_BPS, MAX_TARGET_RATE_BPS ); - if( ( ret = SKP_Silk_control_encoder_Fxx( psEnc, PacketSize_ms, TargetRate_bps, - PacketLoss_perc, Complexity) ) != 0 ) { - SKP_assert( 0 ); - return( ret ); - } - - encControl->internalSampleRate = SKP_SMULBB( psEnc->sCmn.fs_kHz, 1000 ); - - return ret; -} +/* Encoder Super Struct */ +typedef struct { + SKP_Silk_encoder_state_Fxx state_Fxx[ ENCODER_NUM_CHANNELS ]; + stereo_state sStereo; + SKP_int32 nBitsExceeded; + SKP_int nChannels; +} SKP_Silk_encoder; /****************************************/ /* Encoder functions */ @@ -123,7 +57,7 @@ SKP_int SKP_Silk_SDK_Get_Encoder_Size( SKP_int32 *encSizeBytes ) { SKP_int ret = SKP_SILK_NO_ERROR; - *encSizeBytes = sizeof( SKP_Silk_encoder_state_Fxx ); + *encSizeBytes = sizeof( SKP_Silk_encoder ); return ret; } @@ -133,26 +67,30 @@ SKP_int SKP_Silk_SDK_Get_Encoder_Size( SKP_int32 *encSizeBytes ) /*************************/ SKP_int SKP_Silk_SDK_InitEncoder( void *encState, /* I/O: State */ - SKP_Silk_EncodeControlStruct *encStatus /* O: Control structure */ + SKP_SILK_SDK_EncControlStruct *encStatus /* O: Control structure */ ) { - SKP_Silk_encoder_state_Fxx *psEnc; - SKP_int ret = SKP_SILK_NO_ERROR; - - - psEnc = ( SKP_Silk_encoder_state_Fxx* )encState; + SKP_Silk_encoder *psEnc; + SKP_int n, ret = SKP_SILK_NO_ERROR; - /* Reset Encoder */ - if( ret += SKP_Silk_init_encoder_Fxx( psEnc ) ) { - SKP_assert( 0 ); + psEnc = (SKP_Silk_encoder *)encState; + + /* Reset encoder */ + for( n = 0; n < ENCODER_NUM_CHANNELS; n++ ) { + if( ret += SKP_Silk_init_encoder( &psEnc->state_Fxx[ n ] ) ) { + SKP_assert( 0 ); + } } + SKP_memset( &psEnc->sStereo, 0, sizeof( psEnc->sStereo ) ); + + psEnc->nBitsExceeded = 0; + psEnc->nChannels = 1; /* Read control structure */ if( ret += SKP_Silk_SDK_QueryEncoder( encState, encStatus ) ) { SKP_assert( 0 ); } - return ret; } @@ -161,25 +99,26 @@ SKP_int SKP_Silk_SDK_InitEncoder( /***************************************/ SKP_int SKP_Silk_SDK_QueryEncoder( const void *encState, /* I: State Vector */ - SKP_Silk_EncodeControlStruct *encStatus /* O: Control Structure */ + SKP_SILK_SDK_EncControlStruct *encStatus /* O: Control Structure */ ) { - SKP_Silk_encoder_state_Fxx *psEnc; + SKP_Silk_encoder_state_Fxx *state_Fxx; SKP_int ret = SKP_SILK_NO_ERROR; - psEnc = ( SKP_Silk_encoder_state_Fxx* )encState; - - encStatus->API_sampleRate = psEnc->sCmn.API_fs_Hz; - encStatus->maxInternalSampleRate = SKP_SMULBB( psEnc->sCmn.maxInternal_fs_kHz, 1000 ); - encStatus->minInternalSampleRate = SKP_SMULBB( psEnc->sCmn.minInternal_fs_kHz, 1000 ); - encStatus->payloadSize_ms = psEnc->sCmn.PacketSize_ms; - encStatus->bitRate = psEnc->sCmn.TargetRate_bps; - encStatus->packetLossPercentage = psEnc->sCmn.PacketLoss_perc; - encStatus->complexity = psEnc->sCmn.Complexity; - encStatus->useInBandFEC = psEnc->sCmn.useInBandFEC; - encStatus->useDTX = psEnc->sCmn.useDTX; - encStatus->useCBR = psEnc->sCmn.useCBR; - encStatus->internalSampleRate = SKP_SMULBB( psEnc->sCmn.fs_kHz, 1000 ); + state_Fxx = ((SKP_Silk_encoder *)encState)->state_Fxx; + + encStatus->API_sampleRate = state_Fxx->sCmn.API_fs_Hz; + encStatus->maxInternalSampleRate = state_Fxx->sCmn.maxInternal_fs_Hz; + encStatus->minInternalSampleRate = state_Fxx->sCmn.minInternal_fs_Hz; + encStatus->payloadSize_ms = state_Fxx->sCmn.PacketSize_ms; + encStatus->bitRate = state_Fxx->sCmn.TargetRate_bps; + encStatus->packetLossPercentage = state_Fxx->sCmn.PacketLoss_perc; + encStatus->complexity = state_Fxx->sCmn.Complexity; + encStatus->useInBandFEC = state_Fxx->sCmn.useInBandFEC; + encStatus->useDTX = state_Fxx->sCmn.useDTX; + encStatus->useCBR = state_Fxx->sCmn.useCBR; + encStatus->internalSampleRate = SKP_SMULBB( state_Fxx->sCmn.fs_kHz, 1000 ); + return ret; } @@ -188,81 +127,219 @@ SKP_int SKP_Silk_SDK_QueryEncoder( /**************************/ SKP_int SKP_Silk_SDK_Encode( void *encState, /* I/O: State */ - SKP_Silk_EncodeControlStruct *encControl, /* I: Control structure */ + SKP_SILK_SDK_EncControlStruct *encControl, /* I: Control structure */ const SKP_int16 *samplesIn, /* I: Speech sample input vector */ SKP_int nSamplesIn, /* I: Number of samples in input vector */ ec_enc *psRangeEnc, /* I/O Compressor data structure */ SKP_int32 *nBytesOut, /* I/O: Number of bytes in payload (input: Max bytes) */ - const SKP_int prefillFlag /* I: Flag to indicate prefilling buffers no coding */ + const SKP_int prefillFlag /* I: Flag to indicate prefilling buffers; no coding */ ) { - SKP_int tmp_payloadSize_ms, tmp_complexity, ret = 0; + SKP_int n, i, nBits, flags, tmp_payloadSize_ms, tmp_complexity, MS_predictorIx = 0, ret = 0; SKP_int nSamplesToBuffer, nBlocksOf10ms, nSamplesFromInput = 0; - SKP_Silk_encoder_state_Fxx *psEnc = ( SKP_Silk_encoder_state_Fxx* )encState; + SKP_int32 TargetRate_bps, channelRate_bps, LBRR_symbol; + SKP_Silk_encoder *psEnc = ( SKP_Silk_encoder * )encState; + SKP_int16 buf[ MAX_FRAME_LENGTH_MS * MAX_API_FS_KHZ ]; - ret = process_enc_control_struct( psEnc, encControl ); + /* Check values in encoder control structure */ + if( ( ret = check_control_input( encControl ) != 0 ) ) { + SKP_assert( 0 ); + return ret; + } - nBlocksOf10ms = SKP_DIV32( 100 * nSamplesIn, psEnc->sCmn.API_fs_Hz ); + if( encControl->nChannels > psEnc->nChannels ) { + /* Mono -> Stereo transition: init state of second channel and stereo state */ + SKP_memset( &psEnc->sStereo, 0, sizeof( psEnc->sStereo ) ); + ret += SKP_Silk_init_encoder( &psEnc->state_Fxx[ 1 ] ); + } + psEnc->nChannels = encControl->nChannels; + + nBlocksOf10ms = SKP_DIV32( 100 * nSamplesIn, encControl->API_sampleRate ); if( prefillFlag ) { /* Only accept input length of 10 ms */ if( nBlocksOf10ms != 1 ) { ret = SKP_SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES; SKP_assert( 0 ); - return( ret ); + return ret; } /* Reset Encoder */ - if( ret = SKP_Silk_init_encoder_Fxx( psEnc ) ) { - SKP_assert( 0 ); + for( n = 0; n < encControl->nChannels; n++ ) { + if( ret = SKP_Silk_init_encoder( &psEnc->state_Fxx[ n ] ) ) { + SKP_assert( 0 ); + } } tmp_payloadSize_ms = encControl->payloadSize_ms; encControl->payloadSize_ms = 10; tmp_complexity = encControl->complexity; encControl->complexity = 0; - ret = process_enc_control_struct( psEnc, encControl ); - psEnc->sCmn.prefillFlag = 1; + for( n = 0; n < encControl->nChannels; n++ ) { + psEnc->state_Fxx[ n ].sCmn.controlled_since_last_payload = 0; + psEnc->state_Fxx[ n ].sCmn.prefillFlag = 1; + } } else { /* Only accept input lengths that are a multiple of 10 ms */ - if( nBlocksOf10ms * psEnc->sCmn.API_fs_Hz != 100 * nSamplesIn || nSamplesIn < 0 ) { + if( nBlocksOf10ms * encControl->API_sampleRate != 100 * nSamplesIn || nSamplesIn < 0 ) { ret = SKP_SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES; SKP_assert( 0 ); - return( ret ); + return ret; } /* Make sure no more than one packet can be produced */ - if( 1000 * (SKP_int32)nSamplesIn > psEnc->sCmn.PacketSize_ms * psEnc->sCmn.API_fs_Hz ) { + if( 1000 * (SKP_int32)nSamplesIn > encControl->payloadSize_ms * encControl->API_sampleRate ) { ret = SKP_SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES; SKP_assert( 0 ); - return( ret ); + return ret; + } + } + + TargetRate_bps = SKP_RSHIFT32( encControl->bitRate, encControl->nChannels - 1 ); + for( n = 0; n < encControl->nChannels; n++ ) { + if( ( ret = SKP_Silk_control_encoder( &psEnc->state_Fxx[ n ], encControl, TargetRate_bps ) ) != 0 ) { + SKP_assert( 0 ); + return ret; } } + SKP_assert( encControl->nChannels == 1 || psEnc->state_Fxx[ 0 ].sCmn.fs_kHz == psEnc->state_Fxx[ 1 ].sCmn.fs_kHz ); /* Input buffering/resampling and encoding */ while( 1 ) { - nSamplesToBuffer = psEnc->sCmn.frame_length - psEnc->sCmn.inputBufIx; - if( psEnc->sCmn.API_fs_Hz == SKP_SMULBB( 1000, psEnc->sCmn.fs_kHz ) ) { - nSamplesToBuffer = SKP_min_int( nSamplesToBuffer, nSamplesIn ); - nSamplesFromInput = nSamplesToBuffer; - /* Copy to buffer */ - SKP_memcpy( &psEnc->sCmn.inputBuf[ psEnc->sCmn.inputBufIx ], samplesIn, nSamplesFromInput * sizeof( SKP_int16 ) ); - } else { - nSamplesToBuffer = SKP_min( nSamplesToBuffer, 10 * nBlocksOf10ms * psEnc->sCmn.fs_kHz ); - nSamplesFromInput = SKP_DIV32_16( nSamplesToBuffer * psEnc->sCmn.API_fs_Hz, psEnc->sCmn.fs_kHz * 1000 ); - /* Resample and write to buffer */ - ret += SKP_Silk_resampler( &psEnc->sCmn.resampler_state, &psEnc->sCmn.inputBuf[ psEnc->sCmn.inputBufIx ], samplesIn, nSamplesFromInput ); - } - samplesIn += nSamplesFromInput; - nSamplesIn -= nSamplesFromInput; - psEnc->sCmn.inputBufIx += nSamplesToBuffer; + nSamplesToBuffer = psEnc->state_Fxx[ 0 ].sCmn.frame_length - psEnc->state_Fxx[ 0 ].sCmn.inputBufIx; + nSamplesToBuffer = SKP_min( nSamplesToBuffer, 10 * nBlocksOf10ms * psEnc->state_Fxx[ 0 ].sCmn.fs_kHz ); + nSamplesFromInput = SKP_DIV32_16( nSamplesToBuffer * psEnc->state_Fxx[ 0 ].sCmn.API_fs_Hz, psEnc->state_Fxx[ 0 ].sCmn.fs_kHz * 1000 ); + /* Resample and write to buffer */ + if( encControl->nChannels == 2 ) { + for( n = 0; n < nSamplesFromInput; n++ ) { + buf[ n ] = samplesIn[ 2 * n ]; + } + ret += SKP_Silk_resampler( &psEnc->state_Fxx[ 0 ].sCmn.resampler_state, + &psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn.inputBufIx ], buf, nSamplesFromInput ); + psEnc->state_Fxx[ 0 ].sCmn.inputBufIx += nSamplesToBuffer; - /* Silk encoder */ - if( psEnc->sCmn.inputBufIx >= psEnc->sCmn.frame_length ) { - SKP_assert( psEnc->sCmn.inputBufIx == psEnc->sCmn.frame_length ); + nSamplesToBuffer = psEnc->state_Fxx[ 1 ].sCmn.frame_length - psEnc->state_Fxx[ 1 ].sCmn.inputBufIx; + nSamplesToBuffer = SKP_min( nSamplesToBuffer, 10 * nBlocksOf10ms * psEnc->state_Fxx[ 1 ].sCmn.fs_kHz ); + for( n = 0; n < nSamplesFromInput; n++ ) { + buf[ n ] = samplesIn[ 2 * n + 1 ]; + } + ret += SKP_Silk_resampler( &psEnc->state_Fxx[ 1 ].sCmn.resampler_state, + &psEnc->state_Fxx[ 1 ].sCmn.inputBuf[ psEnc->state_Fxx[ 1 ].sCmn.inputBufIx ], buf, nSamplesFromInput ); + psEnc->state_Fxx[ 1 ].sCmn.inputBufIx += nSamplesToBuffer; + } else { + SKP_assert( encControl->nChannels == 1 ); + ret += SKP_Silk_resampler( &psEnc->state_Fxx[ 0 ].sCmn.resampler_state, + &psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn.inputBufIx ], samplesIn, nSamplesFromInput ); + psEnc->state_Fxx[ 0 ].sCmn.inputBufIx += nSamplesToBuffer; + } + samplesIn += nSamplesFromInput * encControl->nChannels; + nSamplesIn -= nSamplesFromInput; + /* Silk encoder */ + if( psEnc->state_Fxx[ 0 ].sCmn.inputBufIx >= psEnc->state_Fxx[ 0 ].sCmn.frame_length ) { /* Enough data in input buffer, so encode */ - if( ( ret = SKP_Silk_encode_frame_Fxx( psEnc, nBytesOut, psRangeEnc ) ) != 0 ) { - SKP_assert( 0 ); + SKP_assert( psEnc->state_Fxx[ 0 ].sCmn.inputBufIx == psEnc->state_Fxx[ 0 ].sCmn.frame_length ); + SKP_assert( encControl->nChannels == 1 || psEnc->state_Fxx[ 1 ].sCmn.inputBufIx == psEnc->state_Fxx[ 1 ].sCmn.frame_length ); + + /* Deal with LBRR data */ + if( psEnc->state_Fxx[ 0 ].sCmn.nFramesAnalyzed == 0 && !prefillFlag ) { + /* Create space at start of payload for VAD and FEC flags */ + SKP_uint8 iCDF[ 2 ] = { 0, 0 }; + iCDF[ 0 ] = 256 - SKP_RSHIFT( 256, ( psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket + 1 ) * encControl->nChannels ); + ec_enc_icdf( psRangeEnc, 0, iCDF, 8 ); + + /* Encode any LBRR data from previous packet */ + /* Encode LBRR flags */ + for( n = 0; n < encControl->nChannels; n++ ) { + LBRR_symbol = 0; + for( i = 0; i < psEnc->state_Fxx[ n ].sCmn.nFramesPerPacket; i++ ) { + LBRR_symbol |= SKP_LSHIFT( psEnc->state_Fxx[ n ].sCmn.LBRR_flags[ i ], i ); + } + psEnc->state_Fxx[ n ].sCmn.LBRR_flag = LBRR_symbol > 0 ? 1 : 0; + if( LBRR_symbol && psEnc->state_Fxx[ n ].sCmn.nFramesPerPacket > 1 ) { + ec_enc_icdf( psRangeEnc, LBRR_symbol - 1, SKP_Silk_LBRR_flags_iCDF_ptr[ psEnc->state_Fxx[ n ].sCmn.nFramesPerPacket - 2 ], 8 ); + } + } + + /* Code LBRR indices and excitation signals */ + for( i = 0; i < psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket; i++ ) { + for( n = 0; n < encControl->nChannels; n++ ) { + if( psEnc->state_Fxx[ n ].sCmn.LBRR_flags[ i ] ) { + SKP_Silk_encode_indices( &psEnc->state_Fxx[ n ].sCmn, psRangeEnc, i, 1 ); + SKP_Silk_encode_pulses( psRangeEnc, psEnc->state_Fxx[ n ].sCmn.indices_LBRR[i].signalType, psEnc->state_Fxx[ n ].sCmn.indices_LBRR[i].quantOffsetType, + psEnc->state_Fxx[ n ].sCmn.pulses_LBRR[ i ], psEnc->state_Fxx[ n ].sCmn.frame_length ); + } + } + } + + /* Reset LBRR flags */ + for( n = 0; n < encControl->nChannels; n++ ) { + SKP_memset( psEnc->state_Fxx[ n ].sCmn.LBRR_flags, 0, sizeof( psEnc->state_Fxx[ n ].sCmn.LBRR_flags ) ); + } + } + + /* Convert Left/Right to Mid/Side */ + if( encControl->nChannels == 2 ) { + SKP_Silk_stereo_LR_to_MS( &psEnc->sStereo, psEnc->state_Fxx[ 0 ].sCmn.inputBuf, psEnc->state_Fxx[ 1 ].sCmn.inputBuf, + &MS_predictorIx, psEnc->state_Fxx[ 0 ].sCmn.fs_kHz, psEnc->state_Fxx[ 0 ].sCmn.frame_length ); + ec_enc_icdf( psRangeEnc, MS_predictorIx, SKP_Silk_stereo_predictor_iCDF, 8 ); + } + + + /* Total target bits for packet */ + nBits = SKP_DIV32_16( SKP_MUL( encControl->bitRate, encControl->payloadSize_ms ), 1000 ); + /* Subtract bits already used */ + nBits -= ec_tell( psRangeEnc ); + /* Divide by number of uncoded frames left in packet */ + nBits = SKP_DIV32_16( nBits, psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket - psEnc->state_Fxx[ 0 ].sCmn.nFramesAnalyzed ); + /* Convert to bits/second */ + if( encControl->payloadSize_ms == 10 ) { + TargetRate_bps = SKP_SMULBB( nBits, 100 ); + } else { + TargetRate_bps = SKP_SMULBB( nBits, 50 ); + } + /* Subtract fraction of bits in excess of target in previous packets */ + TargetRate_bps -= SKP_DIV32_16( SKP_MUL( psEnc->nBitsExceeded, 1000 ), BITRESERVOIR_DECAY_TIME_MS ); + /* Don't exceed input bitrate */ + TargetRate_bps = SKP_min( TargetRate_bps, encControl->bitRate ); + + /* Encode */ + for( n = 0; n < encControl->nChannels; n++ ) { + /* For stereo coding, allocate 60% of the bitrate to mid and 40% to side */ + if( encControl->nChannels == 1 ) { + channelRate_bps = TargetRate_bps; + } else if( n == 0 ) { + channelRate_bps = SKP_SMULWW( TargetRate_bps, SKP_FIX_CONST( 0.6, 16 ) ); + } else { + channelRate_bps = SKP_SMULWB( TargetRate_bps, SKP_FIX_CONST( 0.4, 16 ) ); + } + SKP_Silk_control_SNR( &psEnc->state_Fxx[ n ].sCmn, channelRate_bps ); + //SKP_Silk_control_SNR( &psEnc->state_Fxx[ n ].sCmn, TargetRate_bps / 2 ); + if( ( ret = SKP_Silk_encode_frame_Fxx( &psEnc->state_Fxx[ n ], nBytesOut, psRangeEnc ) ) != 0 ) { + SKP_assert( 0 ); + } + psEnc->state_Fxx[ n ].sCmn.controlled_since_last_payload = 0; + psEnc->state_Fxx[ n ].sCmn.inputBufIx = 0; + } + + /* Insert VAD and FEC flags at beginning of bitstream */ + if( *nBytesOut > 0 ) { + flags = 0; + for( n = 0; n < encControl->nChannels; n++ ) { + for( i = 0; i < psEnc->state_Fxx[ n ].sCmn.nFramesPerPacket; i++ ) { + flags = SKP_LSHIFT( flags, 1 ); + flags |= psEnc->state_Fxx[ n ].sCmn.VAD_flags[ i ]; + } + flags = SKP_LSHIFT( flags, 1 ); + flags |= psEnc->state_Fxx[ n ].sCmn.LBRR_flag; + } + ec_enc_patch_initial_bits( psRangeEnc, flags, ( psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket + 1 ) * encControl->nChannels ); + + /* Return zero bytes if DTXed */ + if( psEnc->state_Fxx[ 0 ].sCmn.inDTX && ( encControl->nChannels == 1 || psEnc->state_Fxx[ 1 ].sCmn.inDTX ) ) { + *nBytesOut = 0; + } + + psEnc->nBitsExceeded += *nBytesOut * 8; + psEnc->nBitsExceeded -= SKP_DIV32_16( SKP_MUL( encControl->bitRate, encControl->payloadSize_ms ), 1000 ); + psEnc->nBitsExceeded = SKP_LIMIT( psEnc->nBitsExceeded, 0, 10000 ); } - psEnc->sCmn.inputBufIx = 0; - psEnc->sCmn.controlled_since_last_payload = 0; if( nSamplesIn == 0 ) { break; @@ -272,11 +349,14 @@ SKP_int SKP_Silk_SDK_Encode( } } + encControl->internalSampleRate = SKP_SMULBB( psEnc->state_Fxx[ 0 ].sCmn.fs_kHz, 1000 ); if( prefillFlag ) { encControl->payloadSize_ms = tmp_payloadSize_ms; encControl->complexity = tmp_complexity; - ret = process_enc_control_struct( psEnc, encControl ); - psEnc->sCmn.prefillFlag = 0; + for( n = 0; n < encControl->nChannels; n++ ) { + psEnc->state_Fxx[ n ].sCmn.controlled_since_last_payload = 0; + psEnc->state_Fxx[ n ].sCmn.prefillFlag = 0; + } } return ret; diff --git a/src_common/SKP_Silk_encode_indices.c b/src_common/SKP_Silk_encode_indices.c index 896209515..71fc766ce 100644 --- a/src_common/SKP_Silk_encode_indices.c +++ b/src_common/SKP_Silk_encode_indices.c @@ -27,9 +27,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "SKP_Silk_main.h" -/*******************************************/ -/* Encode parameters to create the payload */ -/*******************************************/ +/* Encode side-information parameters to payload */ void SKP_Silk_encode_indices( SKP_Silk_encoder_state *psEncC, /* I/O Encoder state */ ec_enc *psRangeEnc, /* I/O Compressor data structure */ @@ -47,6 +45,7 @@ void SKP_Silk_encode_indices( SKP_int nBytes_after, nBytes_before; #endif + /* Use conditional coding if previous frame available */ if( FrameIndex > 0 && ( encode_LBRR == 0 || psEncC->LBRR_flags[ FrameIndex - 1 ] == 1 ) ) { condCoding = 1; } else { diff --git a/src_FIX/SKP_Silk_init_encoder_FIX.c b/src_common/SKP_Silk_init_encoder.c similarity index 85% rename from src_FIX/SKP_Silk_init_encoder_FIX.c rename to src_common/SKP_Silk_init_encoder.c index 601414bc8..7f2b7c353 100644 --- a/src_FIX/SKP_Silk_init_encoder_FIX.c +++ b/src_common/SKP_Silk_init_encoder.c @@ -25,17 +25,24 @@ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***********************************************************************/ +#if FIXED_POINT #include "SKP_Silk_main_FIX.h" +#define SKP_Silk_encoder_state_Fxx SKP_Silk_encoder_state_FIX +#else +#include "SKP_Silk_main_FLP.h" +#define SKP_Silk_encoder_state_Fxx SKP_Silk_encoder_state_FLP +#endif /*********************************/ /* Initialize Silk Encoder state */ /*********************************/ -SKP_int SKP_Silk_init_encoder_FIX( - SKP_Silk_encoder_state_FIX *psEnc /* I/O Pointer to Silk encoder state */ +SKP_int SKP_Silk_init_encoder( + SKP_Silk_encoder_state_Fxx *psEnc /* I/O Pointer to Silk encoder state */ ) { SKP_int ret = 0; + /* Clear the entire encoder state */ - SKP_memset( psEnc, 0, sizeof( SKP_Silk_encoder_state_FIX ) ); + SKP_memset( psEnc, 0, sizeof( SKP_Silk_encoder_state_Fxx ) ); psEnc->sCmn.variable_HP_smth1_Q15 = 200844; /* = SKP_Silk_log2(70)_Q0; */ psEnc->sCmn.variable_HP_smth2_Q15 = 200844; /* = SKP_Silk_log2(70)_Q0; */ diff --git a/src_common/SKP_Silk_main.h b/src_common/SKP_Silk_main.h index 9f1eee4ab..f8de3ea21 100644 --- a/src_common/SKP_Silk_main.h +++ b/src_common/SKP_Silk_main.h @@ -38,6 +38,7 @@ extern "C" #include "SKP_Silk_structs.h" #include "SKP_Silk_tables.h" #include "SKP_Silk_PLC.h" +#include "SKP_Silk_control.h" #include "SKP_debug.h" #include "entenc.h" #include "entdec.h" @@ -49,6 +50,26 @@ extern "C" //#define FORCE_INTERNAL_FS_KHZ 16 +/* Convert Left/Right stereo signal to adaptive Mid/Side representation */ +void SKP_Silk_stereo_LR_to_MS( + stereo_state *state, /* I/O State */ + SKP_int16 x1[], /* I/O Left input signal, becomes mid signal */ + SKP_int16 x2[], /* I/O Right input signal, becomes side signal */ + SKP_int *predictorIx, /* O Index for predictor filter */ + SKP_int fs_kHz, /* I Samples rate (kHz) */ + SKP_int frame_length /* I Number of samples */ +); + +/* Convert adaptive Mid/Side representation to Left/Right stereo signal */ +void SKP_Silk_stereo_MS_to_LR( + stereo_state *state, /* I/O State */ + SKP_int16 x1[], /* I/O Left input signal, becomes mid signal */ + SKP_int16 x2[], /* I/O Right input signal, becomes side signal */ + SKP_int predictorIx, /* I Index for predictor filter */ + SKP_int fs_kHz, /* I Samples rate (kHz) */ + SKP_int frame_length /* I Number of samples */ +); + /* Encodes signs of excitation */ void SKP_Silk_encode_signs( ec_enc *psRangeEnc, /* I/O Compressor data structure */ @@ -69,12 +90,23 @@ void SKP_Silk_decode_signs( const SKP_int sum_pulses[ MAX_NB_SHELL_BLOCKS ] /* I Sum of absolute pulses per block */ ); +/* Check encoder control struct */ +SKP_int check_control_input( + SKP_SILK_SDK_EncControlStruct *encControl /* I: Control structure */ +); + /* Control internal sampling rate */ SKP_int SKP_Silk_control_audio_bandwidth( SKP_Silk_encoder_state *psEncC, /* I/O Pointer to Silk encoder state */ SKP_int32 TargetRate_bps /* I Target max bitrate (bps) */ ); +/* Control SNR of redidual quantizer */ +SKP_int SKP_Silk_control_SNR( + SKP_Silk_encoder_state *psEncC, /* I/O Pointer to Silk encoder state */ + SKP_int32 TargetRate_bps /* I Target max bitrate (bps) */ +); + /***************/ /* Shell coder */ /***************/ @@ -226,7 +258,6 @@ void SKP_Silk_HP_variable_cutoff( const SKP_int frame_length /* I length of input */ ); -#if SWITCH_TRANSITION_FILTERING /* Low-pass filter with variable cutoff frequency based on */ /* piece-wise linear interpolation between elliptic filters */ /* Start by setting transition_frame_no = 1; */ @@ -235,13 +266,6 @@ void SKP_Silk_LP_variable_cutoff( SKP_int16 *signal, /* I/O Low-pass filtered output signal */ const SKP_int frame_length /* I Frame length */ ); -#endif - -/* Encode LBRR side info and excitation */ -void SKP_Silk_LBRR_embed( - SKP_Silk_encoder_state *psEncC, /* I/O Encoder state */ - ec_enc *psRangeEnc /* I/O Compressor data structure */ -); /******************/ /* NLSF Quantizer */ @@ -333,7 +357,6 @@ SKP_int SKP_Silk_decode_frame( ec_dec *psRangeDec, /* I/O Compressor data structure */ SKP_int16 pOut[], /* O Pointer to output speech frame */ SKP_int32 *pN, /* O Pointer to size of output frame */ - const SKP_int nBytes, /* I Payload length */ SKP_int lostFlag /* I 0: no loss, 1 loss, 2 decode fec */ ); diff --git a/src_common/SKP_Silk_process_NLSFs.c b/src_common/SKP_Silk_process_NLSFs.c index 229709f8f..f4da02424 100644 --- a/src_common/SKP_Silk_process_NLSFs.c +++ b/src_common/SKP_Silk_process_NLSFs.c @@ -50,9 +50,13 @@ void SKP_Silk_process_NLSFs( /***********************/ /* NLSF_mu = 0.003 - 0.0015 * psEnc->speech_activity; */ NLSF_mu_Q20 = SKP_SMLAWB( SKP_FIX_CONST( 0.003, 20 ), SKP_FIX_CONST( -0.0015, 28 ), psEncC->speech_activity_Q8 ); + if( psEncC->nb_subfr == 2 ) { + /* Multiply by 1.5 for 10 ms packets */ + NLSF_mu_Q20 = SKP_ADD_RSHIFT( NLSF_mu_Q20, NLSF_mu_Q20, 1 ); + } SKP_assert( NLSF_mu_Q20 > 0 ); - SKP_assert( NLSF_mu_Q20 <= SKP_FIX_CONST( 0.003, 20 ) ); + SKP_assert( NLSF_mu_Q20 <= SKP_FIX_CONST( 0.0045, 20 ) ); /* Calculate NLSF weights */ SKP_Silk_NLSF_VQ_weights_laroia( pNLSFW_Q5, pNLSF_Q15, psEncC->predictLPCOrder ); diff --git a/src_common/SKP_Silk_setup.h b/src_common/SKP_Silk_setup.h deleted file mode 100644 index 4017e2367..000000000 --- a/src_common/SKP_Silk_setup.h +++ /dev/null @@ -1,143 +0,0 @@ -/*********************************************************************** -Copyright (c) 2006-2011, Skype Limited. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, (subject to the limitations in the disclaimer below) -are permitted provided that the following conditions are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Skype Limited, nor the names of specific -contributors, may be used to endorse or promote products derived from -this software without specific prior written permission. -NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED -BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND -CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -#include "SKP_Silk_main.h" -#include "SKP_Silk_tuning_parameters.h" - -SKP_INLINE SKP_int SKP_Silk_setup_complexity( - SKP_Silk_encoder_state *psEncC, /* I/O */ - SKP_int Complexity /* I */ -) -{ - SKP_int ret = 0; - - /* Set encoding complexity */ - if( Complexity < 2 ) { - psEncC->pitchEstimationComplexity = SKP_Silk_PE_MIN_COMPLEX; - psEncC->pitchEstimationThreshold_Q16 = SKP_FIX_CONST( 0.8, 16 ); - psEncC->pitchEstimationLPCOrder = 6; - psEncC->shapingLPCOrder = 8; - psEncC->la_shape = 3 * psEncC->fs_kHz; - psEncC->nStatesDelayedDecision = 1; - psEncC->useInterpolatedNLSFs = 0; - psEncC->LTPQuantLowComplexity = 1; - psEncC->NLSF_MSVQ_Survivors = 2; - psEncC->warping_Q16 = 0; - } else if( Complexity < 4 ) { - psEncC->pitchEstimationComplexity = SKP_Silk_PE_MID_COMPLEX; - psEncC->pitchEstimationThreshold_Q16 = SKP_FIX_CONST( 0.76, 16 ); - psEncC->pitchEstimationLPCOrder = 8; - psEncC->shapingLPCOrder = 10; - psEncC->la_shape = 5 * psEncC->fs_kHz; - psEncC->nStatesDelayedDecision = 1; - psEncC->useInterpolatedNLSFs = 1; - psEncC->LTPQuantLowComplexity = 0; - psEncC->NLSF_MSVQ_Survivors = 4; - psEncC->warping_Q16 = 0; - } else if( Complexity < 6 ) { - psEncC->pitchEstimationComplexity = SKP_Silk_PE_MID_COMPLEX; - psEncC->pitchEstimationThreshold_Q16 = SKP_FIX_CONST( 0.74, 16 ); - psEncC->pitchEstimationLPCOrder = 10; - psEncC->shapingLPCOrder = 12; - psEncC->la_shape = 5 * psEncC->fs_kHz; - psEncC->nStatesDelayedDecision = 2; - psEncC->useInterpolatedNLSFs = 0; - psEncC->LTPQuantLowComplexity = 0; - psEncC->NLSF_MSVQ_Survivors = 6; - psEncC->warping_Q16 = psEncC->fs_kHz * SKP_FIX_CONST( WARPING_MULTIPLIER, 16 ); - } else if( Complexity < 8 ) { - psEncC->pitchEstimationComplexity = SKP_Silk_PE_MID_COMPLEX; - psEncC->pitchEstimationThreshold_Q16 = SKP_FIX_CONST( 0.72, 16 ); - psEncC->pitchEstimationLPCOrder = 12; - psEncC->shapingLPCOrder = 14; - psEncC->la_shape = 5 * psEncC->fs_kHz; - psEncC->nStatesDelayedDecision = 3; - psEncC->useInterpolatedNLSFs = 0; - psEncC->LTPQuantLowComplexity = 0; - psEncC->NLSF_MSVQ_Survivors = 8; - psEncC->warping_Q16 = psEncC->fs_kHz * SKP_FIX_CONST( WARPING_MULTIPLIER, 16 ); - } else if( Complexity <= 10 ) { - psEncC->pitchEstimationComplexity = SKP_Silk_PE_MAX_COMPLEX; - psEncC->pitchEstimationThreshold_Q16 = SKP_FIX_CONST( 0.7, 16 ); - psEncC->pitchEstimationLPCOrder = 16; - psEncC->shapingLPCOrder = 16; - psEncC->la_shape = 5 * psEncC->fs_kHz; - psEncC->nStatesDelayedDecision = MAX_DEL_DEC_STATES; - psEncC->useInterpolatedNLSFs = 1; - psEncC->LTPQuantLowComplexity = 0; - psEncC->NLSF_MSVQ_Survivors = 16; - psEncC->warping_Q16 = psEncC->fs_kHz * SKP_FIX_CONST( WARPING_MULTIPLIER, 16 ); - } else { - ret = SKP_SILK_ENC_INVALID_COMPLEXITY_SETTING; - } - - /* Do not allow higher pitch estimation LPC order than predict LPC order */ - psEncC->pitchEstimationLPCOrder = SKP_min_int( psEncC->pitchEstimationLPCOrder, psEncC->predictLPCOrder ); - psEncC->shapeWinLength = SUB_FRAME_LENGTH_MS * psEncC->fs_kHz + 2 * psEncC->la_shape; - - SKP_assert( psEncC->pitchEstimationLPCOrder <= MAX_FIND_PITCH_LPC_ORDER ); - SKP_assert( psEncC->shapingLPCOrder <= MAX_SHAPE_LPC_ORDER ); - SKP_assert( psEncC->nStatesDelayedDecision <= MAX_DEL_DEC_STATES ); - SKP_assert( psEncC->warping_Q16 <= 32767 ); - SKP_assert( psEncC->la_shape <= LA_SHAPE_MAX ); - SKP_assert( psEncC->shapeWinLength <= SHAPE_LPC_WIN_MAX ); - SKP_assert( psEncC->NLSF_MSVQ_Survivors <= NLSF_VQ_MAX_SURVIVORS ); - - return( ret ); -} - -SKP_INLINE SKP_int SKP_Silk_setup_LBRR( - SKP_Silk_encoder_state *psEncC /* I/O */ -) -{ - SKP_int ret = SKP_SILK_NO_ERROR; - SKP_int32 LBRRRate_thres_bps; - - if( psEncC->useInBandFEC < 0 || psEncC->useInBandFEC > 1 ) { - ret = SKP_SILK_ENC_INVALID_INBAND_FEC_SETTING; - } - - if( psEncC->fs_kHz == 8 ) { - LBRRRate_thres_bps = LBRR_NB_MIN_RATE_BPS; - } else if( psEncC->fs_kHz == 12 ) { - LBRRRate_thres_bps = LBRR_MB_MIN_RATE_BPS; - } else if( psEncC->fs_kHz == 16 ) { - LBRRRate_thres_bps = LBRR_WB_MIN_RATE_BPS; - } else { - SKP_assert( 0 ); - } - - LBRRRate_thres_bps = SKP_RSHIFT( SKP_SMULBB( LBRRRate_thres_bps, 7 - psEncC->PacketLoss_perc ), 2 ); - if( psEncC->useInBandFEC && psEncC->TargetRate_bps >= LBRRRate_thres_bps && psEncC->PacketLoss_perc > 0 ) { - /* Set gain increase / rate reduction for LBRR usage */ - psEncC->LBRR_GainIncreases = SKP_max_int( 6 - SKP_SMULWB( psEncC->PacketLoss_perc, SKP_FIX_CONST( 0.4, 16 ) ), 2 ); - psEncC->LBRR_enabled = 1; - } else { - psEncC->LBRR_enabled = 0; - } - return ret; -} diff --git a/src_common/SKP_Silk_stereo_LR_to_MS.c b/src_common/SKP_Silk_stereo_LR_to_MS.c new file mode 100644 index 000000000..e4a60ae17 --- /dev/null +++ b/src_common/SKP_Silk_stereo_LR_to_MS.c @@ -0,0 +1,94 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, (subject to the limitations in the disclaimer below) +are permitted provided that the following conditions are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Skype Limited, nor the names of specific +contributors, may be used to endorse or promote products derived from +this software without specific prior written permission. +NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED +BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#include "SKP_Silk_main.h" + +/* Convert Left/Right stereo signal to adaptive Mid/Side representation */ +void SKP_Silk_stereo_LR_to_MS( + stereo_state *state, /* I/O State */ + SKP_int16 x1[], /* I/O Left input signal, becomes mid signal */ + SKP_int16 x2[], /* I/O Right input signal, becomes side signal */ + SKP_int *predictorIx, /* O Index for predictor filter */ + SKP_int fs_kHz, /* I Samples rate (kHz) */ + SKP_int frame_length /* I Number of samples */ +) +{ + SKP_int n, scale, scale1, scale2; + SKP_int32 sum, diff, nrg1, nrg2, corr, predictor_Q16, pred_Q16, delta_Q16; + + /* Convert to basic mid/side signals */ + for( n = 0; n < frame_length; n++ ) { + sum = x1[ n ] + (SKP_int32)x2[ n ]; + diff = x1[ n ] - (SKP_int32)x2[ n ]; + x1[ n ] = (SKP_int16)SKP_RSHIFT32( sum + 1, 1 ); + x2[ n ] = (SKP_int16)SKP_RSHIFT32( diff, 1 ); + } + + /* Find predictor */ + SKP_Silk_sum_sqr_shift( &nrg1, &scale1, x1, frame_length ); + SKP_Silk_sum_sqr_shift( &nrg2, &scale2, x2, frame_length ); + if( scale1 > scale2 ) { + scale = scale1; + } else { + scale = scale2; + nrg1 = SKP_RSHIFT32( nrg1, scale2 - scale1 ); + } + corr = SKP_Silk_inner_prod_aligned_scale( x1, x2, scale, frame_length ); + predictor_Q16 = SKP_DIV32_varQ( corr, nrg1 + 1, 16 ); + + /* Hysteresis */ + if( predictor_Q16 > state->predictor_prev_Q16 ) { + predictor_Q16 -= SKP_FIX_CONST( STEREO_QUANT_HYSTERESIS / STEREO_QUANT_STEPS, 16 ); + } else { + predictor_Q16 += SKP_FIX_CONST( STEREO_QUANT_HYSTERESIS / STEREO_QUANT_STEPS, 16 ); + } + + /* Quantize */ + *predictorIx = SKP_RSHIFT_ROUND( SKP_MUL( predictor_Q16 + 65536, STEREO_QUANT_STEPS - 1 ), 17 ); + *predictorIx = SKP_LIMIT( *predictorIx, 0, STEREO_QUANT_STEPS - 1 ); + + predictor_Q16 = SKP_SMLABB( -65536, *predictorIx, ( 1 << 17 ) / ( STEREO_QUANT_STEPS - 1 ) ); + + /* Subtract prediction from side channel */ + if( predictor_Q16 != state->predictor_prev_Q16 ) { + /* Interpolate predictor */ + pred_Q16 = -state->predictor_prev_Q16; + delta_Q16 = -SKP_DIV32_16( predictor_Q16 - state->predictor_prev_Q16, STEREO_INTERPOL_LENGTH_MS * fs_kHz ); + for( n = 0; n < STEREO_INTERPOL_LENGTH_MS * fs_kHz; n++ ) { + pred_Q16 += delta_Q16; + x2[ n ] = (SKP_int16)SKP_SAT16( SKP_SMLAWB( x2[ n ], pred_Q16, x1[ n ] ) ); + } + } else { + n = 0; + } + pred_Q16 = -predictor_Q16; + for( ; n < frame_length; n++ ) { + x2[ n ] = (SKP_int16)SKP_SAT16( SKP_SMLAWB( x2[ n ], pred_Q16, x1[ n ] ) ); + } + + state->predictor_prev_Q16 = predictor_Q16; +} diff --git a/src_common/SKP_Silk_stereo_MS_to_LR.c b/src_common/SKP_Silk_stereo_MS_to_LR.c new file mode 100644 index 000000000..ad3ed14c3 --- /dev/null +++ b/src_common/SKP_Silk_stereo_MS_to_LR.c @@ -0,0 +1,72 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, (subject to the limitations in the disclaimer below) +are permitted provided that the following conditions are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Skype Limited, nor the names of specific +contributors, may be used to endorse or promote products derived from +this software without specific prior written permission. +NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED +BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#include "SKP_Silk_main.h" + +/* Convert adaptive Mid/Side representation to Left/Right stereo signal */ +void SKP_Silk_stereo_MS_to_LR( + stereo_state *state, /* I/O State */ + SKP_int16 x1[], /* I/O Left input signal, becomes mid signal */ + SKP_int16 x2[], /* I/O Right input signal, becomes side signal */ + SKP_int predictorIx, /* I Index for predictor filter */ + SKP_int fs_kHz, /* I Samples rate (kHz) */ + SKP_int frame_length /* I Number of samples */ +) +{ + SKP_int n; + SKP_int32 sum, diff, predictor_Q16, pred_Q16, delta_Q16; + + /* Dequantize */ + predictor_Q16 = SKP_SMLABB( -65536, predictorIx, ( 1 << 17 ) / ( STEREO_QUANT_STEPS - 1 ) ); + + /* Add prediction to side channel */ + if( predictor_Q16 != state->predictor_prev_Q16 ) { + /* Interpolate predictor */ + pred_Q16 = state->predictor_prev_Q16; + delta_Q16 = SKP_DIV32_16( predictor_Q16 - state->predictor_prev_Q16, STEREO_INTERPOL_LENGTH_MS * fs_kHz ); + for( n = 0; n < STEREO_INTERPOL_LENGTH_MS * fs_kHz; n++ ) { + pred_Q16 += delta_Q16; + x2[ n ] = (SKP_int16)SKP_SAT16( SKP_SMLAWB( x2[ n ], pred_Q16, x1[ n ] ) ); + } + } else { + n = 0; + } + pred_Q16 = predictor_Q16; + for( ; n < frame_length; n++ ) { + x2[ n ] = (SKP_int16)SKP_SAT16( SKP_SMLAWB( x2[ n ], pred_Q16, x1[ n ] ) ); + } + + state->predictor_prev_Q16 = predictor_Q16; + + /* Convert to left/right signals */ + for( n = 0; n < frame_length; n++ ) { + sum = x1[ n ] + (SKP_int32)x2[ n ]; + diff = x1[ n ] - (SKP_int32)x2[ n ]; + x1[ n ] = (SKP_int16)SKP_SAT16( sum ); + x2[ n ] = (SKP_int16)SKP_SAT16( diff ); + } +} diff --git a/src_common/SKP_Silk_structs.h b/src_common/SKP_Silk_structs.h index 5fcde0082..cbceaee4a 100644 --- a/src_common/SKP_Silk_structs.h +++ b/src_common/SKP_Silk_structs.h @@ -28,6 +28,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef SKP_SILK_STRUCTS_H #define SKP_SILK_STRUCTS_H +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif #include "SKP_Silk_typedef.h" #include "SKP_Silk_SigProc_FIX.h" @@ -95,6 +98,10 @@ typedef struct { const SKP_int16 *deltaMin_Q15; } SKP_Silk_NLSF_CB_struct; +typedef struct { + SKP_int32 predictor_prev_Q16; +} stereo_state; + typedef struct { SKP_int8 GainsIndices[ MAX_NB_SUBFR ]; SKP_int8 LTPIndex[ MAX_NB_SUBFR ]; @@ -128,8 +135,8 @@ typedef struct { SKP_int max_pitch_lag; /* Highest possible pitch lag (samples) */ SKP_int32 API_fs_Hz; /* API sampling frequency (Hz) */ SKP_int32 prev_API_fs_Hz; /* Previous API sampling frequency (Hz) */ - SKP_int maxInternal_fs_kHz; /* Maximum internal sampling frequency (kHz) */ - SKP_int minInternal_fs_kHz; /* Minimum internal sampling frequency (kHz) */ + SKP_int maxInternal_fs_Hz; /* Maximum internal sampling frequency (Hz) */ + SKP_int minInternal_fs_Hz; /* Minimum internal sampling frequency (Hz) */ SKP_int fs_kHz; /* Internal sampling frequency (kHz) */ SKP_int nb_subfr; /* Number of 5 ms subframes in a frame */ SKP_int frame_length; /* Frame length (samples) */ @@ -157,13 +164,13 @@ typedef struct { SKP_int controlled_since_last_payload; /* Flag for ensuring codec_control only runs once per packet */ SKP_int warping_Q16; /* Warping parameter for warped noise shaping */ SKP_int useCBR; /* Flag to enable constant bitrate */ - SKP_int prev_nBits; /* Use to track bits used by each frame in packet */ SKP_int prefillFlag; /* Flag to indicate that only buffers are prefilled, no coding */ const SKP_uint8 *pitch_lag_low_bits_iCDF; /* Pointer to iCDF table for low bits of pitch lag index */ const SKP_uint8 *pitch_contour_iCDF; /* Pointer to iCDF table for pitch contour index */ const SKP_Silk_NLSF_CB_struct *psNLSF_CB; /* Pointer to NLSF codebook */ SKP_int input_quality_bands_Q15[ VAD_N_BANDS ]; SKP_int input_tilt_Q15; + SKP_int SNR_dB_Q7; /* Quality setting */ SKP_int8 VAD_flags[ MAX_FRAMES_PER_PACKET ]; SKP_int8 LBRR_flag; @@ -237,9 +244,6 @@ typedef struct { SKP_int16 outBuf[ 2 * MAX_FRAME_LENGTH ]; /* Buffer for output signal */ SKP_int lagPrev; /* Previous Lag */ SKP_int8 LastGainIndex; /* Previous gain index */ - SKP_int32 HPState[ DEC_HP_ORDER ]; /* HP filter state */ - const SKP_int32 *HP_A; /* HP filter AR coefficients */ - const SKP_int32 *HP_B; /* HP filter MA coefficients */ SKP_int fs_kHz; /* Sampling frequency in kHz */ SKP_int32 prev_API_sampleRate; /* Previous API sample frequency (Hz) */ SKP_int nb_subfr; /* Number of 5 ms subframes in a frame */ diff --git a/src_common/SKP_Silk_tables.h b/src_common/SKP_Silk_tables.h index c15c30563..cb5957071 100644 --- a/src_common/SKP_Silk_tables.h +++ b/src_common/SKP_Silk_tables.h @@ -31,9 +31,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "SKP_Silk_define.h" #include "SKP_Silk_structs.h" -#define PITCH_EST_MAX_LAG_MS 18 /* 18 ms -> 56 Hz */ -#define PITCH_EST_MIN_LAG_MS 2 /* 2 ms -> 500 Hz */ - #ifdef __cplusplus extern "C" { @@ -44,11 +41,11 @@ extern const SKP_uint8 SKP_Silk_gain_iCDF[ 3 ][ N_LEVELS_QGAIN / 8 ]; extern const SKP_uint8 SKP_Silk_delta_gain_iCDF[ MAX_DELTA_GAIN_QUANT - MIN_DELTA_GAIN_QUANT + 1 ]; /* 41 */ extern const SKP_uint8 SKP_Silk_pitch_lag_iCDF[ 2 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) ]; /* 32 */ -extern const SKP_uint8 SKP_Silk_pitch_delta_iCDF[21]; /* 21 */ -extern const SKP_uint8 SKP_Silk_pitch_contour_iCDF[34]; /* 34 */ +extern const SKP_uint8 SKP_Silk_pitch_delta_iCDF[ 21 ]; /* 21 */ +extern const SKP_uint8 SKP_Silk_pitch_contour_iCDF[ 34 ]; /* 34 */ extern const SKP_uint8 SKP_Silk_pitch_contour_NB_iCDF[ 11 ]; /* 11 */ -extern const SKP_uint8 SKP_Silk_pitch_contour_10_ms_iCDF[12]; /* 12 */ -extern const SKP_uint8 SKP_Silk_pitch_contour_10_ms_NB_iCDF[3]; /* 3 */ +extern const SKP_uint8 SKP_Silk_pitch_contour_10_ms_iCDF[ 12 ]; /* 12 */ +extern const SKP_uint8 SKP_Silk_pitch_contour_10_ms_NB_iCDF[ 3 ]; /* 3 */ extern const SKP_uint8 SKP_Silk_pulses_per_block_iCDF[ N_RATE_LEVELS ][ MAX_PULSES + 2 ]; /* 180 */ extern const SKP_uint8 SKP_Silk_pulses_per_block_BITS_Q5[ N_RATE_LEVELS - 1 ][ MAX_PULSES + 2 ]; /* 162 */ @@ -85,10 +82,12 @@ extern const SKP_int8 SKP_Silk_LTP_vq_sizes[ NB_LTP_CBKS ]; extern const SKP_uint8 SKP_Silk_LTPscale_iCDF[ 3 ]; /* 4 */ extern const SKP_int16 SKP_Silk_LTPScales_table_Q14[ 3 ]; -extern const SKP_uint8 SKP_Silk_type_offset_VAD_iCDF[4]; /* 4 */ -extern const SKP_uint8 SKP_Silk_type_offset_no_VAD_iCDF[2]; /* 2 */ +extern const SKP_uint8 SKP_Silk_type_offset_VAD_iCDF[ 4 ]; /* 4 */ +extern const SKP_uint8 SKP_Silk_type_offset_no_VAD_iCDF[ 2 ]; /* 2 */ + +extern const SKP_uint8 SKP_Silk_stereo_predictor_iCDF[ STEREO_QUANT_STEPS + 1 ]; -extern const SKP_uint8 * const SKP_Silk_LBRR_flags_iCDF_ptr[2]; /* 10 */ +extern const SKP_uint8 * const SKP_Silk_LBRR_flags_iCDF_ptr[ 2 ]; /* 10 */ extern const SKP_uint8 SKP_Silk_NLSF_interpolation_factor_iCDF[ 5 ]; /* 5 */ @@ -101,22 +100,12 @@ extern const SKP_int32 TargetRate_table_MB[ TARGET_RATE_TAB_SZ ]; extern const SKP_int32 TargetRate_table_WB[ TARGET_RATE_TAB_SZ ]; extern const SKP_int16 SNR_table_Q1[ TARGET_RATE_TAB_SZ ]; -/* Decoder high-pass filter coefficients */ -extern const SKP_int32 SKP_Silk_Dec_A_HP_16[ DEC_HP_ORDER ]; /* 2 */ -extern const SKP_int32 SKP_Silk_Dec_B_HP_16[ DEC_HP_ORDER + 1 ]; /* 3 */ -extern const SKP_int32 SKP_Silk_Dec_A_HP_12[ DEC_HP_ORDER ]; /* 2 */ -extern const SKP_int32 SKP_Silk_Dec_B_HP_12[ DEC_HP_ORDER + 1 ]; /* 3 */ -extern const SKP_int32 SKP_Silk_Dec_A_HP_8[ DEC_HP_ORDER ]; /* 2 */ -extern const SKP_int32 SKP_Silk_Dec_B_HP_8[ DEC_HP_ORDER + 1 ]; /* 3 */ - /* Quantization offsets */ extern const SKP_int16 SKP_Silk_Quantization_Offsets_Q10[ 2 ][ 2 ]; -#if SWITCH_TRANSITION_FILTERING /* Interpolation points for filter coefficients used in the bandwidth transition smoother */ extern const SKP_int32 SKP_Silk_Transition_LP_B_Q28[ TRANSITION_INT_NUM ][ TRANSITION_NB ]; extern const SKP_int32 SKP_Silk_Transition_LP_A_Q28[ TRANSITION_INT_NUM ][ TRANSITION_NA ]; -#endif #ifdef __cplusplus } diff --git a/src_common/SKP_Silk_tables_NLSF_CB.h b/src_common/SKP_Silk_tables_NLSF_CB.h deleted file mode 100644 index 216b72a08..000000000 --- a/src_common/SKP_Silk_tables_NLSF_CB.h +++ /dev/null @@ -1,63 +0,0 @@ -/*********************************************************************** -Copyright (c) 2006-2011, Skype Limited. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, (subject to the limitations in the disclaimer below) -are permitted provided that the following conditions are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Skype Limited, nor the names of specific -contributors, may be used to endorse or promote products derived from -this software without specific prior written permission. -NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED -BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND -CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -#ifndef SKP_SILK_TABLES_NLSF_CB -#define SKP_SILK_TABLES_NLSF_CB - -#include "SKP_Silk_define.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -#define NLSF_MSVQ_CB0_10_STAGES 7 -#define NLSF_MSVQ_CB0_10_VECTORS 128 -#define NLSF_MSVQ_CB1_10_STAGES 7 -#define NLSF_MSVQ_CB1_10_VECTORS 80 -#define NLSF_MSVQ_CB0_16_STAGES 10 -#define NLSF_MSVQ_CB0_16_VECTORS 152 -#define NLSF_MSVQ_CB1_16_STAGES 10 -#define NLSF_MSVQ_CB1_16_VECTORS 104 - -/* NLSF codebook entropy coding tables */ -extern const SKP_uint8 SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ NLSF_MSVQ_CB0_10_VECTORS ]; -extern const SKP_uint8 * const SKP_Silk_NLSF_MSVQ_CB0_10_CDF_start_ptr[ NLSF_MSVQ_CB0_10_STAGES ]; -extern const SKP_uint8 SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ NLSF_MSVQ_CB1_10_VECTORS ]; -extern const SKP_uint8 * const SKP_Silk_NLSF_MSVQ_CB1_10_CDF_start_ptr[ NLSF_MSVQ_CB1_10_STAGES ]; -extern const SKP_uint8 SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ NLSF_MSVQ_CB0_16_VECTORS ]; -extern const SKP_uint8 * const SKP_Silk_NLSF_MSVQ_CB0_16_CDF_start_ptr[ NLSF_MSVQ_CB0_16_STAGES ]; -extern const SKP_uint8 SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ NLSF_MSVQ_CB1_16_VECTORS ]; -extern const SKP_uint8 * const SKP_Silk_NLSF_MSVQ_CB1_16_CDF_start_ptr[ NLSF_MSVQ_CB1_16_STAGES ]; - - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/src_common/SKP_Silk_tables_NLSF_CB0_10.c b/src_common/SKP_Silk_tables_NLSF_CB0_10.c deleted file mode 100644 index 44b705817..000000000 --- a/src_common/SKP_Silk_tables_NLSF_CB0_10.c +++ /dev/null @@ -1,926 +0,0 @@ -/*********************************************************************** -Copyright (c) 2006-2011, Skype Limited. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, (subject to the limitations in the disclaimer below) -are permitted provided that the following conditions are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Skype Limited, nor the names of specific -contributors, may be used to endorse or promote products derived from -this software without specific prior written permission. -NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED -BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND -CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -/**********************************************/ -/* This file has been automatically generated */ -/* */ -/* ROM usage: 0.16 + 1.43 kB */ -/**********************************************/ - -#include "SKP_Silk_structs.h" -#include "SKP_Silk_tables.h" -#include "SKP_Silk_tables_NLSF_CB.h" - -const SKP_uint8 SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ NLSF_MSVQ_CB0_10_VECTORS ] = -{ - 246, - 237, - 230, - 223, - 216, - 210, - 204, - 198, - 192, - 186, - 180, - 175, - 169, - 164, - 158, - 153, - 147, - 142, - 137, - 132, - 127, - 123, - 118, - 113, - 109, - 105, - 101, - 97, - 93, - 89, - 85, - 81, - 78, - 74, - 71, - 67, - 64, - 60, - 57, - 54, - 50, - 47, - 44, - 41, - 38, - 35, - 32, - 29, - 27, - 24, - 21, - 19, - 16, - 14, - 12, - 10, - 8, - 6, - 5, - 4, - 3, - 2, - 1, - 0, - 234, - 216, - 198, - 180, - 162, - 145, - 128, - 111, - 95, - 79, - 64, - 50, - 37, - 23, - 10, - 0, - 221, - 188, - 154, - 123, - 91, - 59, - 28, - 0, - 220, - 185, - 151, - 118, - 85, - 51, - 26, - 0, - 220, - 185, - 150, - 116, - 86, - 55, - 26, - 0, - 220, - 185, - 152, - 118, - 88, - 57, - 28, - 0, - 236, - 217, - 199, - 181, - 164, - 146, - 130, - 113, - 97, - 81, - 66, - 51, - 37, - 23, - 11, - 0 -}; - -const SKP_uint8 * const SKP_Silk_NLSF_MSVQ_CB0_10_CDF_start_ptr[ NLSF_MSVQ_CB0_10_STAGES ] = -{ - &SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ 0 ], - &SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ 64 ], - &SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ 80 ], - &SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ 88 ], - &SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ 96 ], - &SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ 104 ], - &SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ 112 ] -}; - -const SKP_uint8 SKP_Silk_NLSF_MSVQ_CB0_10_rates_Q4[ NLSF_MSVQ_CB0_10_VECTORS ] = -{ - 74, 79, - 83, 83, - 84, 85, - 85, 87, - 87, 87, - 88, 88, - 89, 89, - 89, 89, - 89, 89, - 91, 91, - 92, 92, - 92, 94, - 94, 94, - 95, 96, - 96, 97, - 97, 98, - 98, 99, - 99, 100, - 100, 100, - 100, 100, - 101, 101, - 102, 102, - 102, 103, - 103, 105, - 105, 105, - 106, 106, - 108, 108, - 109, 111, - 111, 121, - 124, 128, - 128, 128, - 128, 128, - 57, 61, - 61, 61, - 61, 63, - 63, 63, - 64, 64, - 65, 67, - 68, 68, - 69, 74, - 46, 47, - 47, 48, - 48, 48, - 49, 51, - 45, 46, - 47, 47, - 47, 47, - 53, 53, - 45, 46, - 46, 47, - 49, 49, - 50, 53, - 45, 46, - 47, 47, - 49, 49, - 50, 51, - 59, 60, - 61, 61, - 62, 62, - 63, 63, - 64, 64, - 65, 65, - 67, 67, - 71, 72 -}; - -const SKP_int SKP_Silk_NLSF_MSVQ_CB0_10_ndelta_min_Q15[ 10 + 1 ] = -{ - 550, - 3, - 22, - 18, - 3, - 3, - 181, - 162, - 310, - 172, - 982 -}; - -const SKP_int8 SKP_Silk_NLSF_MSVQ_CB0_10_Q8[ 10 * NLSF_MSVQ_CB0_10_VECTORS ] = -{ - -107, -97, - -74, -56, - -37, -8, - 20, 48, - 75, 100, - -109, -91, - -71, -48, - -20, -1, - 23, 47, - 77, 100, - -100, -93, - -78, -50, - -5, 8, - 28, 53, - 72, 93, - -105, -97, - -82, -49, - -16, -5, - 33, 52, - 72, 100, - -98, -92, - -75, -39, - -10, 1, - 24, 41, - 62, 103, - -99, -92, - -74, -44, - -30, -16, - 33, 51, - 69, 105, - -105, -98, - -82, -51, - 5, 19, - 35, 54, - 73, 102, - -110, -101, - -85, -61, - -40, -24, - 12, 45, - 67, 97, - -104, -95, - -81, -61, - -22, -8, - 14, 50, - 68, 88, - -96, -90, - -74, -44, - -30, -16, - 20, 34, - 74, 90, - -89, -83, - -64, -27, - -11, 0, - 36, 54, - 74, 103, - -102, -96, - -71, -28, - -16, 1, - 21, 40, - 71, 86, - -102, -96, - -80, -32, - -19, -4, - 31, 45, - 88, 103, - -90, -83, - -66, -51, - -40, -20, - 43, 62, - 81, 105, - -115, -108, - -79, -49, - -21, 0, - 26, 54, - 78, 100, - -105, -93, - -78, -59, - -28, -14, - 11, 32, - 57, 96, - -101, -96, - -68, -17, - -5, 9, - 30, 46, - 87, 103, - -109, -101, - -87, -59, - -10, 5, - 23, 41, - 63, 100, - -86, -78, - -63, -45, - -28, -15, - 26, 43, - 63, 102, - -106, -98, - -83, -41, - -21, -7, - 13, 30, - 80, 96, - -94, -88, - -67, -30, - 7, 18, - 37, 55, - 73, 102, - -96, -90, - -73, -61, - -51, -15, - 30, 44, - 83, 99, - -112, -105, - -84, -61, - -35, -3, - 21, 39, - 61, 92, - -105, -98, - -80, -49, - -38, -2, - 17, 38, - 79, 94, - -86, -78, - -66, -48, - -12, 1, - 25, 51, - 71, 94, - -108, -102, - -83, -30, - 0, 10, - 35, 51, - 82, 100, - -107, -99, - -84, -70, - -58, -14, - 17, 40, - 75, 97, - -94, -88, - -62, -32, - -20, -6, - 10, 28, - 86, 105, - -97, -91, - -72, -62, - -50, 1, - 18, 43, - 68, 84, - -103, -98, - -72, -32, - 17, 31, - 47, 66, - 83, 105, - -99, -90, - -76, -61, - -49, -33, - 21, 40, - 63, 100, - -86, -80, - -60, -43, - -32, -13, - 26, 39, - 84, 104, - -102, -96, - -61, -33, - -23, 13, - 31, 54, - 85, 100, - -110, -100, - -87, -52, - -35, -20, - 28, 41, - 83, 102, - -91, -84, - -58, -45, - -36, -2, - 22, 42, - 72, 85, - -105, -96, - -66, -47, - -24, 11, - 31, 45, - 63, 91, - -93, -87, - -70, -45, - -31, -18, - -2, 14, - 69, 105, - -98, -93, - -61, -48, - -35, -19, - -6, 44, - 69, 85, - -101, -94, - -77, -56, - -43, -24, - -7, 18, - 73, 92, - -102, -95, - -77, -48, - -34, -15, - 5, 30, - 55, 79, - -100, -95, - -50, -32, - -22, -5, - 10, 52, - 77, 91, - -114, -109, - -94, -71, - -27, -5, - 21, 47, - 74, 100, - -95, -80, - -65, -46, - -27, -15, - 16, 61, - 79, 98, - -105, -100, - -62, -7, - 7, 20, - 44, 61, - 87, 102, - -101, -95, - -81, -66, - -57, -26, - 40, 57, - 83, 104, - -97, -92, - -66, -53, - -43, 11, - 32, 49, - 89, 102, - -99, -91, - -75, -57, - -45, -29, - 19, 64, - 83, 101, - -91, -85, - -66, -55, - -44, -9, - 11, 27, - 83, 99, - -107, -99, - -83, -59, - -9, 29, - 43, 61, - 81, 99, - -101, -96, - -77, -68, - -53, 17, - 35, 53, - 80, 94, - -99, -93, - -65, -50, - -37, -20, - -7, 51, - 85, 101, - -97, -91, - -72, -64, - -49, 2, - 49, 65, - 89, 105, - -107, -95, - -63, -41, - -14, 17, - 43, 66, - 89, 106, - -84, -76, - -44, -28, - -15, 5, - 25, 44, - 78, 95, - -102, -97, - -42, -17, - -7, 13, - 29, 55, - 82, 98, - -99, -94, - -81, -71, - -21, 9, - 28, 53, - 76, 95, - -86, -79, - -62, -53, - -34, 15, - 37, 54, - 83, 97, - -76, -73, - -57, -33, - -26, -14, - 37, 56, - 76, 103, - -85, -71, - -35, -10, - 4, 21, - 40, 59, - 84, 100, - -79, -77, - -71, -63, - -27, -18, - 25, 52, - 77, 103, - -81, -60, - -50, -47, - -42, 3, - 24, 54, - 80, 104, - -97, -79, - -23, -16, - -12, -9, - 6, 55, - 78, 102, - -76, -74, - -66, -49, - -47, -38, - 14, 47, - 75, 101, - -93, -63, - -44, -37, - -30, -23, - 28, 52, - 77, 102, - 5, 4, - 6, 5, - 5, 8, - 4, 4, - 0, -2, - 0, -1, - -3, -3, - -5, -6, - -12, 4, - -1, -3, - 2, 1, - 2, 0, - 1, -1, - -1, -7, - -12, 6, - -2, -3, - -8, 8, - 6, 5, - 1, 2, - 0, -1, - -1, -1, - 1, 1, - 1, 0, - -3, -5, - -9, -13, - 0, 0, - -2, -3, - -6, -10, - 3, -3, - -3, -5, - -2, -3, - -4, -7, - -8, 10, - 4, 2, - 1, -2, - -5, -6, - -9, -3, - 0, -3, - 2, -2, - 2, 3, - 0, -1, - 2, -1, - -2, -3, - -8, -14, - 4, 2, - 2, 1, - 2, 2, - -1, -4, - 12, 6, - 4, 5, - 2, 1, - 2, 4, - 3, 3, - 1, -5, - 10, 7, - 8, 8, - 4, -1, - -1, -4, - -6, 2, - 0, -1, - 1, 0, - -4, -12, - 5, 3, - 3, 3, - 2, 2, - 1, 0, - 2, -1, - 1, 0, - -3, 15, - 7, 4, - -5, -6, - 9, 5, - 2, 3, - 4, 0, - -1, 3, - -8, 7, - 3, 2, - 0, -2, - 0, 0, - -2, 0, - -2, -2, - -3, -4, - -3, -3, - -3, 0, - -5, 4, - 3, 3, - 2, -2, - -2, 0, - -1, -2, - -4, -8, - 2, 2, - 0, 0, - 7, 4, - 2, 1, - 0, 3, - 2, 2, - 1, 1, - -2, -6, - 3, 0, - -1, 4, - -4, -4, - -5, 1, - 1, 3, - 5, 4, - 1, -1, - -1, -1, - 7, 5, - 3, 0, - -2, 5, - 1, -2, - -2, -2, - -3, 2, - 2, -1, - -4, -7, - 3, -2, - 1, 1, - 2, -3, - -7, 3, - 1, -1, - 7, 2, - -1, -1, - -3, 3, - 0, -1, - -2, 0, - -6, 0, - 0, 0, - -2, 3, - 0, 2, - 3, 1, - 4, 5, - 1, 1, - -3, -3, - -4, -3, - -2, -2, - 2, 0, - 1, 1, - 0, 0, - -1, -2, - 5, 5, - 0, -3, - -1, -1, - -1, -5, - 5, 4, - 1, 0, - -1, -2, - 3, 2, - 3, 4, - 1, 1, - -1, -3, - 0, -1, - -3, -4, - 4, 1, - -2, 0, - 0, -2, - 2, 0, - 0, 4, - 4, -3, - 0, -1, - -4, 2, - 0, 1, - -1, -1, - 0, -1, - -3, 4, - 1, -2, - -2, -1, - 1, 1, - 0, 0, - 1, -1, - -4, -3, - 0, 2, - -1, -1, - 0, 3, - 4, 0, - 2, 0, - -3, 1, - -1, -1, - -3, 2, - -1, 2, - -3, 3, - 2, 0, - 1, 0, - 4, 0, - -1, 0, - 2, 2, - 1, 3, - 0, 0, - 2, 1, - 1, -1, - 0, -2, - 1, -5, - -2, -1, - -2, -2, - 0, -4, - 1, 0, - 2, 1, - 3, 4, - 0, -3, - 1, -1, - 1, 1, - 0, -1, - -4, 2, - -1, 0, - -1, -1, - 0, 0, - 0, 0, - 0, -1, - 2, 0, - -2, -3, - -2, 0, - -2, -1, - 2, 0, - -2, 1, - 0, 0, - 1, 0, - 0, -3, - 1, 0, - 0, -1, - 0, -1, - 1, -3, - 0, 3, - 0, -2, - -1, -3, - 0, 1, - 0, 2, - 0, 0, - 2, 2, - 1, 1, - 0, 3, - 1, 1, - 0, 1, - -1, -2, - 2, 2, - 1, 2, - 0, -1, - 0, 0, - 1, 0, - 0, 0, - 2, -1, - -2, 1, - 3, 0, - 1, 0, - -1, 0, - 0, 0, - -1, 4, - -1, 1, - -1, 0, - 0, -1, - 0, 1, - 4, 0, - -2, 0, - 0, -1, - -3, -1, - 0, 0, - 0, -2, - 1, 1, - -1, 2, - 0, 0, - 0, 1, - 1, 0, - 4, 0, - 1, 0, - 1, -1, - 0, 2, - -3, 0, - 1, -1, - 0, 2, - -1, 3, - 1, 0, - -1, -1, - -1, 0, - 0, 1, - 0, 0, - -4, -1, - 0, 1, - 1, 0, - -1, 2, - -1, -1, - 2, 1, - -1, 0, - -1, -1, - -2, -2, - 1, -1, - 0, 0, - -1, 1, - 0, 2, - 2, -1, - 1, 1, - -1, 1, - 0, -1, - -3, 0, - 0, 1, - 3, -2, - 0, 0, - 0, -1, - -1, -1, - -1, -2, - -1, 1, - 1, -1, - -1, 0, - -1, -2, - 0, 1, - 1, 1, - 1, -3, - 1, 1, - 0, 0, - 0, -1, - 0, 2, - -2, 0, - 1, 0, - 1, 0, - 2, 1, - -1, -1, - 0, -1, - 1, 0, - 2, 0, - 0, -2, - 1, -1, - 1, -1, - 1, 0, - 2, 0 -}; - -const SKP_Silk_NLSF_CBS SKP_Silk_NLSF_CB0_10_Stage_info[ NLSF_MSVQ_CB0_10_STAGES ] = -{ - { 64, &SKP_Silk_NLSF_MSVQ_CB0_10_Q8[ 10 * 0 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates_Q4[ 0 ] }, - { 16, &SKP_Silk_NLSF_MSVQ_CB0_10_Q8[ 10 * 64 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates_Q4[ 64 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB0_10_Q8[ 10 * 80 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates_Q4[ 80 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB0_10_Q8[ 10 * 88 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates_Q4[ 88 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB0_10_Q8[ 10 * 96 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates_Q4[ 96 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB0_10_Q8[ 10 * 104 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates_Q4[ 104 ] }, - { 16, &SKP_Silk_NLSF_MSVQ_CB0_10_Q8[ 10 * 112 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates_Q4[ 112 ] } -}; - -const SKP_Silk_NLSF_CB_struct SKP_Silk_NLSF_CB0_10 = -{ - NLSF_MSVQ_CB0_10_STAGES, - SKP_Silk_NLSF_CB0_10_Stage_info, - SKP_Silk_NLSF_MSVQ_CB0_10_ndelta_min_Q15, - SKP_Silk_NLSF_MSVQ_CB0_10_CDF_start_ptr -}; - diff --git a/src_common/SKP_Silk_tables_NLSF_CB0_16.c b/src_common/SKP_Silk_tables_NLSF_CB0_16.c deleted file mode 100644 index e61e1f140..000000000 --- a/src_common/SKP_Silk_tables_NLSF_CB0_16.c +++ /dev/null @@ -1,942 +0,0 @@ -/*********************************************************************** -Copyright (c) 2006-2011, Skype Limited. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, (subject to the limitations in the disclaimer below) -are permitted provided that the following conditions are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Skype Limited, nor the names of specific -contributors, may be used to endorse or promote products derived from -this software without specific prior written permission. -NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED -BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND -CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -/**********************************************/ -/* This file has been automatically generated */ -/* */ -/* ROM usage: 0.19 + 2.62 kB */ -/**********************************************/ - -#include "SKP_Silk_structs.h" -#include "SKP_Silk_tables.h" -#include "SKP_Silk_tables_NLSF_CB.h" - -const SKP_uint8 SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ NLSF_MSVQ_CB0_16_VECTORS ] = -{ - 247, - 238, - 230, - 223, - 215, - 209, - 203, - 197, - 191, - 186, - 180, - 174, - 169, - 164, - 158, - 153, - 148, - 143, - 138, - 134, - 129, - 124, - 119, - 115, - 111, - 107, - 102, - 98, - 94, - 90, - 86, - 83, - 79, - 76, - 72, - 69, - 65, - 62, - 59, - 56, - 53, - 50, - 47, - 44, - 41, - 38, - 35, - 32, - 30, - 27, - 24, - 22, - 19, - 17, - 14, - 12, - 10, - 8, - 7, - 5, - 3, - 2, - 1, - 0, - 234, - 214, - 196, - 178, - 161, - 144, - 128, - 112, - 96, - 79, - 65, - 51, - 37, - 24, - 11, - 0, - 216, - 178, - 145, - 113, - 83, - 54, - 27, - 0, - 216, - 181, - 148, - 116, - 84, - 53, - 25, - 0, - 220, - 185, - 150, - 116, - 84, - 54, - 26, - 0, - 218, - 183, - 150, - 118, - 87, - 56, - 26, - 0, - 211, - 171, - 134, - 106, - 78, - 50, - 25, - 0, - 215, - 175, - 140, - 108, - 79, - 51, - 24, - 0, - 219, - 184, - 150, - 120, - 89, - 58, - 28, - 0, - 235, - 215, - 197, - 179, - 161, - 144, - 127, - 111, - 95, - 80, - 65, - 51, - 36, - 23, - 11, - 0 -}; - -const SKP_uint8 * const SKP_Silk_NLSF_MSVQ_CB0_16_CDF_start_ptr[ NLSF_MSVQ_CB0_16_STAGES ] = -{ - &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 0 ], - &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 64 ], - &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 80 ], - &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 88 ], - &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 96 ], - &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 104 ], - &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 112 ], - &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 120 ], - &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 128 ], - &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 136 ] -}; - -const SKP_uint8 SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q4[ NLSF_MSVQ_CB0_16_VECTORS ] = -{ - 77, 78, - 80, 81, - 81, 86, - 87, 87, - 88, 88, - 88, 89, - 89, 89, - 90, 90, - 90, 91, - 92, 92, - 92, 92, - 92, 94, - 95, 95, - 95, 95, - 96, 96, - 97, 98, - 98, 99, - 99, 100, - 100, 101, - 102, 102, - 102, 102, - 103, 103, - 103, 103, - 104, 104, - 104, 105, - 106, 106, - 107, 107, - 108, 111, - 111, 113, - 116, 117, - 118, 121, - 128, 128, - 57, 59, - 61, 61, - 63, 63, - 63, 64, - 64, 64, - 66, 67, - 67, 69, - 70, 72, - 43, 44, - 47, 48, - 50, 50, - 52, 52, - 43, 46, - 47, 48, - 48, 49, - 51, 54, - 45, 46, - 46, 47, - 48, 49, - 51, 53, - 44, 46, - 47, 48, - 49, 49, - 49, 53, - 40, 43, - 45, 51, - 51, 51, - 54, 54, - 42, 43, - 46, 48, - 50, 51, - 52, 55, - 45, 46, - 47, 49, - 49, 49, - 50, 51, - 58, 59, - 61, 61, - 61, 63, - 63, 64, - 64, 65, - 66, 66, - 66, 68, - 71, 73 -}; - -const SKP_int SKP_Silk_NLSF_MSVQ_CB0_16_ndelta_min_Q15[ 16 + 1 ] = -{ - 290, - 3, - 54, - 3, - 3, - 3, - 113, - 90, - 103, - 132, - 172, - 154, - 245, - 248, - 262, - 253, - 618 -}; - -const SKP_int8 SKP_Silk_NLSF_MSVQ_CB0_16_Q8[ 16 * NLSF_MSVQ_CB0_16_VECTORS ] = -{ - -117, -105, -93, -79, - -66, -52, -37, -22, - -6, 10, 27, 41, - 58, 75, 92, 107, - -114, -109, -95, -80, - -68, -53, -38, -19, - -6, 7, 26, 40, - 53, 66, 81, 94, - -120, -116, -102, -84, - -65, -51, -36, -21, - -4, 11, 29, 46, - 61, 77, 93, 107, - -117, -110, -99, -86, - -74, -60, -42, -29, - -9, 6, 26, 41, - 58, 75, 91, 107, - -117, -110, -96, -85, - -67, -50, -34, -16, - 0, 17, 34, 49, - 64, 79, 94, 109, - -115, -110, -100, -79, - -69, -57, -43, -30, - -10, 3, 16, 33, - 52, 67, 86, 105, - -113, -110, -87, -78, - -68, -54, -39, -23, - -13, 12, 29, 43, - 59, 75, 93, 112, - -114, -103, -85, -73, - -56, -43, -28, -14, - 2, 17, 32, 47, - 63, 78, 94, 109, - -115, -110, -99, -76, - -66, -52, -37, -26, - 1, 12, 26, 41, - 59, 78, 98, 112, - -115, -111, -96, -72, - -61, -48, -30, -14, - 1, 16, 34, 48, - 61, 75, 91, 104, - -117, -110, -94, -80, - -60, -48, -36, -25, - -3, 12, 28, 47, - 65, 80, 97, 111, - -108, -104, -94, -76, - -50, -42, -30, -14, - -2, 10, 32, 45, - 58, 71, 85, 98, - -112, -109, -95, -67, - -57, -47, -34, -23, - -5, 8, 19, 35, - 65, 81, 96, 108, - -113, -109, -94, -85, - -75, -64, -51, -26, - -16, 5, 22, 42, - 60, 76, 92, 108, - -113, -109, -97, -88, - -78, -53, -43, -21, - -9, 11, 30, 44, - 57, 71, 86, 104, - -115, -111, -100, -69, - -60, -48, -36, -22, - -8, 5, 18, 34, - 51, 68, 87, 102, - -111, -108, -94, -66, - -56, -46, -32, -21, - -4, 9, 22, 33, - 46, 62, 91, 112, - -116, -111, -102, -82, - -60, -49, -35, -21, - -8, 10, 24, 35, - 49, 65, 88, 107, - -113, -109, -96, -78, - -69, -55, -44, -27, - -14, -1, 19, 31, - 58, 76, 94, 109, - -116, -112, -101, -92, - -82, -51, -37, -21, - -7, 6, 23, 41, - 59, 75, 92, 108, - -111, -107, -96, -87, - -79, -49, -36, -24, - -8, 3, 19, 33, - 49, 71, 92, 107, - -113, -110, -92, -81, - -72, -52, -43, -22, - -11, -1, 13, 41, - 58, 75, 88, 103, - -110, -105, -92, -80, - -69, -56, -39, -27, - -11, 2, 15, 30, - 42, 58, 87, 104, - -109, -105, -91, -74, - -66, -52, -38, -25, - -6, 6, 19, 31, - 45, 78, 98, 111, - -114, -111, -80, -73, - -66, -53, -39, -22, - -13, 0, 16, 42, - 60, 77, 93, 111, - -112, -108, -94, -83, - -72, -58, -44, -31, - -18, -6, 8, 26, - 52, 72, 91, 109, - -108, -99, -89, -78, - -60, -49, -38, -18, - -1, 9, 25, 41, - 54, 67, 88, 103, - -108, -104, -96, -90, - -58, -46, -35, -19, - -8, 7, 21, 36, - 53, 74, 91, 108, - -114, -110, -86, -73, - -63, -48, -38, -11, - 1, 14, 28, 42, - 61, 81, 96, 112, - -115, -111, -74, -66, - -56, -44, -30, -16, - -5, 9, 27, 43, - 61, 78, 95, 111, - -107, -104, -86, -79, - -69, -45, -33, -18, - -2, 10, 25, 37, - 50, 76, 99, 113, - -111, -107, -97, -90, - -67, -52, -36, -22, - -12, 2, 26, 47, - 63, 77, 93, 109, - -103, -98, -84, -72, - -61, -48, -33, -21, - -4, 8, 27, 42, - 65, 81, 98, 111, - -111, -108, -95, -87, - -76, -44, -32, -17, - -3, 9, 25, 39, - 65, 82, 99, 112, - -114, -110, -100, -82, - -48, -37, -27, -15, - -2, 11, 26, 39, - 52, 65, 82, 105, - -110, -107, -89, -82, - -71, -61, -49, -13, - -1, 11, 26, 38, - 59, 82, 100, 114, - -112, -109, -88, -61, - -52, -41, -29, -17, - 0, 11, 24, 34, - 48, 80, 99, 112, - -115, -111, -92, -58, - -47, -39, -25, -14, - 2, 14, 27, 43, - 63, 79, 95, 109, - -113, -109, -96, -79, - -45, -32, -21, -10, - 3, 16, 33, 46, - 60, 76, 93, 107, - -105, -102, -90, -76, - -68, -56, -41, -32, - -13, 15, 32, 43, - 59, 74, 86, 101, - -110, -106, -94, -85, - -77, -65, -31, -22, - -5, 8, 20, 34, - 59, 77, 96, 109, - -112, -109, -89, -61, - -52, -43, -29, -18, - -3, 14, 27, 39, - 52, 66, 79, 98, - -114, -110, -104, -96, - -56, -44, -30, -17, - -4, 17, 32, 46, - 61, 77, 94, 109, - -109, -105, -94, -81, - -74, -63, -29, -19, - -8, 11, 23, 33, - 46, 62, 85, 107, - -111, -108, -91, -83, - -72, -63, -35, -24, - -13, 5, 29, 49, - 66, 80, 97, 111, - -117, -111, -94, -76, - -58, -43, -23, -7, - 10, 27, 43, 55, - 69, 83, 97, 110, - -111, -107, -97, -91, - -74, -38, -25, -13, - 0, 13, 27, 40, - 54, 73, 93, 109, - -107, -103, -91, -78, - -69, -57, -46, -35, - -2, 11, 24, 37, - 51, 64, 84, 107, - -109, -104, -94, -82, - -72, -62, -39, -9, - 5, 15, 33, 43, - 56, 71, 87, 102, - -103, -99, -88, -73, - -68, -55, -28, -15, - -3, 14, 30, 41, - 56, 69, 82, 96, - -109, -106, -90, -69, - -39, -29, -19, -7, - 4, 16, 35, 46, - 57, 68, 82, 96, - -109, -105, -93, -86, - -63, -47, -36, -9, - 3, 14, 30, 46, - 66, 82, 99, 112, - -114, -109, -99, -89, - -81, -69, -39, -16, - -3, 12, 28, 41, - 56, 72, 93, 108, - -107, -104, -91, -79, - -72, -61, -51, -40, - -6, 5, 20, 38, - 61, 78, 97, 111, - -102, -98, -81, -72, - -66, -53, -37, -24, - -9, 3, 17, 31, - 47, 62, 81, 102, - -111, -108, -87, -75, - -66, -53, -40, -29, - -17, -7, 6, 16, - 38, 68, 88, 108, - -108, -105, -92, -70, - -56, -47, -33, -21, - -7, 5, 19, 30, - 42, 53, 65, 102, - -102, -99, -88, -78, - -73, -59, -32, -22, - -4, 10, 23, 46, - 66, 80, 95, 107, - -106, -103, -92, -85, - -82, -62, -22, -11, - 2, 18, 33, 46, - 63, 77, 93, 106, - -113, -104, -81, -64, - -47, -30, -13, 0, - 15, 28, 41, 54, - 68, 82, 97, 111, - -99, -91, -71, -58, - -48, -38, -24, -14, - 0, 13, 28, 40, - 58, 74, 92, 105, - -98, -94, -83, -74, - -71, -60, -28, -9, - 3, 15, 35, 47, - 61, 78, 96, 108, - -98, -96, -89, -82, - -68, -63, -42, -16, - 1, 14, 31, 46, - 64, 81, 96, 110, - -98, -94, -88, -81, - -77, -51, -30, -16, - 1, 19, 34, 49, - 64, 79, 96, 112, - -2, -2, -4, -9, - 3, 3, 2, 2, - 1, 0, 0, 1, - 1, 1, 1, 1, - 1, 0, 0, 6, - 4, 4, 2, 2, - 1, 1, 3, 4, - 4, 4, 3, 2, - -4, -4, -7, 2, - 1, 0, -1, -1, - -2, -2, -1, -1, - 0, 0, 1, 1, - 2, 2, 2, 1, - 0, -1, -2, -3, - -4, -5, -5, -6, - -8, -9, -6, -1, - -1, 0, 0, 0, - 1, 1, 2, 0, - -1, -1, -2, -1, - -2, -3, -8, -10, - 0, 0, 0, -1, - -3, -6, -9, 4, - 1, -1, 0, -1, - -2, -1, 0, 0, - 0, 0, 5, 3, - 1, 1, 0, -1, - -2, -4, -7, -10, - -4, 2, 1, 1, - -3, -3, 0, 3, - 2, 6, 7, 6, - 6, 5, 3, 2, - 0, -2, -2, -3, - 0, 0, 0, -2, - -3, -3, -3, -4, - -6, -8, -6, 4, - 4, 3, 2, 2, - -1, -1, -2, -2, - -4, -6, 6, 3, - 2, 3, 1, 0, - 1, 3, 3, 2, - 7, 7, 3, -1, - 3, -2, 0, 3, - 0, -1, 4, 3, - 2, 0, -1, -1, - -1, 0, -1, -2, - -3, -5, -5, -7, - -10, 5, 4, 2, - 2, 2, 1, 1, - 0, -1, 0, 1, - -1, -2, -5, -8, - 5, 4, 0, -2, - -3, -2, -3, -1, - 1, 1, 3, 1, - -1, 0, 1, -1, - 7, 7, 7, 7, - 6, 4, 2, 1, - 1, 1, 3, 2, - 1, 2, 0, 1, - 1, -1, 0, -1, - -4, -6, 7, 6, - 5, 4, 2, -2, - -4, 7, 4, 2, - 4, 2, 2, 1, - 4, 3, 1, 1, - 0, 0, -2, -3, - 6, 3, 2, 0, - -1, 1, 0, -1, - -1, -1, -1, 0, - -1, -1, -1, -1, - -1, -2, -3, -2, - -3, -4, -5, -5, - -4, -1, -1, 0, - -1, -1, 6, 7, - 4, 3, 1, 2, - 2, 1, -1, -1, - -1, -1, 0, 0, - 4, 4, 2, 1, - -1, -2, -1, -2, - -1, 0, 1, 0, - 2, 4, 4, 2, - 1, 1, 0, -1, - -3, -5, 3, 1, - 1, 3, 1, -1, - -2, -4, -3, -1, - -3, -2, -4, -1, - -2, -2, -2, 0, - 3, 2, 1, 2, - 3, 4, 4, 2, - 0, 0, -1, -2, - -4, 6, 4, 3, - 2, 1, 0, 2, - 2, 1, 0, -1, - 0, -1, 1, 0, - -2, -2, -4, -1, - -2, -3, 6, 5, - 3, 0, -2, -1, - -1, -1, -4, 3, - 3, 1, 1, 0, - 0, 1, -1, -2, - -3, 0, 0, 0, - -1, -1, 0, -1, - 0, -1, 0, 3, - 0, 5, 4, 3, - 2, 1, 0, -1, - 0, 1, -1, -1, - -2, -3, -4, -5, - 3, 0, 0, 0, - -1, -1, 0, 1, - -1, -1, 0, -1, - -2, 3, 2, 3, - 2, 1, 0, -1, - -3, -4, -2, 1, - -2, -3, 3, 1, - 0, -1, -1, 0, - -2, -2, -3, 1, - 0, 0, 0, 1, - 1, 1, 1, 0, - 1, 1, 0, -1, - -4, -5, 5, 3, - 1, 1, 1, 0, - 3, 5, 2, 0, - 0, 1, 2, 1, - 1, 0, -2, 0, - -1, 0, 0, -1, - 0, 0, 0, -1, - -2, -1, 0, 0, - -1, -1, -4, -5, - 6, 5, 2, 0, - -1, 0, -2, -4, - -3, 0, -1, -1, - -2, 1, 0, -1, - -1, 0, 0, 0, - -1, 0, 1, 1, - 1, 2, 0, 0, - 0, 0, 2, 1, - 1, 0, -3, -6, - 1, 1, 1, 0, - 0, -1, -4, 4, - 2, 1, 1, 2, - 2, 1, 2, 1, - -1, -1, -3, 1, - 1, 0, -1, -3, - 0, -1, -3, 4, - 3, -1, 0, -1, - 0, -1, 0, 0, - 0, -3, 5, 2, - 1, 0, 0, 1, - 2, 0, 0, 0, - 1, 1, 1, 1, - 1, 1, 2, 0, - 2, 2, 0, -2, - -4, -2, 4, 3, - 1, 1, 1, 1, - 0, 0, 0, -1, - -1, -1, -1, -2, - 0, -3, -6, 2, - -1, -1, 2, 1, - 1, 1, 0, -1, - -2, -2, 0, -2, - -3, 5, 2, 1, - 0, 1, 1, 0, - 0, 1, 1, 0, - -1, -3, -2, 0, - -2, -3, 1, -1, - 1, 0, 1, 0, - 0, 2, 0, -1, - 3, 0, 0, -2, - 2, 3, 2, 2, - 1, 1, 1, 0, - 0, 0, 0, -1, - -3, 4, 3, 1, - -2, -1, -1, 1, - 1, 1, 0, 0, - -1, -1, 0, -1, - 0, -2, -2, 4, - 2, 1, -2, -1, - -1, -1, -2, 0, - 0, -1, 0, 1, - 0, -3, 2, 1, - -1, -1, 2, 3, - 0, 0, 0, 0, - -1, 0, -3, 4, - 3, 1, -1, -2, - 0, -1, -2, -1, - -1, 0, -1, 1, - 1, 0, 0, -2, - -4, 2, 0, -2, - 3, 1, 1, 0, - -2, -1, 0, 0, - 0, -2, 2, -1, - 2, 0, 0, -1, - -3, 1, -2, -2, - 0, 0, -1, -3, - 3, 1, 0, 0, - -1, -1, -1, -1, - 0, 1, -1, -1, - 0, -1, 0, 0, - 2, 0, 1, 0, - 1, 1, 2, 1, - 0, -4, 0, 0, - 0, 0, 1, 0, - -1, 0, -1, -3, - 3, 2, -1, 0, - 0, 1, 0, -1, - 0, 0, 0, 2, - 1, 1, 1, 1, - 0, 0, -1, 2, - 2, 1, -2, 3, - 0, 1, 0, 0, - -1, 0, -1, 1, - 0, -2, 2, 0, - -3, 2, 1, -2, - 0, -1, 0, 0, - -3, 3, 1, 0, - -1, -1, -1, -1, - 1, -1, 1, 0, - 1, 2, 0, 0, - -1, -3, 2, 0, - -2, 1, 0, -1, - 1, 0, 0, -1, - -1, -1, 0, 0, - -1, -3, -3, 2, - 0, -1, 0, -1, - 1, 0, 0, 2, - 1, 0, 1, 0, - 0, -1, -2, -1, - -2, 1, 0, -1, - -2, -1, 1, -1, - 1, 0, 0, 0, - 1, 1, 1, 0, - 1, 1, 1, 0, - 1, 2, 0, -1, - 0, -1, 0, 0, - 0, 1, 0, 1, - 0, 0, -2, 2, - -1, 2, 1, 0, - 0, -1, -3, 0, - 0, 0, 1, 1, - 0, -1, -1, -2, - 0, 0, -1, -1, - 1, 1, 0, 0, - -1, 0, 1, -1, - 1, 0, -1, 1, - -1, -2, 0, 2, - 0, -1, 2, 0, - 0, 0, 0, 0, - -1, -1, 1, -1, - 2, -1, 2, 1, - 0, -1, 0, 0, - -1, 0, -1, 0, - 0, -1, 2, 1, - 0, 0, -3, 0, - -3, 3, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, -1, 3, - 1, -1, 0, 0, - 0, 0, 1, 0, - 0, -1, 0, -1, - -1, 0, 0, -2, - 1, -2, 0, 0, - 0, 0, -1, 0, - -1, 0, 2, 1, - 0, 0, -2, 0, - 0, 2, 0, 0, - 0, 1, 1, 0, - -1, 1, 0, 1, - -1, -1, 0, 0, - 0, 0, -1, 0, - 2, 0, -1, 1, - 1, -1, -2, 0, - 1, 2, 0, 0, - 0, 0, -1, 0, - -1, -1, -1, 0, - 2, 0, 0, -1, - 0, 0, 0, 0, - -2, 0, 1, 0, - 1, 1, 1, 0, - 1, 1, 2, -1, - 0, -1, 0, 0, - 0, 0, 1, -2, - -2, -1, 1, 0, - -1, 0, -1, 0, - 0, 0, 2, 0, - 0, -1, 1, 2, - 0, -1, 0, -1, - -1, 1, -1, 1, - 0, 0, 1, 0, - 0, 0, 1, 0, - 0, 2, -2, -1, - 1, -1, -1, 0, - 1, 0, -3, 0, - 0, 0, 0, -1, - 0, 1, 0, 1, - 1, 0, 0, 0, - -1, -1, 0, 0, - 1, 0, -1, 1, - 0, -1, 0, 0, - 0, 0, 1, -2, - 0, -1, 0, 0, - 1, 0, -1, -1, - 1, -2, -1, 0, - -1, 0, 0, 1, - 1, -1, 1, -2, - 0, 1, 0, 1, - 0, 0, 0, 0, - 0, -1, 0, 0, - 1, 2, 0, 0, - 0, 0, 0, 1, - 1, 0, 0, 1, - 0, 0, 0, -1, - 1, 0, 0, 0, - 0, 0, 1, 0, - -1, 0, 0, 0, - 0, 1, 3, 1, - 1, 0, 1, 1, - 0, 2, -1, 0, - 0, 0, 1, 0, - 0, 0, 0, 0, - 0, 1, 0, 0, - 0, -1, 0, -1, - 1, -1, 2, -2, - 1, -1, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 2, - -2, 0, 0, 1, - 1, 0, -1, 0, - -2, 1, 1, 0, - 0, 0, -1, -1, - 0, 0, 0, 1, - 0, 0, 0, 1, - 1, 0, 0, 0, - -2, 0, -1, 0, - 0, 0, -1, -1, - 0, 2, -1, 0, - -1, 1, 0, 0, - 0, 1, 2, -1, - 0, -1, 0, 1, - 0, 0, 0, 0, - 0, -1, 1, 0, - 0, -3, 0, 0, - 0, 0, 1, 1, - -1, 0, 0, 0, - -1, -1, 0, 0, - 0, 0, 1, 0, - 0, 1, 1, -1, - -1, 0, 0, 1, - -1, 0, -1, 1, - -2, -1, -1, 0, - 0, 1, 0, 0, - 0, -1, 0, 0 -}; - -const SKP_Silk_NLSF_CBS SKP_Silk_NLSF_CB0_16_Stage_info[ NLSF_MSVQ_CB0_16_STAGES ] = -{ - { 64, &SKP_Silk_NLSF_MSVQ_CB0_16_Q8[ 16 * 0 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q4[ 0 ] }, - { 16, &SKP_Silk_NLSF_MSVQ_CB0_16_Q8[ 16 * 64 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q4[ 64 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB0_16_Q8[ 16 * 80 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q4[ 80 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB0_16_Q8[ 16 * 88 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q4[ 88 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB0_16_Q8[ 16 * 96 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q4[ 96 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB0_16_Q8[ 16 * 104 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q4[ 104 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB0_16_Q8[ 16 * 112 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q4[ 112 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB0_16_Q8[ 16 * 120 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q4[ 120 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB0_16_Q8[ 16 * 128 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q4[ 128 ] }, - { 16, &SKP_Silk_NLSF_MSVQ_CB0_16_Q8[ 16 * 136 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q4[ 136 ] } -}; - -const SKP_Silk_NLSF_CB_struct SKP_Silk_NLSF_CB0_16 = -{ - NLSF_MSVQ_CB0_16_STAGES, - SKP_Silk_NLSF_CB0_16_Stage_info, - SKP_Silk_NLSF_MSVQ_CB0_16_ndelta_min_Q15, - SKP_Silk_NLSF_MSVQ_CB0_16_CDF_start_ptr -}; - diff --git a/src_common/SKP_Silk_tables_NLSF_CB1_10.c b/src_common/SKP_Silk_tables_NLSF_CB1_10.c deleted file mode 100644 index 19a5325e8..000000000 --- a/src_common/SKP_Silk_tables_NLSF_CB1_10.c +++ /dev/null @@ -1,614 +0,0 @@ -/*********************************************************************** -Copyright (c) 2006-2011, Skype Limited. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, (subject to the limitations in the disclaimer below) -are permitted provided that the following conditions are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Skype Limited, nor the names of specific -contributors, may be used to endorse or promote products derived from -this software without specific prior written permission. -NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED -BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND -CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -/**********************************************/ -/* This file has been automatically generated */ -/* */ -/* ROM usage: 0.11 + 0.90 kB */ -/**********************************************/ - -#include "SKP_Silk_structs.h" -#include "SKP_Silk_tables.h" -#include "SKP_Silk_tables_NLSF_CB.h" - -const SKP_uint8 SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ NLSF_MSVQ_CB1_10_VECTORS ] = -{ - 176, - 144, - 119, - 102, - 92, - 85, - 79, - 73, - 68, - 63, - 58, - 53, - 49, - 45, - 41, - 37, - 34, - 30, - 27, - 24, - 22, - 19, - 17, - 15, - 13, - 12, - 10, - 8, - 6, - 4, - 2, - 0, - 149, - 93, - 71, - 55, - 40, - 26, - 12, - 0, - 121, - 100, - 80, - 61, - 45, - 29, - 14, - 0, - 133, - 110, - 88, - 67, - 48, - 30, - 13, - 0, - 199, - 152, - 111, - 76, - 53, - 32, - 15, - 0, - 161, - 109, - 88, - 68, - 49, - 30, - 14, - 0, - 211, - 171, - 134, - 98, - 63, - 37, - 11, - 0 -}; - -const SKP_uint8 * const SKP_Silk_NLSF_MSVQ_CB1_10_CDF_start_ptr[ NLSF_MSVQ_CB1_10_STAGES ] = -{ - &SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ 0 ], - &SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ 32 ], - &SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ 40 ], - &SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ 48 ], - &SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ 56 ], - &SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ 64 ], - &SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ 72 ] -}; - -const SKP_uint8 SKP_Silk_NLSF_MSVQ_CB1_10_rates_Q4[ NLSF_MSVQ_CB1_10_VECTORS ] = -{ - 27, 48, - 54, 63, - 74, 84, - 85, 89, - 91, 91, - 91, 91, - 94, 95, - 96, 97, - 100, 101, - 102, 104, - 106, 106, - 113, 113, - 113, 113, - 113, 113, - 113, 113, - 113, 113, - 20, 35, - 57, 64, - 66, 66, - 67, 71, - 15, 58, - 58, 61, - 64, 64, - 65, 68, - 17, 55, - 57, 58, - 60, 61, - 63, 68, - 35, 39, - 43, 46, - 56, 58, - 63, 65, - 23, 37, - 57, 59, - 60, 61, - 63, 68, - 40, 43, - 45, 45, - 46, 53, - 53, 73 -}; - -const SKP_int SKP_Silk_NLSF_MSVQ_CB1_10_ndelta_min_Q15[ 10 + 1 ] = -{ - 488, - 31, - 249, - 268, - 153, - 20, - 12, - 15, - 9, - 3, - 685 -}; - -const SKP_int8 SKP_Silk_NLSF_MSVQ_CB1_10_Q8[ 10 * NLSF_MSVQ_CB1_10_VECTORS ] = -{ - -112, -92, - -67, -43, - -20, 3, - 28, 52, - 78, 100, - -113, -100, - -76, -53, - -30, -7, - 20, 45, - 72, 97, - -97, -81, - -58, -34, - -10, 11, - 37, 59, - 83, 104, - -110, -100, - -80, -61, - -38, -15, - 12, 38, - 66, 90, - -114, -107, - -81, -50, - -23, 2, - 28, 51, - 77, 101, - -92, -80, - -59, -42, - -18, 2, - 26, 50, - 77, 97, - -102, -83, - -56, -29, - -8, 23, - 48, 73, - 98, 111, - -98, -78, - -48, -19, - 7, 32, - 54, 73, - 92, 107, - -105, -90, - -69, -42, - -4, 20, - 38, 57, - 77, 97, - -113, -101, - -71, -40, - -14, 11, - 42, 65, - 89, 108, - -109, -99, - -84, -61, - -17, 0, - 19, 46, - 65, 97, - -109, -100, - -85, -49, - -25, -10, - 21, 35, - 79, 97, - -109, -101, - -81, -33, - -10, 6, - 28, 46, - 81, 99, - -115, -84, - -58, -32, - -11, 11, - 36, 61, - 84, 104, - -114, -106, - -88, -68, - -39, -3, - 25, 44, - 66, 97, - -79, -68, - -46, -29, - -7, 13, - 36, 58, - 82, 101, - -106, -87, - -69, -51, - -27, -11, - 15, 52, - 74, 92, - -99, -87, - -70, -55, - -40, -13, - 31, 52, - 78, 101, - -109, -98, - -83, -66, - -52, -28, - 23, 46, - 74, 99, - -111, -103, - -87, -57, - -2, 19, - 33, 53, - 72, 97, - -113, -99, - -62, -21, - 5, 27, - 47, 65, - 86, 103, - -99, -79, - -37, -16, - 3, 19, - 37, 62, - 83, 101, - -92, -79, - -57, -41, - -25, -10, - 8, 30, - 68, 96, - -104, -92, - -77, -56, - -39, -23, - -7, 21, - 72, 95, - -78, -65, - -34, -16, - 10, 30, - 51, 71, - 90, 106, - -104, -76, - -38, -5, - 27, 52, - 66, 77, - 89, 101, - -106, -79, - -50, -24, - 15, 40, - 43, 35, - 47, 102, - -103, -71, - -40, -6, - 22, 22, - 26, 37, - 66, 99, - -106, -78, - -53, -30, - -3, 40, - 63, 69, - 57, 75, - -106, -79, - -51, -33, - -1, 17, - 51, 89, - 108, 121, - -107, -82, - -56, -37, - -7, 17, - 68, 86, - 86, 88, - -102, -76, - -47, -13, - -3, 3, - 10, 43, - 77, 105, - -2, -2, - -1, -1, - 0, 0, - -1, 0, - 0, 0, - 2, 4, - 4, 3, - 4, 5, - 4, 3, - 2, 2, - -1, -3, - -5, 0, - -5, -9, - -4, -1, - -4, -6, - 1, 1, - 0, 2, - -4, -6, - -2, -4, - 9, 5, - -3, -6, - -9, -12, - 2, 0, - 0, 2, - 0, -1, - 0, -1, - 2, 9, - 6, 2, - -4, -9, - -7, -3, - 9, 9, - 7, 3, - -3, -6, - -3, -5, - -8, -2, - 1, 0, - -3, -8, - -12, 4, - 4, 7, - 7, 0, - -1, 0, - 0, 0, - 0, 1, - 0, 1, - 1, 1, - 3, 3, - 2, -5, - -8, -3, - -3, -1, - -1, -3, - 3, 3, - 4, 4, - 2, -4, - -9, -1, - -2, -2, - 2, 2, - 2, 4, - 5, 5, - 3, 0, - -5, -7, - -1, -2, - -6, -5, - -1, -6, - 1, -1, - -6, 5, - -5, -10, - 4, 2, - 2, 0, - 0, 1, - 1, 0, - 2, 1, - -1, 3, - 3, -1, - 12, 3, - 3, 3, - 0, -2, - -4, -4, - -4, 5, - -1, -9, - 1, 0, - -1, 0, - -1, 0, - 0, 0, - 1, 0, - -1, -2, - 0, -1, - -2, -1, - -1, 0, - 2, 8, - 4, 4, - 6, 4, - 0, -2, - -2, 0, - 0, -1, - -2, 1, - 2, 0, - -3, -2, - 7, 1, - 1, -1, - -3, 2, - -1, -3, - -4, 6, - 0, 1, - -3, -1, - 5, 0, - 0, -2, - 1, -2, - -2, -2, - -6, -2, - 2, 5, - 0, -2, - 10, 5, - -1, 1, - 0, 0, - -1, -1, - -1, 7, - 5, -2, - 0, 0, - 0, -4, - -1, -3, - -2, -1, - -2, -3, - 1, -1, - -1, -2, - 3, 0, - 0, 0, - 1, 1, - -2, -5, - 1, 1, - 0, 2, - 2, 1, - 1, -3, - 1, 2, - 0, 3, - 0, -2, - 2, 1, - 2, 3, - 1, 0, - -1, -3, - 0, -1, - -1, -2, - 0, 0, - 1, 3, - 5, 1, - -1, 1, - -4, 5, - 0, 2, - 1, 1, - 0, 0, - -1, 0, - 0, -2, - -1, 1, - 2, 0, - -5, 4, - -1, 0, - 1, 0, - -2, 1, - -6, 4, - 0, 0, - -2, 0, - 0, -1, - 1, -1, - -1, -1, - 0, -3, - -2, 0, - 1, 1, - -1, 4, - 1, 0, - 0, 2, - -1, 2, - -3, 0, - 3, 0, - 1, 0, - 1, 4, - 2, 0, - 2, 0, - 1, 0, - 0, 1, - 1, -1, - 6, 2, - 0, 3, - -1, -3, - 0, -2, - -2, 1, - 1, 0, - 0, 0, - -1, -1, - 1, 6, - -1, 0, - 0, -1, - 1, 0, - 0, 1, - 0, -1, - 1, 1, - 0, -7, - -1, -3, - -4, -1, - -2, 0, - 0, 1, - 0, 1, - 2, 1, - -3, 0, - 0, 0, - 0, -1, - 1, -1, - -1, 1, - 1, -1, - 0, 2, - 0, 0, - 0, 3, - 1, 0, - 1, 1, - -3, 0, - -2, 1, - 1, 0, - 0, 0, - 1, 0, - 3, -2, - 0, 0, - 1, 0, - -1, 0, - 0, -1, - 0, 0, - -1, 0, - -4, -1, - -2, -3, - 0, 1, - 0, 0, - 0, -1, - 1, 0, - 0, 1, - 0, 0, - -1, 0, - 5, 0, - 1, -1, - 2, -3, - 1, -1, - 0, 0, - 0, 0, - 0, 0 -}; - -const SKP_Silk_NLSF_CBS SKP_Silk_NLSF_CB1_10_Stage_info[ NLSF_MSVQ_CB1_10_STAGES ] = -{ - { 32, &SKP_Silk_NLSF_MSVQ_CB1_10_Q8[ 10 * 0 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates_Q4[ 0 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB1_10_Q8[ 10 * 32 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates_Q4[ 32 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB1_10_Q8[ 10 * 40 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates_Q4[ 40 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB1_10_Q8[ 10 * 48 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates_Q4[ 48 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB1_10_Q8[ 10 * 56 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates_Q4[ 56 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB1_10_Q8[ 10 * 64 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates_Q4[ 64 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB1_10_Q8[ 10 * 72 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates_Q4[ 72 ] } -}; - -const SKP_Silk_NLSF_CB_struct SKP_Silk_NLSF_CB1_10 = -{ - NLSF_MSVQ_CB1_10_STAGES, - SKP_Silk_NLSF_CB1_10_Stage_info, - SKP_Silk_NLSF_MSVQ_CB1_10_ndelta_min_Q15, - SKP_Silk_NLSF_MSVQ_CB1_10_CDF_start_ptr -}; - diff --git a/src_common/SKP_Silk_tables_NLSF_CB1_16.c b/src_common/SKP_Silk_tables_NLSF_CB1_16.c deleted file mode 100644 index 911158eaa..000000000 --- a/src_common/SKP_Silk_tables_NLSF_CB1_16.c +++ /dev/null @@ -1,678 +0,0 @@ -/*********************************************************************** -Copyright (c) 2006-2011, Skype Limited. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, (subject to the limitations in the disclaimer below) -are permitted provided that the following conditions are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Skype Limited, nor the names of specific -contributors, may be used to endorse or promote products derived from -this software without specific prior written permission. -NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED -BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND -CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -/**********************************************/ -/* This file has been automatically generated */ -/* */ -/* ROM usage: 0.14 + 1.80 kB */ -/**********************************************/ - -#include "SKP_Silk_structs.h" -#include "SKP_Silk_tables.h" -#include "SKP_Silk_tables_NLSF_CB.h" - -const SKP_uint8 SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ NLSF_MSVQ_CB1_16_VECTORS ] = -{ - 192, - 162, - 146, - 130, - 116, - 103, - 92, - 83, - 75, - 69, - 63, - 57, - 51, - 46, - 40, - 36, - 32, - 28, - 25, - 23, - 21, - 19, - 17, - 15, - 13, - 12, - 10, - 8, - 6, - 4, - 2, - 0, - 118, - 91, - 64, - 44, - 32, - 21, - 10, - 0, - 128, - 104, - 81, - 60, - 41, - 26, - 12, - 0, - 134, - 103, - 82, - 60, - 42, - 25, - 12, - 0, - 103, - 83, - 64, - 47, - 32, - 19, - 8, - 0, - 97, - 77, - 59, - 43, - 29, - 17, - 8, - 0, - 96, - 75, - 58, - 41, - 29, - 18, - 9, - 0, - 110, - 82, - 55, - 41, - 28, - 18, - 9, - 0, - 197, - 143, - 101, - 73, - 50, - 33, - 16, - 0, - 169, - 128, - 99, - 72, - 47, - 30, - 13, - 0 -}; - -const SKP_uint8 * const SKP_Silk_NLSF_MSVQ_CB1_16_CDF_start_ptr[ NLSF_MSVQ_CB1_16_STAGES ] = -{ - &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 0 ], - &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 32 ], - &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 40 ], - &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 48 ], - &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 56 ], - &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 64 ], - &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 72 ], - &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 80 ], - &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 88 ], - &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 96 ] -}; - -const SKP_uint8 SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q4[ NLSF_MSVQ_CB1_16_VECTORS ] = -{ - 32, 50, - 63, 65, - 66, 70, - 73, 77, - 81, 85, - 85, 88, - 88, 89, - 89, 93, - 95, 98, - 103, 113, - 113, 113, - 113, 113, - 113, 113, - 113, 113, - 113, 113, - 113, 113, - 14, 52, - 52, 58, - 71, 73, - 73, 74, - 16, 55, - 56, 58, - 60, 65, - 67, 71, - 17, 49, - 57, 57, - 61, 63, - 69, 70, - 12, 60, - 60, 62, - 66, 70, - 72, 80, - 11, 59, - 61, 64, - 67, 72, - 77, 79, - 11, 58, - 63, 63, - 71, 73, - 77, 78, - 13, 51, - 52, 67, - 69, 76, - 77, 77, - 34, 36, - 42, 51, - 55, 63, - 63, 64, - 25, 42, - 50, 52, - 54, 62, - 63, 69 -}; - -const SKP_int SKP_Silk_NLSF_MSVQ_CB1_16_ndelta_min_Q15[ 16 + 1 ] = -{ - 110, - 27, - 146, - 128, - 34, - 27, - 32, - 23, - 31, - 25, - 32, - 25, - 23, - 24, - 29, - 4, - 653 -}; - -const SKP_int8 SKP_Silk_NLSF_MSVQ_CB1_16_Q8[ 16 * NLSF_MSVQ_CB1_16_VECTORS ] = -{ - -118, -106, -90, -74, - -59, -44, -28, -13, - 2, 18, 33, 48, - 64, 79, 95, 110, - -118, -108, -94, -78, - -65, -51, -35, -19, - -4, 12, 28, 44, - 60, 77, 93, 107, - -118, -111, -100, -88, - -74, -57, -41, -27, - -9, 9, 26, 42, - 60, 77, 94, 109, - -113, -100, -86, -69, - -54, -39, -24, -8, - 6, 21, 36, 51, - 66, 82, 97, 111, - -119, -113, -99, -85, - -67, -50, -33, -17, - 1, 16, 32, 48, - 64, 79, 95, 110, - -119, -111, -95, -81, - -68, -53, -36, -21, - -6, 9, 27, 40, - 57, 71, 86, 97, - -117, -106, -90, -77, - -63, -49, -30, -16, - -2, 10, 26, 38, - 51, 64, 81, 90, - -114, -103, -88, -71, - -57, -44, -31, -19, - -3, 11, 26, 40, - 55, 71, 89, 106, - -113, -101, -84, -67, - -50, -34, -18, -1, - 16, 31, 46, 59, - 71, 84, 99, 113, - -117, -110, -95, -81, - -70, -56, -43, -27, - -16, -4, 14, 38, - 58, 75, 92, 109, - -110, -97, -79, -62, - -44, -26, -8, 9, - 24, 38, 50, 62, - 74, 87, 100, 112, - -112, -96, -75, -58, - -43, -29, -18, -6, - 7, 19, 34, 46, - 61, 76, 92, 107, - -110, -94, -75, -57, - -38, -22, -7, 2, - 15, 28, 40, 51, - 65, 80, 95, 110, - -116, -108, -96, -80, - -67, -54, -40, -26, - -9, 5, 19, 33, - 48, 66, 88, 108, - -118, -106, -86, -68, - -48, -31, -14, -1, - 14, 26, 39, 50, - 65, 80, 95, 109, - -119, -112, -102, -86, - -56, -42, -29, -19, - -3, 10, 26, 40, - 56, 72, 90, 107, - -117, -110, -99, -88, - -78, -67, -46, -20, - -5, 10, 27, 43, - 60, 77, 93, 110, - -118, -108, -92, -75, - -58, -44, -28, -9, - 10, 26, 41, 57, - 70, 81, 95, 108, - -118, -107, -87, -71, - -51, -35, -18, -6, - 7, 19, 34, 44, - 58, 68, 83, 93, - -116, -96, -75, -61, - -58, -49, -29, 2, - 16, 19, 32, 54, - 72, 86, 97, 112, - -113, -101, -84, -70, - -57, -41, -42, -28, - -14, -8, 8, 19, - 38, 69, 87, 106, - -114, -104, -90, -74, - -58, -45, -31, -19, - -5, 7, 17, 28, - 40, 52, 67, 102, - -109, -95, -77, -62, - -51, -39, -24, -12, - 1, 10, 23, 35, - 50, 65, 81, 94, - -115, -95, -81, -69, - -49, -27, -21, -16, - -1, 25, 52, 50, - 51, 79, 98, 113, - -115, -96, -81, -67, - -50, -28, -9, -2, - 9, 15, 34, 52, - 65, 80, 96, 111, - -115, -95, -77, -57, - -39, -29, -32, -23, - 2, 17, 34, 49, - 66, 81, 96, 110, - -117, -97, -85, -74, - -52, -36, -15, 1, - 33, 39, 39, 36, - 56, 80, 94, 110, - -112, -96, -81, -65, - -52, -39, -22, -8, - 9, 23, 42, 60, - 87, 99, 100, 100, - -114, -99, -80, -67, - -52, -37, -19, -3, - 10, 29, 54, 63, - 65, 76, 111, 111, - -113, -96, -79, -64, - -51, -37, -22, -8, - 11, 25, 41, 60, - 78, 99, 118, 119, - -112, -95, -77, -59, - -48, -39, -23, -8, - 13, 41, 43, 41, - 48, 78, 98, 112, - -117, -102, -82, -66, - -50, -34, -16, 0, - 18, 35, 38, 62, - 74, 95, 101, 111, - -1, -1, 0, 0, - 1, 1, 1, 1, - 2, 2, 2, 1, - 1, 1, 1, 0, - 1, 2, 1, -1, - -2, -2, -2, -5, - -4, -3, -4, -4, - -6, -4, -2, 0, - 0, 0, 2, 7, - 5, 3, 1, -2, - -5, -5, -6, -4, - 0, 1, 1, 1, - 8, 8, 6, 1, - -1, -2, -2, 0, - 1, 0, 0, 0, - 1, 1, 1, 1, - 1, 1, -1, -3, - -4, -7, -2, 1, - -7, -2, 2, 3, - 3, 3, 1, 2, - 1, 0, -3, -8, - -11, -1, 0, 3, - 0, -2, -3, -2, - -4, -2, -4, -2, - 0, 1, 0, -2, - -3, -1, 0, 1, - 5, 2, 0, 0, - -1, -5, -6, -6, - -2, -5, -9, -1, - 2, -2, -4, -1, - -2, -3, 2, 3, - 3, -2, -1, 0, - 0, 0, 0, 0, - -1, -1, -1, -1, - -1, -1, 0, 0, - 0, 0, 0, 0, - -3, -7, 1, 3, - 2, 1, 2, 2, - 4, 2, 2, 2, - 2, 1, 1, 2, - 2, 2, 0, -2, - -3, -5, -4, -5, - -1, 0, -2, -2, - -2, -1, 1, 0, - 0, -2, -5, -7, - 2, 0, 0, 2, - -1, 0, 1, 1, - 2, 3, 3, 3, - 6, 5, 4, 2, - 2, 2, -1, -1, - -2, -1, -1, 0, - -1, -3, -4, -5, - -4, 7, 4, 4, - 2, 3, 4, 5, - 3, 4, 4, 4, - 3, 0, 0, 2, - 0, -1, 0, 2, - 5, 4, 3, 3, - 2, -1, -5, -9, - -6, -1, -2, -1, - 0, -2, -3, -1, - -1, 7, 5, 4, - 4, 4, 1, 1, - 1, 0, -3, -3, - -1, 1, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, -1, 1, 4, - 3, 3, 5, 3, - 1, 1, 0, 0, - 0, 0, 0, 0, - -3, -5, -3, -4, - -1, 0, 0, 0, - -1, 0, 0, -1, - -1, 0, -1, -2, - 1, 1, 2, 1, - 0, -4, -4, -5, - -4, 0, 0, 1, - 0, -1, 0, 1, - 0, 0, 0, -1, - -2, -1, 1, 3, - 4, 3, 5, 4, - 2, 0, 0, -1, - 6, 4, 3, -1, - -2, -1, -1, -2, - 0, -2, 0, 0, - 0, -1, 0, 1, - 0, -2, 0, -1, - -1, -1, -8, 0, - -2, -1, 0, 1, - -1, 2, 0, 1, - 1, 0, -1, 0, - -1, 3, 2, 1, - 2, -3, -7, -7, - 0, 0, 1, 0, - 0, 0, -1, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 1, 1, 1, -1, - -2, 0, 0, 1, - -1, 0, 2, 3, - 5, 5, 4, 2, - 1, 1, 2, 0, - 0, 4, 4, 1, - -2, -5, -2, -1, - 0, -1, 0, 0, - 0, -1, -3, 2, - 0, -2, -4, -6, - 4, 0, 0, 0, - 0, 1, 0, 0, - -1, -1, 7, 0, - 0, -1, 0, 1, - -1, 0, 0, 0, - -2, -2, -1, 0, - -1, 0, 0, 0, - 0, 0, 3, 2, - 0, 1, -1, -3, - -5, -3, 0, 1, - 0, 1, 1, 2, - 2, -1, 1, 0, - 2, 4, 5, 0, - -1, -2, -5, -3, - 1, 1, -2, -5, - 1, -1, -5, 1, - -1, 1, 0, 0, - -2, -2, -2, -2, - 0, 0, 0, -1, - -1, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 1, -1, 2, 2, - 0, 0, 0, 1, - 0, 0, 0, 1, - 4, 3, 0, 0, - 0, 0, -2, -2, - 4, 4, -1, -3, - 0, 0, 0, 0, - 0, -1, -1, 0, - 0, -2, -4, 5, - 1, 0, -1, 1, - 0, 0, 0, 0, - -3, -1, -2, -1, - 0, 0, 0, 1, - 1, -3, 6, 0, - 0, 0, -4, 0, - 0, -1, -1, -1, - 1, 1, 1, 2, - 1, 0, -3, 0, - 0, -4, 2, 2, - -1, -1, 5, 2, - 0, -1, -1, 1, - 1, -2, -2, -2, - -6, 5, 2, -2, - 1, 0, 0, -1, - 0, 1, 2, 1, - 2, 0, -1, 2, - 6, 4, 2, -2, - -2, 0, 1, 1, - 0, -1, -1, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 1, 1, 0, - 0, 0, 0, -1, - 2, 0, 0, -1, - -1, 1, 0, -5, - 1, 1, 2, 2, - 0, 0, -1, 5, - 0, 0, -1, 0, - 0, 0, 0, 1, - 0, 1, 0, 0, - 0, -3, 3, 0, - 0, 0, -1, -2, - 0, 2, 4, 4, - 0, 0, 1, 0, - 0, 0, 1, -1, - 0, -2, -3, 5, - 0, -1, -4, -1, - 1, 2, 2, 1, - 3, 0, -3, -3, - -1, 0, 1, -3, - 0, 1, -1, 1, - 1, 0, 1, -1, - -4, 5, 0, -1, - 1, 1, 2, -2, - 0, -2, 0, 1, - 1, 1, 0, 0, - 0, 0, 0, 0, - -1, 2, 2, 3, - -1, -5, 1, 2, - 0, 1, 1, 1, - 1, 1, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, -1, 1, 1, - -3, -2, -1, 1, - -1, 0, -1, 0, - 0, 0, 0, 0, - 1, -1, -2, -3, - 0, -1, 0, 0, - -1, 1, -3, 0, - 0, 0, 0, 1, - 1, 0, -3, -1, - -1, -1, 2, 0, - 2, 2, 2, -2, - 0, 0, 0, 0, - 0, 0, -1, -1, - 0, -1, 0, 0, - 0, -4, 4, 0, - 0, 0, -2, 0, - 0, -1, 0, -1, - 0, 0, 0, 0, - 1, 1, 2, 0, - -5, 1, 3, 1, - -2, -1, 0, -2, - -2, 0, 0, -1, - 2, 0, 1, 0, - 0, -3, -1, -1, - 0, 1, -1, -1, - 0, -1, -2, -1, - 1, 2, 1, 0, - 5, 4, -2, -1, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, -1, -1, - -2, -2, -1, -1, - -3, 2, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 1, - -1, -3, 0, 0, - 0, 0, 0, 0, - -1, 0, 0, 1, - 1, 0, 0, 0, - 1, 0, 0, 0, - 0, -1, 1, 1, - 2, -2, -1, -1, - 1, 1, 1, 0, - 2, 1, 2, 0, - 0, 1, 0, -1, - -2, 2, 1, 1, - 1, 0, 0, 0, - 1, 0, -3, 2, - 0, 0, -2, 0, - 0, 0, 0, 0, - 4, 0, 1, 0, - 1, 0, -1, 0, - 0, 0, 0, 0, - -1, -1, 1, 0, - -2, 4, 0, 0, - 0, 0, 1, -2, - 0, 0, 0, 0, - 2, 2, 2, 1, - 0, 0, 0, 1, - -1, -1, 1, -1, - 0, 0, -1, 1, - 0, -1, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 1, - -2, 0, 1, -2, - 0, 0, 0, 0, - 0, 0, 0, 1, - 1, 2, -1, -1, - 0, 0, 1, 1, - -1, -1, 0, 1, - 0, 0, -1, -1, - 0, 0, -1, 1, - 3, -2, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - -1, 0, -1, 0, - 0, 3, 1, 1, - 1, 1, 0, 1, - 0, 1, 0, 0, - 0, 0, 0, 0, - 0, -1, 0, 0, - 1, 3, 0, 1, - 0, 0, 3, -1, - 0, 0, 0, 0, - 1, 0, 0, 0, - 0, 0, -1, -5, - 0, -1, 0, 0, - 2, -1, 1, 0, - 0, 0, 0, -1, - -1, 1, 0, 1, - 0, -1, -1, 0 -}; - -const SKP_Silk_NLSF_CBS SKP_Silk_NLSF_CB1_16_Stage_info[ NLSF_MSVQ_CB1_16_STAGES ] = -{ - { 32, &SKP_Silk_NLSF_MSVQ_CB1_16_Q8[ 16 * 0 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q4[ 0 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q8[ 16 * 32 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q4[ 32 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q8[ 16 * 40 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q4[ 40 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q8[ 16 * 48 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q4[ 48 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q8[ 16 * 56 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q4[ 56 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q8[ 16 * 64 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q4[ 64 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q8[ 16 * 72 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q4[ 72 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q8[ 16 * 80 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q4[ 80 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q8[ 16 * 88 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q4[ 88 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q8[ 16 * 96 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q4[ 96 ] } -}; - -const SKP_Silk_NLSF_CB_struct SKP_Silk_NLSF_CB1_16 = -{ - NLSF_MSVQ_CB1_16_STAGES, - SKP_Silk_NLSF_CB1_16_Stage_info, - SKP_Silk_NLSF_MSVQ_CB1_16_ndelta_min_Q15, - SKP_Silk_NLSF_MSVQ_CB1_16_CDF_start_ptr -}; - diff --git a/src_common/SKP_Silk_tables_other.c b/src_common/SKP_Silk_tables_other.c index 41960e795..442959e3b 100644 --- a/src_common/SKP_Silk_tables_other.c +++ b/src_common/SKP_Silk_tables_other.c @@ -48,39 +48,33 @@ const SKP_int16 SNR_table_Q1[ TARGET_RATE_TAB_SZ ] = { 19, 29, 35, 39, 44, 50, 60, 80 }; -/* Decoder high-pass filter coefficients, -6 dB @ 50 Hz, 0.05 dB ripple */ -const SKP_int32 SKP_Silk_Dec_A_HP_16[ DEC_HP_ORDER ] = {-527234079, 258986528}; /* second order AR coefs, Q28 */ -const SKP_int32 SKP_Silk_Dec_B_HP_16[ DEC_HP_ORDER + 1 ] = { 263603618, -527207236, 263603618}; /* second order MA coefs, Q28 */ +/* Table for stereo predictor coding */ +/* p = [2.^(-7:-1), 1, fliplr(2.^(-7:-1))]+2e-2; p = p/sum(p); fprintf('%d, ', round(256 - 256 * cumsum(p(1:end-1)))) */ +const SKP_uint8 SKP_Silk_stereo_predictor_iCDF[ STEREO_QUANT_STEPS + 1 ] = { 254, 251, 247, 241, 229, 208, 168, 88, 48, 27, 15, 9, 5, 2 }; -const SKP_int32 SKP_Silk_Dec_A_HP_12[ DEC_HP_ORDER ] = {-524058488, 255953207}; /* second order AR coefs, Q28 */ -const SKP_int32 SKP_Silk_Dec_B_HP_12[ DEC_HP_ORDER + 1 ] = { 261993005, -523986010, 261993005}; /* second order MA coefs, Q28 */ - -const SKP_int32 SKP_Silk_Dec_A_HP_8[ DEC_HP_ORDER ] = {-517610668, 249913410}; /* second order AR coefs, Q28 */ -const SKP_int32 SKP_Silk_Dec_B_HP_8[ DEC_HP_ORDER + 1 ] = { 258905997, -517811995, 258905997}; /* second order MA coefs, Q28 */ - -/* tables for LBRR flags */ +/* Tables for LBRR flags */ const SKP_uint8 SKP_Silk_LBRR_flags_2_iCDF[ 3 ] = { 203, 150, 0 }; const SKP_uint8 SKP_Silk_LBRR_flags_3_iCDF[ 7 ] = { 215, 195, 166, 125, 110, 82, 0 }; -const SKP_uint8 * const SKP_Silk_LBRR_flags_iCDF_ptr[2] = { +const SKP_uint8 * const SKP_Silk_LBRR_flags_iCDF_ptr[ 2 ] = { SKP_Silk_LBRR_flags_2_iCDF, SKP_Silk_LBRR_flags_3_iCDF }; -/* table for LSB coding */ +/* Table for LSB coding */ const SKP_uint8 SKP_Silk_lsb_iCDF[ 2 ] = { 120, 0 }; -/* tables for LTPScale */ +/* Tables for LTPScale */ const SKP_uint8 SKP_Silk_LTPscale_iCDF[ 3 ] = { 128, 64, 0 }; -/* tables for signal type and offset coding */ -const SKP_uint8 SKP_Silk_type_offset_VAD_iCDF[4] = { +/* Tables for signal type and offset coding */ +const SKP_uint8 SKP_Silk_type_offset_VAD_iCDF[ 4 ] = { 232, 158, 10, 0 }; -const SKP_uint8 SKP_Silk_type_offset_no_VAD_iCDF[2] = { +const SKP_uint8 SKP_Silk_type_offset_no_VAD_iCDF[ 2 ] = { 230, 0 }; -/* tables for NLSF interpolation factor */ +/* Tables for NLSF interpolation factor */ const SKP_uint8 SKP_Silk_NLSF_interpolation_factor_iCDF[ 5 ] = { 243, 221, 192, 181, 0 }; /* Quantization offsets */ @@ -99,7 +93,6 @@ const SKP_uint8 SKP_Silk_uniform8_iCDF[ 8 ] = { 224, 192, 160, 128, 96, 64, 32, const SKP_uint8 SKP_Silk_NLSF_EXT_iCDF[ 7 ] = { 100, 40, 16, 7, 3, 1, 0 }; -#if SWITCH_TRANSITION_FILTERING /* Elliptic/Cauer filters designed with 0.1 dB passband ripple, 80 dB minimum stopband attenuation, and [0.95 : 0.15 : 0.35] normalized cut off frequencies. */ @@ -123,7 +116,6 @@ const SKP_int32 SKP_Silk_Transition_LP_A_Q28[ TRANSITION_INT_NUM ][ TRANSITION_N { 185807084, 77959395 }, { 35497197, 57401098 } }; -#endif #ifdef __cplusplus } diff --git a/src_common/SKP_Silk_tuning_parameters.h b/src_common/SKP_Silk_tuning_parameters.h index dc52ba7fb..a26fd7f77 100644 --- a/src_common/SKP_Silk_tuning_parameters.h +++ b/src_common/SKP_Silk_tuning_parameters.h @@ -82,7 +82,7 @@ extern "C" /***********/ /* VAD threshold */ -#define SPEECH_ACTIVITY_DTX_THRES 0.2f +#define SPEECH_ACTIVITY_DTX_THRES 0.05f /* Speech Activity LBRR enable threshold */ #define LBRR_SPEECH_ACTIVITY_THRES 0.3f diff --git a/src_common/src_common.vcxproj b/src_common/src_common.vcxproj index c90bf51b1..3aa7e82fa 100644 --- a/src_common/src_common.vcxproj +++ b/src_common/src_common.vcxproj @@ -74,18 +74,22 @@ <None Include="ReadMe.txt" /> </ItemGroup> <ItemGroup> + <ClInclude Include="..\interface\SKP_Silk_control.h" /> + <ClInclude Include="..\interface\SKP_Silk_errors.h" /> <ClInclude Include="SKP_Silk_define.h" /> <ClInclude Include="SKP_Silk_main.h" /> <ClInclude Include="SKP_Silk_PLC.h" /> - <ClInclude Include="SKP_Silk_setup.h" /> <ClInclude Include="SKP_Silk_structs.h" /> <ClInclude Include="SKP_Silk_tables.h" /> <ClInclude Include="SKP_Silk_tuning_parameters.h" /> </ItemGroup> <ItemGroup> + <ClCompile Include="SKP_Silk_check_control_input.c" /> <ClCompile Include="SKP_Silk_CNG.c" /> <ClCompile Include="SKP_Silk_code_signs.c" /> <ClCompile Include="SKP_Silk_control_audio_bandwidth.c" /> + <ClCompile Include="SKP_Silk_control_codec.c" /> + <ClCompile Include="SKP_Silk_control_SNR.c" /> <ClCompile Include="SKP_Silk_create_init_destroy.c" /> <ClCompile Include="SKP_Silk_decoder_set_fs.c" /> <ClCompile Include="SKP_Silk_decode_core.c" /> @@ -99,8 +103,8 @@ <ClCompile Include="SKP_Silk_enc_API.c" /> <ClCompile Include="SKP_Silk_gain_quant.c" /> <ClCompile Include="SKP_Silk_HP_variable_cutoff.c" /> + <ClCompile Include="SKP_Silk_init_encoder.c" /> <ClCompile Include="SKP_Silk_interpolate.c" /> - <ClCompile Include="SKP_Silk_LBRR_embed.c" /> <ClCompile Include="SKP_Silk_LP_variable_cutoff.c" /> <ClCompile Include="SKP_Silk_NLSF2A_stable.c" /> <ClCompile Include="SKP_Silk_NLSF_decode.c" /> @@ -114,6 +118,8 @@ <ClCompile Include="SKP_Silk_process_NLSFs.c" /> <ClCompile Include="SKP_Silk_quant_LTP_gains.c" /> <ClCompile Include="SKP_Silk_shell_coder.c" /> + <ClCompile Include="SKP_Silk_stereo_LR_to_MS.c" /> + <ClCompile Include="SKP_Silk_stereo_MS_to_LR.c" /> <ClCompile Include="SKP_Silk_tables_gain.c" /> <ClCompile Include="SKP_Silk_tables_LTP.c" /> <ClCompile Include="SKP_Silk_tables_NLSF_CB_NB_MB.c" /> diff --git a/src_common/src_common.vcxproj.filters b/src_common/src_common.vcxproj.filters index acce7ae9b..20d6c1766 100644 --- a/src_common/src_common.vcxproj.filters +++ b/src_common/src_common.vcxproj.filters @@ -36,7 +36,10 @@ <ClInclude Include="SKP_Silk_tuning_parameters.h"> <Filter>Header Files</Filter> </ClInclude> - <ClInclude Include="SKP_Silk_setup.h"> + <ClInclude Include="..\interface\SKP_Silk_control.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\interface\SKP_Silk_errors.h"> <Filter>Header Files</Filter> </ClInclude> </ItemGroup> @@ -131,9 +134,6 @@ <ClCompile Include="SKP_Silk_encode_indices.c"> <Filter>Source Files</Filter> </ClCompile> - <ClCompile Include="SKP_Silk_LBRR_embed.c"> - <Filter>Source Files</Filter> - </ClCompile> <ClCompile Include="SKP_Silk_process_NLSFs.c"> <Filter>Source Files</Filter> </ClCompile> @@ -161,5 +161,23 @@ <ClCompile Include="SKP_Silk_NLSF_del_dec_quant.c"> <Filter>Source Files</Filter> </ClCompile> + <ClCompile Include="SKP_Silk_control_SNR.c"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="SKP_Silk_control_codec.c"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="SKP_Silk_check_control_input.c"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="SKP_Silk_init_encoder.c"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="SKP_Silk_stereo_LR_to_MS.c"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="SKP_Silk_stereo_MS_to_LR.c"> + <Filter>Source Files</Filter> + </ClCompile> </ItemGroup> </Project> \ No newline at end of file diff --git a/test/Decoder.c b/test/Decoder.c deleted file mode 100644 index 51a6b8999..000000000 --- a/test/Decoder.c +++ /dev/null @@ -1,453 +0,0 @@ -/*********************************************************************** -Copyright (c) 2006-2011, Skype Limited. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, (subject to the limitations in the disclaimer below) -are permitted provided that the following conditions are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Skype Limited, nor the names of specific -contributors, may be used to endorse or promote products derived from -this software without specific prior written permission. -NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED -BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND -CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - - -/*****************************/ -/* Silk decoder test program */ -/*****************************/ - -#ifdef _WIN32 -#define _CRT_SECURE_NO_DEPRECATE 1 -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "SKP_Silk_SDK_API.h" -#include "../src_SigProc_FIX/SKP_Silk_SigProc_FIX.h" - -/* Define codec specific settings should be moved to h file */ -#define MAX_BYTES_PER_FRAME 1024 -#define MAX_INPUT_FRAMES 5 -#define MAX_FRAME_LENGTH 480 -#define MAX_FRAME_LENGTH_MS 20 -#define MAX_API_FS_KHZ 48 -#define MAX_LBRR_DELAY 0 - -#ifdef _SYSTEM_IS_BIG_ENDIAN -/* Function to convert a little endian int16 to a */ -/* big endian int16 or vica verca */ -void swap_endian( - SKP_int16 vec[], - SKP_int len -) -{ - SKP_int i; - SKP_int16 tmp; - SKP_uint8 *p1, *p2; - - for( i = 0; i < len; i++ ){ - tmp = vec[ i ]; - p1 = (SKP_uint8 *)&vec[ i ]; p2 = (SKP_uint8 *)&tmp; - p1[ 0 ] = p2[ 1 ]; p1[ 1 ] = p2[ 0 ]; - } -} -#endif - -static void print_usage(char* argv[]) { - printf( "\nusage: %s in.bit out.pcm [settings]\n", argv[ 0 ] ); - printf( "\nin.bit : Bitstream input to decoder" ); - printf( "\nout.pcm : Speech output from decoder" ); - printf( "\n settings:" ); - printf( "\n-Fs_API <Hz> : Sampling rate of output signal in Hz" ); - printf( "\n-Fs_Internal <Hz> : Internal sampling rate in Hz, default" ); - printf( "\n-packetlength <ms> : Packet interval in ms, default" ); - printf( "\n-loss <perc> : Simulated packet loss percentage (0-100); default: 0" ); - printf( "\n" ); -} - -#ifdef SKP_MACRO_COUNT - varDefine /* Define and reset global counters */ -#endif - -int main( int argc, char* argv[] ) -{ - double filetime; - size_t counter; - SKP_int32 args, totPackets, i, k, ret, len, tot_len, nBytes; - SKP_uint8 payload[ MAX_BYTES_PER_FRAME * MAX_INPUT_FRAMES * ( MAX_LBRR_DELAY + 1 ) ]; - SKP_uint8 *payloadEnd = NULL, *payloadToDec = NULL; -#if 0 - SKP_uint8 FECpayload[ MAX_BYTES_PER_FRAME * MAX_INPUT_FRAMES ]; - SKP_int32 nBytesFEC; -#endif - SKP_uint8 *payloadPtr; - SKP_int16 nBytesPerPacket[ MAX_LBRR_DELAY + 1 ], totBytes; - SKP_int16 out[ ( ( MAX_FRAME_LENGTH_MS * MAX_API_FS_KHZ ) << 1 ) * MAX_INPUT_FRAMES ], *outPtr; - char speechOutFileName[ 150 ], bitInFileName[ 150 ]; - FILE *bitInFile, *speechOutFile; - SKP_int32 API_Fs_Hz = 0, packetSize_ms=0; - SKP_int32 decSizeBytes; - void *psDec; -#ifdef SKP_MACRO_COUNT - SKP_int64 Ops, maxOps = 0, totOps = 0; -#endif - float loss_prob; - SKP_int32 frames, lost, quiet; - SKP_SILK_SDK_DecControlStruct DecControl; - ec_dec range_dec_celt_state; - - if( argc < 3 ) { - print_usage( argv ); - exit( 0 ); - } - - /* default settings */ - quiet = 0; - loss_prob = 0.0f; - - /* get arguments */ - args = 1; - strcpy( bitInFileName, argv[ args ] ); - args++; - strcpy( speechOutFileName, argv[ args ] ); - args++; - while( args < argc ) { - if( SKP_STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-loss" ) == 0 ) { - sscanf( argv[ args + 1 ], "%f", &loss_prob ); - args += 2; - } else if( SKP_STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-Fs_API" ) == 0 ) { - sscanf( argv[ args + 1 ], "%d", &API_Fs_Hz ); - args += 2; - } else if( SKP_STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-Fs_Internal" ) == 0 ) { - sscanf( argv[ args + 1 ], "%d", &DecControl.internalSampleRate ); - args += 2; - } else if( SKP_STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-packetlength" ) == 0 ) { - sscanf( argv[ args + 1 ], "%d", &DecControl.payloadSize_ms ); - args += 2; - } else if( SKP_STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-quiet" ) == 0 ) { - quiet = 1; - args++; - } else { - printf( "Error: unrecognized setting: %s\n\n", argv[ args ] ); - print_usage( argv ); - exit( 0 ); - } - } - - if( !quiet ) { - printf("******************* Compiled for %d bit cpu ********* \n", (int)sizeof(void*) * 8 ); - printf( "Input: %s\n", bitInFileName ); - printf( "Output: %s\n", speechOutFileName ); - } - - /* Open files */ - bitInFile = fopen( bitInFileName, "rb" ); - if( bitInFile == NULL ) { - printf( "Error: could not open input file %s\n", bitInFileName ); - exit( 0 ); - } - speechOutFile = fopen( speechOutFileName, "wb" ); - if( speechOutFile == NULL ) { - printf( "Error: could not open output file %s\n", speechOutFileName ); - exit( 0 ); - } - - /* Set the samplingrate that is requested for the output */ - if( API_Fs_Hz == 0 ) { - DecControl.API_sampleRate = 24000; - } else { - DecControl.API_sampleRate = API_Fs_Hz; - } - - /* Create decoder */ - ret = SKP_Silk_SDK_Get_Decoder_Size( &decSizeBytes ); - if( ret ) { - printf( "\nSKP_Silk_SDK_Get_Decoder_Size returned %d", ret ); - } - psDec = malloc( decSizeBytes ); - - /* Reset decoder */ - ret = SKP_Silk_SDK_InitDecoder( psDec ); - if( ret ) { - printf( "\nSKP_Silk_InitDecoder returned %d", ret ); - } - - totPackets = 0; - payloadEnd = payload; - - /* Simulate the jitter buffer holding MAX_FEC_DELAY packets */ - for( i = 0; i < MAX_LBRR_DELAY; i++ ) { - /* Read payload size */ - counter = fread( &nBytes, sizeof( SKP_int32 ), 1, bitInFile ); -#ifdef _SYSTEM_IS_BIG_ENDIAN - swap_endian( &nBytes, 1 ); -#endif - /* Read payload */ - counter = fread( payloadEnd, sizeof( SKP_uint8 ), nBytes, bitInFile ); - - if( ( SKP_int16 )counter < nBytes ) { - break; - } - nBytesPerPacket[ i ] = nBytes; - payloadEnd += nBytes; - } - - while( 1 ) { - /* Read payload size */ - counter = fread( &nBytes, sizeof( SKP_int32 ), 1, bitInFile ); -#ifdef _SYSTEM_IS_BIG_ENDIAN - swap_endian( &nBytes, 1 ); -#endif - if( nBytes < 0 || counter < 1 ) { - break; - } - - /* Read payload */ - counter = fread( payloadEnd, sizeof( SKP_uint8 ), nBytes, bitInFile ); - if( ( SKP_int16 )counter < nBytes ) { - break; - } - - /* Initialize range decoder state */ - ec_dec_init( &range_dec_celt_state, payloadEnd, nBytes ); - - /* Simulate losses */ - if( ( (float)rand() / (float)RAND_MAX >= loss_prob / 100 ) && counter > 0 ) { - nBytesPerPacket[ MAX_LBRR_DELAY ] = nBytes; - payloadEnd += nBytes; - } else { - nBytesPerPacket[ MAX_LBRR_DELAY ] = 0; - } - - if( nBytesPerPacket[ 0 ] == 0 ) { - /* Indicate lost packet */ - lost = 1; - - /* Packet loss. Search after FEC in next packets. Should be done in the jitter buffer */ - payloadPtr = payload; - for( i = 0; i < MAX_LBRR_DELAY; i++ ) { - if( nBytesPerPacket[ i + 1 ] > 0 ) { -#if 0 - SKP_Silk_SDK_search_for_LBRR( payloadPtr, nBytesPerPacket[ i + 1 ], i + 1, FECpayload, &nBytesFEC ); - if( nBytesFEC > 0 ) { - payloadToDec = FECpayload; - nBytes = nBytesFEC; - lost = 0; - break; - } -#endif - } - payloadPtr += nBytesPerPacket[ i + 1 ]; - } - } else { - lost = 0; - nBytes = nBytesPerPacket[ 0 ]; - payloadToDec = payload; - } - - /* Silk decoder */ - outPtr = out; - tot_len = 0; - - if( lost == 0 ) { - /* No Loss: Decode all frames in the packet */ - frames = 0; - do { - /* Decode 20 ms */ - ret = SKP_Silk_SDK_Decode( psDec, &DecControl, 0, frames == 0, &range_dec_celt_state, nBytes, outPtr, &len ); - if( ret ) { - printf( "\nSKP_Silk_SDK_Decode returned %d", ret ); - } -#ifdef SKP_MACRO_COUNT - Ops = SKP_SaveResetCount(); - if( Ops > maxOps ){ maxOps = Ops; } - totOps += Ops; -#endif - frames++; - outPtr += len; - tot_len += len; - if( frames > MAX_INPUT_FRAMES ) { - /* Hack for corrupt stream that could generate too many frames */ - outPtr = out; - tot_len = 0; - frames = 0; - } - /* Until last 20 ms frame of packet has been decoded */ - } while( frames < DecControl.framesPerPayload ); - } else { - /* Loss: Decode enough frames to cover one packet duration */ - for( i = 0; i < DecControl.framesPerPayload; i++ ) { - /* Generate 20 ms */ - ret = SKP_Silk_SDK_Decode( psDec, &DecControl, 1, i == 0, &range_dec_celt_state, nBytes, outPtr, &len ); - if( ret ) { - printf( "\nSKP_Silk_Decode returned %d", ret ); - } -#ifdef SKP_MACRO_COUNT - Ops = SKP_SaveResetCount(); - if( Ops > maxOps ){ maxOps = Ops; } - totOps += Ops; -#endif - outPtr += len; - tot_len += len; - } - } - totPackets++; - packetSize_ms = tot_len / ( DecControl.API_sampleRate / 1000 ); - - /* Write output to file */ -#ifdef _SYSTEM_IS_BIG_ENDIAN - swap_endian( out, tot_len ); -#endif - fwrite( out, sizeof( SKP_int16 ), tot_len, speechOutFile ); - - /* Update buffer */ - totBytes = 0; - for( i = 0; i < MAX_LBRR_DELAY; i++ ) { - totBytes += nBytesPerPacket[ i + 1 ]; - } - SKP_memmove( payload, &payload[ nBytesPerPacket[ 0 ] ], totBytes * sizeof( SKP_uint8 ) ); - payloadEnd -= nBytesPerPacket[ 0 ]; - SKP_memmove( nBytesPerPacket, &nBytesPerPacket[ 1 ], MAX_LBRR_DELAY * sizeof( SKP_int16 ) ); - - if( !quiet && totPackets % 100 == 0 ) { - fprintf( stderr, "\rPackets decoded: %d", totPackets ); - } - } - - /* Empty the recieve buffer */ - for( k = 0; k < MAX_LBRR_DELAY; k++ ) { - if( nBytesPerPacket[ 0 ] == 0 ) { - /* Indicate lost packet */ - lost = 1; - - /* Packet loss. Search after FEC in next packets. Should be done in the jitter buffer */ - payloadPtr = payload; - for( i = 0; i < MAX_LBRR_DELAY; i++ ) { - if( nBytesPerPacket[ i + 1 ] > 0 ) { -#if 0 - SKP_Silk_SDK_search_for_LBRR( payloadPtr, nBytesPerPacket[ i + 1 ], i + 1, FECpayload, &nBytesFEC ); - if( nBytesFEC > 0 ) { - payloadToDec = FECpayload; - nBytes = nBytesFEC; - lost = 0; - break; - } -#endif - } - payloadPtr += nBytesPerPacket[ i + 1 ]; - } - } else { - lost = 0; - nBytes = nBytesPerPacket[ 0 ]; - payloadToDec = payload; - } - - /* Silk decoder */ - outPtr = out; - tot_len = 0; - - if( lost == 0 ) { - /* No loss: Decode all frames in the packet */ - frames = 0; - do { - /* Decode 20 ms */ - ret = SKP_Silk_SDK_Decode( psDec, &DecControl, 0, frames == 0, &range_dec_celt_state, nBytes, outPtr, &len ); - if( ret ) { - printf( "\nSKP_Silk_SDK_Decode returned %d", ret ); - } - - frames++; - outPtr += len; - tot_len += len; - if( frames > MAX_INPUT_FRAMES ) { - /* Hack for corrupt stream that could generate too many frames */ - outPtr = out; - tot_len = 0; - frames = 0; - } - /* Until last 20 ms frame of packet has been decoded */ - } while( frames < DecControl.framesPerPayload ); - } else { - /* Loss: Decode enough frames to cover one packet duration */ - - /* Generate 20 ms */ - for( i = 0; i < DecControl.framesPerPayload; i++ ) { - ret = SKP_Silk_SDK_Decode( psDec, &DecControl, 1, i == 0, &range_dec_celt_state, nBytes, outPtr, &len ); - if( ret ) { - printf( "\nSKP_Silk_Decode returned %d", ret ); - } - outPtr += len; - tot_len += len; - } - } - totPackets++; - - /* Write output to file */ -#ifdef _SYSTEM_IS_BIG_ENDIAN - swap_endian( out, tot_len ); -#endif - fwrite( out, sizeof( SKP_int16 ), tot_len, speechOutFile ); - - /* Update Buffer */ - totBytes = 0; - for( i = 0; i < MAX_LBRR_DELAY; i++ ) { - totBytes += nBytesPerPacket[ i + 1 ]; - } - SKP_memmove( payload, &payload[ nBytesPerPacket[ 0 ] ], totBytes * sizeof( SKP_uint8 ) ); - payloadEnd -= nBytesPerPacket[ 0 ]; - SKP_memmove( nBytesPerPacket, &nBytesPerPacket[ 1 ], MAX_LBRR_DELAY * sizeof( SKP_int16 ) ); - - if( !quiet && totPackets % 100 == 0 ) { - fprintf( stderr, "\rPackets decoded: %d", totPackets ); - } - } - - filetime = totPackets * 1e-3 * packetSize_ms; - if( !quiet ) { - printf("\nFile length: %.3f s", filetime); - -#ifdef SKP_MACRO_COUNT - printf("\n \nWMOPS calculation"); - printf("\nMean: %.3f WMOPS", (float)totOps / ((float)packetSize_ms * (float)totPackets * 1e3)); - printf("\nMax: %.3f WMOPS", (float)maxOps / ((float)packetSize_ms * 1e3)); -#endif - printf("\n\n"); - } else { -#ifdef SKP_MACRO_COUNT - /* print average and max WMOPS */ - printf( "%.3f %.3f \n", (float)totOps / ((float)packetSize_ms * (float)totPackets * 1e3), - (float)maxOps / ((float)packetSize_ms * 1e3)); -#else - printf( "%.3f %.3f \n", 0, 0); -#endif - } - - /* Free decoder */ - free( psDec ); - - /* Close files */ - fclose( speechOutFile ); - fclose( bitInFile ); - - return 0; -} diff --git a/test/Encoder.c b/test/Encoder.c deleted file mode 100644 index c1566cf5e..000000000 --- a/test/Encoder.c +++ /dev/null @@ -1,355 +0,0 @@ -/*********************************************************************** -Copyright (c) 2006-2011, Skype Limited. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, (subject to the limitations in the disclaimer below) -are permitted provided that the following conditions are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Skype Limited, nor the names of specific -contributors, may be used to endorse or promote products derived from -this software without specific prior written permission. -NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED -BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND -CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - - -/*****************************/ -/* Silk encoder test program */ -/*****************************/ - -#ifdef _WIN32 -#define _CRT_SECURE_NO_DEPRECATE 1 -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <math.h> - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "SKP_Silk_SDK_API.h" -#include "../src_SigProc_FIX/SKP_Silk_SigProc_FIX.h" - -/* Define codec specific settings */ -#define MAX_BYTES_PER_FRAME 250 // Equals peak bitrate of 100 kbps -#define MAX_INPUT_FRAMES 5 -#define MAX_LBRR_DELAY 2 -#define MAX_FRAME_LENGTH 320 -#define MAX_FRAME_LENGTH_MS 20 -#define MAX_API_FS_KHZ 48 - -#ifdef SKP_MACRO_COUNT - varDefine /* Define and reset global counters */ -#endif - -#ifdef _SYSTEM_IS_BIG_ENDIAN -/* Function to convert a little endian int16 to a */ -/* big endian int16 or vica verca */ -void swap_endian( - SKP_int16 vec[], /* I/O array of */ - SKP_int len /* I length */ -) -{ - SKP_int i; - SKP_int16 tmp; - SKP_uint8 *p1, *p2; - - for( i = 0; i < len; i++ ){ - tmp = vec[ i ]; - p1 = (SKP_uint8 *)&vec[ i ]; p2 = (SKP_uint8 *)&tmp; - p1[ 0 ] = p2[ 1 ]; p1[ 1 ] = p2[ 0 ]; - } -} -#endif - -static void print_usage( char* argv[] ) { - printf( "\nusage: %s in.pcm out.bit [settings]\n", argv[ 0 ] ); - printf( "\nin.pcm : Speech input to encoder" ); - printf( "\nout.bit : Bitstream output from encoder" ); - printf( "\n settings:" ); - printf( "\n-Fs_API <Hz> : API sampling rate in Hz, default: 16000" ); - printf( "\n-Fs_maxInternal <Hz> : Maximum internal sampling rate in Hz, default: 16000" ); - printf( "\n-packetlength <ms> : Packet interval in ms, default: 20" ); - printf( "\n-rate <bps> : Target bitrate; default: 25000" ); - printf( "\n-loss <perc> : Uplink loss estimate, in percent (0-100); default: 0" ); - printf( "\n-inbandFEC <flag> : Enable inband FEC usage (0/1); default: 0" ); - printf( "\n-complexity <comp> : Set complexity, 0: low, 1: medium, 2: high; default: 2" ); - printf( "\n-DTX <flag> : Enable DTX (0/1); default: 0" ); - printf( "\n-quiet : Print only some basic values" ); - printf( "\n"); -} - -int main( int argc, char* argv[] ) -{ - double filetime; - size_t counter; - SKP_int32 k, args, totPackets, totActPackets, ret, nBytes; - double sumBytes, sumActBytes, avg_rate, act_rate, nrg; - SKP_int16 in[ MAX_FRAME_LENGTH_MS * MAX_API_FS_KHZ * MAX_INPUT_FRAMES ]; - char speechInFileName[ 150 ], bitOutFileName[ 150 ]; - FILE *bitOutFile, *speechInFile; - SKP_int32 encSizeBytes; - void *psEnc; -#ifdef SKP_MACRO_COUNT - SKP_int64 Ops, maxOps = 0, totOps = 0; -#endif -#ifdef _SYSTEM_IS_BIG_ENDIAN - SKP_int16 nBytes_LE; -#endif - SKP_uint8 range_buf[ MAX_BYTES_PER_FRAME * MAX_INPUT_FRAMES ]; - ec_enc range_enc_celt_state; - - /* default settings */ - SKP_int32 API_fs_Hz = 16000; - SKP_int32 max_internal_fs_Hz = 16000; - SKP_int32 min_internal_fs_Hz = 8000; - SKP_int32 targetRate_bps = 25000; - SKP_int32 packetSize_ms = 20; - SKP_int32 frameSizeReadFromFile_ms = 10; - SKP_int32 packetLoss_perc = 0, complexity_mode = 2, smplsSinceLastPacket; - SKP_int32 INBandFEC_enabled = 0, DTX_enabled = 0, quiet = 0; - SKP_SILK_SDK_EncControlStruct encControl; // Struct for input to encoder - - - if( argc < 3 ) { - print_usage( argv ); - exit( 0 ); - } - - /* get arguments */ - args = 1; - strcpy( speechInFileName, argv[ args ] ); - args++; - strcpy( bitOutFileName, argv[ args ] ); - args++; - while( args < argc ) { - if( SKP_STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-Fs_API" ) == 0 ) { - sscanf( argv[ args + 1 ], "%d", &API_fs_Hz ); - args += 2; - } else if( SKP_STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-Fs_maxInternal" ) == 0 ) { - sscanf( argv[ args + 1 ], "%d", &max_internal_fs_Hz ); - args += 2; - } else if( SKP_STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-packetlength" ) == 0 ) { - sscanf( argv[ args + 1 ], "%d", &packetSize_ms ); - args += 2; - } else if( SKP_STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-rate" ) == 0 ) { - sscanf( argv[ args + 1 ], "%d", &targetRate_bps ); - args += 2; - } else if( SKP_STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-loss" ) == 0 ) { - sscanf( argv[ args + 1 ], "%d", &packetLoss_perc ); - args += 2; - } else if( SKP_STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-complexity" ) == 0 ) { - sscanf( argv[ args + 1 ], "%d", &complexity_mode ); - args += 2; - } else if( SKP_STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-inbandFEC" ) == 0 ) { - sscanf( argv[ args + 1 ], "%d", &INBandFEC_enabled ); - args += 2; - } else if( SKP_STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-DTX") == 0 ) { - sscanf( argv[ args + 1 ], "%d", &DTX_enabled ); - args += 2; - } else if( SKP_STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-quiet" ) == 0 ) { - quiet = 1; - args++; - } else { - printf( "Error: unrecognized setting: %s\n\n", argv[ args ] ); - print_usage( argv ); - exit( 0 ); - } - } - - /* If no max internal set set to API fs */ - if( max_internal_fs_Hz == 0 ) { - max_internal_fs_Hz = API_fs_Hz; - } - - /* Print options */ - if( !quiet ) { - printf("******************* Compiled for %d bit cpu ********* \n", (int)sizeof(void*) * 8 ); - printf( "Input: %s\n", speechInFileName ); - printf( "Output: %s\n", bitOutFileName ); - printf( "API sampling rate: %d Hz\n", API_fs_Hz ); - printf( "Maximum internal sampling rate: %d Hz\n", max_internal_fs_Hz ); - printf( "Packet interval: %d ms\n", packetSize_ms ); - printf( "Inband FEC used: %d\n", INBandFEC_enabled ); - printf( "DTX used: %d\n", DTX_enabled ); - printf( "Complexity: %d\n", complexity_mode ); - printf( "Target bitrate: %d bps\n", targetRate_bps ); - } - - /* Open files */ - speechInFile = fopen( speechInFileName, "rb" ); - if( speechInFile == NULL ) { - printf( "Error: could not open input file %s\n", speechInFileName ); - exit( 0 ); - } - bitOutFile = fopen( bitOutFileName, "wb" ); - if( bitOutFile == NULL ) { - printf( "Error: could not open output file %s\n", bitOutFileName ); - exit( 0 ); - } - - /* Create Encoder */ - ret = SKP_Silk_SDK_Get_Encoder_Size( &encSizeBytes ); - if( ret ) { - printf( "\nSKP_Silk_create_encoder returned %d", ret ); - } - - psEnc = malloc( encSizeBytes ); - - /* Reset Encoder */ - ret = SKP_Silk_SDK_InitEncoder( psEnc, &encControl ); - if( ret ) { - printf( "\nSKP_Silk_reset_encoder returned %d", ret ); - } - - /* Set Encoder parameters */ - encControl.API_sampleRate = API_fs_Hz; - encControl.maxInternalSampleRate = max_internal_fs_Hz; - encControl.minInternalSampleRate = min_internal_fs_Hz; - encControl.payloadSize_ms = packetSize_ms; - encControl.packetLossPercentage = packetLoss_perc; - encControl.useInBandFEC = INBandFEC_enabled; - encControl.useDTX = DTX_enabled; - encControl.complexity = complexity_mode; - encControl.bitRate = ( targetRate_bps > 0 ? targetRate_bps : 0 ); - - if( API_fs_Hz > MAX_API_FS_KHZ * 1000 || API_fs_Hz < 0 ) { - printf( "\nError: API sampling rate = %d out of range, valid range 8000 - 48000 \n \n", API_fs_Hz ); - exit( 0 ); - } - - totPackets = 0; - totActPackets = 0; - smplsSinceLastPacket = 0; - sumBytes = 0.0; - sumActBytes = 0.0; - - while( 1 ) { - if( smplsSinceLastPacket == 0 ) { - /* Init range coder */ - ec_enc_init( &range_enc_celt_state, range_buf, MAX_BYTES_PER_FRAME * MAX_INPUT_FRAMES ); - } - - /* Read input from file */ - counter = fread( in, sizeof( SKP_int16 ), ( frameSizeReadFromFile_ms * API_fs_Hz ) / 1000, speechInFile ); -#ifdef _SYSTEM_IS_BIG_ENDIAN - swap_endian( in, counter ); -#endif - if( (SKP_int)counter < ( ( frameSizeReadFromFile_ms * API_fs_Hz ) / 1000 ) ) { - break; - } - - /* max payload size */ - nBytes = MAX_BYTES_PER_FRAME * MAX_INPUT_FRAMES; - - /* Silk Encoder */ - ret = SKP_Silk_SDK_Encode( psEnc, &encControl, in, (SKP_int16)counter, &range_enc_celt_state, &nBytes, 0 ); - if( ret ) { - printf( "\nSKP_Silk_Encode returned %d", ret ); - break; - } - -#ifdef SKP_MACRO_COUNT - Ops = SKP_SaveResetCount(); - if( Ops > maxOps ){ maxOps = Ops; } - totOps += Ops; -#endif - - /* Get packet size */ - packetSize_ms = encControl.payloadSize_ms; - - smplsSinceLastPacket += ( SKP_int )counter; - - if( ( ( 1000 * smplsSinceLastPacket ) / API_fs_Hz ) == packetSize_ms ) { - - /* Finish up the range coder */ - ec_enc_done( &range_enc_celt_state ); - - /* Sends a dummy zero size packet in case of DTX period */ - /* to make it work with the decoder test program. */ - /* In practice should be handled by RTP sequence numbers */ - totPackets++; - sumBytes += nBytes; - nrg = 0.0; - for( k = 0; k < ( SKP_int )counter; k++ ) { - nrg += in[ k ] * (double)in[ k ]; - } - if( ( nrg / ( SKP_int )counter ) > 1e3 ) { - sumActBytes += nBytes; - totActPackets++; - } - - /* Write payload size */ -#ifdef _SYSTEM_IS_BIG_ENDIAN - nBytes_LE = nBytes; - swap_endian( &nBytes_LE, 1 ); - fwrite( &nBytes_LE, sizeof( SKP_int16 ), 1, bitOutFile ); -#else - fwrite( &nBytes, sizeof( SKP_int32 ), 1, bitOutFile ); -#endif - - /* Write payload */ - fwrite( range_buf, sizeof( SKP_uint8 ), nBytes, bitOutFile ); - - if( !quiet && totPackets % 100 == 0 ) { - fprintf( stderr, "\rPackets encoded: %d", totPackets ); - } - smplsSinceLastPacket = 0; - } - } - - /* Write dummy because it can not end with 0 bytes */ - nBytes = -1; - - /* Write payload size */ - fwrite( &nBytes, sizeof( SKP_int32 ), 1, bitOutFile ); - - /* Free Encoder */ - free( psEnc ); - - fclose( speechInFile ); - fclose( bitOutFile ); - - filetime = totPackets * 1e-3 * packetSize_ms; - avg_rate = 8.0 / packetSize_ms * sumBytes / totPackets; - act_rate = 8.0 / packetSize_ms * sumActBytes / totActPackets; - if( !quiet ) { - printf( "\nFile length: %.3f s", filetime ); - printf( "\nAverage bitrate: %.3f kbps", avg_rate ); - printf( "\nActive bitrate: %.3f kbps", act_rate ); -#ifdef SKP_MACRO_COUNT - printf( "\n \nWMOPS calculation"); - printf( "\nMean: %.3f WMOPS", (float)totOps / ((float)packetSize_ms * (float)totPackets * 1e3)); - printf( "\nMax: %.3f WMOPS", (float)maxOps / ((float)packetSize_ms * 1e3)); -#endif - printf( "\n\n" ); - } else { - /* print average and active bitrates */ - printf( "%.3f %.3f ", avg_rate, act_rate ); -#ifdef SKP_MACRO_COUNT - /* print average and max WMOPS */ - printf( "%.3f %.3f \n", (float)totOps / ((float)packetSize_ms * (float)totPackets * 1e3), - (float)maxOps / ((float)packetSize_ms * 1e3)); -#else - printf( "%.3f %.3f \n", 0, 0); -#endif - } - - return 0; -} diff --git a/test/signalCompare.c b/test/signalCompare.c deleted file mode 100644 index dbca147e5..000000000 --- a/test/signalCompare.c +++ /dev/null @@ -1,373 +0,0 @@ -/*********************************************************************** -Copyright (c) 2006-2011, Skype Limited. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, (subject to the limitations in the disclaimer below) -are permitted provided that the following conditions are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Skype Limited, nor the names of specific -contributors, may be used to endorse or promote products derived from -this software without specific prior written permission. -NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED -BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND -CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -/* -* Compare two audio signals and compute weighted SNR difference -*/ - -#ifdef _WIN32 -#define _CRT_SECURE_NO_DEPRECATE 1 -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <math.h> - -#include "SKP_Silk_SigProc_FIX.h" - -#define FRAME_LENGTH_MS 10 -#define WIN_LENGTH_MS 20 -#define BW_EXPANSION 0.7f - -#define MAX_FS_KHZ 24 -#define LPC_ORDER 10 - -#ifdef __cplusplus -extern "C" -{ -#endif -/* Internally used functions */ -void Autocorrelation( - SKP_float *results, /* o result (length correlationCount) */ - const SKP_float *inputData, /* i input data to correlate */ - SKP_int inputDataSize, /* i length of input */ - SKP_int correlationCount /* i number of correlation taps to compute */ -); - -/* inner product of two SKP_float arrays, with result as double */ -double Inner_product( - const SKP_float *data1, - const SKP_float *data2, - SKP_int dataSize -); -/* Solve the normal equations using the Levinson-Durbin recursion */ -SKP_float Levinsondurbin( /* O prediction error energy */ - SKP_float A[], /* O prediction coefficients [order] */ - const SKP_float corr[], /* I input auto-correlations [order + 1] */ - const SKP_int order /* I prediction order */ -); - -/* Chirp (bw expand) LP AR filter */ -void Bwexpander( - SKP_float *ar, /* io AR filter to be expanded (without leading 1) */ - const SKP_int d, /* i length of ar */ - const SKP_float chirp /* i chirp factor (typically in range (0..1) ) */ -); - -#ifdef __cplusplus -} -#endif - -static void print_usage(char* argv[]) { - printf("\nusage: %s ref.pcm test.pcm [settings]\n", argv[ 0 ]); - printf("\nref.pcm : Reference file"); - printf("\ntest.pcm : File to be tested, should be of same length as ref.pcm"); - printf("\n settings:"); - printf("\n-diff : Only determine bit-exactness"); - printf("\n-fs <Hz> : Sampling rate in Hz, max: %d; default: 24000", MAX_FS_KHZ * 1000 ); - printf("\n"); -} - -#ifdef SKP_MACRO_COUNT - varDefine /* Define and reset global counters */ -#endif - -int main(int argc, char* argv[]) -{ - SKP_int args, n, i, counterRef, counterTest; - char testInFileName[150], refInFileName[150]; - FILE *refInFile, *testInFile; - SKP_int nFrames = 0, isUnequal = 0; - SKP_int diff = 0, Fs_kHz; - SKP_int32 Fs_Hz = 24000; - SKP_float c, refWhtnd, testWhtnd, refNrg, diffNrg; - double SNR = 0.0; - SKP_int16 refIn[WIN_LENGTH_MS * MAX_FS_KHZ], testIn[WIN_LENGTH_MS * MAX_FS_KHZ]; - SKP_float refWin[WIN_LENGTH_MS * MAX_FS_KHZ], testWin[WIN_LENGTH_MS * MAX_FS_KHZ]; - SKP_float autoCorr[LPC_ORDER + 1], LPC_Coef[LPC_ORDER]; - - if (argc < 3) { - print_usage(argv); - exit(0); - } - - /* get arguments */ - args = 1; - strcpy(refInFileName, argv[args]); - args++; - strcpy(testInFileName, argv[args]); - args++; - while(args < argc ) { - if (SKP_STR_CASEINSENSITIVE_COMPARE(argv[args], "-diff") == 0) { - diff = 1; - args++; - }else if (SKP_STR_CASEINSENSITIVE_COMPARE(argv[args], "-fs") == 0) { - sscanf(argv[args+1], "%d", &Fs_Hz); - args += 2; - } else { - printf("Error: unrecognized setting: %s\n\n", argv[args]); - print_usage(argv); - exit(0); - } - } - - Fs_kHz = SKP_DIV32_16( Fs_Hz, 1000 ); - - if( Fs_kHz > MAX_FS_KHZ ) { - printf("Error: sampling rate too high: %d\n\n", Fs_kHz); - print_usage(argv); - exit(0); - } - - printf("Reference: %s\n", refInFileName); - //printf("Test: %s\n", testInFileName); - - /* open files */ - refInFile = fopen(refInFileName, "rb"); - if (refInFile==NULL) { - printf("Error: could not open input file %s\n", refInFileName); - exit(0); - } - testInFile = fopen(testInFileName, "rb"); - if (testInFile==NULL) { - printf("Error: could not open input file %s\n", testInFileName); - exit(0); - } - - SKP_memset( refIn, 0, sizeof(refIn) ); - SKP_memset( testIn, 0, sizeof(testIn) ); - - while(1) { - /* Read inputs */ - counterRef = (SKP_int)fread(&refIn[(WIN_LENGTH_MS - FRAME_LENGTH_MS) * Fs_kHz], - sizeof(SKP_int16), FRAME_LENGTH_MS * Fs_kHz, refInFile); - counterTest = (SKP_int)fread(&testIn[(WIN_LENGTH_MS - FRAME_LENGTH_MS) * Fs_kHz], - sizeof(SKP_int16), FRAME_LENGTH_MS * Fs_kHz, testInFile); - if(counterRef != FRAME_LENGTH_MS * Fs_kHz || counterTest != FRAME_LENGTH_MS * Fs_kHz){ - break; - } - - /* test for bit-exactness */ - for( n = 0; n < FRAME_LENGTH_MS * Fs_kHz; n++ ) { - if( refIn[(WIN_LENGTH_MS - FRAME_LENGTH_MS) * Fs_kHz + n] != - testIn[(WIN_LENGTH_MS - FRAME_LENGTH_MS) * Fs_kHz + n] ) { - isUnequal = 1; - break; - } - } - - /* apply sine window */ - for( n = 0; n < WIN_LENGTH_MS * Fs_kHz; n++ ) { - c = (SKP_float)sin( 3.14159265 * (n + 1) / (WIN_LENGTH_MS * Fs_kHz + 1) ); - refWin[n] = refIn[n] * c; - testWin[n] = testIn[n] * c; - } - - /* LPC analysis on reference signal */ - - /* Calculate auto correlation */ - Autocorrelation(autoCorr, refWin, WIN_LENGTH_MS * Fs_kHz, LPC_ORDER + 1); - - /* Add white noise */ - autoCorr[ 0 ] += autoCorr[ 0 ] * 1e-6f + 1.0f; - - /* Convert correlations to prediction coefficients */ - Levinsondurbin(LPC_Coef, autoCorr, LPC_ORDER); - - /* Bandwdith expansion */ - Bwexpander(LPC_Coef, LPC_ORDER, BW_EXPANSION); - - /* Filter both signals */ - refNrg = 1.0f; - diffNrg = 1e-10f; - for( n = (WIN_LENGTH_MS - FRAME_LENGTH_MS) / 2 * Fs_kHz; - n < (WIN_LENGTH_MS + FRAME_LENGTH_MS) / 2 * Fs_kHz; n++ ) { - refWhtnd = refIn[n]; - testWhtnd = testIn[n]; - for( i = 0; i < LPC_ORDER; i++ ) { - refWhtnd -= LPC_Coef[ i ] * refIn[n - i - 1]; - testWhtnd -= LPC_Coef[ i ] * testIn[n - i - 1]; - } - refNrg += refWhtnd * refWhtnd; - diffNrg += (refWhtnd - testWhtnd) * (refWhtnd - testWhtnd); - } - - /* weighted SNR */ - if( refNrg > FRAME_LENGTH_MS * Fs_kHz ) { - SNR += 10.0 * log10( refNrg / diffNrg ); - nFrames++; - } - - /* Update Buffer */ - SKP_memmove( refIn, &refIn[FRAME_LENGTH_MS * Fs_kHz], (WIN_LENGTH_MS - FRAME_LENGTH_MS) * Fs_kHz * sizeof(SKP_int16)); - SKP_memmove( testIn, &testIn[FRAME_LENGTH_MS * Fs_kHz], (WIN_LENGTH_MS - FRAME_LENGTH_MS) * Fs_kHz * sizeof(SKP_int16)); - } - - if( diff ) { - if( isUnequal ) { - printf("Signals DIFFER\n"); - } else { - if(counterRef != counterTest){ - printf("Warning: signals differ in length\n"); - } - printf("Signals BIT-EXACT\n"); - } - } else { - if( nFrames == 0 ) { - printf("At least one signal too short or not loud enough\n"); - exit(0); - } - if(counterRef != counterTest){ - printf("Warning: signals differ in length\n"); - } - if( isUnequal == 0 ) { - printf("Signals BIT-EXACT\n"); - } else { - printf("AVERAGE WEIGHTED SNR: %4.1f dB\n", SNR / nFrames); - } - } - printf("\n"); - - /* Close Files */ - fclose(refInFile); - fclose(testInFile); - - return 0; -} - -/* compute autocorrelation */ -void Autocorrelation( - SKP_float *results, /* o result (length correlationCount) */ - const SKP_float *inputData, /* i input data to correlate */ - SKP_int inputDataSize, /* i length of input */ - SKP_int correlationCount /* i number of correlation taps to compute */ -) -{ - SKP_int i; - - if (correlationCount > inputDataSize) { - correlationCount = inputDataSize; - } - - for( i = 0; i < correlationCount; i++ ) { - results[ i ] = (SKP_float)Inner_product( inputData, inputData + i, inputDataSize - i ); - } -} - -/* inner product of two SKP_float arrays, with result as double */ -double Inner_product( - const SKP_float *data1, - const SKP_float *data2, - SKP_int dataSize -) -{ - SKP_int i, dataSize4; - double result; - - /* 4x unrolled loop */ - result = 0.0f; - dataSize4 = dataSize & 0xFFFC; - for( i = 0; i < dataSize4; i += 4 ) { - result += data1[ i + 0 ] * data2[ i + 0 ] + - data1[ i + 1 ] * data2[ i + 1 ] + - data1[ i + 2 ] * data2[ i + 2 ] + - data1[ i + 3 ] * data2[ i + 3 ]; - } - - /* add any remaining products */ - for( ; i < dataSize; i++ ) { - result += data1[ i ] * data2[ i ]; - } - - return result; -} - -/* Solve the normal equations using the Levinson-Durbin recursion */ -SKP_float Levinsondurbin( /* O prediction error energy */ - SKP_float A[], /* O prediction coefficients [order] */ - const SKP_float corr[], /* I input auto-correlations [order + 1] */ - const SKP_int order /* I prediction order */ -) -{ - SKP_int i, mHalf, m; - SKP_float min_nrg, nrg, t, km, Atmp1, Atmp2; - - min_nrg = 1e-12f * corr[ 0 ] + 1e-9f; - nrg = corr[ 0 ]; - nrg = SKP_max( min_nrg, nrg ); - A[ 0 ] = corr[ 1 ] / nrg; - nrg -= A[ 0 ] * corr[ 1 ]; - nrg = SKP_max(min_nrg, nrg); - - for( m = 1; m < order; m++ ) - { - t = corr[ m + 1 ]; - for( i = 0; i < m; i++ ) { - t -= A[ i ] * corr[ m - i ]; - } - - /* reflection coefficient */ - km = t / nrg; - - /* residual energy */ - nrg -= km * t; - nrg = SKP_max(min_nrg, nrg); - - mHalf = m >> 1; - for( i = 0; i < mHalf; i++ ) { - Atmp1 = A[ i ]; - Atmp2 = A[ m - i - 1 ]; - A[ m - i - 1 ] -= km * Atmp1; - A[ i ] -= km * Atmp2; - } - if( m & 1 ) { - A[ mHalf ] -= km * A[ mHalf ]; - } - A[ m ] = km; - } - - /* return the residual energy */ - return nrg; -} - -/* Chirp (bw expand) LP AR filter */ -void Bwexpander( - SKP_float *ar, /* io AR filter to be expanded (without leading 1) */ - const SKP_int d, /* i length of ar */ - const SKP_float chirp /* i chirp factor (typically in range (0..1) ) */ -) -{ - SKP_int i; - SKP_float cfac = chirp; - - for( i = 0; i < d - 1; i++ ) { - ar[ i ] *= cfac; - cfac *= chirp; - } - ar[ d - 1 ] *= cfac; -} -- GitLab