From a1bff96d40729dbdc67aedd5043198ceb652b5e8 Mon Sep 17 00:00:00 2001 From: Andrey Volk Date: Tue, 18 Jul 2017 22:16:48 +0300 Subject: [PATCH] FS-10516: [Build-System] Move libsilk from tree to download on windows. --- .gitignore | 1 + Freeswitch.2015.sln | 17 +- libs/silk/.update | 1 - libs/silk/AUTHORS | 0 libs/silk/COPYING | 26 - libs/silk/ChangeLog | 0 libs/silk/INSTALL | 365 ----- libs/silk/Makefile.am | 168 --- libs/silk/NEWS | 0 libs/silk/README | 0 libs/silk/Silk_SDK.sln | 44 - libs/silk/configure.ac | 32 - libs/silk/configure.gnu | 4 - libs/silk/doc/SILKDataSheet.pdf | Bin 351666 -> 0 bytes libs/silk/doc/SILK_RTP_PayloadFormat.pdf | Bin 60170 -> 0 bytes libs/silk/doc/SILK_SDK_API.pdf | Bin 143182 -> 0 bytes libs/silk/interface/SKP_Silk_SDK_API.h | 152 -- libs/silk/interface/SKP_Silk_control.h | 91 -- libs/silk/interface/SKP_Silk_errors.h | 89 -- libs/silk/interface/SKP_Silk_typedef.h | 99 -- libs/silk/readme.txt | 96 -- libs/silk/src/SKP_Silk_A2NLSF.c | 279 ---- libs/silk/src/SKP_Silk_CNG.c | 149 -- .../src/SKP_Silk_HP_variable_cutoff_FIX.c | 120 -- libs/silk/src/SKP_Silk_Inlines.h | 276 ---- libs/silk/src/SKP_Silk_LBRR_reset.c | 40 - libs/silk/src/SKP_Silk_LPC_inv_pred_gain.c | 152 -- libs/silk/src/SKP_Silk_LPC_synthesis_filter.c | 84 -- .../silk/src/SKP_Silk_LPC_synthesis_order16.c | 120 -- libs/silk/src/SKP_Silk_LP_variable_cutoff.c | 194 --- libs/silk/src/SKP_Silk_LSF_cos_table.c | 65 - .../src/SKP_Silk_LTP_analysis_filter_FIX.c | 79 - libs/silk/src/SKP_Silk_LTP_scale_ctrl_FIX.c | 81 - libs/silk/src/SKP_Silk_MA.c | 115 -- libs/silk/src/SKP_Silk_NLSF2A.c | 151 -- libs/silk/src/SKP_Silk_NLSF2A_stable.c | 58 - libs/silk/src/SKP_Silk_NLSF_MSVQ_decode.c | 91 -- libs/silk/src/SKP_Silk_NLSF_MSVQ_encode_FIX.c | 239 --- .../SKP_Silk_NLSF_VQ_rate_distortion_FIX.c | 61 - .../silk/src/SKP_Silk_NLSF_VQ_sum_error_FIX.c | 79 - .../src/SKP_Silk_NLSF_VQ_weights_laroia.c | 79 - libs/silk/src/SKP_Silk_NLSF_stabilize.c | 138 -- libs/silk/src/SKP_Silk_NSQ.c | 423 ------ libs/silk/src/SKP_Silk_NSQ_del_dec.c | 703 --------- libs/silk/src/SKP_Silk_PLC.c | 387 ----- libs/silk/src/SKP_Silk_PLC.h | 78 - libs/silk/src/SKP_Silk_SigProc_FIX.h | 608 -------- libs/silk/src/SKP_Silk_VAD.c | 320 ---- .../src/SKP_Silk_VQ_nearest_neighbor_FIX.c | 107 -- libs/silk/src/SKP_Silk_ana_filt_bank_1.c | 80 - .../silk/src/SKP_Silk_apply_sine_window_new.c | 100 -- libs/silk/src/SKP_Silk_array_maxabs.c | 68 - libs/silk/src/SKP_Silk_autocorr.c | 81 - libs/silk/src/SKP_Silk_biquad.c | 72 - libs/silk/src/SKP_Silk_biquad_alt.c | 73 - libs/silk/src/SKP_Silk_burg_modified.c | 228 --- libs/silk/src/SKP_Silk_bwexpander.c | 49 - libs/silk/src/SKP_Silk_bwexpander_32.c | 46 - libs/silk/src/SKP_Silk_code_signs.c | 90 -- .../src/SKP_Silk_common_pitch_est_defines.h | 75 - .../src/SKP_Silk_control_audio_bandwidth.c | 137 -- libs/silk/src/SKP_Silk_control_codec_FIX.c | 403 ----- libs/silk/src/SKP_Silk_corrMatrix_FIX.c | 152 -- libs/silk/src/SKP_Silk_create_init_destroy.c | 52 - libs/silk/src/SKP_Silk_dec_API.c | 279 ---- libs/silk/src/SKP_Silk_decode_core.c | 241 --- libs/silk/src/SKP_Silk_decode_frame.c | 156 -- libs/silk/src/SKP_Silk_decode_parameters.c | 244 --- libs/silk/src/SKP_Silk_decode_pitch.c | 57 - libs/silk/src/SKP_Silk_decode_pulses.c | 105 -- libs/silk/src/SKP_Silk_decoder_set_fs.c | 79 - libs/silk/src/SKP_Silk_define.h | 306 ---- libs/silk/src/SKP_Silk_detect_SWB_input.c | 76 - libs/silk/src/SKP_Silk_enc_API.c | 244 --- libs/silk/src/SKP_Silk_encode_frame_FIX.c | 413 ------ libs/silk/src/SKP_Silk_encode_parameters.c | 162 -- libs/silk/src/SKP_Silk_encode_pulses.c | 195 --- libs/silk/src/SKP_Silk_find_LPC_FIX.c | 151 -- libs/silk/src/SKP_Silk_find_LTP_FIX.c | 243 --- libs/silk/src/SKP_Silk_find_pitch_lags_FIX.c | 125 -- libs/silk/src/SKP_Silk_find_pred_coefs_FIX.c | 131 -- libs/silk/src/SKP_Silk_gain_quant.c | 94 -- libs/silk/src/SKP_Silk_init_encoder_FIX.c | 56 - libs/silk/src/SKP_Silk_inner_prod_aligned.c | 69 - libs/silk/src/SKP_Silk_interpolate.c | 47 - libs/silk/src/SKP_Silk_k2a.c | 58 - libs/silk/src/SKP_Silk_k2a_Q16.c | 58 - libs/silk/src/SKP_Silk_lin2log.c | 48 - libs/silk/src/SKP_Silk_log2lin.c | 58 - libs/silk/src/SKP_Silk_macros.h | 121 -- libs/silk/src/SKP_Silk_main.h | 387 ----- libs/silk/src/SKP_Silk_main_FIX.h | 328 ---- .../src/SKP_Silk_noise_shape_analysis_FIX.c | 482 ------ libs/silk/src/SKP_Silk_pitch_analysis_core.c | 707 --------- libs/silk/src/SKP_Silk_pitch_est_defines.h | 39 - libs/silk/src/SKP_Silk_pitch_est_tables.c | 88 -- libs/silk/src/SKP_Silk_prefilter_FIX.c | 200 --- libs/silk/src/SKP_Silk_process_NLSFs_FIX.c | 127 -- libs/silk/src/SKP_Silk_process_gains_FIX.c | 108 -- libs/silk/src/SKP_Silk_quant_LTP_gains_FIX.c | 105 -- libs/silk/src/SKP_Silk_range_coder.c | 372 ----- .../SKP_Silk_regularize_correlations_FIX.c | 43 - libs/silk/src/SKP_Silk_resampler.c | 323 ---- libs/silk/src/SKP_Silk_resampler_down2.c | 77 - libs/silk/src/SKP_Silk_resampler_down2_3.c | 102 -- libs/silk/src/SKP_Silk_resampler_down3.c | 93 -- libs/silk/src/SKP_Silk_resampler_private.h | 130 -- .../silk/src/SKP_Silk_resampler_private_AR2.c | 58 - .../src/SKP_Silk_resampler_private_ARMA4.c | 76 - .../src/SKP_Silk_resampler_private_IIR_FIR.c | 104 -- .../src/SKP_Silk_resampler_private_copy.c | 49 - .../src/SKP_Silk_resampler_private_down4.c | 77 - .../src/SKP_Silk_resampler_private_down_FIR.c | 159 -- .../src/SKP_Silk_resampler_private_up2_HQ.c | 118 -- .../silk/src/SKP_Silk_resampler_private_up4.c | 81 - libs/silk/src/SKP_Silk_resampler_rom.c | 269 ---- libs/silk/src/SKP_Silk_resampler_rom.h | 91 -- libs/silk/src/SKP_Silk_resampler_structs.h | 79 - libs/silk/src/SKP_Silk_resampler_up2.c | 75 - .../silk/src/SKP_Silk_residual_energy16_FIX.c | 99 -- libs/silk/src/SKP_Silk_residual_energy_FIX.c | 88 -- libs/silk/src/SKP_Silk_scale_copy_vector16.c | 45 - libs/silk/src/SKP_Silk_scale_vector.c | 42 - libs/silk/src/SKP_Silk_schur.c | 94 -- libs/silk/src/SKP_Silk_schur64.c | 80 - libs/silk/src/SKP_Silk_setup_complexity.h | 99 -- libs/silk/src/SKP_Silk_shell_coder.c | 155 -- libs/silk/src/SKP_Silk_sigm_Q15.c | 77 - libs/silk/src/SKP_Silk_solve_LS_FIX.c | 241 --- libs/silk/src/SKP_Silk_sort.c | 147 -- libs/silk/src/SKP_Silk_structs.h | 350 ----- libs/silk/src/SKP_Silk_structs_FIX.h | 153 -- libs/silk/src/SKP_Silk_sum_sqr_shift.c | 99 -- libs/silk/src/SKP_Silk_tables.h | 168 --- libs/silk/src/SKP_Silk_tables_LTP.c | 324 ---- libs/silk/src/SKP_Silk_tables_NLSF_CB0_10.c | 889 ----------- libs/silk/src/SKP_Silk_tables_NLSF_CB0_10.h | 50 - libs/silk/src/SKP_Silk_tables_NLSF_CB0_16.c | 1319 ----------------- libs/silk/src/SKP_Silk_tables_NLSF_CB0_16.h | 50 - libs/silk/src/SKP_Silk_tables_NLSF_CB1_10.c | 577 ------- libs/silk/src/SKP_Silk_tables_NLSF_CB1_10.h | 50 - libs/silk/src/SKP_Silk_tables_NLSF_CB1_16.c | 703 --------- libs/silk/src/SKP_Silk_tables_NLSF_CB1_16.h | 50 - libs/silk/src/SKP_Silk_tables_gain.c | 77 - libs/silk/src/SKP_Silk_tables_other.c | 147 -- libs/silk/src/SKP_Silk_tables_pitch_lag.c | 199 --- .../src/SKP_Silk_tables_pulses_per_block.c | 234 --- libs/silk/src/SKP_Silk_tables_sign.c | 41 - libs/silk/src/SKP_Silk_tables_type_offset.c | 51 - libs/silk/src/SKP_Silk_tuning_parameters.h | 183 --- .../src/SKP_Silk_warped_autocorrelation_FIX.c | 85 -- libs/silk/src/Silk_FIX.2008.vcproj | 826 ----------- libs/silk/src/Silk_FIX.2010.vcxproj.filters | 413 ------ libs/silk/src/Silk_FIX.2015.vcxproj | 273 ---- libs/silk/src/Silk_FIX.vcproj | 692 --------- libs/silk/test/Dec_SDK.vcproj | 217 --- libs/silk/test/Decoder.c | 418 ------ libs/silk/test/Enc_SDK.vcproj | 217 --- libs/silk/test/Encoder.c | 318 ---- libs/silk/test/SignalCompare.vcproj | 197 --- libs/silk/test/signalCompare.c | 376 ----- .../How to use the test vectors.txt | 24 - libs/silk/test_vectors/test_decoder.bat | 143 -- libs/silk/test_vectors/test_decoder.sh | 142 -- libs/silk/test_vectors/test_encoder.bat | 111 -- libs/silk/test_vectors/test_encoder.sh | 109 -- libs/win32/Download libsilk.2015.vcxproj | 82 + libs/win32/libsilk/Silk_FIX.2015.vcxproj | 275 ++++ src/mod/codecs/mod_silk/mod_silk.2015.vcxproj | 7 +- w32/libsilk-version.props | 17 + w32/libsilk.props | 14 + 171 files changed, 407 insertions(+), 28360 deletions(-) delete mode 100644 libs/silk/.update delete mode 100644 libs/silk/AUTHORS delete mode 100644 libs/silk/COPYING delete mode 100644 libs/silk/ChangeLog delete mode 100644 libs/silk/INSTALL delete mode 100644 libs/silk/Makefile.am delete mode 100644 libs/silk/NEWS delete mode 100644 libs/silk/README delete mode 100644 libs/silk/Silk_SDK.sln delete mode 100644 libs/silk/configure.ac delete mode 100755 libs/silk/configure.gnu delete mode 100644 libs/silk/doc/SILKDataSheet.pdf delete mode 100644 libs/silk/doc/SILK_RTP_PayloadFormat.pdf delete mode 100644 libs/silk/doc/SILK_SDK_API.pdf delete mode 100644 libs/silk/interface/SKP_Silk_SDK_API.h delete mode 100644 libs/silk/interface/SKP_Silk_control.h delete mode 100644 libs/silk/interface/SKP_Silk_errors.h delete mode 100644 libs/silk/interface/SKP_Silk_typedef.h delete mode 100644 libs/silk/readme.txt delete mode 100644 libs/silk/src/SKP_Silk_A2NLSF.c delete mode 100644 libs/silk/src/SKP_Silk_CNG.c delete mode 100644 libs/silk/src/SKP_Silk_HP_variable_cutoff_FIX.c delete mode 100644 libs/silk/src/SKP_Silk_Inlines.h delete mode 100644 libs/silk/src/SKP_Silk_LBRR_reset.c delete mode 100644 libs/silk/src/SKP_Silk_LPC_inv_pred_gain.c delete mode 100644 libs/silk/src/SKP_Silk_LPC_synthesis_filter.c delete mode 100644 libs/silk/src/SKP_Silk_LPC_synthesis_order16.c delete mode 100644 libs/silk/src/SKP_Silk_LP_variable_cutoff.c delete mode 100644 libs/silk/src/SKP_Silk_LSF_cos_table.c delete mode 100644 libs/silk/src/SKP_Silk_LTP_analysis_filter_FIX.c delete mode 100644 libs/silk/src/SKP_Silk_LTP_scale_ctrl_FIX.c delete mode 100644 libs/silk/src/SKP_Silk_MA.c delete mode 100644 libs/silk/src/SKP_Silk_NLSF2A.c delete mode 100644 libs/silk/src/SKP_Silk_NLSF2A_stable.c delete mode 100644 libs/silk/src/SKP_Silk_NLSF_MSVQ_decode.c delete mode 100644 libs/silk/src/SKP_Silk_NLSF_MSVQ_encode_FIX.c delete mode 100644 libs/silk/src/SKP_Silk_NLSF_VQ_rate_distortion_FIX.c delete mode 100644 libs/silk/src/SKP_Silk_NLSF_VQ_sum_error_FIX.c delete mode 100644 libs/silk/src/SKP_Silk_NLSF_VQ_weights_laroia.c delete mode 100644 libs/silk/src/SKP_Silk_NLSF_stabilize.c delete mode 100644 libs/silk/src/SKP_Silk_NSQ.c delete mode 100644 libs/silk/src/SKP_Silk_NSQ_del_dec.c delete mode 100644 libs/silk/src/SKP_Silk_PLC.c delete mode 100644 libs/silk/src/SKP_Silk_PLC.h delete mode 100644 libs/silk/src/SKP_Silk_SigProc_FIX.h delete mode 100644 libs/silk/src/SKP_Silk_VAD.c delete mode 100644 libs/silk/src/SKP_Silk_VQ_nearest_neighbor_FIX.c delete mode 100644 libs/silk/src/SKP_Silk_ana_filt_bank_1.c delete mode 100644 libs/silk/src/SKP_Silk_apply_sine_window_new.c delete mode 100644 libs/silk/src/SKP_Silk_array_maxabs.c delete mode 100644 libs/silk/src/SKP_Silk_autocorr.c delete mode 100644 libs/silk/src/SKP_Silk_biquad.c delete mode 100644 libs/silk/src/SKP_Silk_biquad_alt.c delete mode 100644 libs/silk/src/SKP_Silk_burg_modified.c delete mode 100644 libs/silk/src/SKP_Silk_bwexpander.c delete mode 100644 libs/silk/src/SKP_Silk_bwexpander_32.c delete mode 100644 libs/silk/src/SKP_Silk_code_signs.c delete mode 100644 libs/silk/src/SKP_Silk_common_pitch_est_defines.h delete mode 100644 libs/silk/src/SKP_Silk_control_audio_bandwidth.c delete mode 100644 libs/silk/src/SKP_Silk_control_codec_FIX.c delete mode 100644 libs/silk/src/SKP_Silk_corrMatrix_FIX.c delete mode 100644 libs/silk/src/SKP_Silk_create_init_destroy.c delete mode 100644 libs/silk/src/SKP_Silk_dec_API.c delete mode 100644 libs/silk/src/SKP_Silk_decode_core.c delete mode 100644 libs/silk/src/SKP_Silk_decode_frame.c delete mode 100644 libs/silk/src/SKP_Silk_decode_parameters.c delete mode 100644 libs/silk/src/SKP_Silk_decode_pitch.c delete mode 100644 libs/silk/src/SKP_Silk_decode_pulses.c delete mode 100644 libs/silk/src/SKP_Silk_decoder_set_fs.c delete mode 100644 libs/silk/src/SKP_Silk_define.h delete mode 100644 libs/silk/src/SKP_Silk_detect_SWB_input.c delete mode 100644 libs/silk/src/SKP_Silk_enc_API.c delete mode 100644 libs/silk/src/SKP_Silk_encode_frame_FIX.c delete mode 100644 libs/silk/src/SKP_Silk_encode_parameters.c delete mode 100644 libs/silk/src/SKP_Silk_encode_pulses.c delete mode 100644 libs/silk/src/SKP_Silk_find_LPC_FIX.c delete mode 100644 libs/silk/src/SKP_Silk_find_LTP_FIX.c delete mode 100644 libs/silk/src/SKP_Silk_find_pitch_lags_FIX.c delete mode 100644 libs/silk/src/SKP_Silk_find_pred_coefs_FIX.c delete mode 100644 libs/silk/src/SKP_Silk_gain_quant.c delete mode 100644 libs/silk/src/SKP_Silk_init_encoder_FIX.c delete mode 100644 libs/silk/src/SKP_Silk_inner_prod_aligned.c delete mode 100644 libs/silk/src/SKP_Silk_interpolate.c delete mode 100644 libs/silk/src/SKP_Silk_k2a.c delete mode 100644 libs/silk/src/SKP_Silk_k2a_Q16.c delete mode 100644 libs/silk/src/SKP_Silk_lin2log.c delete mode 100644 libs/silk/src/SKP_Silk_log2lin.c delete mode 100644 libs/silk/src/SKP_Silk_macros.h delete mode 100644 libs/silk/src/SKP_Silk_main.h delete mode 100644 libs/silk/src/SKP_Silk_main_FIX.h delete mode 100644 libs/silk/src/SKP_Silk_noise_shape_analysis_FIX.c delete mode 100644 libs/silk/src/SKP_Silk_pitch_analysis_core.c delete mode 100644 libs/silk/src/SKP_Silk_pitch_est_defines.h delete mode 100644 libs/silk/src/SKP_Silk_pitch_est_tables.c delete mode 100644 libs/silk/src/SKP_Silk_prefilter_FIX.c delete mode 100644 libs/silk/src/SKP_Silk_process_NLSFs_FIX.c delete mode 100644 libs/silk/src/SKP_Silk_process_gains_FIX.c delete mode 100644 libs/silk/src/SKP_Silk_quant_LTP_gains_FIX.c delete mode 100644 libs/silk/src/SKP_Silk_range_coder.c delete mode 100644 libs/silk/src/SKP_Silk_regularize_correlations_FIX.c delete mode 100644 libs/silk/src/SKP_Silk_resampler.c delete mode 100644 libs/silk/src/SKP_Silk_resampler_down2.c delete mode 100644 libs/silk/src/SKP_Silk_resampler_down2_3.c delete mode 100644 libs/silk/src/SKP_Silk_resampler_down3.c delete mode 100644 libs/silk/src/SKP_Silk_resampler_private.h delete mode 100644 libs/silk/src/SKP_Silk_resampler_private_AR2.c delete mode 100644 libs/silk/src/SKP_Silk_resampler_private_ARMA4.c delete mode 100644 libs/silk/src/SKP_Silk_resampler_private_IIR_FIR.c delete mode 100644 libs/silk/src/SKP_Silk_resampler_private_copy.c delete mode 100644 libs/silk/src/SKP_Silk_resampler_private_down4.c delete mode 100644 libs/silk/src/SKP_Silk_resampler_private_down_FIR.c delete mode 100644 libs/silk/src/SKP_Silk_resampler_private_up2_HQ.c delete mode 100644 libs/silk/src/SKP_Silk_resampler_private_up4.c delete mode 100644 libs/silk/src/SKP_Silk_resampler_rom.c delete mode 100644 libs/silk/src/SKP_Silk_resampler_rom.h delete mode 100644 libs/silk/src/SKP_Silk_resampler_structs.h delete mode 100644 libs/silk/src/SKP_Silk_resampler_up2.c delete mode 100644 libs/silk/src/SKP_Silk_residual_energy16_FIX.c delete mode 100644 libs/silk/src/SKP_Silk_residual_energy_FIX.c delete mode 100644 libs/silk/src/SKP_Silk_scale_copy_vector16.c delete mode 100644 libs/silk/src/SKP_Silk_scale_vector.c delete mode 100644 libs/silk/src/SKP_Silk_schur.c delete mode 100644 libs/silk/src/SKP_Silk_schur64.c delete mode 100644 libs/silk/src/SKP_Silk_setup_complexity.h delete mode 100644 libs/silk/src/SKP_Silk_shell_coder.c delete mode 100644 libs/silk/src/SKP_Silk_sigm_Q15.c delete mode 100644 libs/silk/src/SKP_Silk_solve_LS_FIX.c delete mode 100644 libs/silk/src/SKP_Silk_sort.c delete mode 100644 libs/silk/src/SKP_Silk_structs.h delete mode 100644 libs/silk/src/SKP_Silk_structs_FIX.h delete mode 100644 libs/silk/src/SKP_Silk_sum_sqr_shift.c delete mode 100644 libs/silk/src/SKP_Silk_tables.h delete mode 100644 libs/silk/src/SKP_Silk_tables_LTP.c delete mode 100644 libs/silk/src/SKP_Silk_tables_NLSF_CB0_10.c delete mode 100644 libs/silk/src/SKP_Silk_tables_NLSF_CB0_10.h delete mode 100644 libs/silk/src/SKP_Silk_tables_NLSF_CB0_16.c delete mode 100644 libs/silk/src/SKP_Silk_tables_NLSF_CB0_16.h delete mode 100644 libs/silk/src/SKP_Silk_tables_NLSF_CB1_10.c delete mode 100644 libs/silk/src/SKP_Silk_tables_NLSF_CB1_10.h delete mode 100644 libs/silk/src/SKP_Silk_tables_NLSF_CB1_16.c delete mode 100644 libs/silk/src/SKP_Silk_tables_NLSF_CB1_16.h delete mode 100644 libs/silk/src/SKP_Silk_tables_gain.c delete mode 100644 libs/silk/src/SKP_Silk_tables_other.c delete mode 100644 libs/silk/src/SKP_Silk_tables_pitch_lag.c delete mode 100644 libs/silk/src/SKP_Silk_tables_pulses_per_block.c delete mode 100644 libs/silk/src/SKP_Silk_tables_sign.c delete mode 100644 libs/silk/src/SKP_Silk_tables_type_offset.c delete mode 100644 libs/silk/src/SKP_Silk_tuning_parameters.h delete mode 100644 libs/silk/src/SKP_Silk_warped_autocorrelation_FIX.c delete mode 100644 libs/silk/src/Silk_FIX.2008.vcproj delete mode 100644 libs/silk/src/Silk_FIX.2010.vcxproj.filters delete mode 100644 libs/silk/src/Silk_FIX.2015.vcxproj delete mode 100644 libs/silk/src/Silk_FIX.vcproj delete mode 100644 libs/silk/test/Dec_SDK.vcproj delete mode 100644 libs/silk/test/Decoder.c delete mode 100644 libs/silk/test/Enc_SDK.vcproj delete mode 100644 libs/silk/test/Encoder.c delete mode 100644 libs/silk/test/SignalCompare.vcproj delete mode 100644 libs/silk/test/signalCompare.c delete mode 100644 libs/silk/test_vectors/How to use the test vectors.txt delete mode 100644 libs/silk/test_vectors/test_decoder.bat delete mode 100644 libs/silk/test_vectors/test_decoder.sh delete mode 100644 libs/silk/test_vectors/test_encoder.bat delete mode 100644 libs/silk/test_vectors/test_encoder.sh create mode 100644 libs/win32/Download libsilk.2015.vcxproj create mode 100644 libs/win32/libsilk/Silk_FIX.2015.vcxproj create mode 100644 w32/libsilk-version.props create mode 100644 w32/libsilk.props diff --git a/.gitignore b/.gitignore index 0b0e9aea25..d5fad3c126 100644 --- a/.gitignore +++ b/.gitignore @@ -253,3 +253,4 @@ libs/g722_1-*/ libs/ilbc-*/ libs/broadvoice-*/ libs/libcodec2-*/ +libs/libsilk-*/ \ No newline at end of file diff --git a/Freeswitch.2015.sln b/Freeswitch.2015.sln index bafe76f17b..3d9fcd3979 100644 --- a/Freeswitch.2015.sln +++ b/Freeswitch.2015.sln @@ -467,7 +467,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_curl", "src\mod\applica EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_silk", "src\mod\codecs\mod_silk\mod_silk.2015.vcxproj", "{AFA983D6-4569-4F88-BA94-555ED00FD9A8}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Silk_FIX", "libs\silk\src\Silk_FIX.2015.vcxproj", "{56B91D01-9150-4BBF-AFA1-5B68AB991B76}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Silk_FIX", "libs\win32\libsilk\Silk_FIX.2015.vcxproj", "{56B91D01-9150-4BBF-AFA1-5B68AB991B76}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_avmd", "src\mod\applications\mod_avmd\mod_avmd.2015.vcxproj", "{990BAA76-89D3-4E38-8479-C7B28784EFC8}" EndProject @@ -665,6 +665,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_codec2", "src\mod\codec EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Download libcodec2", "libs\win32\Download libcodec2.2015.vcxproj", "{9CFA562C-C611-48A7-90A2-BB031B47FE6D}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Download libsilk", "libs\win32\Download libsilk.2015.vcxproj", "{08782D64-E775-4E96-B707-CC633A226F32}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution All|Win32 = All|Win32 @@ -3019,6 +3021,18 @@ Global {9CFA562C-C611-48A7-90A2-BB031B47FE6D}.Release|Win32.Build.0 = Release|Win32 {9CFA562C-C611-48A7-90A2-BB031B47FE6D}.Release|x64.ActiveCfg = Release|Win32 {9CFA562C-C611-48A7-90A2-BB031B47FE6D}.Release|x64.Build.0 = Release|Win32 + {08782D64-E775-4E96-B707-CC633A226F32}.All|Win32.ActiveCfg = Release|Win32 + {08782D64-E775-4E96-B707-CC633A226F32}.All|Win32.Build.0 = Release|Win32 + {08782D64-E775-4E96-B707-CC633A226F32}.All|x64.ActiveCfg = Release|Win32 + {08782D64-E775-4E96-B707-CC633A226F32}.All|x64.Build.0 = Release|Win32 + {08782D64-E775-4E96-B707-CC633A226F32}.Debug|Win32.ActiveCfg = Debug|Win32 + {08782D64-E775-4E96-B707-CC633A226F32}.Debug|Win32.Build.0 = Debug|Win32 + {08782D64-E775-4E96-B707-CC633A226F32}.Debug|x64.ActiveCfg = Debug|Win32 + {08782D64-E775-4E96-B707-CC633A226F32}.Debug|x64.Build.0 = Debug|Win32 + {08782D64-E775-4E96-B707-CC633A226F32}.Release|Win32.ActiveCfg = Release|Win32 + {08782D64-E775-4E96-B707-CC633A226F32}.Release|Win32.Build.0 = Release|Win32 + {08782D64-E775-4E96-B707-CC633A226F32}.Release|x64.ActiveCfg = Release|Win32 + {08782D64-E775-4E96-B707-CC633A226F32}.Release|x64.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -3258,5 +3272,6 @@ Global {19E934D6-1484-41C8-9305-78DC42FD61F2} = {EB910B0D-F27D-4B62-B67B-DE834C99AC5B} {CB4E68A1-8D19-4B5E-87B9-97A895E1BA17} = {F881ADA2-2F1A-4046-9FEB-191D9422D781} {9CFA562C-C611-48A7-90A2-BB031B47FE6D} = {C120A020-773F-4EA3-923F-B67AF28B750D} + {08782D64-E775-4E96-B707-CC633A226F32} = {C120A020-773F-4EA3-923F-B67AF28B750D} EndGlobalSection EndGlobal diff --git a/libs/silk/.update b/libs/silk/.update deleted file mode 100644 index 2863c1bd29..0000000000 --- a/libs/silk/.update +++ /dev/null @@ -1 +0,0 @@ -Tue Nov 1 11:51:42 CDT 2011 diff --git a/libs/silk/AUTHORS b/libs/silk/AUTHORS deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libs/silk/COPYING b/libs/silk/COPYING deleted file mode 100644 index 4ec0218b97..0000000000 --- a/libs/silk/COPYING +++ /dev/null @@ -1,26 +0,0 @@ -/*********************************************************************** -Copyright (c) 2006-2010, 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. -***********************************************************************/ diff --git a/libs/silk/ChangeLog b/libs/silk/ChangeLog deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libs/silk/INSTALL b/libs/silk/INSTALL deleted file mode 100644 index 7d1c323bea..0000000000 --- a/libs/silk/INSTALL +++ /dev/null @@ -1,365 +0,0 @@ -Installation Instructions -************************* - -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, -2006, 2007, 2008, 2009 Free Software Foundation, Inc. - - Copying and distribution of this file, with or without modification, -are permitted in any medium without royalty provided the copyright -notice and this notice are preserved. This file is offered as-is, -without warranty of any kind. - -Basic Installation -================== - - Briefly, the shell commands `./configure; make; make install' should -configure, build, and install this package. The following -more-detailed instructions are generic; see the `README' file for -instructions specific to this package. Some packages provide this -`INSTALL' file but do not implement all of the features documented -below. The lack of an optional feature in a given package is not -necessarily a bug. More recommendations for GNU packages can be found -in *note Makefile Conventions: (standards)Makefile Conventions. - - The `configure' shell script attempts to guess correct values for -various system-dependent variables used during compilation. It uses -those values to create a `Makefile' in each directory of the package. -It may also create one or more `.h' files containing system-dependent -definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, and a -file `config.log' containing compiler output (useful mainly for -debugging `configure'). - - It can also use an optional file (typically called `config.cache' -and enabled with `--cache-file=config.cache' or simply `-C') that saves -the results of its tests to speed up reconfiguring. Caching is -disabled by default to prevent problems with accidental use of stale -cache files. - - If you need to do unusual things to compile the package, please try -to figure out how `configure' could check whether to do them, and mail -diffs or instructions to the address given in the `README' so they can -be considered for the next release. If you are using the cache, and at -some point `config.cache' contains results you don't want to keep, you -may remove or edit it. - - The file `configure.ac' (or `configure.in') is used to create -`configure' by a program called `autoconf'. You need `configure.ac' if -you want to change it or regenerate `configure' using a newer version -of `autoconf'. - - The simplest way to compile this package is: - - 1. `cd' to the directory containing the package's source code and type - `./configure' to configure the package for your system. - - Running `configure' might take a while. While running, it prints - some messages telling which features it is checking for. - - 2. Type `make' to compile the package. - - 3. Optionally, type `make check' to run any self-tests that come with - the package, generally using the just-built uninstalled binaries. - - 4. Type `make install' to install the programs and any data files and - documentation. When installing into a prefix owned by root, it is - recommended that the package be configured and built as a regular - user, and only the `make install' phase executed with root - privileges. - - 5. Optionally, type `make installcheck' to repeat any self-tests, but - this time using the binaries in their final installed location. - This target does not install anything. Running this target as a - regular user, particularly if the prior `make install' required - root privileges, verifies that the installation completed - correctly. - - 6. You can remove the program binaries and object files from the - source code directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile the package for - a different kind of computer), type `make distclean'. There is - also a `make maintainer-clean' target, but that is intended mainly - for the package's developers. If you use it, you may have to get - all sorts of other programs in order to regenerate files that came - with the distribution. - - 7. Often, you can also type `make uninstall' to remove the installed - files again. In practice, not all packages have tested that - uninstallation works correctly, even though it is required by the - GNU Coding Standards. - - 8. Some packages, particularly those that use Automake, provide `make - distcheck', which can by used by developers to test that all other - targets like `make install' and `make uninstall' work correctly. - This target is generally not run by end users. - -Compilers and Options -===================== - - Some systems require unusual options for compilation or linking that -the `configure' script does not know about. Run `./configure --help' -for details on some of the pertinent environment variables. - - You can give `configure' initial values for configuration parameters -by setting variables in the command line or in the environment. Here -is an example: - - ./configure CC=c99 CFLAGS=-g LIBS=-lposix - - *Note Defining Variables::, for more details. - -Compiling For Multiple Architectures -==================================== - - You can compile the package for more than one kind of computer at the -same time, by placing the object files for each architecture in their -own directory. To do this, you can use GNU `make'. `cd' to the -directory where you want the object files and executables to go and run -the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. This -is known as a "VPATH" build. - - With a non-GNU `make', it is safer to compile the package for one -architecture at a time in the source code directory. After you have -installed the package for one architecture, use `make distclean' before -reconfiguring for another architecture. - - On MacOS X 10.5 and later systems, you can create libraries and -executables that work on multiple system types--known as "fat" or -"universal" binaries--by specifying multiple `-arch' options to the -compiler but only a single `-arch' option to the preprocessor. Like -this: - - ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ - CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ - CPP="gcc -E" CXXCPP="g++ -E" - - This is not guaranteed to produce working output in all cases, you -may have to build one architecture at a time and combine the results -using the `lipo' tool if you have problems. - -Installation Names -================== - - By default, `make install' installs the package's commands under -`/usr/local/bin', include files under `/usr/local/include', etc. You -can specify an installation prefix other than `/usr/local' by giving -`configure' the option `--prefix=PREFIX', where PREFIX must be an -absolute file name. - - You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. If you -pass the option `--exec-prefix=PREFIX' to `configure', the package uses -PREFIX as the prefix for installing programs and libraries. -Documentation and other data files still use the regular prefix. - - In addition, if you use an unusual directory layout you can give -options like `--bindir=DIR' to specify different values for particular -kinds of files. Run `configure --help' for a list of the directories -you can set and what kinds of files go in them. In general, the -default for these options is expressed in terms of `${prefix}', so that -specifying just `--prefix' will affect all of the other directory -specifications that were not explicitly provided. - - The most portable way to affect installation locations is to pass the -correct locations to `configure'; however, many packages provide one or -both of the following shortcuts of passing variable assignments to the -`make install' command line to change installation locations without -having to reconfigure or recompile. - - The first method involves providing an override variable for each -affected directory. For example, `make install -prefix=/alternate/directory' will choose an alternate location for all -directory configuration variables that were expressed in terms of -`${prefix}'. Any directories that were specified during `configure', -but not in terms of `${prefix}', must each be overridden at install -time for the entire installation to be relocated. The approach of -makefile variable overrides for each directory variable is required by -the GNU Coding Standards, and ideally causes no recompilation. -However, some platforms have known limitations with the semantics of -shared libraries that end up requiring recompilation when using this -method, particularly noticeable in packages that use GNU Libtool. - - The second method involves providing the `DESTDIR' variable. For -example, `make install DESTDIR=/alternate/directory' will prepend -`/alternate/directory' before all installation names. The approach of -`DESTDIR' overrides is not required by the GNU Coding Standards, and -does not work on platforms that have drive letters. On the other hand, -it does better at avoiding recompilation issues, and works well even -when some directory options were not specified in terms of `${prefix}' -at `configure' time. - -Optional Features -================= - - If the package supports it, you can cause programs to be installed -with an extra prefix or suffix on their names by giving `configure' the -option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. - - Some packages pay attention to `--enable-FEATURE' options to -`configure', where FEATURE indicates an optional part of the package. -They may also pay attention to `--with-PACKAGE' options, where PACKAGE -is something like `gnu-as' or `x' (for the X Window System). The -`README' should mention any `--enable-' and `--with-' options that the -package recognizes. - - For packages that use the X Window System, `configure' can usually -find the X include and library files automatically, but if it doesn't, -you can use the `configure' options `--x-includes=DIR' and -`--x-libraries=DIR' to specify their locations. - - Some packages offer the ability to configure how verbose the -execution of `make' will be. For these packages, running `./configure ---enable-silent-rules' sets the default to minimal output, which can be -overridden with `make V=1'; while running `./configure ---disable-silent-rules' sets the default to verbose, which can be -overridden with `make V=0'. - -Particular systems -================== - - On HP-UX, the default C compiler is not ANSI C compatible. If GNU -CC is not installed, it is recommended to use the following options in -order to use an ANSI C compiler: - - ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" - -and if that doesn't work, install pre-built binaries of GCC for HP-UX. - - On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot -parse its `' header file. The option `-nodtk' can be used as -a workaround. If GNU CC is not installed, it is therefore recommended -to try - - ./configure CC="cc" - -and if that doesn't work, try - - ./configure CC="cc -nodtk" - - On Solaris, don't put `/usr/ucb' early in your `PATH'. This -directory contains several dysfunctional programs; working variants of -these programs are available in `/usr/bin'. So, if you need `/usr/ucb' -in your `PATH', put it _after_ `/usr/bin'. - - On Haiku, software installed for all users goes in `/boot/common', -not `/usr/local'. It is recommended to use the following options: - - ./configure --prefix=/boot/common - -Specifying the System Type -========================== - - There may be some features `configure' cannot figure out -automatically, but needs to determine by the type of machine the package -will run on. Usually, assuming the package is built to be run on the -_same_ architectures, `configure' can figure that out, but if it prints -a message saying it cannot guess the machine type, give it the -`--build=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name which has the form: - - CPU-COMPANY-SYSTEM - -where SYSTEM can have one of these forms: - - OS - KERNEL-OS - - See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the machine type. - - If you are _building_ compiler tools for cross-compiling, you should -use the option `--target=TYPE' to select the type of system they will -produce code for. - - If you want to _use_ a cross compiler, that generates code for a -platform different from the build platform, you should specify the -"host" platform (i.e., that on which the generated programs will -eventually be run) with `--host=TYPE'. - -Sharing Defaults -================ - - If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. -`configure' looks for `PREFIX/share/config.site' if it exists, then -`PREFIX/etc/config.site' if it exists. Or, you can set the -`CONFIG_SITE' environment variable to the location of the site script. -A warning: not all `configure' scripts look for a site script. - -Defining Variables -================== - - Variables not defined in a site shell script can be set in the -environment passed to `configure'. However, some packages may run -configure again during the build, and the customized values of these -variables may be lost. In order to avoid this problem, you should set -them in the `configure' command line, using `VAR=value'. For example: - - ./configure CC=/usr/local2/bin/gcc - -causes the specified `gcc' to be used as the C compiler (unless it is -overridden in the site shell script). - -Unfortunately, this technique does not work for `CONFIG_SHELL' due to -an Autoconf bug. Until the bug is fixed you can use this workaround: - - CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash - -`configure' Invocation -====================== - - `configure' recognizes the following options to control how it -operates. - -`--help' -`-h' - Print a summary of all of the options to `configure', and exit. - -`--help=short' -`--help=recursive' - Print a summary of the options unique to this package's - `configure', and exit. The `short' variant lists options used - only in the top level, while the `recursive' variant lists options - also present in any nested packages. - -`--version' -`-V' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`--cache-file=FILE' - Enable the cache: use and save the results of the tests in FILE, - traditionally `config.cache'. FILE defaults to `/dev/null' to - disable caching. - -`--config-cache' -`-C' - Alias for `--cache-file=config.cache'. - -`--quiet' -`--silent' -`-q' - Do not print messages saying which checks are being made. To - suppress all normal output, redirect it to `/dev/null' (any error - messages will still be shown). - -`--srcdir=DIR' - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. - -`--prefix=DIR' - Use DIR as the installation prefix. *note Installation Names:: - for more details, including other options available for fine-tuning - the installation locations. - -`--no-create' -`-n' - Run the configure checks, but stop before creating any output - files. - -`configure' also accepts some other, not widely useful, options. Run -`configure --help' for more details. - diff --git a/libs/silk/Makefile.am b/libs/silk/Makefile.am deleted file mode 100644 index c1d88b3a55..0000000000 --- a/libs/silk/Makefile.am +++ /dev/null @@ -1,168 +0,0 @@ -AM_CFLAGS = -Isrc -I$(abs_srcdir)/src -Iinterface -I$(abs_srcdir)/interface -fPIC -O3 -AUTOMAKE_OPTIONS = gnu -NAME = libSKP_SILK_SDK -AM_CPPFLAGS = $(AM_CFLAGS) - -EXTRA_DIST = Silk_SDK.sln \ -src/Silk_FIX.vcproj \ -test/Encoder.c \ -test/Enc_SDK.vcproj \ -test/Decoder.c \ -test/Dec_SDK.vcproj \ -test/signalCompare.c \ -test/SignalCompare.vcproj - -lib_LTLIBRARIES = libSKP_SILK_SDK.la -libSKP_SILK_SDK_la_SOURCES = src/SKP_Silk_A2NLSF.c \ -src/SKP_Silk_ana_filt_bank_1.c \ -src/SKP_Silk_apply_sine_window_new.c \ -src/SKP_Silk_array_maxabs.c \ -src/SKP_Silk_autocorr.c \ -src/SKP_Silk_biquad.c \ -src/SKP_Silk_biquad_alt.c \ -src/SKP_Silk_burg_modified.c \ -src/SKP_Silk_bwexpander.c \ -src/SKP_Silk_bwexpander_32.c \ -src/SKP_Silk_CNG.c \ -src/SKP_Silk_code_signs.c \ -src/SKP_Silk_control_audio_bandwidth.c \ -src/SKP_Silk_control_codec_FIX.c \ -src/SKP_Silk_corrMatrix_FIX.c \ -src/SKP_Silk_create_init_destroy.c \ -src/SKP_Silk_dec_API.c \ -src/SKP_Silk_decode_core.c \ -src/SKP_Silk_decode_frame.c \ -src/SKP_Silk_decode_parameters.c \ -src/SKP_Silk_decode_pitch.c \ -src/SKP_Silk_decode_pulses.c \ -src/SKP_Silk_decoder_set_fs.c \ -src/SKP_Silk_detect_SWB_input.c \ -src/SKP_Silk_enc_API.c \ -src/SKP_Silk_encode_frame_FIX.c \ -src/SKP_Silk_encode_parameters.c \ -src/SKP_Silk_encode_pulses.c \ -src/SKP_Silk_find_LPC_FIX.c \ -src/SKP_Silk_find_LTP_FIX.c \ -src/SKP_Silk_find_pitch_lags_FIX.c \ -src/SKP_Silk_find_pred_coefs_FIX.c \ -src/SKP_Silk_gain_quant.c \ -src/SKP_Silk_HP_variable_cutoff_FIX.c \ -src/SKP_Silk_init_encoder_FIX.c \ -src/SKP_Silk_inner_prod_aligned.c \ -src/SKP_Silk_interpolate.c \ -src/SKP_Silk_k2a.c \ -src/SKP_Silk_k2a_Q16.c \ -src/SKP_Silk_LBRR_reset.c \ -src/SKP_Silk_LPC_inv_pred_gain.c \ -src/SKP_Silk_LPC_synthesis_filter.c \ -src/SKP_Silk_LPC_synthesis_order16.c \ -src/SKP_Silk_LP_variable_cutoff.c \ -src/SKP_Silk_LSF_cos_table.c \ -src/SKP_Silk_LTP_analysis_filter_FIX.c \ -src/SKP_Silk_LTP_scale_ctrl_FIX.c \ -src/SKP_Silk_lin2log.c \ -src/SKP_Silk_log2lin.c \ -src/SKP_Silk_MA.c \ -src/SKP_Silk_NLSF2A.c \ -src/SKP_Silk_NLSF2A_stable.c \ -src/SKP_Silk_NLSF_MSVQ_decode.c \ -src/SKP_Silk_NLSF_MSVQ_encode_FIX.c \ -src/SKP_Silk_NLSF_VQ_rate_distortion_FIX.c \ -src/SKP_Silk_NLSF_VQ_sum_error_FIX.c \ -src/SKP_Silk_NLSF_VQ_weights_laroia.c \ -src/SKP_Silk_NLSF_stabilize.c \ -src/SKP_Silk_NSQ.c \ -src/SKP_Silk_NSQ_del_dec.c \ -src/SKP_Silk_noise_shape_analysis_FIX.c \ -src/SKP_Silk_PLC.c \ -src/SKP_Silk_pitch_analysis_core.c \ -src/SKP_Silk_pitch_est_tables.c \ -src/SKP_Silk_prefilter_FIX.c \ -src/SKP_Silk_process_NLSFs_FIX.c \ -src/SKP_Silk_process_gains_FIX.c \ -src/SKP_Silk_quant_LTP_gains_FIX.c \ -src/SKP_Silk_range_coder.c \ -src/SKP_Silk_regularize_correlations_FIX.c \ -src/SKP_Silk_resampler.c \ -src/SKP_Silk_resampler_down2.c \ -src/SKP_Silk_resampler_down2_3.c \ -src/SKP_Silk_resampler_down3.c \ -src/SKP_Silk_resampler_private_AR2.c \ -src/SKP_Silk_resampler_private_ARMA4.c \ -src/SKP_Silk_resampler_private_IIR_FIR.c \ -src/SKP_Silk_resampler_private_copy.c \ -src/SKP_Silk_resampler_private_down4.c \ -src/SKP_Silk_resampler_private_down_FIR.c \ -src/SKP_Silk_resampler_private_up2_HQ.c \ -src/SKP_Silk_resampler_private_up4.c \ -src/SKP_Silk_resampler_rom.c \ -src/SKP_Silk_resampler_up2.c \ -src/SKP_Silk_residual_energy16_FIX.c \ -src/SKP_Silk_residual_energy_FIX.c \ -src/SKP_Silk_scale_copy_vector16.c \ -src/SKP_Silk_scale_vector.c \ -src/SKP_Silk_schur.c \ -src/SKP_Silk_schur64.c \ -src/SKP_Silk_shell_coder.c \ -src/SKP_Silk_sigm_Q15.c \ -src/SKP_Silk_solve_LS_FIX.c \ -src/SKP_Silk_sort.c \ -src/SKP_Silk_sum_sqr_shift.c \ -src/SKP_Silk_tables_LTP.c \ -src/SKP_Silk_tables_NLSF_CB0_10.c \ -src/SKP_Silk_tables_NLSF_CB0_16.c \ -src/SKP_Silk_tables_NLSF_CB1_10.c \ -src/SKP_Silk_tables_NLSF_CB1_16.c \ -src/SKP_Silk_tables_gain.c \ -src/SKP_Silk_tables_other.c \ -src/SKP_Silk_tables_pitch_lag.c \ -src/SKP_Silk_tables_pulses_per_block.c \ -src/SKP_Silk_tables_sign.c \ -src/SKP_Silk_tables_type_offset.c \ -src/SKP_Silk_VAD.c \ -src/SKP_Silk_VQ_nearest_neighbor_FIX.c \ -src/SKP_Silk_warped_autocorrelation_FIX.c - - -libSKP_SILK_SDK_la_CFLAGS = $(AM_CFLAGS) -libSKP_SILK_SDK_la_LDFLAGS = $(LIBS) - -library_includedir = $(prefix)/include/silk -library_include_HEADERS = src/SKP_Silk_common_pitch_est_defines.h \ -src/SKP_Silk_define.h \ -src/SKP_Silk_Inlines.h \ -src/SKP_Silk_macros.h \ -src/SKP_Silk_main.h \ -src/SKP_Silk_main_FIX.h \ -src/SKP_Silk_pitch_est_defines.h \ -src/SKP_Silk_PLC.h \ -src/SKP_Silk_resampler_private.h \ -src/SKP_Silk_resampler_rom.h \ -src/SKP_Silk_resampler_structs.h \ -src/SKP_Silk_SigProc_FIX.h \ -src/SKP_Silk_setup_complexity.h \ -src/SKP_Silk_structs.h \ -src/SKP_Silk_structs_FIX.h \ -src/SKP_Silk_tables.h \ -src/SKP_Silk_tables_NLSF_CB0_10.h \ -src/SKP_Silk_tables_NLSF_CB0_16.h \ -src/SKP_Silk_tables_NLSF_CB1_10.h \ -src/SKP_Silk_tables_NLSF_CB1_16.h \ -src/SKP_Silk_tuning_parameters.h \ -interface/SKP_Silk_control.h \ -interface/SKP_Silk_errors.h \ -interface/SKP_Silk_SDK_API.h \ -interface/SKP_Silk_typedef.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) diff --git a/libs/silk/NEWS b/libs/silk/NEWS deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libs/silk/README b/libs/silk/README deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libs/silk/Silk_SDK.sln b/libs/silk/Silk_SDK.sln deleted file mode 100644 index ab0dd8d373..0000000000 --- a/libs/silk/Silk_SDK.sln +++ /dev/null @@ -1,44 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Silk_FIX", "src\Silk_FIX.vcproj", "{56B91D01-9150-4BBF-AFA1-5B68AB991B76}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Dec_SDK", "test\Dec_SDK.vcproj", "{82685D7F-0589-42BD-877C-31A952D53A8E}" - ProjectSection(ProjectDependencies) = postProject - {56B91D01-9150-4BBF-AFA1-5B68AB991B76} = {56B91D01-9150-4BBF-AFA1-5B68AB991B76} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SignalCompare", "test\SignalCompare.vcproj", "{7FE8F544-9175-40C3-A187-7F15CE9A75D8}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Enc_SDK", "test\Enc_SDK.vcproj", "{6D97A8EF-5724-4D85-8BF4-C583714BBA78}" - ProjectSection(ProjectDependencies) = postProject - {56B91D01-9150-4BBF-AFA1-5B68AB991B76} = {56B91D01-9150-4BBF-AFA1-5B68AB991B76} - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|Win32.ActiveCfg = Debug|Win32 - {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|Win32.Build.0 = Debug|Win32 - {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|Win32.ActiveCfg = Release|Win32 - {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|Win32.Build.0 = Release|Win32 - {82685D7F-0589-42BD-877C-31A952D53A8E}.Debug|Win32.ActiveCfg = Debug|Win32 - {82685D7F-0589-42BD-877C-31A952D53A8E}.Debug|Win32.Build.0 = Debug|Win32 - {82685D7F-0589-42BD-877C-31A952D53A8E}.Release|Win32.ActiveCfg = Release|Win32 - {82685D7F-0589-42BD-877C-31A952D53A8E}.Release|Win32.Build.0 = Release|Win32 - {7FE8F544-9175-40C3-A187-7F15CE9A75D8}.Debug|Win32.ActiveCfg = Debug|Win32 - {7FE8F544-9175-40C3-A187-7F15CE9A75D8}.Debug|Win32.Build.0 = Debug|Win32 - {7FE8F544-9175-40C3-A187-7F15CE9A75D8}.Release|Win32.ActiveCfg = Release|Win32 - {7FE8F544-9175-40C3-A187-7F15CE9A75D8}.Release|Win32.Build.0 = Release|Win32 - {6D97A8EF-5724-4D85-8BF4-C583714BBA78}.Debug|Win32.ActiveCfg = Debug|Win32 - {6D97A8EF-5724-4D85-8BF4-C583714BBA78}.Debug|Win32.Build.0 = Debug|Win32 - {6D97A8EF-5724-4D85-8BF4-C583714BBA78}.Release|Win32.ActiveCfg = Release|Win32 - {6D97A8EF-5724-4D85-8BF4-C583714BBA78}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/libs/silk/configure.ac b/libs/silk/configure.ac deleted file mode 100644 index 64feb0b5f8..0000000000 --- a/libs/silk/configure.ac +++ /dev/null @@ -1,32 +0,0 @@ -# -*- Autoconf -*- -# Process this file with autoconf to produce a configure script. - -AC_PREREQ([2.59]) -AC_INIT(libSKP_SILK_SDK, 1.0.8, brian@freeswitch.org, libSKP_SILK_SDK) -AM_INIT_AUTOMAKE - -# Checks for programs. -AC_PROG_CC -AC_PROG_LIBTOOL - -# Checks for header files. -AC_HEADER_STDC -AC_CHECK_HEADERS([float.h stdint.h stdlib.h string.h]) - -# Checks for typedefs, structures, and compiler characteristics. -AC_C_CONST -AC_C_INLINE -AC_TYPE_SIZE_T - -# Checks for library functions. -AC_FUNC_MALLOC -AC_CHECK_LIB([m],[pow]) - -# Absolute source/build directory -abs_srcdir=`(cd $srcdir && pwd)` -abs_builddir=`pwd` -AC_SUBST(abs_srcdir) -AC_SUBST(abs_builddir) - -AC_CONFIG_FILES([Makefile]) -AC_OUTPUT diff --git a/libs/silk/configure.gnu b/libs/silk/configure.gnu deleted file mode 100755 index c78238de46..0000000000 --- a/libs/silk/configure.gnu +++ /dev/null @@ -1,4 +0,0 @@ -#! /bin/sh -srcpath=$(dirname $0 2>/dev/null ) || srcpath="." -$srcpath/configure "$@" --disable-shared --with-pic - diff --git a/libs/silk/doc/SILKDataSheet.pdf b/libs/silk/doc/SILKDataSheet.pdf deleted file mode 100644 index 8210108e099d3961dd56e682b3917368a763d567..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 351666 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 BU=jcT diff --git a/libs/silk/doc/SILK_RTP_PayloadFormat.pdf b/libs/silk/doc/SILK_RTP_PayloadFormat.pdf deleted file mode 100644 index 0597cf31e51418af2edab561c4a07e9c6fe621b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 60170 zc-rjSV~j0ryD$3LwryLZZQHhH+qP%hwr$(9ZDY1(+qQY0cb&CPR?aiC_mi`8l6NON zBbBP8?rYrjrG9nQ_>Y@RK}3v>k)9cvYV(V&H6HXDedh zY(hvW!o>t&1OS*BnHX7F*jO3q02~wm00k8^gRGtL|7?hYqn)vfk%=QArI4@;p^1T$ z$6wPDvd}XF2z4j{EQ|mhDysjS(C)86|206t(ZbgGuPPBo3)jDPe~qVt=Hr7lu{HkJ zH9~Xz=f!G60|@_zpa0=`Ho$*u(Eqvr|GNF3`u|h^f9n4i>UIC0`YX?hH`~ zDZ!v}+AM<4`ext8fDcPx5jHG;K1$snaUE8x{6{a?HyU=h!xGBBG;`gpTC*EezjCHilpay_dq40gIa+uNb*1({>JLb z*k~L$0~8V9CG;`yJ-dHi1H3b*_s(uMjG40J$PtWU1bnj~evV6VP1f`X-+I`45y*CW z>R}iLBKjeum)zm=xzAIlVo_6wdNcw$*b*q2Y_4M|=5S3Lzgef#ekWQ}iiFK+E)N39 zKbF@duF7J|DtqHw23KRy?*Xl=#Ey?JJsKfT#0DOJ=JVwE;W3X@f;Wsg+zOPBQd6Jj zWFOpg4M%gKyL*g3tbCPFN3>v}tO%tLj-KRNCsyW6?i9W{S~@j5nr-hGTDNR^W;CAY zXTAXh(=7)FZO9zZ(BBAvMwVls{RwPhNi8J^72~S z7M&H5(s4n}6-7v{^9FW16|NJJ^10i#v6)N1eDLZ4d@Me1aEug1Ry1Wk`9Zz|-LrzL z$Wjw&bs1b0&QYdHh`<%J2VMyT(H(*6vlI+rao=Ky1L&M!y z4dO|alo%!XnvLfdJyrLpBzgih;X7}TI^W>0-w&MnUMJ8S&fZ8W)m$3Ul9JRc<|OVq zU0oO_XS2&r@{wrS##)BQh{iU zrw%(kpzF8B_^bj@K9i8hj)YVbTDR`{r>z2kXXqm1*|dzmznizLV2a?BD3+mPlVKYU zjuNP73NP$DK>_D?!(!ImMZv5{>VjXoD|?qMDxKRnQ=Rn&2}YWZn77R%Ci<a@C7c zItcrVobE-!F&exLNhaf1l4JK�);(>dr5qO*abZ5=A`3XjLz>*}#4%I#_C9w#8d% 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�@TPjct zY^07^w`QF$?zc{-zN10wOo?K@g@5Fo^7+6-2%lzRL8CYVBqK zeB!R?=NzVai;8Kf3A1wY1|dgWbMwk)8uD|jEr&cm4(08ylb?1x+OV$@tNWm@)%U5v zoq5yj#oniSijY{`%n36Fl0FxuO)h%a?3_jyql->hC-*16C-d=8`xl-AB8TskM~^uV zlP}(#RMZ>5-N-lY#CQW9Gl^D==e0A6xIH?D=iZ%P`R3l$H1%xmZi`sYXg0{s9@-s# z-4a^F<`W>ct%A=HuuV-qZPEJ?fW$BphJFDZn$+Mj-6Z1Yf3;(e5{ILLudx)05rL}N zTjr&&orMk1f-?P-Y~6>(4$fP)$QQmdLSlX{QSgBqC> zHyKWSJ0o~%rAbc?rC#F{Rf$_QI}`Hw3m|uFT9&os;q`XiBKCsOkXv@9j@OX3aD4Fd z@2gI+{kd{?Ni121XU^)VX#g<=qN?J0jFstqOhZR;1f+~5V)7ur;23F?BYNkW*kej1 z!q~2|kI@*E^;WfB5ZJD2)?9Y#%_m(pMn%`ZMgr)=@ZEE9O^GiB4DsC>!uMgr{Hy>_bK3cMn~)r>n)mGH&7jE;#rF8WPWW{MlO9f zwF>pF>HeJM%aAt-dBjyEd!}Sc8^ZwUZ*AAj763HTt)g+N*ZRhos;`-2q8{M%hXLMW z&M;XPU@ptSM=+7^0723P0w63*?PMl9F(`9fG46b@v^z0e26P`sDMIE)SC^MqXeH({ zAL`Zqs_vUTK&0#guDGqIa2cj!ccloqp-NNdujT@wa{yub{<*llbv;U1Y!bd4Ib2Ns zG~y}%z>ohe7~9gL6ln#}keRkr(v*QaEDYBcyJ2rfSZ28}9oj7G@XZ&t8+kB!m(sL) zYa%f|`+CaBZd$u>hP%V^#DKvz_A6wnFGC;i0wjp}yzSFfm?VzLBJk&8AxNxH)+;$5<#@lP9J&}}K zOiO!T?%5E(RivF~BTVf5D4>vQPR?9xahQCgu_gX3%k2#y3g-mQOhV8v13(az-UsZW z*fD5|xAElTNKQNxf}b{O2rD|z-3J7{n;PbX%Sfq{SvJNzRhCt_?vLKw2!rWqMwaB( zPF-d`Uh6kgWatMh4!GGZh41-bLmw#$(g12;wOK3UgsA7l4bSDV!#Yt5VVL+g9OAL~ zq?q(v#oj7zJEKB6Q4v-BfEy9QscT-)_|HtS_D3-rFH4zBaL$gFADX^4LU9>EZ%bA4 zVTByp9?hH`urr#U@4CZzEWE_4;x^3r8$df&T%h7WO1U47aXg)qfQFIBYnfGXIn0NN zBaE3tvZ6by2|upEvvCz}_mZ)sr-FJ3Ewe$pS!B;aUw($==g!H8W>E4C*}m zq>3|4)a$!;214gLT(@lV$#QvJry<+~PvkDMn|p~@WU#0xvx(PzGX8K5dBOmPz*-7y z!ys=9@<`{X2Zxj+1ppY%Yy@^<12QQUBZw-l0~sf<`sRlg{3x4B$zO{k;!UoSvEBO2 zHPnkrz*jCAbhhyo4g;5d7;u&Ha>OUxcPD7a_&$D*d6*j0y9>zaWu_YsquH-@r6%>;1-6U`W5 zVIEl6uAl_bxU|&VHbsHG;_`NEj`TuqMLZtf~HRORrMenhujqqKh5Qkq4?;cI_`8#|Jq1W`&c-!IPUL?|+e6xV8GvYW_GoZ_n1{C%b10}htz zaC57W*a^^+1EUH2ppva+e*l*<)EGW0rdKJuJIPr>h3T7v(nYZ-TROr=E2A7DI!`JR z*W-o-w!HS3c07gy9U{g{=KC?BKLsf{L)T7mF7Ut{n2i6~O^?9;;HF35|KO%an2<-# z*}>WM{$n!>v^3Pp)7HZ3o}w%v&(+<})lJjAf8F=+3W0_G`wO47R6K7>J)d)%x-OHO z4i;^XEJ8kDI7EHO@ERas!yuPkS|`m2PkLl`i+})I3C501E(_k@PyuJv_wSoK@9p31 z>Z}{^O&_`N?e;47wNkc!$$8LS`*X+FJ2da5^~SiX|AGIam`ykDb#Scrli)NH1kYPO z%E{iNq6@Xcj7FYi0#^(E>&?8Ee*?_OWn#{1xCF*t@^ISh4=d_$v&+Bi&xCU! z71)%XLSzYKHCwm>8CB+I4;>-kQ-&~Iju6^(vtNv_aiXI49aHmfM0igSvxj$cl11_55`cqi*Mf758;{Q++;w-gP#r)siS;`LNUIy`6YX z$69tNQ21}n)&Ls&aMj*o1*}xELo>cVTIFqy)jCXDxWn&9oxeA~yK|NtH1z;35xESP zYhT?;3}mGH#n|j#jzX1EFGY(XTAy?^WR3o|OYLAedbmuKL-mehHHPstidlYZMSs$w~WOSw;CP45UvlS-S7=>8+03AWKIdr{55oX8DcHMZbe%$K7m zL>^e>rp_t${ANmh1D>#h3~^_WX%zfcNbR+v_S5oC;;xy=wB7515?VgsGQ*>hlwdKe z-==+Pw|c_J!Trr6 zY;5xs7hx@!wY3{j74h4OXg3dq*7XpAuy3Xwv0qXGmN=jdLTIdZ2}BLf1m@=CK7~F)gEIgr?o^RkZSn%4H=s^c87e`!ltyO*nZJ zvP^a*Z;7XrsoZAP?^tX+>`xY^qWKL{`n+qO-upANBY)CNnK^6LoBYno${nqHpE(5n z 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 z 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 -#if defined( __GNUC__ ) -#include -#endif - -#define SKP_int int /* used for counters etc; at least 16 bits */ -#define SKP_int64 long long -#define SKP_int32 int -#define SKP_int16 short -#define SKP_int8 signed char - -#define SKP_uint unsigned int /* used for counters etc; at least 16 bits */ -#define SKP_uint64 unsigned long long -#define SKP_uint32 unsigned int -#define SKP_uint16 unsigned short -#define SKP_uint8 unsigned char - -#define SKP_int_ptr_size intptr_t - -#if SKP_USE_DOUBLE_PRECISION_FLOATS -# define SKP_float double -# define SKP_float_MAX DBL_MAX -#else -# define SKP_float float -# define SKP_float_MAX FLT_MAX -#endif - -#define SKP_INLINE static __inline - -#ifdef _WIN32 -# define SKP_STR_CASEINSENSITIVE_COMPARE(x, y) _stricmp(x, y) -#else -# define SKP_STR_CASEINSENSITIVE_COMPARE(x, y) strcasecmp(x, y) -#endif - -#define SKP_int64_MAX ((SKP_int64)0x7FFFFFFFFFFFFFFFLL) // 2^63 - 1 -#define SKP_int64_MIN ((SKP_int64)0x8000000000000000LL) // -2^63 -#define SKP_int32_MAX 0x7FFFFFFF // 2^31 - 1 = 2147483647 -#define SKP_int32_MIN ((SKP_int32)0x80000000) // -2^31 = -2147483648 -#define SKP_int16_MAX 0x7FFF // 2^15 - 1 = 32767 -#define SKP_int16_MIN ((SKP_int16)0x8000) // -2^15 = -32768 -#define SKP_int8_MAX 0x7F // 2^7 - 1 = 127 -#define SKP_int8_MIN ((SKP_int8)0x80) // -2^7 = -128 - -#define SKP_uint32_MAX 0xFFFFFFFF // 2^32 - 1 = 4294967295 -#define SKP_uint32_MIN 0x00000000 -#define SKP_uint16_MAX 0xFFFF // 2^16 - 1 = 65535 -#define SKP_uint16_MIN 0x0000 -#define SKP_uint8_MAX 0xFF // 2^8 - 1 = 255 -#define SKP_uint8_MIN 0x00 - -#define SKP_TRUE 1 -#define SKP_FALSE 0 - -/* assertions */ -#if (defined _WIN32 && !defined _WINCE && !defined(__GNUC__) && !defined(NO_ASSERTS)) -# ifndef SKP_assert -# include /* ASSERTE() */ -# define SKP_assert(COND) _ASSERTE(COND) -# endif -#else -# define SKP_assert(COND) -#endif - -#endif diff --git a/libs/silk/readme.txt b/libs/silk/readme.txt deleted file mode 100644 index 66a445c199..0000000000 --- a/libs/silk/readme.txt +++ /dev/null @@ -1,96 +0,0 @@ -************************************************************************ -Fixed Point SILK SDK 1.0.8 beta source code package -Copyright 2010 (c), Skype Limited -https://developer.skype.com/silk/ -************************************************************************ - -Date: 15/06/2011 (Format: DD/MM/YYYY) - -I. Description - -This package contains files for compilation and evaluation of the fixed -point SILK SDK library. The following is included in this package: - - o Source code for the fixed point SILK SDK library - o Source code for creating encoder and decoder executables - o Test vectors - o Comparison tool - o Microsoft Visual Studio solution and project files - o Makefile for GNU C-compiler (GCC) - -II. Files and Folders - - o doc/ - contains more information about the SILK SDK - o interface/ - contains API header files - o src/ - contains all SILK SDK library source files - o test/ - contains source files for testing the SILK SDK - o test_vectors/ - contains test vectors - o Makefile - Makefile for compiling with GCC - o readme.txt - this file - o Silk_SDK.sln - Visual Studio solution for all SILK SDK code - -III. How to use the Makefile - - 1. How to clean and compile the SILK SDK library: - - make clean lib - - 2. How to compile an encoder executable: - - make encoder - - 3. How to compile a decoder executable: - - make decoder - - 4. How to compile the comparison tool: - - make signalcompare - - 5. How to clean and compile all of the above: - - make clean all - - 6. How to build for big endian CPU's - - Make clean all ADDED_DEFINES+=_SYSTEM_IS_BIG_ENDIAN - To be able to use the test vectors with big endian CPU's the test programs - need to be compiled in a different way. Note that the 16 bit input and output - from the test programs will have the upper and lower bytes swapped with this setting. - - 7. How to use the comparison tool: - - See 'How to use the test vectors.txt' in the test_vectors folder. - -IV. History - - Version 1.0.8 - Improved noise shaping, various other improvements, and various bugfixes. Added a MIPS version - Version 1.0.7 - Updated with bugfixes for LBRR and pitch estimator. SignalCompare updated - Version 1.0.6 - Updated with bugfixes for ARM builds - Version 1.0.5 - Updated with bugfixes for ARM builds - Version 1.0.4 - Updated with various bugfixes and improvements, including some API changes - Added support for big endian platforms - Added resampler support for additional API sample rates - Version 1.0.3 - Updated with various bugfixes and improvements - Version 1.0.2 - Updated with various bugfixes and improvements - Version 1.0.1 - First beta source code release - -V. Compatibility - - This package has been tested on the following platforms: - - Windows XP Home and Professional - Windows Vista, 32-bit version - Mac OSX intel - Mac OSX ppc - Ubuntu Linux 9.10, 64-bit version - -VI. Known Issues - - None - -VII. Additional Resources - - For more information, visit the SILK SDK web site at: - - diff --git a/libs/silk/src/SKP_Silk_A2NLSF.c b/libs/silk/src/SKP_Silk_A2NLSF.c deleted file mode 100644 index 210e3e1842..0000000000 --- a/libs/silk/src/SKP_Silk_A2NLSF.c +++ /dev/null @@ -1,279 +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. -***********************************************************************/ - -/* Conversion between prediction filter coefficients and NLSFs */ -/* Requires the order to be an even number */ -/* A piecewise linear approximation maps LSF <-> cos(LSF) */ -/* Therefore the result is not accurate NLSFs, but the two */ -/* function are accurate inverses of each other */ - -#include "SKP_Silk_SigProc_FIX.h" - -/* Number of binary divisions */ -#define BIN_DIV_STEPS_A2NLSF_FIX 3 /* must be no higher than 16 - log2( LSF_COS_TAB_SZ_FIX ) */ -#define QPoly 16 -#define MAX_ITERATIONS_A2NLSF_FIX 30 - -/* Flag for using 2x as many cosine sampling points, reduces the risk of missing a root */ -#define OVERSAMPLE_COSINE_TABLE 0 - -/* Helper function for A2NLSF(..) */ -/* Transforms polynomials from cos(n*f) to cos(f)^n */ -SKP_INLINE void SKP_Silk_A2NLSF_trans_poly( - SKP_int32 *p, /* I/O Polynomial */ - const SKP_int dd /* I Polynomial order (= filter order / 2 ) */ -) -{ - SKP_int k, n; - - for( k = 2; k <= dd; k++ ) { - for( n = dd; n > k; n-- ) { - p[ n - 2 ] -= p[ n ]; - } - p[ k - 2 ] -= SKP_LSHIFT( p[ k ], 1 ); - } -} -/* Helper function for A2NLSF(..) */ -/* Polynomial evaluation */ -SKP_INLINE SKP_int32 SKP_Silk_A2NLSF_eval_poly( /* return the polynomial evaluation, in QPoly */ - SKP_int32 *p, /* I Polynomial, QPoly */ - const SKP_int32 x, /* I Evaluation point, Q12 */ - const SKP_int dd /* I Order */ -) -{ - SKP_int n; - SKP_int32 x_Q16, y32; - - y32 = p[ dd ]; /* QPoly */ - x_Q16 = SKP_LSHIFT( x, 4 ); - for( n = dd - 1; n >= 0; n-- ) { - y32 = SKP_SMLAWW( p[ n ], y32, x_Q16 ); /* QPoly */ - } - return y32; -} - -SKP_INLINE void SKP_Silk_A2NLSF_init( - const SKP_int32 *a_Q16, - SKP_int32 *P, - SKP_int32 *Q, - const SKP_int dd -) -{ - SKP_int k; - - /* Convert filter coefs to even and odd polynomials */ - P[dd] = SKP_LSHIFT( 1, QPoly ); - Q[dd] = SKP_LSHIFT( 1, QPoly ); - for( k = 0; k < dd; k++ ) { -#if( QPoly < 16 ) - P[ k ] = SKP_RSHIFT_ROUND( -a_Q16[ dd - k - 1 ] - a_Q16[ dd + k ], 16 - QPoly ); /* QPoly */ - Q[ k ] = SKP_RSHIFT_ROUND( -a_Q16[ dd - k - 1 ] + a_Q16[ dd + k ], 16 - QPoly ); /* QPoly */ -#elif( Qpoly == 16 ) - P[ k ] = -a_Q16[ dd - k - 1 ] - a_Q16[ dd + k ]; // QPoly - Q[ k ] = -a_Q16[ dd - k - 1 ] + a_Q16[ dd + k ]; // QPoly -#else - P[ k ] = SKP_LSHIFT( -a_Q16[ dd - k - 1 ] - a_Q16[ dd + k ], QPoly - 16 ); /* QPoly */ - Q[ k ] = SKP_LSHIFT( -a_Q16[ dd - k - 1 ] + a_Q16[ dd + k ], QPoly - 16 ); /* QPoly */ -#endif - } - - /* Divide out zeros as we have that for even filter orders, */ - /* z = 1 is always a root in Q, and */ - /* z = -1 is always a root in P */ - for( k = dd; k > 0; k-- ) { - P[ k - 1 ] -= P[ k ]; - Q[ k - 1 ] += Q[ k ]; - } - - /* Transform polynomials from cos(n*f) to cos(f)^n */ - SKP_Silk_A2NLSF_trans_poly( P, dd ); - SKP_Silk_A2NLSF_trans_poly( Q, dd ); -} - -/* Compute Normalized Line Spectral Frequencies (NLSFs) from whitening filter coefficients */ -/* If not all roots are found, the a_Q16 coefficients are bandwidth expanded until convergence. */ -void SKP_Silk_A2NLSF( - SKP_int *NLSF, /* O Normalized Line Spectral Frequencies, Q15 (0 - (2^15-1)), [d] */ - SKP_int32 *a_Q16, /* I/O Monic whitening filter coefficients in Q16 [d] */ - const SKP_int d /* I Filter order (must be even) */ -) -{ - SKP_int i, k, m, dd, root_ix, ffrac; - SKP_int32 xlo, xhi, xmid; - SKP_int32 ylo, yhi, ymid; - SKP_int32 nom, den; - SKP_int32 P[ SKP_Silk_MAX_ORDER_LPC / 2 + 1 ]; - SKP_int32 Q[ SKP_Silk_MAX_ORDER_LPC / 2 + 1 ]; - SKP_int32 *PQ[ 2 ]; - SKP_int32 *p; - - /* Store pointers to array */ - PQ[ 0 ] = P; - PQ[ 1 ] = Q; - - dd = SKP_RSHIFT( d, 1 ); - - SKP_Silk_A2NLSF_init( a_Q16, P, Q, dd ); - - /* Find roots, alternating between P and Q */ - p = P; /* Pointer to polynomial */ - - xlo = SKP_Silk_LSFCosTab_FIX_Q12[ 0 ]; // Q12 - ylo = SKP_Silk_A2NLSF_eval_poly( p, xlo, dd ); - - if( ylo < 0 ) { - /* Set the first NLSF to zero and move on to the next */ - NLSF[ 0 ] = 0; - p = Q; /* Pointer to polynomial */ - ylo = SKP_Silk_A2NLSF_eval_poly( p, xlo, dd ); - root_ix = 1; /* Index of current root */ - } else { - root_ix = 0; /* Index of current root */ - } - k = 1; /* Loop counter */ - i = 0; /* Counter for bandwidth expansions applied */ - while( 1 ) { - /* Evaluate polynomial */ -#if OVERSAMPLE_COSINE_TABLE - xhi = SKP_Silk_LSFCosTab_FIX_Q12[ k >> 1 ] + - ( ( SKP_Silk_LSFCosTab_FIX_Q12[ ( k + 1 ) >> 1 ] - - SKP_Silk_LSFCosTab_FIX_Q12[ k >> 1 ] ) >> 1 ); /* Q12 */ -#else - xhi = SKP_Silk_LSFCosTab_FIX_Q12[ k ]; /* Q12 */ -#endif - yhi = SKP_Silk_A2NLSF_eval_poly( p, xhi, dd ); - - /* Detect zero crossing */ - if( ( ylo <= 0 && yhi >= 0 ) || ( ylo >= 0 && yhi <= 0 ) ) { - /* Binary division */ -#if OVERSAMPLE_COSINE_TABLE - ffrac = -128; -#else - ffrac = -256; -#endif - for( m = 0; m < BIN_DIV_STEPS_A2NLSF_FIX; m++ ) { - /* Evaluate polynomial */ - xmid = SKP_RSHIFT_ROUND( xlo + xhi, 1 ); - ymid = SKP_Silk_A2NLSF_eval_poly( p, xmid, dd ); - - /* Detect zero crossing */ - if( ( ylo <= 0 && ymid >= 0 ) || ( ylo >= 0 && ymid <= 0 ) ) { - /* Reduce frequency */ - xhi = xmid; - yhi = ymid; - } else { - /* Increase frequency */ - xlo = xmid; - ylo = ymid; -#if OVERSAMPLE_COSINE_TABLE - ffrac = SKP_ADD_RSHIFT( ffrac, 64, m ); -#else - ffrac = SKP_ADD_RSHIFT( ffrac, 128, m ); -#endif - } - } - - /* Interpolate */ - if( SKP_abs( ylo ) < 65536 ) { - /* Avoid dividing by zero */ - den = ylo - yhi; - nom = SKP_LSHIFT( ylo, 8 - BIN_DIV_STEPS_A2NLSF_FIX ) + SKP_RSHIFT( den, 1 ); - if( den != 0 ) { - ffrac += SKP_DIV32( nom, den ); - } - } else { - /* No risk of dividing by zero because abs(ylo - yhi) >= abs(ylo) >= 65536 */ - ffrac += SKP_DIV32( ylo, SKP_RSHIFT( ylo - yhi, 8 - BIN_DIV_STEPS_A2NLSF_FIX ) ); - } -#if OVERSAMPLE_COSINE_TABLE - NLSF[ root_ix ] = (SKP_int)SKP_min_32( SKP_LSHIFT( (SKP_int32)k, 7 ) + ffrac, SKP_int16_MAX ); -#else - NLSF[ root_ix ] = (SKP_int)SKP_min_32( SKP_LSHIFT( (SKP_int32)k, 8 ) + ffrac, SKP_int16_MAX ); -#endif - - SKP_assert( NLSF[ root_ix ] >= 0 ); - SKP_assert( NLSF[ root_ix ] <= 32767 ); - - root_ix++; /* Next root */ - if( root_ix >= d ) { - /* Found all roots */ - break; - } - /* Alternate pointer to polynomial */ - p = PQ[ root_ix & 1 ]; - - /* Evaluate polynomial */ -#if OVERSAMPLE_COSINE_TABLE - xlo = SKP_Silk_LSFCosTab_FIX_Q12[ ( k - 1 ) >> 1 ] + - ( ( SKP_Silk_LSFCosTab_FIX_Q12[ k >> 1 ] - - SKP_Silk_LSFCosTab_FIX_Q12[ ( k - 1 ) >> 1 ] ) >> 1 ); // Q12 -#else - xlo = SKP_Silk_LSFCosTab_FIX_Q12[ k - 1 ]; // Q12 -#endif - ylo = SKP_LSHIFT( 1 - ( root_ix & 2 ), 12 ); - } else { - /* Increment loop counter */ - k++; - xlo = xhi; - ylo = yhi; - -#if OVERSAMPLE_COSINE_TABLE - if( k > 2 * LSF_COS_TAB_SZ_FIX ) { -#else - if( k > LSF_COS_TAB_SZ_FIX ) { -#endif - i++; - if( i > MAX_ITERATIONS_A2NLSF_FIX ) { - /* Set NLSFs to white spectrum and exit */ - NLSF[ 0 ] = SKP_DIV32_16( 1 << 15, d + 1 ); - for( k = 1; k < d; k++ ) { - NLSF[ k ] = SKP_SMULBB( k + 1, NLSF[ 0 ] ); - } - return; - } - - /* Error: Apply progressively more bandwidth expansion and run again */ - SKP_Silk_bwexpander_32( a_Q16, d, 65536 - SKP_SMULBB( 10 + i, i ) ); // 10_Q16 = 0.00015 - - SKP_Silk_A2NLSF_init( a_Q16, P, Q, dd ); - p = P; /* Pointer to polynomial */ - xlo = SKP_Silk_LSFCosTab_FIX_Q12[ 0 ]; // Q12 - ylo = SKP_Silk_A2NLSF_eval_poly( p, xlo, dd ); - if( ylo < 0 ) { - /* Set the first NLSF to zero and move on to the next */ - NLSF[ 0 ] = 0; - p = Q; /* Pointer to polynomial */ - ylo = SKP_Silk_A2NLSF_eval_poly( p, xlo, dd ); - root_ix = 1; /* Index of current root */ - } else { - root_ix = 0; /* Index of current root */ - } - k = 1; /* Reset loop counter */ - } - } - } -} diff --git a/libs/silk/src/SKP_Silk_CNG.c b/libs/silk/src/SKP_Silk_CNG.c deleted file mode 100644 index 797e1b3069..0000000000 --- a/libs/silk/src/SKP_Silk_CNG.c +++ /dev/null @@ -1,149 +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" - -/* Generates excitation for CNG LPC synthesis */ -SKP_INLINE void SKP_Silk_CNG_exc( - SKP_int16 residual[], /* O CNG residual signal Q0 */ - SKP_int32 exc_buf_Q10[], /* I Random samples buffer Q10 */ - SKP_int32 Gain_Q16, /* I Gain to apply */ - SKP_int length, /* I Length */ - SKP_int32 *rand_seed /* I/O Seed to random index generator */ -) -{ - SKP_int32 seed; - SKP_int i, idx, exc_mask; - - exc_mask = CNG_BUF_MASK_MAX; - while( exc_mask > length ) { - exc_mask = SKP_RSHIFT( exc_mask, 1 ); - } - - seed = *rand_seed; - for( i = 0; i < length; i++ ) { - seed = SKP_RAND( seed ); - idx = ( SKP_int )( SKP_RSHIFT( seed, 24 ) & exc_mask ); - SKP_assert( idx >= 0 ); - SKP_assert( idx <= CNG_BUF_MASK_MAX ); - residual[ i ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND( SKP_SMULWW( exc_buf_Q10[ idx ], Gain_Q16 ), 10 ) ); - } - *rand_seed = seed; -} - -void SKP_Silk_CNG_Reset( - SKP_Silk_decoder_state *psDec /* I/O Decoder state */ -) -{ - SKP_int i, NLSF_step_Q15, NLSF_acc_Q15; - - NLSF_step_Q15 = SKP_DIV32_16( SKP_int16_MAX, psDec->LPC_order + 1 ); - NLSF_acc_Q15 = 0; - for( i = 0; i < psDec->LPC_order; i++ ) { - NLSF_acc_Q15 += NLSF_step_Q15; - psDec->sCNG.CNG_smth_NLSF_Q15[ i ] = NLSF_acc_Q15; - } - psDec->sCNG.CNG_smth_Gain_Q16 = 0; - psDec->sCNG.rand_seed = 3176576; -} - -/* Updates CNG estimate, and applies the CNG when packet was lost */ -void SKP_Silk_CNG( - SKP_Silk_decoder_state *psDec, /* I/O Decoder state */ - SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */ - SKP_int16 signal[], /* I/O Signal */ - SKP_int length /* I Length of residual */ -) -{ - SKP_int i, subfr; - SKP_int32 tmp_32, Gain_Q26, max_Gain_Q16; - SKP_int16 LPC_buf[ MAX_LPC_ORDER ]; - SKP_int16 CNG_sig[ MAX_FRAME_LENGTH ]; - SKP_Silk_CNG_struct *psCNG; - psCNG = &psDec->sCNG; - - if( psDec->fs_kHz != psCNG->fs_kHz ) { - /* Reset state */ - SKP_Silk_CNG_Reset( psDec ); - - psCNG->fs_kHz = psDec->fs_kHz; - } - if( psDec->lossCnt == 0 && psDec->vadFlag == NO_VOICE_ACTIVITY ) { - /* Update CNG parameters */ - - /* Smoothing of LSF's */ - for( i = 0; i < psDec->LPC_order; i++ ) { - psCNG->CNG_smth_NLSF_Q15[ i ] += SKP_SMULWB( psDec->prevNLSF_Q15[ i ] - psCNG->CNG_smth_NLSF_Q15[ i ], CNG_NLSF_SMTH_Q16 ); - } - /* Find the subframe with the highest gain */ - max_Gain_Q16 = 0; - subfr = 0; - for( i = 0; i < NB_SUBFR; i++ ) { - if( psDecCtrl->Gains_Q16[ i ] > max_Gain_Q16 ) { - max_Gain_Q16 = psDecCtrl->Gains_Q16[ i ]; - subfr = i; - } - } - /* Update CNG excitation buffer with excitation from this subframe */ - SKP_memmove( &psCNG->CNG_exc_buf_Q10[ psDec->subfr_length ], psCNG->CNG_exc_buf_Q10, ( NB_SUBFR - 1 ) * psDec->subfr_length * sizeof( SKP_int32 ) ); - SKP_memcpy( psCNG->CNG_exc_buf_Q10, &psDec->exc_Q10[ subfr * psDec->subfr_length ], psDec->subfr_length * sizeof( SKP_int32 ) ); - - /* Smooth gains */ - for( i = 0; i < NB_SUBFR; i++ ) { - psCNG->CNG_smth_Gain_Q16 += SKP_SMULWB( psDecCtrl->Gains_Q16[ i ] - psCNG->CNG_smth_Gain_Q16, CNG_GAIN_SMTH_Q16 ); - } - } - - /* Add CNG when packet is lost and / or when low speech activity */ - if( psDec->lossCnt ) {//|| psDec->vadFlag == NO_VOICE_ACTIVITY ) { - - /* Generate CNG excitation */ - SKP_Silk_CNG_exc( CNG_sig, psCNG->CNG_exc_buf_Q10, - psCNG->CNG_smth_Gain_Q16, length, &psCNG->rand_seed ); - - /* Convert CNG NLSF to filter representation */ - SKP_Silk_NLSF2A_stable( LPC_buf, psCNG->CNG_smth_NLSF_Q15, psDec->LPC_order ); - - Gain_Q26 = ( SKP_int32 )1 << 26; /* 1.0 */ - - /* Generate CNG signal, by synthesis filtering */ - if( psDec->LPC_order == 16 ) { - SKP_Silk_LPC_synthesis_order16( CNG_sig, LPC_buf, - Gain_Q26, psCNG->CNG_synth_state, CNG_sig, length ); - } else { - SKP_Silk_LPC_synthesis_filter( CNG_sig, LPC_buf, - Gain_Q26, psCNG->CNG_synth_state, CNG_sig, length, psDec->LPC_order ); - } - /* Mix with signal */ - for( i = 0; i < length; i++ ) { - tmp_32 = signal[ i ] + CNG_sig[ i ]; - signal[ i ] = SKP_SAT16( tmp_32 ); - } - } else { - SKP_memset( psCNG->CNG_synth_state, 0, psDec->LPC_order * sizeof( SKP_int32 ) ); - } -} diff --git a/libs/silk/src/SKP_Silk_HP_variable_cutoff_FIX.c b/libs/silk/src/SKP_Silk_HP_variable_cutoff_FIX.c deleted file mode 100644 index 30eeec510f..0000000000 --- a/libs/silk/src/SKP_Silk_HP_variable_cutoff_FIX.c +++ /dev/null @@ -1,120 +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_FIX.h" -#include "SKP_Silk_tuning_parameters.h" - -#if HIGH_PASS_INPUT - -#define SKP_RADIANS_CONSTANT_Q19 1482 // 0.45f * 2.0f * 3.14159265359 / 1000 -#define SKP_LOG2_VARIABLE_HP_MIN_FREQ_Q7 809 // log(80) in Q7 - -/* High-pass filter with cutoff frequency adaptation based on pitch lag statistics */ -void SKP_Silk_HP_variable_cutoff_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O Encoder state FIX */ - SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O Encoder control FIX */ - SKP_int16 *out, /* O high-pass filtered output signal */ - const SKP_int16 *in /* I input signal */ -) -{ - SKP_int quality_Q15; - SKP_int32 B_Q28[ 3 ], A_Q28[ 2 ]; - SKP_int32 Fc_Q19, r_Q28, r_Q22; - SKP_int32 pitch_freq_Hz_Q16, pitch_freq_log_Q7, delta_freq_Q7; - - /*********************************************/ - /* Estimate Low End of Pitch Frequency Range */ - /*********************************************/ - if( psEnc->sCmn.prev_sigtype == SIG_TYPE_VOICED ) { - /* difference, in log domain */ - pitch_freq_Hz_Q16 = SKP_DIV32_16( SKP_LSHIFT( SKP_MUL( psEnc->sCmn.fs_kHz, 1000 ), 16 ), psEnc->sCmn.prevLag ); - pitch_freq_log_Q7 = SKP_Silk_lin2log( pitch_freq_Hz_Q16 ) - ( 16 << 7 ); //0x70 - - /* adjustment based on quality */ - quality_Q15 = psEncCtrl->input_quality_bands_Q15[ 0 ]; - pitch_freq_log_Q7 = SKP_SUB32( pitch_freq_log_Q7, SKP_SMULWB( SKP_SMULWB( SKP_LSHIFT( quality_Q15, 2 ), quality_Q15 ), - pitch_freq_log_Q7 - SKP_LOG2_VARIABLE_HP_MIN_FREQ_Q7 ) ); - pitch_freq_log_Q7 = SKP_ADD32( pitch_freq_log_Q7, SKP_RSHIFT( SKP_FIX_CONST( 0.6, 15 ) - quality_Q15, 9 ) ); - - //delta_freq = pitch_freq_log - psEnc->variable_HP_smth1; - delta_freq_Q7 = pitch_freq_log_Q7 - SKP_RSHIFT( psEnc->variable_HP_smth1_Q15, 8 ); - if( delta_freq_Q7 < 0 ) { - /* less smoothing for decreasing pitch frequency, to track something close to the minimum */ - delta_freq_Q7 = SKP_MUL( delta_freq_Q7, 3 ); - } - - /* limit delta, to reduce impact of outliers */ - delta_freq_Q7 = SKP_LIMIT_32( delta_freq_Q7, -SKP_FIX_CONST( VARIABLE_HP_MAX_DELTA_FREQ, 7 ), SKP_FIX_CONST( VARIABLE_HP_MAX_DELTA_FREQ, 7 ) ); - - /* update smoother */ - psEnc->variable_HP_smth1_Q15 = SKP_SMLAWB( psEnc->variable_HP_smth1_Q15, - SKP_MUL( SKP_LSHIFT( psEnc->speech_activity_Q8, 1 ), delta_freq_Q7 ), SKP_FIX_CONST( VARIABLE_HP_SMTH_COEF1, 16 ) ); - } - /* second smoother */ - psEnc->variable_HP_smth2_Q15 = SKP_SMLAWB( psEnc->variable_HP_smth2_Q15, - psEnc->variable_HP_smth1_Q15 - psEnc->variable_HP_smth2_Q15, SKP_FIX_CONST( VARIABLE_HP_SMTH_COEF2, 16 ) ); - - /* convert from log scale to Hertz */ - psEncCtrl->pitch_freq_low_Hz = SKP_Silk_log2lin( SKP_RSHIFT( psEnc->variable_HP_smth2_Q15, 8 ) ); - - /* limit frequency range */ - psEncCtrl->pitch_freq_low_Hz = SKP_LIMIT_32( psEncCtrl->pitch_freq_low_Hz, - SKP_FIX_CONST( VARIABLE_HP_MIN_FREQ, 0 ), SKP_FIX_CONST( VARIABLE_HP_MAX_FREQ, 0 ) ); - - /********************************/ - /* Compute Filter Coefficients */ - /********************************/ - /* compute cut-off frequency, in radians */ - //Fc_num = (SKP_float)( 0.45f * 2.0f * 3.14159265359 * psEncCtrl->pitch_freq_low_Hz ); - //Fc_denom = (SKP_float)( 1e3f * psEnc->sCmn.fs_kHz ); - SKP_assert( psEncCtrl->pitch_freq_low_Hz <= SKP_int32_MAX / SKP_RADIANS_CONSTANT_Q19 ); - Fc_Q19 = SKP_DIV32_16( SKP_SMULBB( SKP_RADIANS_CONSTANT_Q19, psEncCtrl->pitch_freq_low_Hz ), psEnc->sCmn.fs_kHz ); // range: 3704 - 27787, 11-15 bits - SKP_assert( Fc_Q19 >= 3704 ); - SKP_assert( Fc_Q19 <= 27787 ); - - r_Q28 = SKP_FIX_CONST( 1.0, 28 ) - SKP_MUL( SKP_FIX_CONST( 0.92, 9 ), Fc_Q19 ); - SKP_assert( r_Q28 >= 255347779 ); - SKP_assert( r_Q28 <= 266690872 ); - - /* b = r * [ 1; -2; 1 ]; */ - /* a = [ 1; -2 * r * ( 1 - 0.5 * Fc^2 ); r^2 ]; */ - B_Q28[ 0 ] = r_Q28; - B_Q28[ 1 ] = SKP_LSHIFT( -r_Q28, 1 ); - B_Q28[ 2 ] = r_Q28; - - // -r * ( 2 - Fc * Fc ); - r_Q22 = SKP_RSHIFT( r_Q28, 6 ); - A_Q28[ 0 ] = SKP_SMULWW( r_Q22, SKP_SMULWW( Fc_Q19, Fc_Q19 ) - SKP_FIX_CONST( 2.0, 22 ) ); - A_Q28[ 1 ] = SKP_SMULWW( r_Q22, r_Q22 ); - - /********************************/ - /* High-Pass Filter */ - /********************************/ - SKP_Silk_biquad_alt( in, B_Q28, A_Q28, psEnc->sCmn.In_HP_State, out, psEnc->sCmn.frame_length ); -} - -#endif // HIGH_PASS_INPUT diff --git a/libs/silk/src/SKP_Silk_Inlines.h b/libs/silk/src/SKP_Silk_Inlines.h deleted file mode 100644 index a2ad452ef8..0000000000 --- a/libs/silk/src/SKP_Silk_Inlines.h +++ /dev/null @@ -1,276 +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. -***********************************************************************/ - -/*! \file SKP_Silk_Inlines.h - * \brief SigProcFix_Inlines.h defines inline signal processing functions. - */ - -#ifndef _SKP_SILK_FIX_INLINES_H_ -#define _SKP_SILK_FIX_INLINES_H_ - -#ifdef __cplusplus -extern "C" -{ -#endif - -/* count leading zeros of SKP_int64 */ -SKP_INLINE SKP_int32 SKP_Silk_CLZ64(SKP_int64 in) -{ - SKP_int32 in_upper; - - in_upper = (SKP_int32)SKP_RSHIFT64(in, 32); - if (in_upper == 0) { - /* Search in the lower 32 bits */ - return 32 + SKP_Silk_CLZ32( (SKP_int32) in ); - } else { - /* Search in the upper 32 bits */ - return SKP_Silk_CLZ32( in_upper ); - } -} - -/* get number of leading zeros and fractional part (the bits right after the leading one */ -SKP_INLINE void SKP_Silk_CLZ_FRAC(SKP_int32 in, /* I: input */ - SKP_int32 *lz, /* O: number of leading zeros */ - SKP_int32 *frac_Q7) /* O: the 7 bits right after the leading one */ -{ - SKP_int32 lzeros = SKP_Silk_CLZ32(in); - - * lz = lzeros; - * frac_Q7 = SKP_ROR32(in, 24 - lzeros) & 0x7f; -} - -/* Approximation of square root */ -/* Accuracy: < +/- 10% for output values > 15 */ -/* < +/- 2.5% for output values > 120 */ -SKP_INLINE SKP_int32 SKP_Silk_SQRT_APPROX(SKP_int32 x) -{ - SKP_int32 y, lz, frac_Q7; - - if( x <= 0 ) { - return 0; - } - - SKP_Silk_CLZ_FRAC(x, &lz, &frac_Q7); - - if( lz & 1 ) { - y = 32768; - } else { - y = 46214; /* 46214 = sqrt(2) * 32768 */ - } - - /* get scaling right */ - y >>= SKP_RSHIFT(lz, 1); - - /* increment using fractional part of input */ - y = SKP_SMLAWB(y, y, SKP_SMULBB(213, frac_Q7)); - - return y; -} - -/* returns the number of left shifts before overflow for a 16 bit number (ITU definition with norm(0)=0) */ -SKP_INLINE SKP_int32 SKP_Silk_norm16(SKP_int16 a) { - - SKP_int32 a32; - - /* if ((a == 0) || (a == SKP_int16_MIN)) return(0); */ - if ((a << 1) == 0) return(0); - - a32 = a; - /* if (a32 < 0) a32 = -a32 - 1; */ - a32 ^= SKP_RSHIFT(a32, 31); - - return SKP_Silk_CLZ32(a32) - 17; -} - -/* returns the number of left shifts before overflow for a 32 bit number (ITU definition with norm(0)=0) */ -SKP_INLINE SKP_int32 SKP_Silk_norm32(SKP_int32 a) { - - /* if ((a == 0) || (a == SKP_int32_MIN)) return(0); */ - if ((a << 1) == 0) return(0); - - /* if (a < 0) a = -a - 1; */ - a ^= SKP_RSHIFT(a, 31); - - return SKP_Silk_CLZ32(a) - 1; -} - -/* Divide two int32 values and return result as int32 in a given Q-domain */ -SKP_INLINE SKP_int32 SKP_DIV32_varQ( /* O returns a good approximation of "(a32 << Qres) / b32" */ - const SKP_int32 a32, /* I numerator (Q0) */ - const SKP_int32 b32, /* I denominator (Q0) */ - const SKP_int Qres /* I Q-domain of result (>= 0) */ -) -{ - SKP_int a_headrm, b_headrm, lshift; - SKP_int32 b32_inv, a32_nrm, b32_nrm, result; - - SKP_assert( b32 != 0 ); - SKP_assert( Qres >= 0 ); - - /* Compute number of bits head room and normalize inputs */ - a_headrm = SKP_Silk_CLZ32( SKP_abs(a32) ) - 1; - a32_nrm = SKP_LSHIFT(a32, a_headrm); /* Q: a_headrm */ - b_headrm = SKP_Silk_CLZ32( SKP_abs(b32) ) - 1; - b32_nrm = SKP_LSHIFT(b32, b_headrm); /* Q: b_headrm */ - - /* Inverse of b32, with 14 bits of precision */ - b32_inv = SKP_DIV32_16( SKP_int32_MAX >> 2, SKP_RSHIFT(b32_nrm, 16) ); /* Q: 29 + 16 - b_headrm */ - - /* First approximation */ - result = SKP_SMULWB(a32_nrm, b32_inv); /* Q: 29 + a_headrm - b_headrm */ - - /* Compute residual by subtracting product of denominator and first approximation */ - a32_nrm -= SKP_LSHIFT_ovflw( SKP_SMMUL(b32_nrm, result), 3 ); /* Q: a_headrm */ - - /* Refinement */ - result = SKP_SMLAWB(result, a32_nrm, b32_inv); /* Q: 29 + a_headrm - b_headrm */ - - /* Convert to Qres domain */ - lshift = 29 + a_headrm - b_headrm - Qres; - if( lshift <= 0 ) { - return SKP_LSHIFT_SAT32(result, -lshift); - } else { - if( lshift < 32){ - return SKP_RSHIFT(result, lshift); - } else { - /* Avoid undefined result */ - return 0; - } - } -} - -/* Invert int32 value and return result as int32 in a given Q-domain */ -SKP_INLINE SKP_int32 SKP_INVERSE32_varQ( /* O returns a good approximation of "(1 << Qres) / b32" */ - const SKP_int32 b32, /* I denominator (Q0) */ - const SKP_int Qres /* I Q-domain of result (> 0) */ -) -{ - SKP_int b_headrm, lshift; - SKP_int32 b32_inv, b32_nrm, err_Q32, result; - - SKP_assert( b32 != 0 ); - SKP_assert( b32 != SKP_int32_MIN ); /* SKP_int32_MIN is not handled by SKP_abs */ - SKP_assert( Qres > 0 ); - - /* Compute number of bits head room and normalize input */ - b_headrm = SKP_Silk_CLZ32( SKP_abs(b32) ) - 1; - b32_nrm = SKP_LSHIFT(b32, b_headrm); /* Q: b_headrm */ - - /* Inverse of b32, with 14 bits of precision */ - b32_inv = SKP_DIV32_16( SKP_int32_MAX >> 2, SKP_RSHIFT(b32_nrm, 16) ); /* Q: 29 + 16 - b_headrm */ - - /* First approximation */ - result = SKP_LSHIFT(b32_inv, 16); /* Q: 61 - b_headrm */ - - /* Compute residual by subtracting product of denominator and first approximation from one */ - err_Q32 = SKP_LSHIFT_ovflw( -SKP_SMULWB(b32_nrm, b32_inv), 3 ); /* Q32 */ - - /* Refinement */ - result = SKP_SMLAWW(result, err_Q32, b32_inv); /* Q: 61 - b_headrm */ - - /* Convert to Qres domain */ - lshift = 61 - b_headrm - Qres; - if( lshift <= 0 ) { - return SKP_LSHIFT_SAT32(result, -lshift); - } else { - if( lshift < 32){ - return SKP_RSHIFT(result, lshift); - }else{ - /* Avoid undefined result */ - return 0; - } - } -} - -#define SKP_SIN_APPROX_CONST0 (1073735400) -#define SKP_SIN_APPROX_CONST1 (-82778932) -#define SKP_SIN_APPROX_CONST2 (1059577) -#define SKP_SIN_APPROX_CONST3 (-5013) - -/* Sine approximation; an input of 65536 corresponds to 2 * pi */ -/* Uses polynomial expansion of the input to the power 0, 2, 4 and 6 */ -/* The relative error is below 1e-5 */ -SKP_INLINE SKP_int32 SKP_Silk_SIN_APPROX_Q24( /* O returns approximately 2^24 * sin(x * 2 * pi / 65536) */ - SKP_int32 x -) -{ - SKP_int y_Q30; - - /* Keep only bottom 16 bits (the function repeats itself with period 65536) */ - x &= 65535; - - /* Split range in four quadrants */ - if( x <= 32768 ) { - if( x < 16384 ) { - /* Return cos(pi/2 - x) */ - x = 16384 - x; - } else { - /* Return cos(x - pi/2) */ - x -= 16384; - } - if( x < 1100 ) { - /* Special case: high accuracy */ - return SKP_SMLAWB( 1 << 24, SKP_MUL( x, x ), -5053 ); - } - x = SKP_SMULWB( SKP_LSHIFT( x, 8 ), x ); /* contains x^2 in Q20 */ - y_Q30 = SKP_SMLAWB( SKP_SIN_APPROX_CONST2, x, SKP_SIN_APPROX_CONST3 ); - y_Q30 = SKP_SMLAWW( SKP_SIN_APPROX_CONST1, x, y_Q30 ); - y_Q30 = SKP_SMLAWW( SKP_SIN_APPROX_CONST0 + 66, x, y_Q30 ); - } else { - if( x < 49152 ) { - /* Return -cos(3*pi/2 - x) */ - x = 49152 - x; - } else { - /* Return -cos(x - 3*pi/2) */ - x -= 49152; - } - if( x < 1100 ) { - /* Special case: high accuracy */ - return SKP_SMLAWB( -1 << 24, SKP_MUL( x, x ), 5053 ); - } - x = SKP_SMULWB( SKP_LSHIFT( x, 8 ), x ); /* contains x^2 in Q20 */ - y_Q30 = SKP_SMLAWB( -SKP_SIN_APPROX_CONST2, x, -SKP_SIN_APPROX_CONST3 ); - y_Q30 = SKP_SMLAWW( -SKP_SIN_APPROX_CONST1, x, y_Q30 ); - y_Q30 = SKP_SMLAWW( -SKP_SIN_APPROX_CONST0, x, y_Q30 ); - } - return SKP_RSHIFT_ROUND( y_Q30, 6 ); -} - -/* Cosine approximation; an input of 65536 corresponds to 2 * pi */ -/* The relative error is below 1e-5 */ -SKP_INLINE SKP_int32 SKP_Silk_COS_APPROX_Q24( /* O returns approximately 2^24 * cos(x * 2 * pi / 65536) */ - SKP_int32 x -) -{ - return SKP_Silk_SIN_APPROX_Q24( x + 16384 ); -} - -#ifdef __cplusplus -} -#endif - -#endif /*_SKP_SILK_FIX_INLINES_H_*/ diff --git a/libs/silk/src/SKP_Silk_LBRR_reset.c b/libs/silk/src/SKP_Silk_LBRR_reset.c deleted file mode 100644 index c50477c0fe..0000000000 --- a/libs/silk/src/SKP_Silk_LBRR_reset.c +++ /dev/null @@ -1,40 +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" - -/* Resets LBRR buffer, used if packet size changes */ -void SKP_Silk_LBRR_reset( - SKP_Silk_encoder_state *psEncC /* I/O state */ -) -{ - SKP_int i; - - for( i = 0; i < MAX_LBRR_DELAY; i++ ) { - psEncC->LBRR_buffer[ i ].usage = SKP_SILK_NO_LBRR; - } -} diff --git a/libs/silk/src/SKP_Silk_LPC_inv_pred_gain.c b/libs/silk/src/SKP_Silk_LPC_inv_pred_gain.c deleted file mode 100644 index 8858f9a139..0000000000 --- a/libs/silk/src/SKP_Silk_LPC_inv_pred_gain.c +++ /dev/null @@ -1,152 +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_LPC_inverse_pred_gain.c * - * * - * Compute inverse of LPC prediction gain, and * - * test if LPC coefficients are stable (all poles within unit circle) * - * * - * Copyright 2008 (c), Skype Limited * - * */ -#include "SKP_Silk_SigProc_FIX.h" - -#define QA 16 -#define A_LIMIT SKP_FIX_CONST( 0.99975, QA ) - -/* Compute inverse of LPC prediction gain, and */ -/* test if LPC coefficients are stable (all poles within unit circle) */ -static SKP_int LPC_inverse_pred_gain_QA( /* O: Returns 1 if unstable, otherwise 0 */ - SKP_int32 *invGain_Q30, /* O: Inverse prediction gain, Q30 energy domain */ - SKP_int32 A_QA[ 2 ][ SKP_Silk_MAX_ORDER_LPC ], - /* I: Prediction coefficients */ - const SKP_int order /* I: Prediction order */ -) -{ - SKP_int k, n, headrm; - SKP_int32 rc_Q31, rc_mult1_Q30, rc_mult2_Q16, tmp_QA; - SKP_int32 *Aold_QA, *Anew_QA; - - Anew_QA = A_QA[ order & 1 ]; - - *invGain_Q30 = ( 1 << 30 ); - for( k = order - 1; k > 0; k-- ) { - /* Check for stability */ - if( ( Anew_QA[ k ] > A_LIMIT ) || ( Anew_QA[ k ] < -A_LIMIT ) ) { - return 1; - } - - /* Set RC equal to negated AR coef */ - rc_Q31 = -SKP_LSHIFT( Anew_QA[ k ], 31 - QA ); - - /* rc_mult1_Q30 range: [ 1 : 2^30-1 ] */ - rc_mult1_Q30 = ( SKP_int32_MAX >> 1 ) - SKP_SMMUL( rc_Q31, rc_Q31 ); - SKP_assert( rc_mult1_Q30 > ( 1 << 15 ) ); /* reduce A_LIMIT if fails */ - SKP_assert( rc_mult1_Q30 < ( 1 << 30 ) ); - - /* rc_mult2_Q16 range: [ 2^16 : SKP_int32_MAX ] */ - rc_mult2_Q16 = SKP_INVERSE32_varQ( rc_mult1_Q30, 46 ); /* 16 = 46 - 30 */ - - /* Update inverse gain */ - /* invGain_Q30 range: [ 0 : 2^30 ] */ - *invGain_Q30 = SKP_LSHIFT( SKP_SMMUL( *invGain_Q30, rc_mult1_Q30 ), 2 ); - SKP_assert( *invGain_Q30 >= 0 ); - SKP_assert( *invGain_Q30 <= ( 1 << 30 ) ); - - /* Swap pointers */ - Aold_QA = Anew_QA; - Anew_QA = A_QA[ k & 1 ]; - - /* Update AR coefficient */ - headrm = SKP_Silk_CLZ32( rc_mult2_Q16 ) - 1; - rc_mult2_Q16 = SKP_LSHIFT( rc_mult2_Q16, headrm ); /* Q: 16 + headrm */ - for( n = 0; n < k; n++ ) { - tmp_QA = Aold_QA[ n ] - SKP_LSHIFT( SKP_SMMUL( Aold_QA[ k - n - 1 ], rc_Q31 ), 1 ); - Anew_QA[ n ] = SKP_LSHIFT( SKP_SMMUL( tmp_QA, rc_mult2_Q16 ), 16 - headrm ); - } - } - - /* Check for stability */ - if( ( Anew_QA[ 0 ] > A_LIMIT ) || ( Anew_QA[ 0 ] < -A_LIMIT ) ) { - return 1; - } - - /* Set RC equal to negated AR coef */ - rc_Q31 = -SKP_LSHIFT( Anew_QA[ 0 ], 31 - QA ); - - /* Range: [ 1 : 2^30 ] */ - rc_mult1_Q30 = ( SKP_int32_MAX >> 1 ) - SKP_SMMUL( rc_Q31, rc_Q31 ); - - /* Update inverse gain */ - /* Range: [ 0 : 2^30 ] */ - *invGain_Q30 = SKP_LSHIFT( SKP_SMMUL( *invGain_Q30, rc_mult1_Q30 ), 2 ); - SKP_assert( *invGain_Q30 >= 0 ); - SKP_assert( *invGain_Q30 <= 1<<30 ); - - return 0; -} -/* For input in Q12 domain */ -SKP_int SKP_Silk_LPC_inverse_pred_gain( /* O: Returns 1 if unstable, otherwise 0 */ - SKP_int32 *invGain_Q30, /* O: Inverse prediction gain, Q30 energy domain */ - const SKP_int16 *A_Q12, /* I: Prediction coefficients, Q12 [order] */ - const SKP_int order /* I: Prediction order */ -) -{ - SKP_int k; - SKP_int32 Atmp_QA[ 2 ][ SKP_Silk_MAX_ORDER_LPC ]; - SKP_int32 *Anew_QA; - - Anew_QA = Atmp_QA[ order & 1 ]; - - /* Increase Q domain of the AR coefficients */ - for( k = 0; k < order; k++ ) { - Anew_QA[ k ] = SKP_LSHIFT( (SKP_int32)A_Q12[ k ], QA - 12 ); - } - - return LPC_inverse_pred_gain_QA( invGain_Q30, Atmp_QA, order ); -} - -/* For input in Q24 domain */ -SKP_int SKP_Silk_LPC_inverse_pred_gain_Q24( /* O: Returns 1 if unstable, otherwise 0 */ - SKP_int32 *invGain_Q30, /* O: Inverse prediction gain, Q30 energy domain */ - const SKP_int32 *A_Q24, /* I: Prediction coefficients, Q24 [order] */ - const SKP_int order /* I: Prediction order */ -) -{ - SKP_int k; - SKP_int32 Atmp_QA[ 2 ][ SKP_Silk_MAX_ORDER_LPC ]; - SKP_int32 *Anew_QA; - - Anew_QA = Atmp_QA[ order & 1 ]; - - /* Increase Q domain of the AR coefficients */ - for( k = 0; k < order; k++ ) { - Anew_QA[ k ] = SKP_RSHIFT_ROUND( A_Q24[ k ], 24 - QA ); - } - - return LPC_inverse_pred_gain_QA( invGain_Q30, Atmp_QA, order ); -} diff --git a/libs/silk/src/SKP_Silk_LPC_synthesis_filter.c b/libs/silk/src/SKP_Silk_LPC_synthesis_filter.c deleted file mode 100644 index 59d7d53fe9..0000000000 --- a/libs/silk/src/SKP_Silk_LPC_synthesis_filter.c +++ /dev/null @@ -1,84 +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_LPC_synthesis_filter.c * - * Coefficients are in Q12 * - * * - * even order AR filter * - * */ -#include "SKP_Silk_SigProc_FIX.h" - -/* even order AR filter */ -void SKP_Silk_LPC_synthesis_filter( - const SKP_int16 *in, /* I: excitation signal */ - const SKP_int16 *A_Q12, /* I: AR coefficients [Order], between -8_Q0 and 8_Q0 */ - const SKP_int32 Gain_Q26, /* I: gain */ - SKP_int32 *S, /* I/O: state vector [Order] */ - SKP_int16 *out, /* O: output signal */ - const SKP_int32 len, /* I: signal length */ - const SKP_int Order /* I: filter order, must be even */ -) -{ - SKP_int k, j, idx, Order_half = SKP_RSHIFT( Order, 1 ); - SKP_int32 SA, SB, out32_Q10, out32; - - /* Order must be even */ - SKP_assert( 2 * Order_half == Order ); - - /* S[] values are in Q14 */ - for( k = 0; k < len; k++ ) { - SA = S[ Order - 1 ]; - out32_Q10 = 0; - for( j = 0; j < ( Order_half - 1 ); j++ ) { - idx = SKP_SMULBB( 2, j ) + 1; - SB = S[ Order - 1 - idx ]; - S[ Order - 1 - idx ] = SA; - out32_Q10 = SKP_SMLAWB( out32_Q10, SA, A_Q12[ ( j << 1 ) ] ); - out32_Q10 = SKP_SMLAWB( out32_Q10, SB, A_Q12[ ( j << 1 ) + 1 ] ); - SA = S[ Order - 2 - idx ]; - S[ Order - 2 - idx ] = SB; - } - - /* unrolled loop: epilog */ - SB = S[ 0 ]; - S[ 0 ] = SA; - out32_Q10 = SKP_SMLAWB( out32_Q10, SA, A_Q12[ Order - 2 ] ); - out32_Q10 = SKP_SMLAWB( out32_Q10, SB, A_Q12[ Order - 1 ] ); - /* apply gain to excitation signal and add to prediction */ - out32_Q10 = SKP_ADD_SAT32( out32_Q10, SKP_SMULWB( Gain_Q26, in[ k ] ) ); - - /* scale to Q0 */ - out32 = SKP_RSHIFT_ROUND( out32_Q10, 10 ); - - /* saturate output */ - out[ k ] = ( SKP_int16 )SKP_SAT16( out32 ); - - /* move result into delay line */ - S[ Order - 1 ] = SKP_LSHIFT_SAT32( out32_Q10, 4 ); - } -} diff --git a/libs/silk/src/SKP_Silk_LPC_synthesis_order16.c b/libs/silk/src/SKP_Silk_LPC_synthesis_order16.c deleted file mode 100644 index c2ff3a7e47..0000000000 --- a/libs/silk/src/SKP_Silk_LPC_synthesis_order16.c +++ /dev/null @@ -1,120 +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_LPC_synthesis_order16.c * - * Coefficients are in Q12 * - * * - * 16th order AR filter * - * */ -#include "SKP_Silk_SigProc_FIX.h" - -/* 16th order AR filter */ -void SKP_Silk_LPC_synthesis_order16(const SKP_int16 *in, /* I: excitation signal */ - const SKP_int16 *A_Q12, /* I: AR coefficients [16], between -8_Q0 and 8_Q0 */ - const SKP_int32 Gain_Q26, /* I: gain */ - SKP_int32 *S, /* I/O: state vector [16] */ - SKP_int16 *out, /* O: output signal */ - const SKP_int32 len /* I: signal length, must be multiple of 16 */ -) -{ - SKP_int k; - SKP_int32 SA, SB, out32_Q10, out32; - for( k = 0; k < len; k++ ) { - /* unrolled loop: prolog */ - /* multiply-add two prediction coefficients per iteration */ - SA = S[ 15 ]; - SB = S[ 14 ]; - S[ 14 ] = SA; - out32_Q10 = SKP_SMULWB( SA, A_Q12[ 0 ] ); - out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SB, A_Q12[ 1 ] ); - SA = S[ 13 ]; - S[ 13 ] = SB; - - /* unrolled loop: main loop */ - SB = S[ 12 ]; - S[ 12 ] = SA; - out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, A_Q12[ 2 ] ); - out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SB, A_Q12[ 3 ] ); - SA = S[ 11 ]; - S[ 11 ] = SB; - - SB = S[ 10 ]; - S[ 10 ] = SA; - out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, A_Q12[ 4 ] ); - out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SB, A_Q12[ 5 ] ); - SA = S[ 9 ]; - S[ 9 ] = SB; - - SB = S[ 8 ]; - S[ 8 ] = SA; - out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, A_Q12[ 6 ] ); - out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SB, A_Q12[ 7 ] ); - SA = S[ 7 ]; - S[ 7 ] = SB; - - SB = S[ 6 ]; - S[ 6 ] = SA; - out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, A_Q12[ 8 ] ); - out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SB, A_Q12[ 9 ] ); - SA = S[ 5 ]; - S[ 5 ] = SB; - - SB = S[ 4 ]; - S[ 4 ] = SA; - out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, A_Q12[ 10 ] ); - out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SB, A_Q12[ 11 ] ); - SA = S[ 3 ]; - S[ 3 ] = SB; - - SB = S[ 2 ]; - S[ 2 ] = SA; - out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, A_Q12[ 12 ] ); - out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SB, A_Q12[ 13 ] ); - SA = S[ 1 ]; - S[ 1 ] = SB; - - /* unrolled loop: epilog */ - SB = S[ 0 ]; - S[ 0 ] = SA; - out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, A_Q12[ 14 ] ); - out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SB, A_Q12[ 15 ] ); - - /* unrolled loop: end */ - /* apply gain to excitation signal and add to prediction */ - out32_Q10 = SKP_ADD_SAT32( out32_Q10, SKP_SMULWB( Gain_Q26, in[ k ] ) ); - - /* scale to Q0 */ - out32 = SKP_RSHIFT_ROUND( out32_Q10, 10 ); - - /* saturate output */ - out[ k ] = ( SKP_int16 )SKP_SAT16( out32 ); - - /* move result into delay line */ - S[ 15 ] = SKP_LSHIFT_SAT32( out32_Q10, 4 ); - } -} diff --git a/libs/silk/src/SKP_Silk_LP_variable_cutoff.c b/libs/silk/src/SKP_Silk_LP_variable_cutoff.c deleted file mode 100644 index d29ce2a3a0..0000000000 --- a/libs/silk/src/SKP_Silk_LP_variable_cutoff.c +++ /dev/null @@ -1,194 +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. -***********************************************************************/ - -/* - - 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. - -*/ -#include "SKP_Silk_main.h" - -#if SWITCH_TRANSITION_FILTERING - -/* Helper function, that 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 ], - const SKP_int ind, - const SKP_int32 fac_Q16 -) -{ - SKP_int nb, na; - - if( ind < TRANSITION_INT_NUM - 1 ) { - if( fac_Q16 > 0 ) { - if( fac_Q16 == SKP_SAT16( fac_Q16 ) ) { /* fac_Q16 is in range of a 16-bit int */ - /* Piece-wise linear interpolation of B and A */ - for( nb = 0; nb < TRANSITION_NB; nb++ ) { - B_Q28[ nb ] = SKP_SMLAWB( - SKP_Silk_Transition_LP_B_Q28[ ind ][ nb ], - SKP_Silk_Transition_LP_B_Q28[ ind + 1 ][ nb ] - - SKP_Silk_Transition_LP_B_Q28[ ind ][ nb ], - fac_Q16 ); - } - for( na = 0; na < TRANSITION_NA; na++ ) { - A_Q28[ na ] = SKP_SMLAWB( - SKP_Silk_Transition_LP_A_Q28[ ind ][ na ], - SKP_Silk_Transition_LP_A_Q28[ ind + 1 ][ na ] - - SKP_Silk_Transition_LP_A_Q28[ ind ][ na ], - fac_Q16 ); - } - } else if( fac_Q16 == ( 1 << 15 ) ) { /* Neither fac_Q16 nor ( ( 1 << 16 ) - fac_Q16 ) is in range of a 16-bit int */ - - /* Piece-wise linear interpolation of B and A */ - for( nb = 0; nb < TRANSITION_NB; nb++ ) { - B_Q28[ nb ] = SKP_RSHIFT( - SKP_Silk_Transition_LP_B_Q28[ ind ][ nb ] + - SKP_Silk_Transition_LP_B_Q28[ ind + 1 ][ nb ], - 1 ); - } - for( na = 0; na < TRANSITION_NA; na++ ) { - A_Q28[ na ] = SKP_RSHIFT( - SKP_Silk_Transition_LP_A_Q28[ ind ][ na ] + - SKP_Silk_Transition_LP_A_Q28[ ind + 1 ][ na ], - 1 ); - } - } else { /* ( ( 1 << 16 ) - fac_Q16 ) is in range of a 16-bit int */ - - SKP_assert( ( ( 1 << 16 ) - fac_Q16 ) == SKP_SAT16( ( ( 1 << 16 ) - fac_Q16) ) ); - /* Piece-wise linear interpolation of B and A */ - for( nb = 0; nb < TRANSITION_NB; nb++ ) { - B_Q28[ nb ] = SKP_SMLAWB( - SKP_Silk_Transition_LP_B_Q28[ ind + 1 ][ nb ], - SKP_Silk_Transition_LP_B_Q28[ ind ][ nb ] - - SKP_Silk_Transition_LP_B_Q28[ ind + 1 ][ nb ], - ( 1 << 16 ) - fac_Q16 ); - } - for( na = 0; na < TRANSITION_NA; na++ ) { - A_Q28[ na ] = SKP_SMLAWB( - SKP_Silk_Transition_LP_A_Q28[ ind + 1 ][ na ], - SKP_Silk_Transition_LP_A_Q28[ ind ][ na ] - - SKP_Silk_Transition_LP_A_Q28[ ind + 1 ][ na ], - ( 1 << 16 ) - fac_Q16 ); - } - } - } else { - SKP_memcpy( B_Q28, SKP_Silk_Transition_LP_B_Q28[ ind ], TRANSITION_NB * sizeof( SKP_int32 ) ); - SKP_memcpy( A_Q28, SKP_Silk_Transition_LP_A_Q28[ ind ], TRANSITION_NA * sizeof( SKP_int32 ) ); - } - } else { - SKP_memcpy( B_Q28, SKP_Silk_Transition_LP_B_Q28[ TRANSITION_INT_NUM - 1 ], TRANSITION_NB * sizeof( SKP_int32 ) ); - SKP_memcpy( A_Q28, SKP_Silk_Transition_LP_A_Q28[ TRANSITION_INT_NUM - 1 ], TRANSITION_NA * sizeof( SKP_int32 ) ); - } -} - -/* Low-pass filter with variable cutoff frequency based on */ -/* piece-wise linear interpolation between elliptic filters */ -/* Start by setting psEncC->transition_frame_no = 1; */ -/* Deactivate by setting psEncC->transition_frame_no = 0; */ -void SKP_Silk_LP_variable_cutoff( - SKP_Silk_LP_state *psLP, /* I/O LP filter state */ - SKP_int16 *out, /* O Low-pass filtered output signal */ - const SKP_int16 *in, /* I Input signal */ - const SKP_int frame_length /* I Frame length */ -) -{ - SKP_int32 B_Q28[ TRANSITION_NB ], A_Q28[ TRANSITION_NA ], fac_Q16 = 0; - SKP_int ind = 0; - - SKP_assert( psLP->transition_frame_no >= 0 ); - SKP_assert( ( ( ( psLP->transition_frame_no <= TRANSITION_FRAMES_DOWN ) && ( psLP->mode == 0 ) ) || - ( ( psLP->transition_frame_no <= TRANSITION_FRAMES_UP ) && ( psLP->mode == 1 ) ) ) ); - - /* Interpolate filter coefficients if needed */ - if( psLP->transition_frame_no > 0 ) { - if( psLP->mode == 0 ) { - if( psLP->transition_frame_no < TRANSITION_FRAMES_DOWN ) { - /* Calculate index and interpolation factor for interpolation */ -#if( TRANSITION_INT_STEPS_DOWN == 32 ) - fac_Q16 = SKP_LSHIFT( psLP->transition_frame_no, 16 - 5 ); -#else - fac_Q16 = SKP_DIV32_16( SKP_LSHIFT( psLP->transition_frame_no, 16 ), TRANSITION_INT_STEPS_DOWN ); -#endif - ind = SKP_RSHIFT( fac_Q16, 16 ); - fac_Q16 -= SKP_LSHIFT( ind, 16 ); - - SKP_assert( ind >= 0 ); - SKP_assert( ind < TRANSITION_INT_NUM ); - - /* Interpolate filter coefficients */ - SKP_Silk_LP_interpolate_filter_taps( B_Q28, A_Q28, ind, fac_Q16 ); - - /* Increment transition frame number for next frame */ - psLP->transition_frame_no++; - - } else { - SKP_assert( psLP->transition_frame_no == TRANSITION_FRAMES_DOWN ); - /* End of transition phase */ - SKP_Silk_LP_interpolate_filter_taps( B_Q28, A_Q28, TRANSITION_INT_NUM - 1, 0 ); - } - } else { - SKP_assert( psLP->mode == 1 ); - if( psLP->transition_frame_no < TRANSITION_FRAMES_UP ) { - /* Calculate index and interpolation factor for interpolation */ -#if( TRANSITION_INT_STEPS_UP == 64 ) - fac_Q16 = SKP_LSHIFT( TRANSITION_FRAMES_UP - psLP->transition_frame_no, 16 - 6 ); -#else - fac_Q16 = SKP_DIV32_16( SKP_LSHIFT( TRANSITION_FRAMES_UP - psLP->transition_frame_no, 16 ), TRANSITION_INT_STEPS_UP ); -#endif - ind = SKP_RSHIFT( fac_Q16, 16 ); - fac_Q16 -= SKP_LSHIFT( ind, 16 ); - - SKP_assert( ind >= 0 ); - SKP_assert( ind < TRANSITION_INT_NUM ); - - /* Interpolate filter coefficients */ - SKP_Silk_LP_interpolate_filter_taps( B_Q28, A_Q28, ind, fac_Q16 ); - - /* Increment transition frame number for next frame */ - psLP->transition_frame_no++; - - } else { - SKP_assert( psLP->transition_frame_no == TRANSITION_FRAMES_UP ); - /* End of transition phase */ - SKP_Silk_LP_interpolate_filter_taps( B_Q28, A_Q28, 0, 0 ); - } - } - } - - if( psLP->transition_frame_no > 0 ) { - /* ARMA low-pass filtering */ - SKP_assert( TRANSITION_NB == 3 && TRANSITION_NA == 2 ); - SKP_Silk_biquad_alt( in, B_Q28, A_Q28, psLP->In_LP_State, out, frame_length ); - } else { - /* Instead of using the filter, copy input directly to output */ - SKP_memcpy( out, in, frame_length * sizeof( SKP_int16 ) ); - } -} -#endif diff --git a/libs/silk/src/SKP_Silk_LSF_cos_table.c b/libs/silk/src/SKP_Silk_LSF_cos_table.c deleted file mode 100644 index 6f7140ec1b..0000000000 --- a/libs/silk/src/SKP_Silk_LSF_cos_table.c +++ /dev/null @@ -1,65 +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_SigProc_FIX.h" - -// Q12 values (even) -const SKP_int SKP_Silk_LSFCosTab_FIX_Q12[LSF_COS_TAB_SZ_FIX + 1] = { - 8192, 8190, 8182, 8170, - 8152, 8130, 8104, 8072, - 8034, 7994, 7946, 7896, - 7840, 7778, 7714, 7644, - 7568, 7490, 7406, 7318, - 7226, 7128, 7026, 6922, - 6812, 6698, 6580, 6458, - 6332, 6204, 6070, 5934, - 5792, 5648, 5502, 5352, - 5198, 5040, 4880, 4718, - 4552, 4382, 4212, 4038, - 3862, 3684, 3502, 3320, - 3136, 2948, 2760, 2570, - 2378, 2186, 1990, 1794, - 1598, 1400, 1202, 1002, - 802, 602, 402, 202, - 0, -202, -402, -602, - -802, -1002, -1202, -1400, - -1598, -1794, -1990, -2186, - -2378, -2570, -2760, -2948, - -3136, -3320, -3502, -3684, - -3862, -4038, -4212, -4382, - -4552, -4718, -4880, -5040, - -5198, -5352, -5502, -5648, - -5792, -5934, -6070, -6204, - -6332, -6458, -6580, -6698, - -6812, -6922, -7026, -7128, - -7226, -7318, -7406, -7490, - -7568, -7644, -7714, -7778, - -7840, -7896, -7946, -7994, - -8034, -8072, -8104, -8130, - -8152, -8170, -8182, -8190, - -8192 -}; diff --git a/libs/silk/src/SKP_Silk_LTP_analysis_filter_FIX.c b/libs/silk/src/SKP_Silk_LTP_analysis_filter_FIX.c deleted file mode 100644 index b7d211430d..0000000000 --- a/libs/silk/src/SKP_Silk_LTP_analysis_filter_FIX.c +++ /dev/null @@ -1,79 +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_FIX.h" - -void SKP_Silk_LTP_analysis_filter_FIX( - SKP_int16 *LTP_res, /* O: LTP residual signal of length NB_SUBFR * ( pre_length + subfr_length ) */ - const SKP_int16 *x, /* I: Pointer to input signal with at least max( pitchL ) preceeding samples */ - const SKP_int16 LTPCoef_Q14[ LTP_ORDER * NB_SUBFR ],/* I: LTP_ORDER LTP coefficients for each NB_SUBFR subframe */ - const SKP_int pitchL[ NB_SUBFR ], /* I: Pitch lag, one for each subframe */ - const SKP_int32 invGains_Q16[ NB_SUBFR ], /* I: Inverse quantization gains, one for each subframe */ - const SKP_int subfr_length, /* I: Length of each subframe */ - const SKP_int pre_length /* I: Length of the preceeding samples starting at &x[0] for each subframe */ -) -{ - const SKP_int16 *x_ptr, *x_lag_ptr; - SKP_int16 Btmp_Q14[ LTP_ORDER ]; - SKP_int16 *LTP_res_ptr; - SKP_int k, i, j; - SKP_int32 LTP_est; - - x_ptr = x; - LTP_res_ptr = LTP_res; - for( k = 0; k < NB_SUBFR; k++ ) { - - x_lag_ptr = x_ptr - pitchL[ k ]; - for( i = 0; i < LTP_ORDER; i++ ) { - Btmp_Q14[ i ] = LTPCoef_Q14[ k * LTP_ORDER + i ]; - } - - /* LTP analysis FIR filter */ - for( i = 0; i < subfr_length + pre_length; i++ ) { - LTP_res_ptr[ i ] = x_ptr[ i ]; - - /* Long-term prediction */ - LTP_est = SKP_SMULBB( x_lag_ptr[ LTP_ORDER / 2 ], Btmp_Q14[ 0 ] ); - for( j = 1; j < LTP_ORDER; j++ ) { - LTP_est = SKP_SMLABB_ovflw( LTP_est, x_lag_ptr[ LTP_ORDER / 2 - j ], Btmp_Q14[ j ] ); - } - LTP_est = SKP_RSHIFT_ROUND( LTP_est, 14 ); // round and -> Q0 - - /* Subtract long-term prediction */ - LTP_res_ptr[ i ] = ( SKP_int16 )SKP_SAT16( ( SKP_int32 )x_ptr[ i ] - LTP_est ); - - /* Scale residual */ - LTP_res_ptr[ i ] = SKP_SMULWB( invGains_Q16[ k ], LTP_res_ptr[ i ] ); - - x_lag_ptr++; - } - - /* Update pointers */ - LTP_res_ptr += subfr_length + pre_length; - x_ptr += subfr_length; - } -} diff --git a/libs/silk/src/SKP_Silk_LTP_scale_ctrl_FIX.c b/libs/silk/src/SKP_Silk_LTP_scale_ctrl_FIX.c deleted file mode 100644 index dced005a33..0000000000 --- a/libs/silk/src/SKP_Silk_LTP_scale_ctrl_FIX.c +++ /dev/null @@ -1,81 +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_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, frames_per_packet; - 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->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 */ - psEncCtrl->sCmn.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 0% */ - if( psEnc->sCmn.nFramesInPayloadBuf == 0 ) { - - frames_per_packet = SKP_DIV32_16( psEnc->sCmn.PacketSize_ms, FRAME_LENGTH_MS ); - - round_loss += frames_per_packet - 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 */ - psEncCtrl->sCmn.LTP_scaleIndex = 2; - } else if( g_limit_Q15 > thrld2_Q15 ) { - /* Medium scaling */ - psEncCtrl->sCmn.LTP_scaleIndex = 1; - } - } - psEncCtrl->LTP_scale_Q14 = SKP_Silk_LTPScales_table_Q14[ psEncCtrl->sCmn.LTP_scaleIndex ]; -} diff --git a/libs/silk/src/SKP_Silk_MA.c b/libs/silk/src/SKP_Silk_MA.c deleted file mode 100644 index aea88d4605..0000000000 --- a/libs/silk/src/SKP_Silk_MA.c +++ /dev/null @@ -1,115 +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_MA.c * - * * - * Variable order MA filter * - * * - * Copyright 2006 (c), Skype Limited * - * Date: 060221 * - * */ -#include "SKP_Silk_SigProc_FIX.h" - -/* Variable order MA prediction error filter */ -void SKP_Silk_MA_Prediction( - const SKP_int16 *in, /* I: Input signal */ - const SKP_int16 *B, /* I: MA prediction coefficients, Q12 [order] */ - SKP_int32 *S, /* I/O: State vector [order] */ - SKP_int16 *out, /* O: Output signal */ - const SKP_int32 len, /* I: Signal length */ - const SKP_int32 order /* I: Filter order */ -) -{ - SKP_int k, d, in16; - SKP_int32 out32; - - for( k = 0; k < len; k++ ) { - in16 = in[ k ]; - out32 = SKP_LSHIFT( in16, 12 ) - S[ 0 ]; - out32 = SKP_RSHIFT_ROUND( out32, 12 ); - - for( d = 0; d < order - 1; d++ ) { - S[ d ] = SKP_SMLABB_ovflw( S[ d + 1 ], in16, B[ d ] ); - } - S[ order - 1 ] = SKP_SMULBB( in16, B[ order - 1 ] ); - - /* Limit */ - out[ k ] = (SKP_int16)SKP_SAT16( out32 ); - } -} - - -void SKP_Silk_LPC_analysis_filter( - const SKP_int16 *in, /* I: Input signal */ - const SKP_int16 *B, /* I: MA prediction coefficients, Q12 [order] */ - SKP_int16 *S, /* I/O: State vector [order] */ - SKP_int16 *out, /* O: Output signal */ - const SKP_int32 len, /* I: Signal length */ - const SKP_int32 Order /* I: Filter order */ -) -{ - SKP_int k, j, idx, Order_half = SKP_RSHIFT( Order, 1 ); - SKP_int32 out32_Q12, out32; - SKP_int16 SA, SB; - /* Order must be even */ - SKP_assert( 2 * Order_half == Order ); - - /* S[] values are in Q0 */ - for( k = 0; k < len; k++ ) { - SA = S[ 0 ]; - out32_Q12 = 0; - for( j = 0; j < ( Order_half - 1 ); j++ ) { - idx = SKP_SMULBB( 2, j ) + 1; - /* Multiply-add two prediction coefficients for each loop */ - SB = S[ idx ]; - S[ idx ] = SA; - out32_Q12 = SKP_SMLABB( out32_Q12, SA, B[ idx - 1 ] ); - out32_Q12 = SKP_SMLABB( out32_Q12, SB, B[ idx ] ); - SA = S[ idx + 1 ]; - S[ idx + 1 ] = SB; - } - - /* Unrolled loop: epilog */ - SB = S[ Order - 1 ]; - S[ Order - 1 ] = SA; - out32_Q12 = SKP_SMLABB( out32_Q12, SA, B[ Order - 2 ] ); - out32_Q12 = SKP_SMLABB( out32_Q12, SB, B[ Order - 1 ] ); - - /* Subtract prediction */ - out32_Q12 = SKP_SUB_SAT32( SKP_LSHIFT( (SKP_int32)in[ k ], 12 ), out32_Q12 ); - - /* Scale to Q0 */ - out32 = SKP_RSHIFT_ROUND( out32_Q12, 12 ); - - /* Saturate output */ - out[ k ] = ( SKP_int16 )SKP_SAT16( out32 ); - - /* Move input line */ - S[ 0 ] = in[ k ]; - } -} diff --git a/libs/silk/src/SKP_Silk_NLSF2A.c b/libs/silk/src/SKP_Silk_NLSF2A.c deleted file mode 100644 index cf305c8542..0000000000 --- a/libs/silk/src/SKP_Silk_NLSF2A.c +++ /dev/null @@ -1,151 +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. -***********************************************************************/ - -/* conversion between prediction filter coefficients and LSFs */ -/* order should be even */ -/* a piecewise linear approximation maps LSF <-> cos(LSF) */ -/* therefore the result is not accurate LSFs, but the two */ -/* function are accurate inverses of each other */ - -#include "SKP_Silk_SigProc_FIX.h" - -/* helper function for NLSF2A(..) */ -SKP_INLINE void SKP_Silk_NLSF2A_find_poly( - SKP_int32 *out, /* o intermediate polynomial, Q20 */ - const SKP_int32 *cLSF, /* i vector of interleaved 2*cos(LSFs), Q20 */ - SKP_int dd /* i polynomial order (= 1/2 * filter order) */ -) -{ - SKP_int k, n; - SKP_int32 ftmp; - - out[0] = SKP_LSHIFT( 1, 20 ); - out[1] = -cLSF[0]; - for( k = 1; k < dd; k++ ) { - ftmp = cLSF[2*k]; // Q20 - out[k+1] = SKP_LSHIFT( out[k-1], 1 ) - (SKP_int32)SKP_RSHIFT_ROUND64( SKP_SMULL( ftmp, out[k] ), 20 ); - for( n = k; n > 1; n-- ) { - out[n] += out[n-2] - (SKP_int32)SKP_RSHIFT_ROUND64( SKP_SMULL( ftmp, out[n-1] ), 20 ); - } - out[1] -= ftmp; - } -} - -/* compute whitening filter coefficients from normalized line spectral frequencies */ -void SKP_Silk_NLSF2A( - SKP_int16 *a, /* o monic whitening filter coefficients in Q12, [d] */ - const SKP_int *NLSF, /* i normalized line spectral frequencies in Q15, [d] */ - const SKP_int d /* i filter order (should be even) */ -) -{ - SKP_int k, i, dd; - SKP_int32 cos_LSF_Q20[SKP_Silk_MAX_ORDER_LPC]; - SKP_int32 P[SKP_Silk_MAX_ORDER_LPC/2+1], Q[SKP_Silk_MAX_ORDER_LPC/2+1]; - SKP_int32 Ptmp, Qtmp; - SKP_int32 f_int; - SKP_int32 f_frac; - SKP_int32 cos_val, delta; - SKP_int32 a_int32[SKP_Silk_MAX_ORDER_LPC]; - SKP_int32 maxabs, absval, idx=0, sc_Q16; - - SKP_assert(LSF_COS_TAB_SZ_FIX == 128); - - /* convert LSFs to 2*cos(LSF(i)), using piecewise linear curve from table */ - for( k = 0; k < d; k++ ) { - SKP_assert(NLSF[k] >= 0 ); - SKP_assert(NLSF[k] <= 32767 ); - - /* f_int on a scale 0-127 (rounded down) */ - f_int = SKP_RSHIFT( NLSF[k], 15 - 7 ); - - /* f_frac, range: 0..255 */ - f_frac = NLSF[k] - SKP_LSHIFT( f_int, 15 - 7 ); - - SKP_assert(f_int >= 0); - SKP_assert(f_int < LSF_COS_TAB_SZ_FIX ); - - /* Read start and end value from table */ - cos_val = SKP_Silk_LSFCosTab_FIX_Q12[ f_int ]; /* Q12 */ - delta = SKP_Silk_LSFCosTab_FIX_Q12[ f_int + 1 ] - cos_val; /* Q12, with a range of 0..200 */ - - /* Linear interpolation */ - cos_LSF_Q20[k] = SKP_LSHIFT( cos_val, 8 ) + SKP_MUL( delta, f_frac ); /* Q20 */ - } - - dd = SKP_RSHIFT( d, 1 ); - - /* generate even and odd polynomials using convolution */ - SKP_Silk_NLSF2A_find_poly( P, &cos_LSF_Q20[0], dd ); - SKP_Silk_NLSF2A_find_poly( Q, &cos_LSF_Q20[1], dd ); - - /* convert even and odd polynomials to SKP_int32 Q12 filter coefs */ - for( k = 0; k < dd; k++ ) { - Ptmp = P[k+1] + P[k]; - Qtmp = Q[k+1] - Q[k]; - - /* the Ptmp and Qtmp values at this stage need to fit in int32 */ - - a_int32[k] = -SKP_RSHIFT_ROUND( Ptmp + Qtmp, 9 ); /* Q20 -> Q12 */ - a_int32[d-k-1] = SKP_RSHIFT_ROUND( Qtmp - Ptmp, 9 ); /* Q20 -> Q12 */ - } - - /* Limit the maximum absolute value of the prediction coefficients */ - for( i = 0; i < 10; i++ ) { - /* Find maximum absolute value and its index */ - maxabs = 0; - for( k = 0; k < d; k++ ) { - absval = SKP_abs( a_int32[k] ); - if( absval > maxabs ) { - maxabs = absval; - idx = k; - } - } - - if( maxabs > SKP_int16_MAX ) { - /* Reduce magnitude of prediction coefficients */ - maxabs = SKP_min( maxabs, 98369 ); // ( SKP_int32_MAX / ( 65470 >> 2 ) ) + SKP_int16_MAX = 98369 - sc_Q16 = 65470 - SKP_DIV32( SKP_MUL( 65470 >> 2, maxabs - SKP_int16_MAX ), - SKP_RSHIFT32( SKP_MUL( maxabs, idx + 1), 2 ) ); - SKP_Silk_bwexpander_32( a_int32, d, sc_Q16 ); - } else { - break; - } - } - - /* Reached the last iteration */ - if( i == 10 ) { - SKP_assert(0); - for( k = 0; k < d; k++ ) { - a_int32[k] = SKP_SAT16( a_int32[k] ); - } - } - - /* Return as SKP_int16 Q12 coefficients */ - for( k = 0; k < d; k++ ) { - a[k] = (SKP_int16)a_int32[k]; - } -} diff --git a/libs/silk/src/SKP_Silk_NLSF2A_stable.c b/libs/silk/src/SKP_Silk_NLSF2A_stable.c deleted file mode 100644 index 9a66d02711..0000000000 --- a/libs/silk/src/SKP_Silk_NLSF2A_stable.c +++ /dev/null @@ -1,58 +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" - -/* Convert NLSF parameters to stable AR prediction filter coefficients */ -void SKP_Silk_NLSF2A_stable( - SKP_int16 pAR_Q12[ MAX_LPC_ORDER ], /* O Stabilized AR coefs [LPC_order] */ - const SKP_int pNLSF[ MAX_LPC_ORDER ], /* I NLSF vector [LPC_order] */ - const SKP_int LPC_order /* I LPC/LSF order */ -) -{ - SKP_int i; - SKP_int32 invGain_Q30; - - SKP_Silk_NLSF2A( pAR_Q12, pNLSF, LPC_order ); - - /* Ensure stable LPCs */ - for( i = 0; i < MAX_LPC_STABILIZE_ITERATIONS; i++ ) { - if( SKP_Silk_LPC_inverse_pred_gain( &invGain_Q30, pAR_Q12, LPC_order ) == 1 ) { - SKP_Silk_bwexpander( pAR_Q12, LPC_order, 65536 - SKP_SMULBB( 10 + i, i ) ); /* 10_Q16 = 0.00015 */ - } else { - break; - } - } - - /* Reached the last iteration */ - if( i == MAX_LPC_STABILIZE_ITERATIONS ) { - SKP_assert( 0 ); - for( i = 0; i < LPC_order; i++ ) { - pAR_Q12[ i ] = 0; - } - } -} diff --git a/libs/silk/src/SKP_Silk_NLSF_MSVQ_decode.c b/libs/silk/src/SKP_Silk_NLSF_MSVQ_decode.c deleted file mode 100644 index 9e5ef6d97c..0000000000 --- a/libs/silk/src/SKP_Silk_NLSF_MSVQ_decode.c +++ /dev/null @@ -1,91 +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_int *NLSFIndices, /* I Pointer to NLSF indices [nStages x 1] */ - const SKP_int LPC_order /* I LPC order used */ -) -{ - const SKP_int16 *pCB_element; - SKP_int s; - SKP_int i; - - /* Check that each 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_Q15[ SKP_MUL( NLSFIndices[ 0 ], LPC_order ) ]; - - /* Initialize with the codebook vector from stage 0 */ - for( i = 0; i < LPC_order; i++ ) { - pNLSF_Q15[ i ] = ( SKP_int )pCB_element[ i ]; - } - - 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 ); - - if( LPC_order == 16 ) { - /* Point to the first vector element */ - pCB_element = &psNLSF_CB->CBStages[ s ].CB_NLSF_Q15[ SKP_LSHIFT( NLSFIndices[ s ], 4 ) ]; - - /* Add the codebook vector from the current stage */ - pNLSF_Q15[ 0 ] += pCB_element[ 0 ]; - pNLSF_Q15[ 1 ] += pCB_element[ 1 ]; - pNLSF_Q15[ 2 ] += pCB_element[ 2 ]; - pNLSF_Q15[ 3 ] += pCB_element[ 3 ]; - pNLSF_Q15[ 4 ] += pCB_element[ 4 ]; - pNLSF_Q15[ 5 ] += pCB_element[ 5 ]; - pNLSF_Q15[ 6 ] += pCB_element[ 6 ]; - pNLSF_Q15[ 7 ] += pCB_element[ 7 ]; - pNLSF_Q15[ 8 ] += pCB_element[ 8 ]; - pNLSF_Q15[ 9 ] += pCB_element[ 9 ]; - pNLSF_Q15[ 10 ] += pCB_element[ 10 ]; - pNLSF_Q15[ 11 ] += pCB_element[ 11 ]; - pNLSF_Q15[ 12 ] += pCB_element[ 12 ]; - pNLSF_Q15[ 13 ] += pCB_element[ 13 ]; - pNLSF_Q15[ 14 ] += pCB_element[ 14 ]; - pNLSF_Q15[ 15 ] += pCB_element[ 15 ]; - } else { - /* Point to the first vector element */ - pCB_element = &psNLSF_CB->CBStages[ s ].CB_NLSF_Q15[ SKP_SMULBB( NLSFIndices[ s ], LPC_order ) ]; - - /* Add the codebook vector from the current stage */ - for( i = 0; i < LPC_order; i++ ) { - pNLSF_Q15[ i ] += pCB_element[ i ]; - } - } - } - - /* NLSF stabilization */ - SKP_Silk_NLSF_stabilize( pNLSF_Q15, psNLSF_CB->NDeltaMin_Q15, LPC_order ); -} diff --git a/libs/silk/src/SKP_Silk_NLSF_MSVQ_encode_FIX.c b/libs/silk/src/SKP_Silk_NLSF_MSVQ_encode_FIX.c deleted file mode 100644 index 1ab7299dc2..0000000000 --- a/libs/silk/src/SKP_Silk_NLSF_MSVQ_encode_FIX.c +++ /dev/null @@ -1,239 +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_FIX.h" - -/***********************/ -/* NLSF vector encoder */ -/***********************/ -void SKP_Silk_NLSF_MSVQ_encode_FIX( - SKP_int *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_Q6, /* 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 - -#if( LOW_COMPLEXITY_ONLY == 1 ) - SKP_int32 pRateDist_Q18[ NLSF_MSVQ_TREE_SEARCH_MAX_VECTORS_EVALUATED_LC_MODE ]; - SKP_int32 pRate_Q5[ MAX_NLSF_MSVQ_SURVIVORS_LC_MODE ]; - SKP_int32 pRate_new_Q5[ MAX_NLSF_MSVQ_SURVIVORS_LC_MODE ]; - SKP_int pTempIndices[ MAX_NLSF_MSVQ_SURVIVORS_LC_MODE ]; - SKP_int pPath[ MAX_NLSF_MSVQ_SURVIVORS_LC_MODE * NLSF_MSVQ_MAX_CB_STAGES ]; - SKP_int pPath_new[ MAX_NLSF_MSVQ_SURVIVORS_LC_MODE * NLSF_MSVQ_MAX_CB_STAGES ]; - SKP_int pRes_Q15[ MAX_NLSF_MSVQ_SURVIVORS_LC_MODE * MAX_LPC_ORDER ]; - SKP_int pRes_new_Q15[ MAX_NLSF_MSVQ_SURVIVORS_LC_MODE * MAX_LPC_ORDER ]; -#else - SKP_int32 pRateDist_Q18[ NLSF_MSVQ_TREE_SEARCH_MAX_VECTORS_EVALUATED ]; - SKP_int32 pRate_Q5[ MAX_NLSF_MSVQ_SURVIVORS ]; - SKP_int32 pRate_new_Q5[ MAX_NLSF_MSVQ_SURVIVORS ]; - SKP_int pTempIndices[ MAX_NLSF_MSVQ_SURVIVORS ]; - SKP_int pPath[ MAX_NLSF_MSVQ_SURVIVORS * NLSF_MSVQ_MAX_CB_STAGES ]; - SKP_int pPath_new[ MAX_NLSF_MSVQ_SURVIVORS * NLSF_MSVQ_MAX_CB_STAGES ]; - SKP_int pRes_Q15[ MAX_NLSF_MSVQ_SURVIVORS * MAX_LPC_ORDER ]; - SKP_int pRes_new_Q15[ MAX_NLSF_MSVQ_SURVIVORS * MAX_LPC_ORDER ]; -#endif - - const SKP_int *pConstInt; - SKP_int *pInt; - const SKP_int16 *pCB_element; - const SKP_Silk_NLSF_CBS *pCurrentCBStage; - -#ifdef USE_UNQUANTIZED_LSFS - SKP_int NLSF_orig[ MAX_LPC_ORDER ]; - SKP_memcpy( NLSF_orig, pNLSF_Q15, LPC_order * sizeof( SKP_int ) ); -#endif - - SKP_assert( NLSF_MSVQ_Survivors <= MAX_NLSF_MSVQ_SURVIVORS ); - SKP_assert( ( LOW_COMPLEXITY_ONLY == 0 ) || ( NLSF_MSVQ_Survivors <= MAX_NLSF_MSVQ_SURVIVORS_LC_MODE ) ); - - - /****************************************************/ - /* Tree search for the multi-stage vector quantizer */ - /****************************************************/ - - /* Clear accumulated rates */ - SKP_memset( pRate_Q5, 0, NLSF_MSVQ_Survivors * sizeof( SKP_int32 ) ); - - /* Copy NLSFs into residual signal vector */ - for( i = 0; i < LPC_order; i++ ) { - pRes_Q15[ i ] = pNLSF_Q15[ i ]; - } - - /* 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_FIX( pRateDist_Q18, pCurrentCBStage, pRes_Q15, pW_Q6, - pRate_Q5, NLSF_mu_Q15, prev_survivors, 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' */ - pConstInt = &pRes_Q15[ SKP_SMULBB( input_index, LPC_order ) ]; - pCB_element = &pCurrentCBStage->CB_NLSF_Q15[ SKP_SMULBB( cb_index, LPC_order ) ]; - pInt = &pRes_new_Q15[ SKP_SMULBB( k, LPC_order ) ]; - for( i = 0; i < LPC_order; i++ ) { - pInt[ i ] = pConstInt[ i ] - ( SKP_int )pCB_element[ i ]; - } - - /* Update accumulated rate for stage 1 to the current */ - pRate_new_Q5[ k ] = pRate_Q5[ input_index ] + pCurrentCBStage->Rates_Q5[ cb_index ]; - - /* Copy paths from previous matrix, starting with the best path */ - pConstInt = &pPath[ SKP_SMULBB( input_index, psNLSF_CB->nStages ) ]; - pInt = &pPath_new[ SKP_SMULBB( k, psNLSF_CB->nStages ) ]; - for( i = 0; i < s; i++ ) { - pInt[ i ] = pConstInt[ i ]; - } - /* Write the current stage indices for the 'cur_survivors' to the best path matrix */ - pInt[ s ] = 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_int ) ); - - /* Copy rate vector for next stage */ - SKP_memcpy( pRate_Q5, pRate_new_Q5, 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_int ) ); - } - - 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_Q6[ 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_Q6[ 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_int ) ); - - /* Decode and stabilize the best survivor */ - SKP_Silk_NLSF_MSVQ_decode( pNLSF_Q15, psNLSF_CB, NLSFIndices, LPC_order ); - -#ifdef USE_UNQUANTIZED_LSFS - SKP_memcpy( pNLSF_Q15, NLSF_orig, LPC_order * sizeof( SKP_int ) ); -#endif - -} diff --git a/libs/silk/src/SKP_Silk_NLSF_VQ_rate_distortion_FIX.c b/libs/silk/src/SKP_Silk_NLSF_VQ_rate_distortion_FIX.c deleted file mode 100644 index 46492a08c8..0000000000 --- a/libs/silk/src/SKP_Silk_NLSF_VQ_rate_distortion_FIX.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. -***********************************************************************/ - -#include "SKP_Silk_main_FIX.h" - -/* Rate-Distortion calculations for multiple input data vectors */ -void SKP_Silk_NLSF_VQ_rate_distortion_FIX( - SKP_int32 *pRD_Q20, /* O Rate-distortion values [psNLSF_CBS->nVectors*N] */ - const SKP_Silk_NLSF_CBS *psNLSF_CBS, /* I NLSF codebook stage struct */ - const SKP_int *in_Q15, /* I Input vectors to be quantized */ - const SKP_int *w_Q6, /* I Weight vector */ - const SKP_int32 *rate_acc_Q5, /* 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 LPC_order /* I LPC order */ -) -{ - SKP_int i, n; - SKP_int32 *pRD_vec_Q20; - - /* Compute weighted quantization errors for all input vectors over one codebook stage */ - SKP_Silk_NLSF_VQ_sum_error_FIX( pRD_Q20, in_Q15, w_Q6, psNLSF_CBS->CB_NLSF_Q15, - N, psNLSF_CBS->nVectors, LPC_order ); - - /* Loop over input vectors */ - pRD_vec_Q20 = pRD_Q20; - 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_Q5[ n ] + psNLSF_CBS->Rates_Q5[ i ] >= 0 ); - SKP_assert( rate_acc_Q5[ n ] + psNLSF_CBS->Rates_Q5[ i ] <= SKP_int16_MAX ); - pRD_vec_Q20[ i ] = SKP_SMLABB( pRD_vec_Q20[ i ], rate_acc_Q5[ n ] + psNLSF_CBS->Rates_Q5[ i ], mu_Q15 ); - SKP_assert( pRD_vec_Q20[ i ] >= 0 ); - } - pRD_vec_Q20 += psNLSF_CBS->nVectors; - } -} diff --git a/libs/silk/src/SKP_Silk_NLSF_VQ_sum_error_FIX.c b/libs/silk/src/SKP_Silk_NLSF_VQ_sum_error_FIX.c deleted file mode 100644 index 93cb54da35..0000000000 --- a/libs/silk/src/SKP_Silk_NLSF_VQ_sum_error_FIX.c +++ /dev/null @@ -1,79 +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_FIX.h" - - -/* Compute weighted quantization errors for an LPC_order element input vector, over one codebook stage */ -void SKP_Silk_NLSF_VQ_sum_error_FIX( - SKP_int32 *err_Q20, /* O Weighted quantization errors [N*K] */ - const SKP_int *in_Q15, /* I Input vectors to be quantized [N*LPC_order] */ - const SKP_int *w_Q6, /* I Weighting vectors [N*LPC_order] */ - const SKP_int16 *pCB_Q15, /* 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 LPC_order /* I Number of LPCs */ -) -{ - SKP_int i, n, m; - SKP_int32 diff_Q15, sum_error, Wtmp_Q6; - SKP_int32 Wcpy_Q6[ MAX_LPC_ORDER / 2 ]; - const SKP_int16 *cb_vec_Q15; - - 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_Q6[ m ] = w_Q6[ 2 * m ] | SKP_LSHIFT( ( SKP_int32 )w_Q6[ 2 * m + 1 ], 16 ); - } - - /* Loop over input vectors */ - for( n = 0; n < N; n++ ) { - /* Loop over codebook */ - cb_vec_Q15 = pCB_Q15; - 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_Q6 = Wcpy_Q6[ SKP_RSHIFT( m, 1 ) ]; - - /* Compute weighted squared quantization error for index m */ - diff_Q15 = in_Q15[ m ] - *cb_vec_Q15++; // range: [ -32767 : 32767 ] - sum_error = SKP_SMLAWB( sum_error, SKP_SMULBB( diff_Q15, diff_Q15 ), Wtmp_Q6 ); - - /* Compute weighted squared quantization error for index m + 1 */ - diff_Q15 = in_Q15[m + 1] - *cb_vec_Q15++; // range: [ -32767 : 32767 ] - sum_error = SKP_SMLAWT( sum_error, SKP_SMULBB( diff_Q15, diff_Q15 ), Wtmp_Q6 ); - } - SKP_assert( sum_error >= 0 ); - err_Q20[ i ] = sum_error; - } - err_Q20 += K; - in_Q15 += LPC_order; - } -} diff --git a/libs/silk/src/SKP_Silk_NLSF_VQ_weights_laroia.c b/libs/silk/src/SKP_Silk_NLSF_VQ_weights_laroia.c deleted file mode 100644 index 441a7e68cb..0000000000 --- a/libs/silk/src/SKP_Silk_NLSF_VQ_weights_laroia.c +++ /dev/null @@ -1,79 +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_SigProc_FIX.h" - -/* -R. Laroia, N. Phamdo and N. Farvardin, "Robust and Efficient Quantization of Speech LSP -Parameters Using Structured Vector Quantization", Proc. IEEE Int. Conf. Acoust., Speech, -Signal Processing, pp. 641-644, 1991. -*/ - -#define Q_OUT 6 -#define MIN_NDELTA 3 - -/* Laroia low complexity NLSF weights */ -void SKP_Silk_NLSF_VQ_weights_laroia( - SKP_int *pNLSFW_Q6, /* O: Pointer to input vector weights [D x 1] */ - const SKP_int *pNLSF_Q15, /* I: Pointer to input vector [D x 1] */ - const SKP_int D /* I: Input vector dimension (even) */ -) -{ - SKP_int k; - SKP_int32 tmp1_int, tmp2_int; - - /* Check that we are guaranteed to end up within the required range */ - SKP_assert( D > 0 ); - SKP_assert( ( D & 1 ) == 0 ); - - /* First value */ - tmp1_int = SKP_max_int( pNLSF_Q15[ 0 ], MIN_NDELTA ); - tmp1_int = SKP_DIV32_16( 1 << ( 15 + Q_OUT ), tmp1_int ); - tmp2_int = SKP_max_int( pNLSF_Q15[ 1 ] - pNLSF_Q15[ 0 ], MIN_NDELTA ); - tmp2_int = SKP_DIV32_16( 1 << ( 15 + Q_OUT ), tmp2_int ); - pNLSFW_Q6[ 0 ] = (SKP_int)SKP_min_int( tmp1_int + tmp2_int, SKP_int16_MAX ); - SKP_assert( pNLSFW_Q6[ 0 ] > 0 ); - - /* Main loop */ - for( k = 1; k < D - 1; k += 2 ) { - tmp1_int = SKP_max_int( pNLSF_Q15[ k + 1 ] - pNLSF_Q15[ k ], MIN_NDELTA ); - tmp1_int = SKP_DIV32_16( 1 << ( 15 + Q_OUT ), tmp1_int ); - pNLSFW_Q6[ k ] = (SKP_int)SKP_min_int( tmp1_int + tmp2_int, SKP_int16_MAX ); - SKP_assert( pNLSFW_Q6[ k ] > 0 ); - - tmp2_int = SKP_max_int( pNLSF_Q15[ k + 2 ] - pNLSF_Q15[ k + 1 ], MIN_NDELTA ); - tmp2_int = SKP_DIV32_16( 1 << ( 15 + Q_OUT ), tmp2_int ); - pNLSFW_Q6[ k + 1 ] = (SKP_int)SKP_min_int( tmp1_int + tmp2_int, SKP_int16_MAX ); - SKP_assert( pNLSFW_Q6[ k + 1 ] > 0 ); - } - - /* Last value */ - tmp1_int = SKP_max_int( ( 1 << 15 ) - pNLSF_Q15[ D - 1 ], MIN_NDELTA ); - tmp1_int = SKP_DIV32_16( 1 << ( 15 + Q_OUT ), tmp1_int ); - pNLSFW_Q6[ D - 1 ] = (SKP_int)SKP_min_int( tmp1_int + tmp2_int, SKP_int16_MAX ); - SKP_assert( pNLSFW_Q6[ D - 1 ] > 0 ); -} diff --git a/libs/silk/src/SKP_Silk_NLSF_stabilize.c b/libs/silk/src/SKP_Silk_NLSF_stabilize.c deleted file mode 100644 index da0ea232da..0000000000 --- a/libs/silk/src/SKP_Silk_NLSF_stabilize.c +++ /dev/null @@ -1,138 +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. -***********************************************************************/ - -/* NLSF stabilizer: */ -/* */ -/* - Moves NLSFs futher apart if they are too close */ -/* - Moves NLSFs away from borders if they are too close */ -/* - High effort to achieve a modification with minimum */ -/* Euclidean distance to input vector */ -/* - Output are sorted NLSF coefficients */ -/* */ -#include "SKP_Silk_SigProc_FIX.h" - -/* Constant Definitions */ -#define MAX_LOOPS 20 - -/* NLSF stabilizer, for a single input data vector */ -void SKP_Silk_NLSF_stabilize( - SKP_int *NLSF_Q15, /* I/O: Unstable/stabilized normalized LSF vector in Q15 [L] */ - const SKP_int *NDeltaMin_Q15, /* I: Normalized delta min vector in Q15, NDeltaMin_Q15[L] must be >= 1 [L+1] */ - const SKP_int L /* I: Number of NLSF parameters in the input vector */ -) -{ - SKP_int center_freq_Q15, diff_Q15, min_center_Q15, max_center_Q15; - SKP_int32 min_diff_Q15; - SKP_int loops; - SKP_int i, I=0, k; - - /* This is necessary to ensure an output within range of a SKP_int16 */ - SKP_assert( NDeltaMin_Q15[L] >= 1 ); - - for( loops = 0; loops < MAX_LOOPS; loops++ ) { - /**************************/ - /* Find smallest distance */ - /**************************/ - /* First element */ - min_diff_Q15 = NLSF_Q15[0] - NDeltaMin_Q15[0]; - I = 0; - /* Middle elements */ - for( i = 1; i <= L-1; i++ ) { - diff_Q15 = NLSF_Q15[i] - ( NLSF_Q15[i-1] + NDeltaMin_Q15[i] ); - if( diff_Q15 < min_diff_Q15 ) { - min_diff_Q15 = diff_Q15; - I = i; - } - } - /* Last element */ - diff_Q15 = (1<<15) - ( NLSF_Q15[L-1] + NDeltaMin_Q15[L] ); - if( diff_Q15 < min_diff_Q15 ) { - min_diff_Q15 = diff_Q15; - I = L; - } - - /***************************************************/ - /* Now check if the smallest distance non-negative */ - /***************************************************/ - if (min_diff_Q15 >= 0) { - return; - } - - if( I == 0 ) { - /* Move away from lower limit */ - NLSF_Q15[0] = NDeltaMin_Q15[0]; - - } else if( I == L) { - /* Move away from higher limit */ - NLSF_Q15[L-1] = (1<<15) - NDeltaMin_Q15[L]; - - } else { - /* Find the lower extreme for the location of the current center frequency */ - min_center_Q15 = 0; - for( k = 0; k < I; k++ ) { - min_center_Q15 += NDeltaMin_Q15[k]; - } - min_center_Q15 += SKP_RSHIFT( NDeltaMin_Q15[I], 1 ); - - /* Find the upper extreme for the location of the current center frequency */ - max_center_Q15 = (1<<15); - for( k = L; k > I; k-- ) { - max_center_Q15 -= NDeltaMin_Q15[k]; - } - max_center_Q15 -= ( NDeltaMin_Q15[I] - SKP_RSHIFT( NDeltaMin_Q15[I], 1 ) ); - - /* Move apart, sorted by value, keeping the same center frequency */ - center_freq_Q15 = SKP_LIMIT_32( SKP_RSHIFT_ROUND( (SKP_int32)NLSF_Q15[I-1] + (SKP_int32)NLSF_Q15[I], 1 ), - min_center_Q15, max_center_Q15 ); - NLSF_Q15[I-1] = center_freq_Q15 - SKP_RSHIFT( NDeltaMin_Q15[I], 1 ); - NLSF_Q15[I] = NLSF_Q15[I-1] + NDeltaMin_Q15[I]; - } - } - - /* Safe and simple fall back method, which is less ideal than the above */ - if( loops == MAX_LOOPS ) - { - /* Insertion sort (fast for already almost sorted arrays): */ - /* Best case: O(n) for an already sorted array */ - /* Worst case: O(n^2) for an inversely sorted array */ - SKP_Silk_insertion_sort_increasing_all_values(&NLSF_Q15[0], L); - - /* First NLSF should be no less than NDeltaMin[0] */ - NLSF_Q15[0] = SKP_max_int( NLSF_Q15[0], NDeltaMin_Q15[0] ); - - /* Keep delta_min distance between the NLSFs */ - for( i = 1; i < L; i++ ) - NLSF_Q15[i] = SKP_max_int( NLSF_Q15[i], NLSF_Q15[i-1] + NDeltaMin_Q15[i] ); - - /* Last NLSF should be no higher than 1 - NDeltaMin[L] */ - NLSF_Q15[L-1] = SKP_min_int( NLSF_Q15[L-1], (1<<15) - NDeltaMin_Q15[L] ); - - /* Keep NDeltaMin distance between the NLSFs */ - for( i = L-2; i >= 0; i-- ) - NLSF_Q15[i] = SKP_min_int( NLSF_Q15[i], NLSF_Q15[i+1] - NDeltaMin_Q15[i+1] ); - } -} diff --git a/libs/silk/src/SKP_Silk_NSQ.c b/libs/silk/src/SKP_Silk_NSQ.c deleted file mode 100644 index 61b010ba07..0000000000 --- a/libs/silk/src/SKP_Silk_NSQ.c +++ /dev/null @@ -1,423 +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" - -SKP_INLINE void SKP_Silk_nsq_scale_states( - SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */ - const SKP_int16 x[], /* I input in Q0 */ - SKP_int32 x_sc_Q10[], /* O input scaled with 1/Gain */ - SKP_int subfr_length, /* I length of input */ - const SKP_int16 sLTP[], /* I re-whitened LTP state in Q0 */ - SKP_int32 sLTP_Q16[], /* O LTP state matching scaled input */ - SKP_int subfr, /* I subframe number */ - const SKP_int LTP_scale_Q14, /* I */ - const SKP_int32 Gains_Q16[ NB_SUBFR ], /* I */ - const SKP_int pitchL[ NB_SUBFR ] /* I */ -); - -SKP_INLINE void SKP_Silk_noise_shape_quantizer( - SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */ - SKP_int sigtype, /* I Signal type */ - const SKP_int32 x_sc_Q10[], /* I */ - SKP_int8 q[], /* O */ - SKP_int16 xq[], /* O */ - SKP_int32 sLTP_Q16[], /* I/O LTP state */ - const SKP_int16 a_Q12[], /* I Short term prediction coefs */ - const SKP_int16 b_Q14[], /* I Long term prediction coefs */ - const SKP_int16 AR_shp_Q13[], /* I Noise shaping AR coefs */ - SKP_int lag, /* I Pitch lag */ - SKP_int32 HarmShapeFIRPacked_Q14, /* I */ - SKP_int Tilt_Q14, /* I Spectral tilt */ - SKP_int32 LF_shp_Q14, /* I */ - SKP_int32 Gain_Q16, /* I */ - SKP_int Lambda_Q10, /* I */ - SKP_int offset_Q10, /* I */ - SKP_int length, /* I Input length */ - SKP_int shapingLPCOrder, /* I Noise shaping AR filter order */ - SKP_int predictLPCOrder /* I Prediction filter order */ -); - -void SKP_Silk_NSQ( - SKP_Silk_encoder_state *psEncC, /* I/O Encoder State */ - SKP_Silk_encoder_control *psEncCtrlC, /* I Encoder Control */ - SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */ - const SKP_int16 x[], /* I prefiltered input signal */ - SKP_int8 q[], /* O quantized qulse signal */ - const SKP_int LSFInterpFactor_Q2, /* I LSF interpolation factor in Q2 */ - const SKP_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefficients */ - const SKP_int16 LTPCoef_Q14[ LTP_ORDER * NB_SUBFR ], /* I Long term prediction coefficients */ - const SKP_int16 AR2_Q13[ NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I */ - const SKP_int HarmShapeGain_Q14[ NB_SUBFR ], /* I */ - const SKP_int Tilt_Q14[ NB_SUBFR ], /* I Spectral tilt */ - const SKP_int32 LF_shp_Q14[ NB_SUBFR ], /* I */ - const SKP_int32 Gains_Q16[ NB_SUBFR ], /* I */ - const SKP_int Lambda_Q10, /* I */ - const SKP_int LTP_scale_Q14 /* I LTP state scaling */ -) -{ - SKP_int k, lag, start_idx, subfr_length, LSF_interpolation_flag; - const SKP_int16 *A_Q12, *B_Q14, *AR_shp_Q13; - SKP_int16 *pxq; - SKP_int32 sLTP_Q16[ 2 * MAX_FRAME_LENGTH ]; - SKP_int16 sLTP[ 2 * MAX_FRAME_LENGTH ]; - SKP_int32 HarmShapeFIRPacked_Q14; - SKP_int offset_Q10; - SKP_int32 FiltState[ MAX_LPC_ORDER ]; - SKP_int32 x_sc_Q10[ MAX_FRAME_LENGTH / NB_SUBFR ]; - - subfr_length = psEncC->frame_length / NB_SUBFR; - - NSQ->rand_seed = psEncCtrlC->Seed; - /* Set unvoiced lag to the previous one, overwrite later for voiced */ - lag = NSQ->lagPrev; - - SKP_assert( NSQ->prev_inv_gain_Q16 != 0 ); - - offset_Q10 = SKP_Silk_Quantization_Offsets_Q10[ psEncCtrlC->sigtype ][ psEncCtrlC->QuantOffsetType ]; - - if( LSFInterpFactor_Q2 == ( 1 << 2 ) ) { - LSF_interpolation_flag = 0; - } else { - LSF_interpolation_flag = 1; - } - - /* Setup pointers to start of sub frame */ - NSQ->sLTP_shp_buf_idx = psEncC->frame_length; - NSQ->sLTP_buf_idx = psEncC->frame_length; - pxq = &NSQ->xq[ psEncC->frame_length ]; - for( k = 0; k < NB_SUBFR; k++ ) { - A_Q12 = &PredCoef_Q12[ (( k >> 1 ) | ( 1 - LSF_interpolation_flag )) * MAX_LPC_ORDER ]; - B_Q14 = <PCoef_Q14[ k * LTP_ORDER ]; - AR_shp_Q13 = &AR2_Q13[ k * MAX_SHAPE_LPC_ORDER ]; - - /* Noise shape parameters */ - SKP_assert( HarmShapeGain_Q14[ k ] >= 0 ); - HarmShapeFIRPacked_Q14 = SKP_RSHIFT( HarmShapeGain_Q14[ k ], 2 ); - HarmShapeFIRPacked_Q14 |= SKP_LSHIFT( ( SKP_int32 )SKP_RSHIFT( HarmShapeGain_Q14[ k ], 1 ), 16 ); - - NSQ->rewhite_flag = 0; - if( psEncCtrlC->sigtype == SIG_TYPE_VOICED ) { - /* Voiced */ - lag = psEncCtrlC->pitchL[ k ]; - - /* Re-whitening */ - if( ( k & ( 3 - SKP_LSHIFT( LSF_interpolation_flag, 1 ) ) ) == 0 ) { - - /* Rewhiten with new A coefs */ - start_idx = psEncC->frame_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2; - SKP_assert( start_idx >= 0 ); - SKP_assert( start_idx <= psEncC->frame_length - psEncC->predictLPCOrder ); - - SKP_memset( FiltState, 0, psEncC->predictLPCOrder * sizeof( SKP_int32 ) ); - SKP_Silk_MA_Prediction( &NSQ->xq[ start_idx + k * ( psEncC->frame_length >> 2 ) ], - A_Q12, FiltState, sLTP + start_idx, psEncC->frame_length - start_idx, psEncC->predictLPCOrder ); - - NSQ->rewhite_flag = 1; - NSQ->sLTP_buf_idx = psEncC->frame_length; - } - } - - SKP_Silk_nsq_scale_states( NSQ, x, x_sc_Q10, psEncC->subfr_length, sLTP, - sLTP_Q16, k, LTP_scale_Q14, Gains_Q16, psEncCtrlC->pitchL ); - - SKP_Silk_noise_shape_quantizer( NSQ, psEncCtrlC->sigtype, x_sc_Q10, q, pxq, sLTP_Q16, A_Q12, B_Q14, - AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[ k ], Gains_Q16[ k ], Lambda_Q10, - offset_Q10, psEncC->subfr_length, psEncC->shapingLPCOrder, psEncC->predictLPCOrder - ); - - x += psEncC->subfr_length; - q += psEncC->subfr_length; - pxq += psEncC->subfr_length; - } - - /* Update lagPrev for next frame */ - NSQ->lagPrev = psEncCtrlC->pitchL[ NB_SUBFR - 1 ]; - - /* Save quantized speech and noise shaping signals */ - SKP_memcpy( NSQ->xq, &NSQ->xq[ psEncC->frame_length ], psEncC->frame_length * sizeof( SKP_int16 ) ); - SKP_memcpy( NSQ->sLTP_shp_Q10, &NSQ->sLTP_shp_Q10[ psEncC->frame_length ], psEncC->frame_length * sizeof( SKP_int32 ) ); - -#ifdef USE_UNQUANTIZED_LSFS - DEBUG_STORE_DATA( xq_unq_lsfs.pcm, NSQ->xq, psEncC->frame_length * sizeof( SKP_int16 ) ); -#endif - -} - -/***********************************/ -/* SKP_Silk_noise_shape_quantizer */ -/***********************************/ -SKP_INLINE void SKP_Silk_noise_shape_quantizer( - SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */ - SKP_int sigtype, /* I Signal type */ - const SKP_int32 x_sc_Q10[], /* I */ - SKP_int8 q[], /* O */ - SKP_int16 xq[], /* O */ - SKP_int32 sLTP_Q16[], /* I/O LTP state */ - const SKP_int16 a_Q12[], /* I Short term prediction coefs */ - const SKP_int16 b_Q14[], /* I Long term prediction coefs */ - const SKP_int16 AR_shp_Q13[], /* I Noise shaping AR coefs */ - SKP_int lag, /* I Pitch lag */ - SKP_int32 HarmShapeFIRPacked_Q14, /* I */ - SKP_int Tilt_Q14, /* I Spectral tilt */ - SKP_int32 LF_shp_Q14, /* I */ - SKP_int32 Gain_Q16, /* I */ - SKP_int Lambda_Q10, /* I */ - SKP_int offset_Q10, /* I */ - SKP_int length, /* I Input length */ - SKP_int shapingLPCOrder, /* I Noise shaping AR filter order */ - SKP_int predictLPCOrder /* I Prediction filter order */ -) -{ - SKP_int i, j; - SKP_int32 LTP_pred_Q14, LPC_pred_Q10, n_AR_Q10, n_LTP_Q14; - SKP_int32 n_LF_Q10, r_Q10, q_Q0, q_Q10; - SKP_int32 thr1_Q10, thr2_Q10, thr3_Q10; - SKP_int32 dither, exc_Q10, LPC_exc_Q10, xq_Q10; - SKP_int32 tmp1, tmp2, sLF_AR_shp_Q10; - SKP_int32 *psLPC_Q14, *shp_lag_ptr, *pred_lag_ptr; - - shp_lag_ptr = &NSQ->sLTP_shp_Q10[ NSQ->sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2 ]; - pred_lag_ptr = &sLTP_Q16[ NSQ->sLTP_buf_idx - lag + LTP_ORDER / 2 ]; - - /* Setup short term AR state */ - psLPC_Q14 = &NSQ->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - 1 ]; - - /* Quantization thresholds */ - thr1_Q10 = SKP_SUB_RSHIFT32( -1536, Lambda_Q10, 1 ); - thr2_Q10 = SKP_SUB_RSHIFT32( -512, Lambda_Q10, 1 ); - thr2_Q10 = SKP_ADD_RSHIFT32( thr2_Q10, SKP_SMULBB( offset_Q10, Lambda_Q10 ), 10 ); - thr3_Q10 = SKP_ADD_RSHIFT32( 512, Lambda_Q10, 1 ); - - for( i = 0; i < length; i++ ) { - /* Generate dither */ - NSQ->rand_seed = SKP_RAND( NSQ->rand_seed ); - - /* dither = rand_seed < 0 ? 0xFFFFFFFF : 0; */ - dither = SKP_RSHIFT( NSQ->rand_seed, 31 ); - - /* Short-term prediction */ - SKP_assert( ( predictLPCOrder & 1 ) == 0 ); /* check that order is even */ - /* check that array starts at 4-byte aligned address */ - SKP_assert( ( ( SKP_int64 )( ( SKP_int8* )a_Q12 - ( SKP_int8* )0 ) & 3 ) == 0 ); - SKP_assert( predictLPCOrder >= 10 ); /* check that unrolling works */ - /* Partially unrolled */ - LPC_pred_Q10 = SKP_SMULWB( psLPC_Q14[ 0 ], a_Q12[ 0 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -1 ], a_Q12[ 1 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -2 ], a_Q12[ 2 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -3 ], a_Q12[ 3 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -4 ], a_Q12[ 4 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -5 ], a_Q12[ 5 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -6 ], a_Q12[ 6 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -7 ], a_Q12[ 7 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -8 ], a_Q12[ 8 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -9 ], a_Q12[ 9 ] ); - for( j = 10; j < predictLPCOrder; j ++ ) { - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -j ], a_Q12[ j ] ); - } - /* Long-term prediction */ - if( sigtype == SIG_TYPE_VOICED ) { - /* Unrolled loop */ - LTP_pred_Q14 = SKP_SMULWB( pred_lag_ptr[ 0 ], b_Q14[ 0 ] ); - LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -1 ], b_Q14[ 1 ] ); - LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -2 ], b_Q14[ 2 ] ); - LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -3 ], b_Q14[ 3 ] ); - LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -4 ], b_Q14[ 4 ] ); - pred_lag_ptr++; - } else { - LTP_pred_Q14 = 0; - } - - /* Noise shape feedback */ - SKP_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is even */ - tmp2 = psLPC_Q14[ 0 ]; - tmp1 = NSQ->sAR2_Q14[ 0 ]; - NSQ->sAR2_Q14[ 0 ] = tmp2; - n_AR_Q10 = SKP_SMULWB( tmp2, AR_shp_Q13[ 0 ] ); - for( j = 2; j < shapingLPCOrder; j += 2 ) { - tmp2 = NSQ->sAR2_Q14[ j - 1 ]; - NSQ->sAR2_Q14[ j - 1 ] = tmp1; - n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, tmp1, AR_shp_Q13[ j - 1 ] ); - tmp1 = NSQ->sAR2_Q14[ j + 0 ]; - NSQ->sAR2_Q14[ j + 0 ] = tmp2; - n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, tmp2, AR_shp_Q13[ j ] ); - } - NSQ->sAR2_Q14[ shapingLPCOrder - 1 ] = tmp1; - n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, tmp1, AR_shp_Q13[ shapingLPCOrder - 1 ] ); - - n_AR_Q10 = SKP_RSHIFT( n_AR_Q10, 1 ); /* Q11 -> Q10 */ - n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, NSQ->sLF_AR_shp_Q12, Tilt_Q14 ); - - n_LF_Q10 = SKP_LSHIFT( SKP_SMULWB( NSQ->sLTP_shp_Q10[ NSQ->sLTP_shp_buf_idx - 1 ], LF_shp_Q14 ), 2 ); - n_LF_Q10 = SKP_SMLAWT( n_LF_Q10, NSQ->sLF_AR_shp_Q12, LF_shp_Q14 ); - - SKP_assert( lag > 0 || sigtype == SIG_TYPE_UNVOICED ); - - /* Long-term shaping */ - if( lag > 0 ) { - /* Symmetric, packed FIR coefficients */ - n_LTP_Q14 = SKP_SMULWB( SKP_ADD32( shp_lag_ptr[ 0 ], shp_lag_ptr[ -2 ] ), HarmShapeFIRPacked_Q14 ); - n_LTP_Q14 = SKP_SMLAWT( n_LTP_Q14, shp_lag_ptr[ -1 ], HarmShapeFIRPacked_Q14 ); - n_LTP_Q14 = SKP_LSHIFT( n_LTP_Q14, 6 ); - shp_lag_ptr++; - } else { - n_LTP_Q14 = 0; - } - - /* Input minus prediction plus noise feedback */ - //r = x[ i ] - LTP_pred - LPC_pred + n_AR + n_Tilt + n_LF + n_LTP; - tmp1 = SKP_SUB32( LTP_pred_Q14, n_LTP_Q14 ); /* Add Q14 stuff */ - tmp1 = SKP_RSHIFT( tmp1, 4 ); /* convert to Q10 */ - tmp1 = SKP_ADD32( tmp1, LPC_pred_Q10 ); /* add Q10 stuff */ - tmp1 = SKP_SUB32( tmp1, n_AR_Q10 ); /* subtract Q10 stuff */ - tmp1 = SKP_SUB32( tmp1, n_LF_Q10 ); /* subtract Q10 stuff */ - r_Q10 = SKP_SUB32( x_sc_Q10[ i ], tmp1 ); - - /* Flip sign depending on dither */ - r_Q10 = ( r_Q10 ^ dither ) - dither; - r_Q10 = SKP_SUB32( r_Q10, offset_Q10 ); - r_Q10 = SKP_LIMIT_32( r_Q10, -64 << 10, 64 << 10 ); - - /* Quantize */ - q_Q0 = 0; - q_Q10 = 0; - if( r_Q10 < thr2_Q10 ) { - if( r_Q10 < thr1_Q10 ) { - q_Q0 = SKP_RSHIFT_ROUND( SKP_ADD_RSHIFT32( r_Q10, Lambda_Q10, 1 ), 10 ); - q_Q10 = SKP_LSHIFT( q_Q0, 10 ); - } else { - q_Q0 = -1; - q_Q10 = -1024; - } - } else { - if( r_Q10 > thr3_Q10 ) { - q_Q0 = SKP_RSHIFT_ROUND( SKP_SUB_RSHIFT32( r_Q10, Lambda_Q10, 1 ), 10 ); - q_Q10 = SKP_LSHIFT( q_Q0, 10 ); - } - } - q[ i ] = ( SKP_int8 )q_Q0; /* No saturation needed because max is 64 */ - - /* Excitation */ - exc_Q10 = SKP_ADD32( q_Q10, offset_Q10 ); - exc_Q10 = ( exc_Q10 ^ dither ) - dither; - - /* Add predictions */ - LPC_exc_Q10 = SKP_ADD32( exc_Q10, SKP_RSHIFT_ROUND( LTP_pred_Q14, 4 ) ); - xq_Q10 = SKP_ADD32( LPC_exc_Q10, LPC_pred_Q10 ); - - /* Scale XQ back to normal level before saving */ - xq[ i ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND( SKP_SMULWW( xq_Q10, Gain_Q16 ), 10 ) ); - - - /* Update states */ - psLPC_Q14++; - *psLPC_Q14 = SKP_LSHIFT( xq_Q10, 4 ); - sLF_AR_shp_Q10 = SKP_SUB32( xq_Q10, n_AR_Q10 ); - NSQ->sLF_AR_shp_Q12 = SKP_LSHIFT( sLF_AR_shp_Q10, 2 ); - - NSQ->sLTP_shp_Q10[ NSQ->sLTP_shp_buf_idx ] = SKP_SUB32( sLF_AR_shp_Q10, n_LF_Q10 ); - sLTP_Q16[ NSQ->sLTP_buf_idx ] = SKP_LSHIFT( LPC_exc_Q10, 6 ); - NSQ->sLTP_shp_buf_idx++; - NSQ->sLTP_buf_idx++; - - /* Make dither dependent on quantized signal */ - NSQ->rand_seed += q[ i ]; - } - - /* Update LPC synth buffer */ - SKP_memcpy( NSQ->sLPC_Q14, &NSQ->sLPC_Q14[ length ], NSQ_LPC_BUF_LENGTH * sizeof( SKP_int32 ) ); -} - -SKP_INLINE void SKP_Silk_nsq_scale_states( - SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */ - const SKP_int16 x[], /* I input in Q0 */ - SKP_int32 x_sc_Q10[], /* O input scaled with 1/Gain */ - SKP_int subfr_length, /* I length of input */ - const SKP_int16 sLTP[], /* I re-whitened LTP state in Q0 */ - SKP_int32 sLTP_Q16[], /* O LTP state matching scaled input */ - SKP_int subfr, /* I subframe number */ - const SKP_int LTP_scale_Q14, /* I */ - const SKP_int32 Gains_Q16[ NB_SUBFR ], /* I */ - const SKP_int pitchL[ NB_SUBFR ] /* I */ -) -{ - SKP_int i, lag; - SKP_int32 inv_gain_Q16, gain_adj_Q16, inv_gain_Q32; - - inv_gain_Q16 = SKP_INVERSE32_varQ( SKP_max( Gains_Q16[ subfr ], 1 ), 32 ); - inv_gain_Q16 = SKP_min( inv_gain_Q16, SKP_int16_MAX ); - lag = pitchL[ subfr ]; - - /* After rewhitening the LTP state is un-scaled, so scale with inv_gain_Q16 */ - if( NSQ->rewhite_flag ) { - inv_gain_Q32 = SKP_LSHIFT( inv_gain_Q16, 16 ); - if( subfr == 0 ) { - /* Do LTP downscaling */ - inv_gain_Q32 = SKP_LSHIFT( SKP_SMULWB( inv_gain_Q32, LTP_scale_Q14 ), 2 ); - } - for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) { - SKP_assert( i < MAX_FRAME_LENGTH ); - sLTP_Q16[ i ] = SKP_SMULWB( inv_gain_Q32, sLTP[ i ] ); - } - } - - /* Adjust for changing gain */ - if( inv_gain_Q16 != NSQ->prev_inv_gain_Q16 ) { - gain_adj_Q16 = SKP_DIV32_varQ( inv_gain_Q16, NSQ->prev_inv_gain_Q16, 16 ); - - /* Scale long-term shaping state */ - for( i = NSQ->sLTP_shp_buf_idx - subfr_length * NB_SUBFR; i < NSQ->sLTP_shp_buf_idx; i++ ) { - NSQ->sLTP_shp_Q10[ i ] = SKP_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q10[ i ] ); - } - - /* Scale long-term prediction state */ - if( NSQ->rewhite_flag == 0 ) { - for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) { - sLTP_Q16[ i ] = SKP_SMULWW( gain_adj_Q16, sLTP_Q16[ i ] ); - } - } - - NSQ->sLF_AR_shp_Q12 = SKP_SMULWW( gain_adj_Q16, NSQ->sLF_AR_shp_Q12 ); - - /* Scale short-term prediction and shaping states */ - for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) { - NSQ->sLPC_Q14[ i ] = SKP_SMULWW( gain_adj_Q16, NSQ->sLPC_Q14[ i ] ); - } - for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) { - NSQ->sAR2_Q14[ i ] = SKP_SMULWW( gain_adj_Q16, NSQ->sAR2_Q14[ i ] ); - } - } - - /* Scale input */ - for( i = 0; i < subfr_length; i++ ) { - x_sc_Q10[ i ] = SKP_RSHIFT( SKP_SMULBB( x[ i ], ( SKP_int16 )inv_gain_Q16 ), 6 ); - } - - /* save inv_gain */ - SKP_assert( inv_gain_Q16 != 0 ); - NSQ->prev_inv_gain_Q16 = inv_gain_Q16; -} diff --git a/libs/silk/src/SKP_Silk_NSQ_del_dec.c b/libs/silk/src/SKP_Silk_NSQ_del_dec.c deleted file mode 100644 index 087c772795..0000000000 --- a/libs/silk/src/SKP_Silk_NSQ_del_dec.c +++ /dev/null @@ -1,703 +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" - -typedef struct { - SKP_int32 RandState[ DECISION_DELAY ]; - SKP_int32 Q_Q10[ DECISION_DELAY ]; - SKP_int32 Xq_Q10[ DECISION_DELAY ]; - SKP_int32 Pred_Q16[ DECISION_DELAY ]; - SKP_int32 Shape_Q10[ DECISION_DELAY ]; - SKP_int32 Gain_Q16[ DECISION_DELAY ]; - SKP_int32 sAR2_Q14[ MAX_SHAPE_LPC_ORDER ]; - SKP_int32 sLPC_Q14[ MAX_FRAME_LENGTH / NB_SUBFR + NSQ_LPC_BUF_LENGTH ]; - SKP_int32 LF_AR_Q12; - SKP_int32 Seed; - SKP_int32 SeedInit; - SKP_int32 RD_Q10; -} NSQ_del_dec_struct; - -typedef struct { - SKP_int32 Q_Q10; - SKP_int32 RD_Q10; - SKP_int32 xq_Q14; - SKP_int32 LF_AR_Q12; - SKP_int32 sLTP_shp_Q10; - SKP_int32 LPC_exc_Q16; -} NSQ_sample_struct; - -SKP_INLINE void SKP_Silk_copy_del_dec_state( - NSQ_del_dec_struct *DD_dst, /* I Dst del dec state */ - NSQ_del_dec_struct *DD_src, /* I Src del dec state */ - SKP_int LPC_state_idx /* I Index to LPC buffer */ -); - -SKP_INLINE void SKP_Silk_nsq_del_dec_scale_states( - SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */ - NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */ - const SKP_int16 x[], /* I Input in Q0 */ - SKP_int32 x_sc_Q10[], /* O Input scaled with 1/Gain in Q10 */ - SKP_int subfr_length, /* I Length of input */ - const SKP_int16 sLTP[], /* I Re-whitened LTP state in Q0 */ - SKP_int32 sLTP_Q16[], /* O LTP state matching scaled input */ - SKP_int subfr, /* I Subframe number */ - SKP_int nStatesDelayedDecision, /* I Number of del dec states */ - SKP_int smpl_buf_idx, /* I Index to newest samples in buffers */ - const SKP_int LTP_scale_Q14, /* I LTP state scaling */ - const SKP_int32 Gains_Q16[ NB_SUBFR ], /* I */ - const SKP_int pitchL[ NB_SUBFR ] /* I Pitch lag */ -); - -/******************************************/ -/* Noise shape quantizer for one subframe */ -/******************************************/ -SKP_INLINE void SKP_Silk_noise_shape_quantizer_del_dec( - SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */ - NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */ - SKP_int sigtype, /* I Signal type */ - const SKP_int32 x_Q10[], /* I */ - SKP_int8 q[], /* O */ - SKP_int16 xq[], /* O */ - SKP_int32 sLTP_Q16[], /* I/O LTP filter state */ - const SKP_int16 a_Q12[], /* I Short term prediction coefs */ - const SKP_int16 b_Q14[], /* I Long term prediction coefs */ - const SKP_int16 AR_shp_Q13[], /* I Noise shaping coefs */ - SKP_int lag, /* I Pitch lag */ - SKP_int32 HarmShapeFIRPacked_Q14, /* I */ - SKP_int Tilt_Q14, /* I Spectral tilt */ - SKP_int32 LF_shp_Q14, /* I */ - SKP_int32 Gain_Q16, /* I */ - SKP_int Lambda_Q10, /* I */ - SKP_int offset_Q10, /* I */ - SKP_int length, /* I Input length */ - SKP_int subfr, /* I Subframe number */ - SKP_int shapingLPCOrder, /* I Shaping LPC filter order */ - SKP_int predictLPCOrder, /* I Prediction filter order */ - SKP_int warping_Q16, /* I */ - SKP_int nStatesDelayedDecision, /* I Number of states in decision tree */ - SKP_int *smpl_buf_idx, /* I Index to newest samples in buffers */ - SKP_int decisionDelay /* I */ -); - -void SKP_Silk_NSQ_del_dec( - SKP_Silk_encoder_state *psEncC, /* I/O Encoder State */ - SKP_Silk_encoder_control *psEncCtrlC, /* I Encoder Control */ - SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */ - const SKP_int16 x[], /* I Prefiltered input signal */ - SKP_int8 q[], /* O Quantized pulse signal */ - const SKP_int LSFInterpFactor_Q2, /* I LSF interpolation factor in Q2 */ - const SKP_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Prediction coefs */ - const SKP_int16 LTPCoef_Q14[ LTP_ORDER * NB_SUBFR ], /* I LT prediction coefs */ - const SKP_int16 AR2_Q13[ NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I */ - const SKP_int HarmShapeGain_Q14[ NB_SUBFR ], /* I */ - const SKP_int Tilt_Q14[ NB_SUBFR ], /* I Spectral tilt */ - const SKP_int32 LF_shp_Q14[ NB_SUBFR ], /* I */ - const SKP_int32 Gains_Q16[ NB_SUBFR ], /* I */ - const SKP_int Lambda_Q10, /* I */ - const SKP_int LTP_scale_Q14 /* I LTP state scaling */ -) -{ - SKP_int i, k, lag, start_idx, LSF_interpolation_flag, Winner_ind, subfr; - SKP_int last_smple_idx, smpl_buf_idx, decisionDelay, subfr_length; - const SKP_int16 *A_Q12, *B_Q14, *AR_shp_Q13; - SKP_int16 *pxq; - SKP_int32 sLTP_Q16[ 2 * MAX_FRAME_LENGTH ]; - SKP_int16 sLTP[ 2 * MAX_FRAME_LENGTH ]; - SKP_int32 HarmShapeFIRPacked_Q14; - SKP_int offset_Q10; - SKP_int32 FiltState[ MAX_LPC_ORDER ], RDmin_Q10; - SKP_int32 x_sc_Q10[ MAX_FRAME_LENGTH / NB_SUBFR ]; - NSQ_del_dec_struct psDelDec[ MAX_DEL_DEC_STATES ]; - NSQ_del_dec_struct *psDD; - - subfr_length = psEncC->frame_length / NB_SUBFR; - - /* Set unvoiced lag to the previous one, overwrite later for voiced */ - lag = NSQ->lagPrev; - - SKP_assert( NSQ->prev_inv_gain_Q16 != 0 ); - - /* Initialize delayed decision states */ - SKP_memset( psDelDec, 0, psEncC->nStatesDelayedDecision * sizeof( NSQ_del_dec_struct ) ); - for( k = 0; k < psEncC->nStatesDelayedDecision; k++ ) { - psDD = &psDelDec[ k ]; - psDD->Seed = ( k + psEncCtrlC->Seed ) & 3; - psDD->SeedInit = psDD->Seed; - psDD->RD_Q10 = 0; - psDD->LF_AR_Q12 = NSQ->sLF_AR_shp_Q12; - psDD->Shape_Q10[ 0 ] = NSQ->sLTP_shp_Q10[ psEncC->frame_length - 1 ]; - SKP_memcpy( psDD->sLPC_Q14, NSQ->sLPC_Q14, NSQ_LPC_BUF_LENGTH * sizeof( SKP_int32 ) ); - SKP_memcpy( psDD->sAR2_Q14, NSQ->sAR2_Q14, sizeof( NSQ->sAR2_Q14 ) ); - } - - offset_Q10 = SKP_Silk_Quantization_Offsets_Q10[ psEncCtrlC->sigtype ][ psEncCtrlC->QuantOffsetType ]; - smpl_buf_idx = 0; /* index of oldest samples */ - - decisionDelay = SKP_min_int( DECISION_DELAY, subfr_length ); - - /* For voiced frames limit the decision delay to lower than the pitch lag */ - if( psEncCtrlC->sigtype == SIG_TYPE_VOICED ) { - for( k = 0; k < NB_SUBFR; k++ ) { - decisionDelay = SKP_min_int( decisionDelay, psEncCtrlC->pitchL[ k ] - LTP_ORDER / 2 - 1 ); - } - } else { - if( lag > 0 ) { - decisionDelay = SKP_min_int( decisionDelay, lag - LTP_ORDER / 2 - 1 ); - } - } - - if( LSFInterpFactor_Q2 == ( 1 << 2 ) ) { - LSF_interpolation_flag = 0; - } else { - LSF_interpolation_flag = 1; - } - - /* Setup pointers to start of sub frame */ - pxq = &NSQ->xq[ psEncC->frame_length ]; - NSQ->sLTP_shp_buf_idx = psEncC->frame_length; - NSQ->sLTP_buf_idx = psEncC->frame_length; - subfr = 0; - for( k = 0; k < NB_SUBFR; k++ ) { - A_Q12 = &PredCoef_Q12[ ( ( k >> 1 ) | ( 1 - LSF_interpolation_flag ) ) * MAX_LPC_ORDER ]; - B_Q14 = <PCoef_Q14[ k * LTP_ORDER ]; - AR_shp_Q13 = &AR2_Q13[ k * MAX_SHAPE_LPC_ORDER ]; - - /* Noise shape parameters */ - SKP_assert( HarmShapeGain_Q14[ k ] >= 0 ); - HarmShapeFIRPacked_Q14 = SKP_RSHIFT( HarmShapeGain_Q14[ k ], 2 ); - HarmShapeFIRPacked_Q14 |= SKP_LSHIFT( ( SKP_int32 )SKP_RSHIFT( HarmShapeGain_Q14[ k ], 1 ), 16 ); - - NSQ->rewhite_flag = 0; - if( psEncCtrlC->sigtype == SIG_TYPE_VOICED ) { - /* Voiced */ - lag = psEncCtrlC->pitchL[ k ]; - - /* Re-whitening */ - if( ( k & ( 3 - SKP_LSHIFT( LSF_interpolation_flag, 1 ) ) ) == 0 ) { - if( k == 2 ) { - /* RESET DELAYED DECISIONS */ - /* Find winner */ - RDmin_Q10 = psDelDec[ 0 ].RD_Q10; - Winner_ind = 0; - for( i = 1; i < psEncC->nStatesDelayedDecision; i++ ) { - if( psDelDec[ i ].RD_Q10 < RDmin_Q10 ) { - RDmin_Q10 = psDelDec[ i ].RD_Q10; - Winner_ind = i; - } - } - for( i = 0; i < psEncC->nStatesDelayedDecision; i++ ) { - if( i != Winner_ind ) { - psDelDec[ i ].RD_Q10 += ( SKP_int32_MAX >> 4 ); - SKP_assert( psDelDec[ i ].RD_Q10 >= 0 ); - } - } - - /* Copy final part of signals from winner state to output and long-term filter states */ - psDD = &psDelDec[ Winner_ind ]; - last_smple_idx = smpl_buf_idx + decisionDelay; - for( i = 0; i < decisionDelay; i++ ) { - last_smple_idx = ( last_smple_idx - 1 ) & DECISION_DELAY_MASK; - q[ i - decisionDelay ] = ( SKP_int8 )SKP_RSHIFT( psDD->Q_Q10[ last_smple_idx ], 10 ); - pxq[ i - decisionDelay ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND( - SKP_SMULWW( psDD->Xq_Q10[ last_smple_idx ], - psDD->Gain_Q16[ last_smple_idx ] ), 10 ) ); - NSQ->sLTP_shp_Q10[ NSQ->sLTP_shp_buf_idx - decisionDelay + i ] = psDD->Shape_Q10[ last_smple_idx ]; - } - - subfr = 0; - } - - /* Rewhiten with new A coefs */ - start_idx = psEncC->frame_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2; - SKP_assert( start_idx >= 0 ); - SKP_assert( start_idx <= psEncC->frame_length - psEncC->predictLPCOrder ); - - SKP_memset( FiltState, 0, psEncC->predictLPCOrder * sizeof( SKP_int32 ) ); - SKP_Silk_MA_Prediction( &NSQ->xq[ start_idx + k * psEncC->subfr_length ], - A_Q12, FiltState, sLTP + start_idx, psEncC->frame_length - start_idx, psEncC->predictLPCOrder ); - - NSQ->sLTP_buf_idx = psEncC->frame_length; - NSQ->rewhite_flag = 1; - } - } - - SKP_Silk_nsq_del_dec_scale_states( NSQ, psDelDec, x, x_sc_Q10, - subfr_length, sLTP, sLTP_Q16, k, psEncC->nStatesDelayedDecision, smpl_buf_idx, - LTP_scale_Q14, Gains_Q16, psEncCtrlC->pitchL ); - - SKP_Silk_noise_shape_quantizer_del_dec( NSQ, psDelDec, psEncCtrlC->sigtype, x_sc_Q10, q, pxq, sLTP_Q16, - A_Q12, B_Q14, AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[ k ], Gains_Q16[ k ], - Lambda_Q10, offset_Q10, psEncC->subfr_length, subfr++, psEncC->shapingLPCOrder, psEncC->predictLPCOrder, - psEncC->warping_Q16, psEncC->nStatesDelayedDecision, &smpl_buf_idx, decisionDelay ); - - x += psEncC->subfr_length; - q += psEncC->subfr_length; - pxq += psEncC->subfr_length; - } - - /* Find winner */ - RDmin_Q10 = psDelDec[ 0 ].RD_Q10; - Winner_ind = 0; - for( k = 1; k < psEncC->nStatesDelayedDecision; k++ ) { - if( psDelDec[ k ].RD_Q10 < RDmin_Q10 ) { - RDmin_Q10 = psDelDec[ k ].RD_Q10; - Winner_ind = k; - } - } - - /* Copy final part of signals from winner state to output and long-term filter states */ - psDD = &psDelDec[ Winner_ind ]; - psEncCtrlC->Seed = psDD->SeedInit; - last_smple_idx = smpl_buf_idx + decisionDelay; - for( i = 0; i < decisionDelay; i++ ) { - last_smple_idx = ( last_smple_idx - 1 ) & DECISION_DELAY_MASK; - q[ i - decisionDelay ] = ( SKP_int8 )SKP_RSHIFT( psDD->Q_Q10[ last_smple_idx ], 10 ); - pxq[ i - decisionDelay ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND( - SKP_SMULWW( psDD->Xq_Q10[ last_smple_idx ], psDD->Gain_Q16[ last_smple_idx ] ), 10 ) ); - NSQ->sLTP_shp_Q10[ NSQ->sLTP_shp_buf_idx - decisionDelay + i ] = psDD->Shape_Q10[ last_smple_idx ]; - sLTP_Q16[ NSQ->sLTP_buf_idx - decisionDelay + i ] = psDD->Pred_Q16[ last_smple_idx ]; - } - SKP_memcpy( NSQ->sLPC_Q14, &psDD->sLPC_Q14[ psEncC->subfr_length ], NSQ_LPC_BUF_LENGTH * sizeof( SKP_int32 ) ); - SKP_memcpy( NSQ->sAR2_Q14, psDD->sAR2_Q14, sizeof( psDD->sAR2_Q14 ) ); - - /* Update states */ - NSQ->sLF_AR_shp_Q12 = psDD->LF_AR_Q12; - NSQ->lagPrev = psEncCtrlC->pitchL[ NB_SUBFR - 1 ]; - - /* Save quantized speech and noise shaping signals */ - SKP_memcpy( NSQ->xq, &NSQ->xq[ psEncC->frame_length ], psEncC->frame_length * sizeof( SKP_int16 ) ); - SKP_memcpy( NSQ->sLTP_shp_Q10, &NSQ->sLTP_shp_Q10[ psEncC->frame_length ], psEncC->frame_length * sizeof( SKP_int32 ) ); - -#ifdef USE_UNQUANTIZED_LSFS - DEBUG_STORE_DATA( xq_unq_lsfs.pcm, NSQ->xq, psEncC->frame_length * sizeof( SKP_int16 ) ); -#endif - -} - -/******************************************/ -/* Noise shape quantizer for one subframe */ -/******************************************/ -SKP_INLINE void SKP_Silk_noise_shape_quantizer_del_dec( - SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */ - NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */ - SKP_int sigtype, /* I Signal type */ - const SKP_int32 x_Q10[], /* I */ - SKP_int8 q[], /* O */ - SKP_int16 xq[], /* O */ - SKP_int32 sLTP_Q16[], /* I/O LTP filter state */ - const SKP_int16 a_Q12[], /* I Short term prediction coefs */ - const SKP_int16 b_Q14[], /* I Long term prediction coefs */ - const SKP_int16 AR_shp_Q13[], /* I Noise shaping coefs */ - SKP_int lag, /* I Pitch lag */ - SKP_int32 HarmShapeFIRPacked_Q14, /* I */ - SKP_int Tilt_Q14, /* I Spectral tilt */ - SKP_int32 LF_shp_Q14, /* I */ - SKP_int32 Gain_Q16, /* I */ - SKP_int Lambda_Q10, /* I */ - SKP_int offset_Q10, /* I */ - SKP_int length, /* I Input length */ - SKP_int subfr, /* I Subframe number */ - SKP_int shapingLPCOrder, /* I Shaping LPC filter order */ - SKP_int predictLPCOrder, /* I Prediction filter order */ - SKP_int warping_Q16, /* I */ - SKP_int nStatesDelayedDecision, /* I Number of states in decision tree */ - SKP_int *smpl_buf_idx, /* I Index to newest samples in buffers */ - SKP_int decisionDelay /* I */ -) -{ - SKP_int i, j, k, Winner_ind, RDmin_ind, RDmax_ind, last_smple_idx; - SKP_int32 Winner_rand_state; - SKP_int32 LTP_pred_Q14, LPC_pred_Q10, n_AR_Q10, n_LTP_Q14; - SKP_int32 n_LF_Q10, r_Q10, rr_Q20, rd1_Q10, rd2_Q10, RDmin_Q10, RDmax_Q10; - SKP_int32 q1_Q10, q2_Q10, dither, exc_Q10, LPC_exc_Q10, xq_Q10; - SKP_int32 tmp1, tmp2, sLF_AR_shp_Q10; - SKP_int32 *pred_lag_ptr, *shp_lag_ptr, *psLPC_Q14; - NSQ_sample_struct psSampleState[ MAX_DEL_DEC_STATES ][ 2 ]; - NSQ_del_dec_struct *psDD; - NSQ_sample_struct *psSS; - - shp_lag_ptr = &NSQ->sLTP_shp_Q10[ NSQ->sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2 ]; - pred_lag_ptr = &sLTP_Q16[ NSQ->sLTP_buf_idx - lag + LTP_ORDER / 2 ]; - - for( i = 0; i < length; i++ ) { - /* Perform common calculations used in all states */ - - /* Long-term prediction */ - if( sigtype == SIG_TYPE_VOICED ) { - /* Unrolled loop */ - LTP_pred_Q14 = SKP_SMULWB( pred_lag_ptr[ 0 ], b_Q14[ 0 ] ); - LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -1 ], b_Q14[ 1 ] ); - LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -2 ], b_Q14[ 2 ] ); - LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -3 ], b_Q14[ 3 ] ); - LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -4 ], b_Q14[ 4 ] ); - pred_lag_ptr++; - } else { - LTP_pred_Q14 = 0; - } - - /* Long-term shaping */ - if( lag > 0 ) { - /* Symmetric, packed FIR coefficients */ - n_LTP_Q14 = SKP_SMULWB( SKP_ADD32( shp_lag_ptr[ 0 ], shp_lag_ptr[ -2 ] ), HarmShapeFIRPacked_Q14 ); - n_LTP_Q14 = SKP_SMLAWT( n_LTP_Q14, shp_lag_ptr[ -1 ], HarmShapeFIRPacked_Q14 ); - n_LTP_Q14 = SKP_LSHIFT( n_LTP_Q14, 6 ); - shp_lag_ptr++; - } else { - n_LTP_Q14 = 0; - } - - for( k = 0; k < nStatesDelayedDecision; k++ ) { - /* Delayed decision state */ - psDD = &psDelDec[ k ]; - - /* Sample state */ - psSS = psSampleState[ k ]; - - /* Generate dither */ - psDD->Seed = SKP_RAND( psDD->Seed ); - - /* dither = rand_seed < 0 ? 0xFFFFFFFF : 0; */ - dither = SKP_RSHIFT( psDD->Seed, 31 ); - - /* Pointer used in short term prediction and shaping */ - psLPC_Q14 = &psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - 1 + i ]; - /* Short-term prediction */ - SKP_assert( predictLPCOrder >= 10 ); /* check that unrolling works */ - SKP_assert( ( predictLPCOrder & 1 ) == 0 ); /* check that order is even */ - SKP_assert( ( ( ( int )( ( char* )( a_Q12 ) - ( ( char* ) 0 ) ) ) & 3 ) == 0 ); /* check that array starts at 4-byte aligned address */ - /* Partially unrolled */ - LPC_pred_Q10 = SKP_SMULWB( psLPC_Q14[ 0 ], a_Q12[ 0 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -1 ], a_Q12[ 1 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -2 ], a_Q12[ 2 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -3 ], a_Q12[ 3 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -4 ], a_Q12[ 4 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -5 ], a_Q12[ 5 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -6 ], a_Q12[ 6 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -7 ], a_Q12[ 7 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -8 ], a_Q12[ 8 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -9 ], a_Q12[ 9 ] ); - for( j = 10; j < predictLPCOrder; j ++ ) { - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -j ], a_Q12[ j ] ); - } - - /* Noise shape feedback */ - SKP_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is even */ - /* Output of lowpass section */ - tmp2 = SKP_SMLAWB( psLPC_Q14[ 0 ], psDD->sAR2_Q14[ 0 ], warping_Q16 ); - /* Output of allpass section */ - tmp1 = SKP_SMLAWB( psDD->sAR2_Q14[ 0 ], psDD->sAR2_Q14[ 1 ] - tmp2, warping_Q16 ); - psDD->sAR2_Q14[ 0 ] = tmp2; - n_AR_Q10 = SKP_SMULWB( tmp2, AR_shp_Q13[ 0 ] ); - /* Loop over allpass sections */ - for( j = 2; j < shapingLPCOrder; j += 2 ) { - /* Output of allpass section */ - tmp2 = SKP_SMLAWB( psDD->sAR2_Q14[ j - 1 ], psDD->sAR2_Q14[ j + 0 ] - tmp1, warping_Q16 ); - psDD->sAR2_Q14[ j - 1 ] = tmp1; - n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, tmp1, AR_shp_Q13[ j - 1 ] ); - /* Output of allpass section */ - tmp1 = SKP_SMLAWB( psDD->sAR2_Q14[ j + 0 ], psDD->sAR2_Q14[ j + 1 ] - tmp2, warping_Q16 ); - psDD->sAR2_Q14[ j + 0 ] = tmp2; - n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, tmp2, AR_shp_Q13[ j ] ); - } - psDD->sAR2_Q14[ shapingLPCOrder - 1 ] = tmp1; - n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, tmp1, AR_shp_Q13[ shapingLPCOrder - 1 ] ); - - n_AR_Q10 = SKP_RSHIFT( n_AR_Q10, 1 ); /* Q11 -> Q10 */ - n_AR_Q10 = SKP_SMLAWB( n_AR_Q10, psDD->LF_AR_Q12, Tilt_Q14 ); - - n_LF_Q10 = SKP_LSHIFT( SKP_SMULWB( psDD->Shape_Q10[ *smpl_buf_idx ], LF_shp_Q14 ), 2 ); - n_LF_Q10 = SKP_SMLAWT( n_LF_Q10, psDD->LF_AR_Q12, LF_shp_Q14 ); - - /* Input minus prediction plus noise feedback */ - /* r = x[ i ] - LTP_pred - LPC_pred + n_AR + n_Tilt + n_LF + n_LTP */ - tmp1 = SKP_SUB32( LTP_pred_Q14, n_LTP_Q14 ); /* Add Q14 stuff */ - tmp1 = SKP_RSHIFT( tmp1, 4 ); /* convert to Q10 */ - tmp1 = SKP_ADD32( tmp1, LPC_pred_Q10 ); /* add Q10 stuff */ - tmp1 = SKP_SUB32( tmp1, n_AR_Q10 ); /* subtract Q10 stuff */ - tmp1 = SKP_SUB32( tmp1, n_LF_Q10 ); /* subtract Q10 stuff */ - r_Q10 = SKP_SUB32( x_Q10[ i ], tmp1 ); /* residual error Q10 */ - - /* Flip sign depending on dither */ - r_Q10 = ( r_Q10 ^ dither ) - dither; - r_Q10 = SKP_SUB32( r_Q10, offset_Q10 ); - r_Q10 = SKP_LIMIT_32( r_Q10, -64 << 10, 64 << 10 ); - - /* Find two quantization level candidates and measure their rate-distortion */ - if( r_Q10 < -1536 ) { - q1_Q10 = SKP_LSHIFT( SKP_RSHIFT_ROUND( r_Q10, 10 ), 10 ); - r_Q10 = SKP_SUB32( r_Q10, q1_Q10 ); - rd1_Q10 = SKP_RSHIFT( SKP_SMLABB( SKP_MUL( -SKP_ADD32( q1_Q10, offset_Q10 ), Lambda_Q10 ), r_Q10, r_Q10 ), 10 ); - rd2_Q10 = SKP_ADD32( rd1_Q10, 1024 ); - rd2_Q10 = SKP_SUB32( rd2_Q10, SKP_ADD_LSHIFT32( Lambda_Q10, r_Q10, 1 ) ); - q2_Q10 = SKP_ADD32( q1_Q10, 1024 ); - } else if( r_Q10 > 512 ) { - q1_Q10 = SKP_LSHIFT( SKP_RSHIFT_ROUND( r_Q10, 10 ), 10 ); - r_Q10 = SKP_SUB32( r_Q10, q1_Q10 ); - rd1_Q10 = SKP_RSHIFT( SKP_SMLABB( SKP_MUL( SKP_ADD32( q1_Q10, offset_Q10 ), Lambda_Q10 ), r_Q10, r_Q10 ), 10 ); - rd2_Q10 = SKP_ADD32( rd1_Q10, 1024 ); - rd2_Q10 = SKP_SUB32( rd2_Q10, SKP_SUB_LSHIFT32( Lambda_Q10, r_Q10, 1 ) ); - q2_Q10 = SKP_SUB32( q1_Q10, 1024 ); - } else { /* r_Q10 >= -1536 && q1_Q10 <= 512 */ - rr_Q20 = SKP_SMULBB( offset_Q10, Lambda_Q10 ); - rd2_Q10 = SKP_RSHIFT( SKP_SMLABB( rr_Q20, r_Q10, r_Q10 ), 10 ); - rd1_Q10 = SKP_ADD32( rd2_Q10, 1024 ); - rd1_Q10 = SKP_ADD32( rd1_Q10, SKP_SUB_RSHIFT32( SKP_ADD_LSHIFT32( Lambda_Q10, r_Q10, 1 ), rr_Q20, 9 ) ); - q1_Q10 = -1024; - q2_Q10 = 0; - } - - if( rd1_Q10 < rd2_Q10 ) { - psSS[ 0 ].RD_Q10 = SKP_ADD32( psDD->RD_Q10, rd1_Q10 ); - psSS[ 1 ].RD_Q10 = SKP_ADD32( psDD->RD_Q10, rd2_Q10 ); - psSS[ 0 ].Q_Q10 = q1_Q10; - psSS[ 1 ].Q_Q10 = q2_Q10; - } else { - psSS[ 0 ].RD_Q10 = SKP_ADD32( psDD->RD_Q10, rd2_Q10 ); - psSS[ 1 ].RD_Q10 = SKP_ADD32( psDD->RD_Q10, rd1_Q10 ); - psSS[ 0 ].Q_Q10 = q2_Q10; - psSS[ 1 ].Q_Q10 = q1_Q10; - } - - /* Update states for best quantization */ - - /* Quantized excitation */ - exc_Q10 = SKP_ADD32( offset_Q10, psSS[ 0 ].Q_Q10 ); - exc_Q10 = ( exc_Q10 ^ dither ) - dither; - - /* Add predictions */ - LPC_exc_Q10 = exc_Q10 + SKP_RSHIFT_ROUND( LTP_pred_Q14, 4 ); - xq_Q10 = SKP_ADD32( LPC_exc_Q10, LPC_pred_Q10 ); - - /* Update states */ - sLF_AR_shp_Q10 = SKP_SUB32( xq_Q10, n_AR_Q10 ); - psSS[ 0 ].sLTP_shp_Q10 = SKP_SUB32( sLF_AR_shp_Q10, n_LF_Q10 ); - psSS[ 0 ].LF_AR_Q12 = SKP_LSHIFT( sLF_AR_shp_Q10, 2 ); - psSS[ 0 ].xq_Q14 = SKP_LSHIFT( xq_Q10, 4 ); - psSS[ 0 ].LPC_exc_Q16 = SKP_LSHIFT( LPC_exc_Q10, 6 ); - - /* Update states for second best quantization */ - - /* Quantized excitation */ - exc_Q10 = SKP_ADD32( offset_Q10, psSS[ 1 ].Q_Q10 ); - exc_Q10 = ( exc_Q10 ^ dither ) - dither; - - /* Add predictions */ - LPC_exc_Q10 = exc_Q10 + SKP_RSHIFT_ROUND( LTP_pred_Q14, 4 ); - xq_Q10 = SKP_ADD32( LPC_exc_Q10, LPC_pred_Q10 ); - - /* Update states */ - sLF_AR_shp_Q10 = SKP_SUB32( xq_Q10, n_AR_Q10 ); - psSS[ 1 ].sLTP_shp_Q10 = SKP_SUB32( sLF_AR_shp_Q10, n_LF_Q10 ); - psSS[ 1 ].LF_AR_Q12 = SKP_LSHIFT( sLF_AR_shp_Q10, 2 ); - psSS[ 1 ].xq_Q14 = SKP_LSHIFT( xq_Q10, 4 ); - psSS[ 1 ].LPC_exc_Q16 = SKP_LSHIFT( LPC_exc_Q10, 6 ); - } - - *smpl_buf_idx = ( *smpl_buf_idx - 1 ) & DECISION_DELAY_MASK; /* Index to newest samples */ - last_smple_idx = ( *smpl_buf_idx + decisionDelay ) & DECISION_DELAY_MASK; /* Index to decisionDelay old samples */ - - /* Find winner */ - RDmin_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10; - Winner_ind = 0; - for( k = 1; k < nStatesDelayedDecision; k++ ) { - if( psSampleState[ k ][ 0 ].RD_Q10 < RDmin_Q10 ) { - RDmin_Q10 = psSampleState[ k ][ 0 ].RD_Q10; - Winner_ind = k; - } - } - - /* Increase RD values of expired states */ - Winner_rand_state = psDelDec[ Winner_ind ].RandState[ last_smple_idx ]; - for( k = 0; k < nStatesDelayedDecision; k++ ) { - if( psDelDec[ k ].RandState[ last_smple_idx ] != Winner_rand_state ) { - psSampleState[ k ][ 0 ].RD_Q10 = SKP_ADD32( psSampleState[ k ][ 0 ].RD_Q10, ( SKP_int32_MAX >> 4 ) ); - psSampleState[ k ][ 1 ].RD_Q10 = SKP_ADD32( psSampleState[ k ][ 1 ].RD_Q10, ( SKP_int32_MAX >> 4 ) ); - SKP_assert( psSampleState[ k ][ 0 ].RD_Q10 >= 0 ); - } - } - - /* Find worst in first set and best in second set */ - RDmax_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10; - RDmin_Q10 = psSampleState[ 0 ][ 1 ].RD_Q10; - RDmax_ind = 0; - RDmin_ind = 0; - for( k = 1; k < nStatesDelayedDecision; k++ ) { - /* find worst in first set */ - if( psSampleState[ k ][ 0 ].RD_Q10 > RDmax_Q10 ) { - RDmax_Q10 = psSampleState[ k ][ 0 ].RD_Q10; - RDmax_ind = k; - } - /* find best in second set */ - if( psSampleState[ k ][ 1 ].RD_Q10 < RDmin_Q10 ) { - RDmin_Q10 = psSampleState[ k ][ 1 ].RD_Q10; - RDmin_ind = k; - } - } - - /* Replace a state if best from second set outperforms worst in first set */ - if( RDmin_Q10 < RDmax_Q10 ) { - SKP_Silk_copy_del_dec_state( &psDelDec[ RDmax_ind ], &psDelDec[ RDmin_ind ], i ); - SKP_memcpy( &psSampleState[ RDmax_ind ][ 0 ], &psSampleState[ RDmin_ind ][ 1 ], sizeof( NSQ_sample_struct ) ); - } - - /* Write samples from winner to output and long-term filter states */ - psDD = &psDelDec[ Winner_ind ]; - if( subfr > 0 || i >= decisionDelay ) { - q[ i - decisionDelay ] = ( SKP_int8 )SKP_RSHIFT( psDD->Q_Q10[ last_smple_idx ], 10 ); - xq[ i - decisionDelay ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND( - SKP_SMULWW( psDD->Xq_Q10[ last_smple_idx ], psDD->Gain_Q16[ last_smple_idx ] ), 10 ) ); - NSQ->sLTP_shp_Q10[ NSQ->sLTP_shp_buf_idx - decisionDelay ] = psDD->Shape_Q10[ last_smple_idx ]; - sLTP_Q16[ NSQ->sLTP_buf_idx - decisionDelay ] = psDD->Pred_Q16[ last_smple_idx ]; - } - NSQ->sLTP_shp_buf_idx++; - NSQ->sLTP_buf_idx++; - - /* Update states */ - for( k = 0; k < nStatesDelayedDecision; k++ ) { - psDD = &psDelDec[ k ]; - psSS = &psSampleState[ k ][ 0 ]; - psDD->LF_AR_Q12 = psSS->LF_AR_Q12; - psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH + i ] = psSS->xq_Q14; - psDD->Xq_Q10[ *smpl_buf_idx ] = SKP_RSHIFT( psSS->xq_Q14, 4 ); - psDD->Q_Q10[ *smpl_buf_idx ] = psSS->Q_Q10; - psDD->Pred_Q16[ *smpl_buf_idx ] = psSS->LPC_exc_Q16; - psDD->Shape_Q10[ *smpl_buf_idx ] = psSS->sLTP_shp_Q10; - psDD->Seed = SKP_ADD_RSHIFT32( psDD->Seed, psSS->Q_Q10, 10 ); - psDD->RandState[ *smpl_buf_idx ] = psDD->Seed; - psDD->RD_Q10 = psSS->RD_Q10; - psDD->Gain_Q16[ *smpl_buf_idx ] = Gain_Q16; - } - } - /* Update LPC states */ - for( k = 0; k < nStatesDelayedDecision; k++ ) { - psDD = &psDelDec[ k ]; - SKP_memcpy( psDD->sLPC_Q14, &psDD->sLPC_Q14[ length ], NSQ_LPC_BUF_LENGTH * sizeof( SKP_int32 ) ); - } -} - -SKP_INLINE void SKP_Silk_nsq_del_dec_scale_states( - SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */ - NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */ - const SKP_int16 x[], /* I Input in Q0 */ - SKP_int32 x_sc_Q10[], /* O Input scaled with 1/Gain in Q10 */ - SKP_int subfr_length, /* I Length of input */ - const SKP_int16 sLTP[], /* I Re-whitened LTP state in Q0 */ - SKP_int32 sLTP_Q16[], /* O LTP state matching scaled input */ - SKP_int subfr, /* I Subframe number */ - SKP_int nStatesDelayedDecision, /* I Number of del dec states */ - SKP_int smpl_buf_idx, /* I Index to newest samples in buffers */ - const SKP_int LTP_scale_Q14, /* I LTP state scaling */ - const SKP_int32 Gains_Q16[ NB_SUBFR ], /* I */ - const SKP_int pitchL[ NB_SUBFR ] /* I Pitch lag */ -) -{ - SKP_int i, k, lag; - SKP_int32 inv_gain_Q16, gain_adj_Q16, inv_gain_Q32; - NSQ_del_dec_struct *psDD; - - inv_gain_Q16 = SKP_INVERSE32_varQ( SKP_max( Gains_Q16[ subfr ], 1 ), 32 ); - inv_gain_Q16 = SKP_min( inv_gain_Q16, SKP_int16_MAX ); - lag = pitchL[ subfr ]; - - /* After rewhitening the LTP state is un-scaled, so scale with inv_gain_Q16 */ - if( NSQ->rewhite_flag ) { - inv_gain_Q32 = SKP_LSHIFT( inv_gain_Q16, 16 ); - if( subfr == 0 ) { - /* Do LTP downscaling */ - inv_gain_Q32 = SKP_LSHIFT( SKP_SMULWB( inv_gain_Q32, LTP_scale_Q14 ), 2 ); - } - for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) { - SKP_assert( i < MAX_FRAME_LENGTH ); - sLTP_Q16[ i ] = SKP_SMULWB( inv_gain_Q32, sLTP[ i ] ); - } - } - - /* Adjust for changing gain */ - if( inv_gain_Q16 != NSQ->prev_inv_gain_Q16 ) { - gain_adj_Q16 = SKP_DIV32_varQ( inv_gain_Q16, NSQ->prev_inv_gain_Q16, 16 ); - - /* Scale long-term shaping state */ - for( i = NSQ->sLTP_shp_buf_idx - subfr_length * NB_SUBFR; i < NSQ->sLTP_shp_buf_idx; i++ ) { - NSQ->sLTP_shp_Q10[ i ] = SKP_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q10[ i ] ); - } - - /* Scale long-term prediction state */ - if( NSQ->rewhite_flag == 0 ) { - for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) { - sLTP_Q16[ i ] = SKP_SMULWW( gain_adj_Q16, sLTP_Q16[ i ] ); - } - } - - for( k = 0; k < nStatesDelayedDecision; k++ ) { - psDD = &psDelDec[ k ]; - - /* Scale scalar states */ - psDD->LF_AR_Q12 = SKP_SMULWW( gain_adj_Q16, psDD->LF_AR_Q12 ); - - /* Scale short-term prediction and shaping states */ - for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) { - psDD->sLPC_Q14[ i ] = SKP_SMULWW( gain_adj_Q16, psDD->sLPC_Q14[ i ] ); - } - for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) { - psDD->sAR2_Q14[ i ] = SKP_SMULWW( gain_adj_Q16, psDD->sAR2_Q14[ i ] ); - } - for( i = 0; i < DECISION_DELAY; i++ ) { - psDD->Pred_Q16[ i ] = SKP_SMULWW( gain_adj_Q16, psDD->Pred_Q16[ i ] ); - psDD->Shape_Q10[ i ] = SKP_SMULWW( gain_adj_Q16, psDD->Shape_Q10[ i ] ); - } - } - } - - /* Scale input */ - for( i = 0; i < subfr_length; i++ ) { - x_sc_Q10[ i ] = SKP_RSHIFT( SKP_SMULBB( x[ i ], ( SKP_int16 )inv_gain_Q16 ), 6 ); - } - - /* save inv_gain */ - SKP_assert( inv_gain_Q16 != 0 ); - NSQ->prev_inv_gain_Q16 = inv_gain_Q16; -} - -SKP_INLINE void SKP_Silk_copy_del_dec_state( - NSQ_del_dec_struct *DD_dst, /* I Dst del dec state */ - NSQ_del_dec_struct *DD_src, /* I Src del dec state */ - SKP_int LPC_state_idx /* I Index to LPC buffer */ -) -{ - SKP_memcpy( DD_dst->RandState, DD_src->RandState, sizeof( DD_src->RandState ) ); - SKP_memcpy( DD_dst->Q_Q10, DD_src->Q_Q10, sizeof( DD_src->Q_Q10 ) ); - SKP_memcpy( DD_dst->Pred_Q16, DD_src->Pred_Q16, sizeof( DD_src->Pred_Q16 ) ); - SKP_memcpy( DD_dst->Shape_Q10, DD_src->Shape_Q10, sizeof( DD_src->Shape_Q10 ) ); - SKP_memcpy( DD_dst->Xq_Q10, DD_src->Xq_Q10, sizeof( DD_src->Xq_Q10 ) ); - SKP_memcpy( DD_dst->sAR2_Q14, DD_src->sAR2_Q14, sizeof( DD_src->sAR2_Q14 ) ); - SKP_memcpy( &DD_dst->sLPC_Q14[ LPC_state_idx ], &DD_src->sLPC_Q14[ LPC_state_idx ], NSQ_LPC_BUF_LENGTH * sizeof( SKP_int32 ) ); - DD_dst->LF_AR_Q12 = DD_src->LF_AR_Q12; - DD_dst->Seed = DD_src->Seed; - DD_dst->SeedInit = DD_src->SeedInit; - DD_dst->RD_Q10 = DD_src->RD_Q10; -} diff --git a/libs/silk/src/SKP_Silk_PLC.c b/libs/silk/src/SKP_Silk_PLC.c deleted file mode 100644 index 3ee7ee0cdb..0000000000 --- a/libs/silk/src/SKP_Silk_PLC.c +++ /dev/null @@ -1,387 +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_PLC.h" - -#define NB_ATT 2 -static const SKP_int16 HARM_ATT_Q15[NB_ATT] = { 32440, 31130 }; /* 0.99, 0.95 */ -static const SKP_int16 PLC_RAND_ATTENUATE_V_Q15[NB_ATT] = { 31130, 26214 }; /* 0.95, 0.8 */ -static const SKP_int16 PLC_RAND_ATTENUATE_UV_Q15[NB_ATT] = { 32440, 29491 }; /* 0.99, 0.9 */ - -void SKP_Silk_PLC_Reset( - SKP_Silk_decoder_state *psDec /* I/O Decoder state */ -) -{ - psDec->sPLC.pitchL_Q8 = SKP_RSHIFT( psDec->frame_length, 1 ); -} - -void SKP_Silk_PLC( - SKP_Silk_decoder_state *psDec, /* I Decoder state */ - SKP_Silk_decoder_control *psDecCtrl, /* I Decoder control */ - SKP_int16 signal[], /* O Concealed signal */ - SKP_int length, /* I length of residual */ - SKP_int lost /* I Loss flag */ -) -{ - /* PLC control function */ - if( psDec->fs_kHz != psDec->sPLC.fs_kHz ) { - SKP_Silk_PLC_Reset( psDec ); - psDec->sPLC.fs_kHz = psDec->fs_kHz; - } - - if( lost ) { - /****************************/ - /* Generate Signal */ - /****************************/ - SKP_Silk_PLC_conceal( psDec, psDecCtrl, signal, length ); - - psDec->lossCnt++; - } else { - /****************************/ - /* Update state */ - /****************************/ - SKP_Silk_PLC_update( psDec, psDecCtrl, signal, length ); - } -} - -/**************************************************/ -/* Update state of PLC */ -/**************************************************/ -void SKP_Silk_PLC_update( - SKP_Silk_decoder_state *psDec, /* (I/O) Decoder state */ - SKP_Silk_decoder_control *psDecCtrl, /* (I/O) Decoder control */ - SKP_int16 signal[], - SKP_int length -) -{ - SKP_int32 LTP_Gain_Q14, temp_LTP_Gain_Q14; - SKP_int i, j; - SKP_Silk_PLC_struct *psPLC; - - psPLC = &psDec->sPLC; - - /* Update parameters used in case of packet loss */ - psDec->prev_sigtype = psDecCtrl->sigtype; - LTP_Gain_Q14 = 0; - if( psDecCtrl->sigtype == SIG_TYPE_VOICED ) { - /* Find the parameters for the last subframe which contains a pitch pulse */ - for( j = 0; j * psDec->subfr_length < psDecCtrl->pitchL[ NB_SUBFR - 1 ]; j++ ) { - temp_LTP_Gain_Q14 = 0; - for( i = 0; i < LTP_ORDER; i++ ) { - temp_LTP_Gain_Q14 += psDecCtrl->LTPCoef_Q14[ ( NB_SUBFR - 1 - j ) * LTP_ORDER + i ]; - } - if( temp_LTP_Gain_Q14 > LTP_Gain_Q14 ) { - LTP_Gain_Q14 = temp_LTP_Gain_Q14; - SKP_memcpy( psPLC->LTPCoef_Q14, - &psDecCtrl->LTPCoef_Q14[ SKP_SMULBB( NB_SUBFR - 1 - j, LTP_ORDER ) ], - LTP_ORDER * sizeof( SKP_int16 ) ); - - psPLC->pitchL_Q8 = SKP_LSHIFT( psDecCtrl->pitchL[ NB_SUBFR - 1 - j ], 8 ); - } - } - -#if USE_SINGLE_TAP - SKP_memset( psPLC->LTPCoef_Q14, 0, LTP_ORDER * sizeof( SKP_int16 ) ); - psPLC->LTPCoef_Q14[ LTP_ORDER / 2 ] = LTP_Gain_Q14; -#endif - - /* Limit LT coefs */ - if( LTP_Gain_Q14 < V_PITCH_GAIN_START_MIN_Q14 ) { - SKP_int scale_Q10; - SKP_int32 tmp; - - tmp = SKP_LSHIFT( V_PITCH_GAIN_START_MIN_Q14, 10 ); - scale_Q10 = SKP_DIV32( tmp, SKP_max( LTP_Gain_Q14, 1 ) ); - for( i = 0; i < LTP_ORDER; i++ ) { - psPLC->LTPCoef_Q14[ i ] = SKP_RSHIFT( SKP_SMULBB( psPLC->LTPCoef_Q14[ i ], scale_Q10 ), 10 ); - } - } else if( LTP_Gain_Q14 > V_PITCH_GAIN_START_MAX_Q14 ) { - SKP_int scale_Q14; - SKP_int32 tmp; - - tmp = SKP_LSHIFT( V_PITCH_GAIN_START_MAX_Q14, 14 ); - scale_Q14 = SKP_DIV32( tmp, SKP_max( LTP_Gain_Q14, 1 ) ); - for( i = 0; i < LTP_ORDER; i++ ) { - psPLC->LTPCoef_Q14[ i ] = SKP_RSHIFT( SKP_SMULBB( psPLC->LTPCoef_Q14[ i ], scale_Q14 ), 14 ); - } - } - } else { - psPLC->pitchL_Q8 = SKP_LSHIFT( SKP_SMULBB( psDec->fs_kHz, 18 ), 8 ); - SKP_memset( psPLC->LTPCoef_Q14, 0, LTP_ORDER * sizeof( SKP_int16 )); - } - - /* Save LPC coeficients */ - SKP_memcpy( psPLC->prevLPC_Q12, psDecCtrl->PredCoef_Q12[ 1 ], psDec->LPC_order * sizeof( SKP_int16 ) ); - psPLC->prevLTP_scale_Q14 = psDecCtrl->LTP_scale_Q14; - - /* Save Gains */ - SKP_memcpy( psPLC->prevGain_Q16, psDecCtrl->Gains_Q16, NB_SUBFR * sizeof( SKP_int32 ) ); -} - -void SKP_Silk_PLC_conceal( - SKP_Silk_decoder_state *psDec, /* I/O Decoder state */ - SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */ - SKP_int16 signal[], /* O concealed signal */ - SKP_int length /* I length of residual */ -) -{ - SKP_int i, j, k; - SKP_int16 *B_Q14, exc_buf[ MAX_FRAME_LENGTH ], *exc_buf_ptr; - SKP_int16 rand_scale_Q14; - union { - SKP_int16 as_int16[ MAX_LPC_ORDER ]; - SKP_int32 as_int32[ MAX_LPC_ORDER / 2 ]; - } A_Q12_tmp; - SKP_int32 rand_seed, harm_Gain_Q15, rand_Gain_Q15; - SKP_int lag, idx, sLTP_buf_idx, shift1, shift2; - SKP_int32 energy1, energy2, *rand_ptr, *pred_lag_ptr; - SKP_int32 sig_Q10[ MAX_FRAME_LENGTH ], *sig_Q10_ptr, LPC_exc_Q10, LPC_pred_Q10, LTP_pred_Q14; - SKP_Silk_PLC_struct *psPLC; - psPLC = &psDec->sPLC; - - /* Update LTP buffer */ - SKP_memcpy( psDec->sLTP_Q16, &psDec->sLTP_Q16[ psDec->frame_length ], psDec->frame_length * sizeof( SKP_int32 ) ); - - /* LPC concealment. Apply BWE to previous LPC */ - SKP_Silk_bwexpander( psPLC->prevLPC_Q12, psDec->LPC_order, BWE_COEF_Q16 ); - - /* Find random noise component */ - /* Scale previous excitation signal */ - exc_buf_ptr = exc_buf; - for( k = ( NB_SUBFR >> 1 ); k < NB_SUBFR; k++ ) { - for( i = 0; i < psDec->subfr_length; i++ ) { - exc_buf_ptr[ i ] = ( SKP_int16 )SKP_RSHIFT( - SKP_SMULWW( psDec->exc_Q10[ i + k * psDec->subfr_length ], psPLC->prevGain_Q16[ k ] ), 10 ); - } - exc_buf_ptr += psDec->subfr_length; - } - /* Find the subframe with lowest energy of the last two and use that as random noise generator */ - SKP_Silk_sum_sqr_shift( &energy1, &shift1, exc_buf, psDec->subfr_length ); - SKP_Silk_sum_sqr_shift( &energy2, &shift2, &exc_buf[ psDec->subfr_length ], psDec->subfr_length ); - - if( SKP_RSHIFT( energy1, shift2 ) < SKP_RSHIFT( energy2, shift1 ) ) { - /* First sub-frame has lowest energy */ - rand_ptr = &psDec->exc_Q10[ SKP_max_int( 0, 3 * psDec->subfr_length - RAND_BUF_SIZE ) ]; - } else { - /* Second sub-frame has lowest energy */ - rand_ptr = &psDec->exc_Q10[ SKP_max_int( 0, psDec->frame_length - RAND_BUF_SIZE ) ]; - } - - /* Setup Gain to random noise component */ - B_Q14 = psPLC->LTPCoef_Q14; - rand_scale_Q14 = psPLC->randScale_Q14; - - /* Setup attenuation gains */ - harm_Gain_Q15 = HARM_ATT_Q15[ SKP_min_int( NB_ATT - 1, psDec->lossCnt ) ]; - if( psDec->prev_sigtype == SIG_TYPE_VOICED ) { - rand_Gain_Q15 = PLC_RAND_ATTENUATE_V_Q15[ SKP_min_int( NB_ATT - 1, psDec->lossCnt ) ]; - } else { - rand_Gain_Q15 = PLC_RAND_ATTENUATE_UV_Q15[ SKP_min_int( NB_ATT - 1, psDec->lossCnt ) ]; - } - - /* First Lost frame */ - if( psDec->lossCnt == 0 ) { - rand_scale_Q14 = (1 << 14 ); - - /* Reduce random noise Gain for voiced frames */ - if( psDec->prev_sigtype == SIG_TYPE_VOICED ) { - for( i = 0; i < LTP_ORDER; i++ ) { - rand_scale_Q14 -= B_Q14[ i ]; - } - rand_scale_Q14 = SKP_max_16( 3277, rand_scale_Q14 ); /* 0.2 */ - rand_scale_Q14 = ( SKP_int16 )SKP_RSHIFT( SKP_SMULBB( rand_scale_Q14, psPLC->prevLTP_scale_Q14 ), 14 ); - } - - /* Reduce random noise for unvoiced frames with high LPC gain */ - if( psDec->prev_sigtype == SIG_TYPE_UNVOICED ) { - SKP_int32 invGain_Q30, down_scale_Q30; - - 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_LSHIFT( down_scale_Q30, LOG2_INV_LPC_GAIN_HIGH_THRES ); - - rand_Gain_Q15 = SKP_RSHIFT( SKP_SMULWB( down_scale_Q30, rand_Gain_Q15 ), 14 ); - } - } - - rand_seed = psPLC->rand_seed; - lag = SKP_RSHIFT_ROUND( psPLC->pitchL_Q8, 8 ); - sLTP_buf_idx = psDec->frame_length; - - /***************************/ - /* LTP synthesis filtering */ - /***************************/ - sig_Q10_ptr = sig_Q10; - for( k = 0; k < NB_SUBFR; k++ ) { - /* Setup pointer */ - pred_lag_ptr = &psDec->sLTP_Q16[ sLTP_buf_idx - lag + LTP_ORDER / 2 ]; - for( i = 0; i < psDec->subfr_length; i++ ) { - rand_seed = SKP_RAND( rand_seed ); - idx = SKP_RSHIFT( rand_seed, 25 ) & RAND_BUF_MASK; - - /* Unrolled loop */ - LTP_pred_Q14 = SKP_SMULWB( pred_lag_ptr[ 0 ], B_Q14[ 0 ] ); - LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -1 ], B_Q14[ 1 ] ); - LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -2 ], B_Q14[ 2 ] ); - LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -3 ], B_Q14[ 3 ] ); - LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -4 ], B_Q14[ 4 ] ); - pred_lag_ptr++; - - /* Generate LPC residual */ - LPC_exc_Q10 = SKP_LSHIFT( SKP_SMULWB( rand_ptr[ idx ], rand_scale_Q14 ), 2 ); /* Random noise part */ - LPC_exc_Q10 = SKP_ADD32( LPC_exc_Q10, SKP_RSHIFT_ROUND( LTP_pred_Q14, 4 ) ); /* Harmonic part */ - - /* Update states */ - psDec->sLTP_Q16[ sLTP_buf_idx ] = SKP_LSHIFT( LPC_exc_Q10, 6 ); - sLTP_buf_idx++; - - /* Save LPC residual */ - sig_Q10_ptr[ i ] = LPC_exc_Q10; - } - sig_Q10_ptr += psDec->subfr_length; - /* Gradually reduce LTP gain */ - for( j = 0; j < LTP_ORDER; j++ ) { - B_Q14[ j ] = SKP_RSHIFT( SKP_SMULBB( harm_Gain_Q15, B_Q14[ j ] ), 15 ); - } - /* Gradually reduce excitation gain */ - rand_scale_Q14 = SKP_RSHIFT( SKP_SMULBB( rand_scale_Q14, rand_Gain_Q15 ), 15 ); - - /* Slowly increase pitch lag */ - psPLC->pitchL_Q8 += SKP_SMULWB( psPLC->pitchL_Q8, PITCH_DRIFT_FAC_Q16 ); - psPLC->pitchL_Q8 = SKP_min_32( psPLC->pitchL_Q8, SKP_LSHIFT( SKP_SMULBB( MAX_PITCH_LAG_MS, psDec->fs_kHz ), 8 ) ); - lag = SKP_RSHIFT_ROUND( psPLC->pitchL_Q8, 8 ); - } - - /***************************/ - /* LPC synthesis filtering */ - /***************************/ - sig_Q10_ptr = sig_Q10; - /* Preload LPC coeficients to array on stack. Gives small performance gain */ - SKP_memcpy( A_Q12_tmp.as_int16, psPLC->prevLPC_Q12, psDec->LPC_order * sizeof( SKP_int16 ) ); - SKP_assert( psDec->LPC_order >= 10 ); /* check that unrolling works */ - for( k = 0; k < NB_SUBFR; k++ ) { - for( i = 0; i < psDec->subfr_length; i++ ){ - /* partly unrolled */ - LPC_pred_Q10 = SKP_SMULWB( psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 1 ], A_Q12_tmp.as_int16[ 0 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 2 ], A_Q12_tmp.as_int16[ 1 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 3 ], A_Q12_tmp.as_int16[ 2 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 4 ], A_Q12_tmp.as_int16[ 3 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 5 ], A_Q12_tmp.as_int16[ 4 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 6 ], A_Q12_tmp.as_int16[ 5 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 7 ], A_Q12_tmp.as_int16[ 6 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 8 ], A_Q12_tmp.as_int16[ 7 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 9 ], A_Q12_tmp.as_int16[ 8 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 10 ], A_Q12_tmp.as_int16[ 9 ] ); - - for( j = 10; j < psDec->LPC_order; j++ ) { - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - j - 1 ], A_Q12_tmp.as_int16[ j ] ); - } - /* Add prediction to LPC residual */ - sig_Q10_ptr[ i ] = SKP_ADD32( sig_Q10_ptr[ i ], LPC_pred_Q10 ); - - /* Update states */ - psDec->sLPC_Q14[ MAX_LPC_ORDER + i ] = SKP_LSHIFT( sig_Q10_ptr[ i ], 4 ); - } - sig_Q10_ptr += psDec->subfr_length; - /* Update LPC filter state */ - SKP_memcpy( psDec->sLPC_Q14, &psDec->sLPC_Q14[ psDec->subfr_length ], MAX_LPC_ORDER * sizeof( SKP_int32 ) ); - } - - /* Scale with Gain */ - for( i = 0; i < psDec->frame_length; i++ ) { - signal[ i ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND( SKP_SMULWW( sig_Q10[ i ], psPLC->prevGain_Q16[ NB_SUBFR - 1 ] ), 10 ) ); - } - - /**************************************/ - /* Update states */ - /**************************************/ - psPLC->rand_seed = rand_seed; - psPLC->randScale_Q14 = rand_scale_Q14; - for( i = 0; i < NB_SUBFR; i++ ) { - psDecCtrl->pitchL[ i ] = lag; - } -} - -/* Glues concealed frames with new good recieved frames */ -void SKP_Silk_PLC_glue_frames( - SKP_Silk_decoder_state *psDec, /* I/O decoder state */ - SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */ - SKP_int16 signal[], /* I/O signal */ - SKP_int length /* I length of residual */ -) -{ - SKP_int i, energy_shift; - SKP_int32 energy; - SKP_Silk_PLC_struct *psPLC; - psPLC = &psDec->sPLC; - - if( psDec->lossCnt ) { - /* Calculate energy in concealed residual */ - SKP_Silk_sum_sqr_shift( &psPLC->conc_energy, &psPLC->conc_energy_shift, signal, length ); - - psPLC->last_frame_lost = 1; - } else { - if( psDec->sPLC.last_frame_lost ) { - /* Calculate residual in decoded signal if last frame was lost */ - SKP_Silk_sum_sqr_shift( &energy, &energy_shift, signal, length ); - - /* Normalize energies */ - if( energy_shift > psPLC->conc_energy_shift ) { - psPLC->conc_energy = SKP_RSHIFT( psPLC->conc_energy, energy_shift - psPLC->conc_energy_shift ); - } else if( energy_shift < psPLC->conc_energy_shift ) { - energy = SKP_RSHIFT( energy, psPLC->conc_energy_shift - energy_shift ); - } - - /* Fade in the energy difference */ - if( energy > psPLC->conc_energy ) { - SKP_int32 frac_Q24, LZ; - SKP_int32 gain_Q12, slope_Q12; - - LZ = SKP_Silk_CLZ32( psPLC->conc_energy ); - LZ = LZ - 1; - psPLC->conc_energy = SKP_LSHIFT( psPLC->conc_energy, LZ ); - energy = SKP_RSHIFT( energy, SKP_max_32( 24 - LZ, 0 ) ); - - 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 ); - - 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 ) ); - } - } - } - psPLC->last_frame_lost = 0; - - } -} diff --git a/libs/silk/src/SKP_Silk_PLC.h b/libs/silk/src/SKP_Silk_PLC.h deleted file mode 100644 index 33b3d2b4ff..0000000000 --- a/libs/silk/src/SKP_Silk_PLC.h +++ /dev/null @@ -1,78 +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_PLC_FIX_H -#define SKP_SILK_PLC_FIX_H - -#include "SKP_Silk_main.h" - -#define BWE_COEF_Q16 64880 /* 0.99 in Q16 */ -#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 -#define SA_THRES_Q8 50 -#define USE_SINGLE_TAP 1 -#define RAND_BUF_SIZE 128 -#define RAND_BUF_MASK (RAND_BUF_SIZE - 1) -#define LOG2_INV_LPC_GAIN_HIGH_THRES 3 /* 2^3 = 8 dB LPC gain */ -#define LOG2_INV_LPC_GAIN_LOW_THRES 8 /* 2^8 = 24 dB LPC gain */ -#define PITCH_DRIFT_FAC_Q16 655 /* 0.01 in Q16 */ - -void SKP_Silk_PLC_Reset( - SKP_Silk_decoder_state *psDec /* I/O Decoder state */ -); - -void SKP_Silk_PLC( - SKP_Silk_decoder_state *psDec, /* I/O Decoder state */ - SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */ - SKP_int16 signal[], /* I/O signal */ - SKP_int length, /* I length of residual */ - SKP_int lost /* I Loss flag */ -); - -void SKP_Silk_PLC_update( - SKP_Silk_decoder_state *psDec, /* I/O Decoder state */ - SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */ - SKP_int16 signal[], - SKP_int length -); - -void SKP_Silk_PLC_conceal( - SKP_Silk_decoder_state *psDec, /* I/O Decoder state */ - SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */ - SKP_int16 signal[], /* O LPC residual signal */ - SKP_int length /* I length of signal */ -); - -void SKP_Silk_PLC_glue_frames( - SKP_Silk_decoder_state *psDec, /* I/O decoder state */ - SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */ - SKP_int16 signal[], /* I/O signal */ - SKP_int length /* I length of signal */ -); - -#endif diff --git a/libs/silk/src/SKP_Silk_SigProc_FIX.h b/libs/silk/src/SKP_Silk_SigProc_FIX.h deleted file mode 100644 index a6ab3e1fea..0000000000 --- a/libs/silk/src/SKP_Silk_SigProc_FIX.h +++ /dev/null @@ -1,608 +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_SIGPROC_FIX_H_ -#define _SKP_SILK_SIGPROC_FIX_H_ - -#ifdef __cplusplus -extern "C" -{ -#endif - -#define SKP_Silk_MAX_ORDER_LPC 16 /* max order of the LPC analysis in schur() and k2a() */ -#define SKP_Silk_MAX_CORRELATION_LENGTH 640 /* max input length to the correlation */ -#include "SKP_Silk_typedef.h" -#include -#include /* for abs() */ -#include "SKP_Silk_resampler_structs.h" - -# include "SKP_Silk_macros.h" - - - -/********************************************************************/ -/* SIGNAL PROCESSING FUNCTIONS */ -/********************************************************************/ - -/*! - * Initialize/reset the resampler state for a given pair of input/output sampling rates -*/ -SKP_int SKP_Silk_resampler_init( - SKP_Silk_resampler_state_struct *S, /* I/O: Resampler state */ - SKP_int32 Fs_Hz_in, /* I: Input sampling rate (Hz) */ - SKP_int32 Fs_Hz_out /* I: Output sampling rate (Hz) */ -); - - -/*! - * Clear the states of all resampling filters, without resetting sampling rate ratio - */ -SKP_int SKP_Silk_resampler_clear( - SKP_Silk_resampler_state_struct *S /* I/O: Resampler state */ -); - -/*! - * Resampler: convert from one sampling rate to another - */ -SKP_int SKP_Silk_resampler( - SKP_Silk_resampler_state_struct *S, /* I/O: Resampler state */ - SKP_int16 out[], /* O: Output signal */ - const SKP_int16 in[], /* I: Input signal */ - SKP_int32 inLen /* I: Number of input samples */ -); - -/*! - Upsample 2x, low quality - */ -void SKP_Silk_resampler_up2( - SKP_int32 *S, /* I/O: State vector [ 2 ] */ - SKP_int16 *out, /* O: Output signal [ 2 * len ] */ - const SKP_int16 *in, /* I: Input signal [ len ] */ - SKP_int32 len /* I: Number of input samples */ -); - -/*! -* Downsample 2x, mediocre quality -*/ -void SKP_Silk_resampler_down2( - SKP_int32 *S, /* I/O: State vector [ 2 ] */ - SKP_int16 *out, /* O: Output signal [ len ] */ - const SKP_int16 *in, /* I: Input signal [ floor(len/2) ] */ - SKP_int32 inLen /* I: Number of input samples */ -); - - -/*! - * Downsample by a factor 2/3, low quality -*/ -void SKP_Silk_resampler_down2_3( - SKP_int32 *S, /* I/O: State vector [ 6 ] */ - SKP_int16 *out, /* O: Output signal [ floor(2*inLen/3) ] */ - const SKP_int16 *in, /* I: Input signal [ inLen ] */ - SKP_int32 inLen /* I: Number of input samples */ -); - -/*! - * Downsample by a factor 3, low quality -*/ -void SKP_Silk_resampler_down3( - SKP_int32 *S, /* I/O: State vector [ 8 ] */ - SKP_int16 *out, /* O: Output signal [ floor(inLen/3) ] */ - const SKP_int16 *in, /* I: Input signal [ inLen ] */ - SKP_int32 inLen /* I: Number of input samples */ -); - -/*! - * second order ARMA filter - * can handle (slowly) varying coefficients - */ -void SKP_Silk_biquad( - const SKP_int16 *in, /* I: input signal */ - const SKP_int16 *B, /* I: MA coefficients, Q13 [3] */ - const SKP_int16 *A, /* I: AR coefficients, Q13 [2] */ - SKP_int32 *S, /* I/O: state vector [2] */ - SKP_int16 *out, /* O: output signal */ - const SKP_int32 len /* I: signal length */ -); -/*! - * second order ARMA filter; - * slower than biquad() but uses more precise coefficients - * can handle (slowly) varying coefficients - */ -void SKP_Silk_biquad_alt( - const SKP_int16 *in, /* I: input signal */ - const SKP_int32 *B_Q28, /* I: MA coefficients [3] */ - const SKP_int32 *A_Q28, /* I: AR coefficients [2] */ - SKP_int32 *S, /* I/O: state vector [2] */ - SKP_int16 *out, /* O: output signal */ - const SKP_int32 len /* I: signal length (must be even) */ -); - -/*! - * variable order MA filter. Prediction error filter implementation. Coeficients negated and starting with coef to x[n - 1] - */ -void SKP_Silk_MA_Prediction( - const SKP_int16 *in, /* I: Input signal */ - const SKP_int16 *B, /* I: MA prediction coefficients, Q12 [order] */ - SKP_int32 *S, /* I/O: State vector [order] */ - SKP_int16 *out, /* O: Output signal */ - const SKP_int32 len, /* I: Signal length */ - const SKP_int32 order /* I: Filter order */ -); - -/*! - * 16th order AR filter for LPC synthesis, coefficients are in Q12 - */ -void SKP_Silk_LPC_synthesis_order16( - const SKP_int16 *in, /* I: excitation signal */ - const SKP_int16 *A_Q12, /* I: AR coefficients [16], between -8_Q0 and 8_Q0 */ - const SKP_int32 Gain_Q26, /* I: gain */ - SKP_int32 *S, /* I/O: state vector [16] */ - SKP_int16 *out, /* O: output signal */ - const SKP_int32 len /* I: signal length, must be multiple of 16 */ -); - -/* variable order MA prediction error filter. */ -/* Inverse filter of SKP_Silk_LPC_synthesis_filter */ -void SKP_Silk_LPC_analysis_filter( - const SKP_int16 *in, /* I: Input signal */ - const SKP_int16 *B, /* I: MA prediction coefficients, Q12 [order] */ - SKP_int16 *S, /* I/O: State vector [order] */ - SKP_int16 *out, /* O: Output signal */ - const SKP_int32 len, /* I: Signal length */ - const SKP_int32 Order /* I: Filter order */ -); - -/* even order AR filter */ -void SKP_Silk_LPC_synthesis_filter( - const SKP_int16 *in, /* I: excitation signal */ - const SKP_int16 *A_Q12, /* I: AR coefficients [Order], between -8_Q0 and 8_Q0 */ - const SKP_int32 Gain_Q26, /* I: gain */ - SKP_int32 *S, /* I/O: state vector [Order] */ - SKP_int16 *out, /* O: output signal */ - const SKP_int32 len, /* I: signal length */ - const SKP_int Order /* I: filter order, must be even */ -); - -/* Chirp (bandwidth expand) LP AR filter */ -void SKP_Silk_bwexpander( - SKP_int16 *ar, /* I/O AR filter to be expanded (without leading 1) */ - const SKP_int d, /* I Length of ar */ - SKP_int32 chirp_Q16 /* I Chirp factor (typically in the range 0 to 1) */ -); - -/* Chirp (bandwidth expand) LP AR filter */ -void SKP_Silk_bwexpander_32( - SKP_int32 *ar, /* I/O AR filter to be expanded (without leading 1) */ - const SKP_int d, /* I Length of ar */ - SKP_int32 chirp_Q16 /* I Chirp factor in Q16 */ -); - -/* Compute inverse of LPC prediction gain, and */ -/* test if LPC coefficients are stable (all poles within unit circle) */ -SKP_int SKP_Silk_LPC_inverse_pred_gain( /* O: Returns 1 if unstable, otherwise 0 */ - SKP_int32 *invGain_Q30, /* O: Inverse prediction gain, Q30 energy domain */ - const SKP_int16 *A_Q12, /* I: Prediction coefficients, Q12 [order] */ - const SKP_int order /* I: Prediction order */ -); - -SKP_int SKP_Silk_LPC_inverse_pred_gain_Q24( /* O: Returns 1 if unstable, otherwise 0 */ - SKP_int32 *invGain_Q30, /* O: Inverse prediction gain, Q30 energy domain */ - const SKP_int32 *A_Q24, /* I: Prediction coefficients, Q24 [order] */ - const SKP_int order /* I: Prediction order */ -); - -/* split signal in two decimated bands using first-order allpass filters */ -void SKP_Silk_ana_filt_bank_1( - const SKP_int16 *in, /* I: Input signal [N] */ - SKP_int32 *S, /* I/O: State vector [2] */ - SKP_int16 *outL, /* O: Low band [N/2] */ - SKP_int16 *outH, /* O: High band [N/2] */ - SKP_int32 *scratch, /* I: Scratch memory [3*N/2] */ - const SKP_int32 N /* I: Number of input samples */ -); - -/********************************************************************/ -/* SCALAR FUNCTIONS */ -/********************************************************************/ - -/* approximation of 128 * log2() (exact inverse of approx 2^() below) */ -/* convert input to a log scale */ -SKP_int32 SKP_Silk_lin2log(const SKP_int32 inLin); /* I: input in linear scale */ - -/* Approximation of a sigmoid function */ -SKP_int SKP_Silk_sigm_Q15(SKP_int in_Q5); - -/* approximation of 2^() (exact inverse of approx log2() above) */ -/* convert input to a linear scale */ -SKP_int32 SKP_Silk_log2lin(const SKP_int32 inLog_Q7); /* I: input on log scale */ - -/* Function that returns the maximum absolut value of the input vector */ -SKP_int16 SKP_Silk_int16_array_maxabs( /* O Maximum absolute value, max: 2^15-1 */ - const SKP_int16 *vec, /* I Input vector [len] */ - const SKP_int32 len /* I Length of input vector */ -); - -/* 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( - SKP_int32 *energy, /* O Energy of x, after shifting to the right */ - SKP_int *shift, /* O Number of bits right shift applied to energy */ - const SKP_int16 *x, /* I Input vector */ - SKP_int len /* I Length of input vector */ -); - -/* Calculates the reflection coefficients from the correlation sequence */ -/* Faster than schur64(), but much less accurate. */ -/* uses SMLAWB(), requiring armv5E and higher. */ -SKP_int32 SKP_Silk_schur( /* O: Returns residual energy */ - SKP_int16 *rc_Q15, /* O: reflection coefficients [order] Q15 */ - const SKP_int32 *c, /* I: correlations [order+1] */ - const SKP_int32 order /* I: prediction order */ -);; - -/* Calculates the reflection coefficients from the correlation sequence */ -/* Slower than schur(), but more accurate. */ -/* Uses SMULL(), available on armv4 */ -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 */ -); - -/* Step up function, converts reflection coefficients to prediction coefficients */ -void SKP_Silk_k2a( - SKP_int32 *A_Q24, /* O: Prediction coefficients [order] Q24 */ - const SKP_int16 *rc_Q15, /* I: Reflection coefficients [order] Q15 */ - const SKP_int32 order /* I: Prediction order */ -); - -/* Step up function, converts reflection coefficients to prediction coefficients */ -void SKP_Silk_k2a_Q16( - SKP_int32 *A_Q24, /* O: Prediction coefficients [order] Q24 */ - const SKP_int32 *rc_Q16, /* I: Reflection coefficients [order] Q16 */ - const SKP_int32 order /* I: Prediction order */ -); - -/* Apply sine window to signal vector. */ -/* Window types: */ -/* 1 -> sine window from 0 to pi/2 */ -/* 2 -> sine window from pi/2 to pi */ -/* Every other sample is linearly interpolated, for speed. */ -/* Window length must be between 16 and 120 (incl) and a multiple of 4. */ -void SKP_Silk_apply_sine_window_new( - SKP_int16 px_win[], /* O Pointer to windowed signal */ - const SKP_int16 px[], /* I Pointer to input signal */ - const SKP_int win_type, /* I Selects a window type */ - const SKP_int length /* I Window length, multiple of 4 */ -); - -/* Compute autocorrelation */ -void SKP_Silk_autocorr( - SKP_int32 *results, /* O Result (length correlationCount) */ - SKP_int *scale, /* O Scaling of the correlation vector */ - const SKP_int16 *inputData, /* I Input data to correlate */ - const SKP_int inputDataSize, /* I Length of input */ - const SKP_int correlationCount /* I Number of correlation taps to compute */ -); - -/* Pitch estimator */ -#define SKP_Silk_PITCH_EST_MIN_COMPLEX 0 -#define SKP_Silk_PITCH_EST_MID_COMPLEX 1 -#define SKP_Silk_PITCH_EST_MAX_COMPLEX 2 - -void SKP_Silk_decode_pitch( - SKP_int lagIndex, /* I */ - SKP_int contourIndex, /* O */ - SKP_int pitch_lags[], /* O 4 pitch values */ - SKP_int Fs_kHz /* I sampling frequency (kHz) */ -); - -SKP_int SKP_Silk_pitch_analysis_core( /* O Voicing estimate: 0 voiced, 1 unvoiced */ - const SKP_int16 *signal, /* I Signal of length PITCH_EST_FRAME_LENGTH_MS*Fs_kHz */ - SKP_int *pitch_out, /* O 4 pitch lag values */ - SKP_int *lagIndex, /* O Lag Index */ - SKP_int *contourIndex, /* O Pitch contour Index */ - SKP_int *LTPCorr_Q15, /* I/O Normalized correlation; input: value from previous frame */ - SKP_int prevLag, /* I Last lag of previous frame; set to zero is unvoiced */ - const SKP_int32 search_thres1_Q16, /* I First stage threshold for lag candidates 0 - 1 */ - const SKP_int search_thres2_Q15, /* I Final threshold for lag candidates 0 - 1 */ - const SKP_int Fs_kHz, /* I Sample frequency (kHz) */ - const SKP_int complexity, /* I Complexity setting, 0-2, where 2 is highest */ - const SKP_int forLJC /* I 1 if this function is called from LJC code, 0 otherwise. */ -); - -/* parameter defining the size and accuracy of the piecewise linear */ -/* cosine approximatin table. */ - -#define LSF_COS_TAB_SZ_FIX 128 -/* rom table with cosine values */ -extern const SKP_int SKP_Silk_LSFCosTab_FIX_Q12[ LSF_COS_TAB_SZ_FIX + 1 ]; - -/* Compute Normalized Line Spectral Frequencies (NLSFs) from whitening filter coefficients */ -/* If not all roots are found, the a_Q16 coefficients are bandwidth expanded until convergence. */ -void SKP_Silk_A2NLSF( - SKP_int *NLSF, /* O Normalized Line Spectral Frequencies, Q15 (0 - (2^15-1)), [d] */ - SKP_int32 *a_Q16, /* I/O Monic whitening filter coefficients in Q16 [d] */ - const SKP_int d /* I Filter order (must be even) */ -); - -/* compute whitening filter coefficients from normalized line spectral frequencies */ -void SKP_Silk_NLSF2A( - SKP_int16 *a, /* o monic whitening filter coefficients in Q12, [d] */ - const SKP_int *NLSF, /* i normalized line spectral frequencies in Q15, [d] */ - const SKP_int d /* i filter order (should be even) */ -); - -void SKP_Silk_insertion_sort_increasing( - SKP_int32 *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 */ -); - -void SKP_Silk_insertion_sort_decreasing_int16( - SKP_int16 *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 */ -); - -void SKP_Silk_insertion_sort_increasing_all_values( - SKP_int *a, /* I/O: Unsorted / Sorted vector */ - const SKP_int L /* I: Vector length */ -); - -/* NLSF stabilizer, for a single input data vector */ -void SKP_Silk_NLSF_stabilize( - SKP_int *NLSF_Q15, /* I/O: Unstable/stabilized normalized LSF vector in Q15 [L] */ - const SKP_int *NDeltaMin_Q15, /* I: Normalized delta min vector in Q15, NDeltaMin_Q15[L] must be >= 1 [L+1] */ - const SKP_int L /* I: Number of NLSF parameters in the input vector */ -); - -/* Laroia low complexity NLSF weights */ -void SKP_Silk_NLSF_VQ_weights_laroia( - SKP_int *pNLSFW_Q6, /* O: Pointer to input vector weights [D x 1] */ - const SKP_int *pNLSF_Q15, /* I: Pointer to input vector [D x 1] */ - const SKP_int D /* I: Input vector dimension (even) */ -); - -/* Compute reflection coefficients from input signal */ -void SKP_Silk_burg_modified( - SKP_int32 *res_nrg, /* O residual energy */ - SKP_int *res_nrgQ, /* O residual energy Q value */ - SKP_int32 A_Q16[], /* O prediction coefficients (length order) */ - const SKP_int16 x[], /* I input signal, length: nb_subfr * ( D + subfr_length ) */ - const SKP_int subfr_length, /* I input signal subframe length (including D preceeding samples) */ - const SKP_int nb_subfr, /* I number of subframes stacked in x */ - const SKP_int32 WhiteNoiseFrac_Q32, /* I fraction added to zero-lag autocorrelation */ - const SKP_int D /* I order */ -); - -/* Copy and multiply a vector by a constant */ -void SKP_Silk_scale_copy_vector16( - SKP_int16 *data_out, - const SKP_int16 *data_in, - SKP_int32 gain_Q16, /* I: gain in Q16 */ - 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 */ - SKP_int32 gain_Q26, /* I: Q26 */ - SKP_int dataSize /* I: length */ -); - -/********************************************************************/ -/* INLINE ARM MATH */ -/********************************************************************/ - -/* 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 */ -); - -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 */ -); -/********************************************************************/ -/* MACROS */ -/********************************************************************/ - -/* Rotate a32 right by 'rot' bits. Negative rot values result in rotating - left. Output is 32bit int. - Note: contemporary compilers recognize the C expression below and - compile it into a 'ror' instruction if available. No need for inline ASM! */ -SKP_INLINE SKP_int32 SKP_ROR32( SKP_int32 a32, SKP_int rot ) -{ - SKP_uint32 x = (SKP_uint32) a32; - SKP_uint32 r = (SKP_uint32) rot; - SKP_uint32 m = (SKP_uint32) -rot; - if(rot <= 0) - return (SKP_int32) ((x << m) | (x >> (32 - m))); - else - return (SKP_int32) ((x << (32 - r)) | (x >> r)); -} - -/* Allocate SKP_int16 alligned to 4-byte memory address */ -#define SKP_DWORD_ALIGN - -/* Useful Macros that can be adjusted to other platforms */ -#define SKP_memcpy(a, b, c) memcpy((a), (b), (c)) /* Dest, Src, ByteCount */ -#define SKP_memset(a, b, c) memset((a), (b), (c)) /* Dest, value, ByteCount */ -#define SKP_memmove(a, b, c) memmove((a), (b), (c)) /* Dest, Src, ByteCount */ -/* fixed point macros */ - -// (a32 * b32) output have to be 32bit int -#define SKP_MUL(a32, b32) ((a32) * (b32)) - -// (a32 * b32) output have to be 32bit uint -#define SKP_MUL_uint(a32, b32) SKP_MUL(a32, b32) - -// a32 + (b32 * c32) output have to be 32bit int -#define SKP_MLA(a32, b32, c32) SKP_ADD32((a32),((b32) * (c32))) - -// a32 + ((a32 >> 16) * (b32 >> 16)) output have to be 32bit int -#define SKP_SMLATT(a32, b32, c32) SKP_ADD32((a32),((b32) >> 16) * ((c32) >> 16)) - -#define SKP_SMLALBB(a64, b16, c16) SKP_ADD64((a64),(SKP_int64)((SKP_int32)(b16) * (SKP_int32)(c16))) - -// (a32 * b32) -#define SKP_SMULL(a32, b32) ((SKP_int64)(a32) * /*(SKP_int64)*/(b32)) - -// multiply-accumulate macros that allow overflow in the addition (ie, no asserts in debug mode) -#define SKP_MLA_ovflw(a32, b32, c32) SKP_MLA(a32, b32, c32) -#ifndef SKP_SMLABB_ovflw -# define SKP_SMLABB_ovflw(a32, b32, c32) SKP_SMLABB(a32, b32, c32) -#endif -#define SKP_SMLATT_ovflw(a32, b32, c32) SKP_SMLATT(a32, b32, c32) -#define SKP_SMLAWB_ovflw(a32, b32, c32) SKP_SMLAWB(a32, b32, c32) -#define SKP_SMLAWT_ovflw(a32, b32, c32) SKP_SMLAWT(a32, b32, c32) - -#define SKP_DIV32_16(a32, b16) ((SKP_int32)((a32) / (b16))) -#define SKP_DIV32(a32, b32) ((SKP_int32)((a32) / (b32))) - -#define SKP_ADD32(a, b) ((a) + (b)) -#define SKP_ADD64(a, b) ((a) + (b)) - -#define SKP_SUB32(a, b) ((a) - (b)) - -#define SKP_SAT16(a) ((a) > SKP_int16_MAX ? SKP_int16_MAX : \ - ((a) < SKP_int16_MIN ? SKP_int16_MIN : (a))) -#define SKP_SAT32(a) ((a) > SKP_int32_MAX ? SKP_int32_MAX : \ - ((a) < SKP_int32_MIN ? SKP_int32_MIN : (a))) - -#define SKP_CHECK_FIT16(a) (a) -#define SKP_CHECK_FIT32(a) (a) - -#define SKP_ADD_SAT16(a, b) (SKP_int16)SKP_SAT16( SKP_ADD32( (SKP_int32)(a), (b) ) ) - -/* Add with saturation for positive input values */ -#define SKP_ADD_POS_SAT32(a, b) ((((a)+(b)) & 0x80000000) ? SKP_int32_MAX : ((a)+(b))) - -#define SKP_LSHIFT32(a, shift) ((a)<<(shift)) // shift >= 0, shift < 32 -#define SKP_LSHIFT64(a, shift) ((a)<<(shift)) // shift >= 0, shift < 64 -#define SKP_LSHIFT(a, shift) SKP_LSHIFT32(a, shift) // shift >= 0, shift < 32 - -#define SKP_RSHIFT32(a, shift) ((a)>>(shift)) // shift >= 0, shift < 32 -#define SKP_RSHIFT64(a, shift) ((a)>>(shift)) // shift >= 0, shift < 64 -#define SKP_RSHIFT(a, shift) SKP_RSHIFT32(a, shift) // shift >= 0, shift < 32 - -/* saturates before shifting */ -#define SKP_LSHIFT_SAT32(a, shift) (SKP_LSHIFT32( SKP_LIMIT( (a), SKP_RSHIFT32( SKP_int32_MIN, (shift) ), \ - SKP_RSHIFT32( SKP_int32_MAX, (shift) ) ), (shift) )) - -#define SKP_LSHIFT_ovflw(a, shift) ((a)<<(shift)) // shift >= 0, allowed to overflow -#define SKP_LSHIFT_uint(a, shift) ((a)<<(shift)) // shift >= 0 -#define SKP_RSHIFT_uint(a, shift) ((a)>>(shift)) // shift >= 0 - -#define SKP_ADD_LSHIFT(a, b, shift) ((a) + SKP_LSHIFT((b), (shift))) // shift >= 0 -#define SKP_ADD_LSHIFT32(a, b, shift) SKP_ADD32((a), SKP_LSHIFT32((b), (shift))) // shift >= 0 -#define SKP_ADD_RSHIFT(a, b, shift) ((a) + SKP_RSHIFT((b), (shift))) // shift >= 0 -#define SKP_ADD_RSHIFT32(a, b, shift) SKP_ADD32((a), SKP_RSHIFT32((b), (shift))) // shift >= 0 -#define SKP_ADD_RSHIFT_uint(a, b, shift) ((a) + SKP_RSHIFT_uint((b), (shift))) // shift >= 0 -#define SKP_SUB_LSHIFT32(a, b, shift) SKP_SUB32((a), SKP_LSHIFT32((b), (shift))) // shift >= 0 -#define SKP_SUB_RSHIFT32(a, b, shift) SKP_SUB32((a), SKP_RSHIFT32((b), (shift))) // shift >= 0 - -/* Requires that shift > 0 */ -#define SKP_RSHIFT_ROUND(a, shift) ((shift) == 1 ? ((a) >> 1) + ((a) & 1) : (((a) >> ((shift) - 1)) + 1) >> 1) -#define SKP_RSHIFT_ROUND64(a, shift) ((shift) == 1 ? ((a) >> 1) + ((a) & 1) : (((a) >> ((shift) - 1)) + 1) >> 1) - -/* Number of rightshift required to fit the multiplication */ -#define SKP_NSHIFT_MUL_32_32(a, b) ( -(31- (32-SKP_Silk_CLZ32(SKP_abs(a)) + (32-SKP_Silk_CLZ32(SKP_abs(b))))) ) - -#define SKP_min(a, b) (((a) < (b)) ? (a) : (b)) -#define SKP_max(a, b) (((a) > (b)) ? (a) : (b)) - -/* Macro to convert floating-point constants to fixed-point */ -#define SKP_FIX_CONST( C, Q ) ((SKP_int32)((C) * ((SKP_int64)1 << (Q)) + 0.5)) - -/* SKP_min() versions with typecast in the function call */ -SKP_INLINE SKP_int SKP_min_int(SKP_int a, SKP_int b) -{ - return (((a) < (b)) ? (a) : (b)); -} - -SKP_INLINE SKP_int32 SKP_min_32(SKP_int32 a, SKP_int32 b) -{ - return (((a) < (b)) ? (a) : (b)); -} - -/* SKP_min() versions with typecast in the function call */ -SKP_INLINE SKP_int SKP_max_int(SKP_int a, SKP_int b) -{ - return (((a) > (b)) ? (a) : (b)); -} -SKP_INLINE SKP_int16 SKP_max_16(SKP_int16 a, SKP_int16 b) -{ - return (((a) > (b)) ? (a) : (b)); -} -SKP_INLINE SKP_int32 SKP_max_32(SKP_int32 a, SKP_int32 b) -{ - return (((a) > (b)) ? (a) : (b)); -} - -#define SKP_LIMIT( a, limit1, limit2) ((limit1) > (limit2) ? ((a) > (limit1) ? (limit1) : ((a) < (limit2) ? (limit2) : (a))) \ - : ((a) > (limit2) ? (limit2) : ((a) < (limit1) ? (limit1) : (a)))) - -#define SKP_LIMIT_int SKP_LIMIT -#define SKP_LIMIT_32 SKP_LIMIT - -//#define SKP_non_neg(a) ((a) & ((-(a)) >> (8 * sizeof(a) - 1))) /* doesn't seem faster than SKP_max(0, a); - -#define SKP_abs(a) (((a) > 0) ? (a) : -(a)) // Be careful, SKP_abs returns wrong when input equals to SKP_intXX_MIN -#define SKP_abs_int32(a) (((a) ^ ((a) >> 31)) - ((a) >> 31)) - -/* PSEUDO-RANDOM GENERATOR */ -/* Make sure to store the result as the seed for the next call (also in between */ -/* frames), otherwise result won't be random at all. When only using some of the */ -/* bits, take the most significant bits by right-shifting. Do not just mask off */ -/* the lowest bits. */ -#define SKP_RAND(seed) (SKP_MLA_ovflw(907633515, (seed), 196314165)) - -// Add some multiplication functions that can be easily mapped to ARM. - -// SKP_SMMUL: Signed top word multiply. -// ARMv6 2 instruction cycles. -// ARMv3M+ 3 instruction cycles. use SMULL and ignore LSB registers.(except xM) -//#define SKP_SMMUL(a32, b32) (SKP_int32)SKP_RSHIFT(SKP_SMLAL(SKP_SMULWB((a32), (b32)), (a32), SKP_RSHIFT_ROUND((b32), 16)), 16) -// the following seems faster on x86 -#define SKP_SMMUL(a32, b32) (SKP_int32)SKP_RSHIFT64(SKP_SMULL((a32), (b32)), 32) - -#include "SKP_Silk_Inlines.h" - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libs/silk/src/SKP_Silk_VAD.c b/libs/silk/src/SKP_Silk_VAD.c deleted file mode 100644 index ecf2ba15db..0000000000 --- a/libs/silk/src/SKP_Silk_VAD.c +++ /dev/null @@ -1,320 +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. -***********************************************************************/ - -/* - * File Name: SKP_Silk_VAD.c - * Description: Silk VAD. - */ - -#include -#include "SKP_Silk_main.h" - -/**********************************/ -/* Initialization of the Silk VAD */ -/**********************************/ -SKP_int SKP_Silk_VAD_Init( /* O Return value, 0 if success */ - SKP_Silk_VAD_state *psSilk_VAD /* I/O Pointer to Silk VAD state */ -) -{ - SKP_int b, ret = 0; - - /* reset state memory */ - SKP_memset( psSilk_VAD, 0, sizeof( SKP_Silk_VAD_state ) ); - - /* init noise levels */ - /* Initialize array with approx pink noise levels (psd proportional to inverse of frequency) */ - for( b = 0; b < VAD_N_BANDS; b++ ) { - psSilk_VAD->NoiseLevelBias[ b ] = SKP_max_32( SKP_DIV32_16( VAD_NOISE_LEVELS_BIAS, b + 1 ), 1 ); - } - - /* Initialize state */ - for( b = 0; b < VAD_N_BANDS; b++ ) { - psSilk_VAD->NL[ b ] = SKP_MUL( 100, psSilk_VAD->NoiseLevelBias[ b ] ); - psSilk_VAD->inv_NL[ b ] = SKP_DIV32( SKP_int32_MAX, psSilk_VAD->NL[ b ] ); - } - psSilk_VAD->counter = 15; - - /* init smoothed energy-to-noise ratio*/ - for( b = 0; b < VAD_N_BANDS; b++ ) { - psSilk_VAD->NrgRatioSmth_Q8[ b ] = 100 * 256; /* 100 * 256 --> 20 dB SNR */ - } - - return( ret ); -} - -/* Weighting factors for tilt measure */ -const static SKP_int32 tiltWeights[ VAD_N_BANDS ] = { 30000, 6000, -12000, -12000 }; - -/***************************************/ -/* Get the speech activity level in Q8 */ -/***************************************/ -SKP_int SKP_Silk_VAD_GetSA_Q8( /* O Return value, 0 if success */ - SKP_Silk_VAD_state *psSilk_VAD, /* I/O Silk VAD state */ - SKP_int *pSA_Q8, /* O Speech activity level in Q8 */ - SKP_int *pSNR_dB_Q7, /* O SNR for current frame in Q7 */ - SKP_int pQuality_Q15[ VAD_N_BANDS ], /* O Smoothed SNR for each band */ - SKP_int *pTilt_Q15, /* O current frame's frequency tilt */ - const SKP_int16 pIn[], /* I PCM input [framelength] */ - const SKP_int framelength /* I Input frame length */ -) -{ - SKP_int SA_Q15, input_tilt; - SKP_int32 scratch[ 3 * MAX_FRAME_LENGTH / 2 ]; - SKP_int decimated_framelength, dec_subframe_length, dec_subframe_offset, SNR_Q7, i, b, s; - SKP_int32 sumSquared, smooth_coef_Q16; - SKP_int16 HPstateTmp; - - SKP_int16 X[ VAD_N_BANDS ][ MAX_FRAME_LENGTH / 2 ]; - SKP_int32 Xnrg[ VAD_N_BANDS ]; - SKP_int32 NrgToNoiseRatio_Q8[ VAD_N_BANDS ]; - SKP_int32 speech_nrg, x_tmp; - SKP_int ret = 0; - - /* Safety checks */ - SKP_assert( VAD_N_BANDS == 4 ); - SKP_assert( MAX_FRAME_LENGTH >= framelength ); - SKP_assert( framelength <= 512 ); - - /***********************/ - /* Filter and Decimate */ - /***********************/ - /* 0-8 kHz to 0-4 kHz and 4-8 kHz */ - SKP_Silk_ana_filt_bank_1( pIn, &psSilk_VAD->AnaState[ 0 ], &X[ 0 ][ 0 ], &X[ 3 ][ 0 ], &scratch[ 0 ], framelength ); - - /* 0-4 kHz to 0-2 kHz and 2-4 kHz */ - SKP_Silk_ana_filt_bank_1( &X[ 0 ][ 0 ], &psSilk_VAD->AnaState1[ 0 ], &X[ 0 ][ 0 ], &X[ 2 ][ 0 ], &scratch[ 0 ], SKP_RSHIFT( framelength, 1 ) ); - - /* 0-2 kHz to 0-1 kHz and 1-2 kHz */ - SKP_Silk_ana_filt_bank_1( &X[ 0 ][ 0 ], &psSilk_VAD->AnaState2[ 0 ], &X[ 0 ][ 0 ], &X[ 1 ][ 0 ], &scratch[ 0 ], SKP_RSHIFT( framelength, 2 ) ); - - /*********************************************/ - /* HP filter on lowest band (differentiator) */ - /*********************************************/ - decimated_framelength = SKP_RSHIFT( framelength, 3 ); - X[ 0 ][ decimated_framelength - 1 ] = SKP_RSHIFT( X[ 0 ][ decimated_framelength - 1 ], 1 ); - HPstateTmp = X[ 0 ][ decimated_framelength - 1 ]; - for( i = decimated_framelength - 1; i > 0; i-- ) { - X[ 0 ][ i - 1 ] = SKP_RSHIFT( X[ 0 ][ i - 1 ], 1 ); - X[ 0 ][ i ] -= X[ 0 ][ i - 1 ]; - } - X[ 0 ][ 0 ] -= psSilk_VAD->HPstate; - psSilk_VAD->HPstate = HPstateTmp; - - /*************************************/ - /* Calculate the energy in each band */ - /*************************************/ - for( b = 0; b < VAD_N_BANDS; b++ ) { - /* Find the decimated framelength in the non-uniformly divided bands */ - decimated_framelength = SKP_RSHIFT( framelength, SKP_min_int( VAD_N_BANDS - b, VAD_N_BANDS - 1 ) ); - - /* Split length into subframe lengths */ - dec_subframe_length = SKP_RSHIFT( decimated_framelength, VAD_INTERNAL_SUBFRAMES_LOG2 ); - dec_subframe_offset = 0; - - /* Compute energy per sub-frame */ - /* initialize with summed energy of last subframe */ - Xnrg[ b ] = psSilk_VAD->XnrgSubfr[ b ]; - for( s = 0; s < VAD_INTERNAL_SUBFRAMES; s++ ) { - sumSquared = 0; - for( i = 0; i < dec_subframe_length; i++ ) { - /* The energy will be less than dec_subframe_length * ( SKP_int16_MIN / 8 ) ^ 2. */ - /* Therefore we can accumulate with no risk of overflow (unless dec_subframe_length > 128) */ - x_tmp = SKP_RSHIFT( X[ b ][ i + dec_subframe_offset ], 3 ); - sumSquared = SKP_SMLABB( sumSquared, x_tmp, x_tmp ); - - /* Safety check */ - SKP_assert( sumSquared >= 0 ); - } - - /* Add/saturate summed energy of current subframe */ - if( s < VAD_INTERNAL_SUBFRAMES - 1 ) { - Xnrg[ b ] = SKP_ADD_POS_SAT32( Xnrg[ b ], sumSquared ); - } else { - /* Look-ahead subframe */ - Xnrg[ b ] = SKP_ADD_POS_SAT32( Xnrg[ b ], SKP_RSHIFT( sumSquared, 1 ) ); - } - - dec_subframe_offset += dec_subframe_length; - } - psSilk_VAD->XnrgSubfr[ b ] = sumSquared; - } - - /********************/ - /* Noise estimation */ - /********************/ - SKP_Silk_VAD_GetNoiseLevels( &Xnrg[ 0 ], psSilk_VAD ); - - /***********************************************/ - /* Signal-plus-noise to noise ratio estimation */ - /***********************************************/ - sumSquared = 0; - input_tilt = 0; - for( b = 0; b < VAD_N_BANDS; b++ ) { - speech_nrg = Xnrg[ b ] - psSilk_VAD->NL[ b ]; - if( speech_nrg > 0 ) { - /* Divide, with sufficient resolution */ - if( ( Xnrg[ b ] & 0xFF800000 ) == 0 ) { - NrgToNoiseRatio_Q8[ b ] = SKP_DIV32( SKP_LSHIFT( Xnrg[ b ], 8 ), psSilk_VAD->NL[ b ] + 1 ); - } else { - NrgToNoiseRatio_Q8[ b ] = SKP_DIV32( Xnrg[ b ], SKP_RSHIFT( psSilk_VAD->NL[ b ], 8 ) + 1 ); - } - - /* Convert to log domain */ - SNR_Q7 = SKP_Silk_lin2log( NrgToNoiseRatio_Q8[ b ] ) - 8 * 128; - - /* Sum-of-squares */ - sumSquared = SKP_SMLABB( sumSquared, SNR_Q7, SNR_Q7 ); /* Q14 */ - - /* Tilt measure */ - if( speech_nrg < ( 1 << 20 ) ) { - /* Scale down SNR value for small subband speech energies */ - SNR_Q7 = SKP_SMULWB( SKP_LSHIFT( SKP_Silk_SQRT_APPROX( speech_nrg ), 6 ), SNR_Q7 ); - } - input_tilt = SKP_SMLAWB( input_tilt, tiltWeights[ b ], SNR_Q7 ); - } else { - NrgToNoiseRatio_Q8[ b ] = 256; - } - } - - /* Mean-of-squares */ - sumSquared = SKP_DIV32_16( sumSquared, VAD_N_BANDS ); /* Q14 */ - - /* Root-mean-square approximation, scale to dBs, and write to output pointer */ - *pSNR_dB_Q7 = ( SKP_int16 )( 3 * SKP_Silk_SQRT_APPROX( sumSquared ) ); /* Q7 */ - - /*********************************/ - /* Speech Probability Estimation */ - /*********************************/ - SA_Q15 = SKP_Silk_sigm_Q15( SKP_SMULWB( VAD_SNR_FACTOR_Q16, *pSNR_dB_Q7 ) - VAD_NEGATIVE_OFFSET_Q5 ); - - /**************************/ - /* Frequency Tilt Measure */ - /**************************/ - *pTilt_Q15 = SKP_LSHIFT( SKP_Silk_sigm_Q15( input_tilt ) - 16384, 1 ); - - /**************************************************/ - /* Scale the sigmoid output based on power levels */ - /**************************************************/ - speech_nrg = 0; - for( b = 0; b < VAD_N_BANDS; b++ ) { - /* Accumulate signal-without-noise energies, higher frequency bands have more weight */ - speech_nrg += ( b + 1 ) * SKP_RSHIFT( Xnrg[ b ] - psSilk_VAD->NL[ b ], 4 ); - } - - /* Power scaling */ - if( speech_nrg <= 0 ) { - SA_Q15 = SKP_RSHIFT( SA_Q15, 1 ); - } else if( speech_nrg < 32768 ) { - /* square-root */ - speech_nrg = SKP_Silk_SQRT_APPROX( SKP_LSHIFT( speech_nrg, 15 ) ); - SA_Q15 = SKP_SMULWB( 32768 + speech_nrg, SA_Q15 ); - } - - /* Copy the resulting speech activity in Q8 to *pSA_Q8 */ - *pSA_Q8 = SKP_min_int( SKP_RSHIFT( SA_Q15, 7 ), SKP_uint8_MAX ); - - /***********************************/ - /* Energy Level and SNR estimation */ - /***********************************/ - /* Smoothing coefficient */ - smooth_coef_Q16 = SKP_SMULWB( VAD_SNR_SMOOTH_COEF_Q18, SKP_SMULWB( SA_Q15, SA_Q15 ) ); - for( b = 0; b < VAD_N_BANDS; b++ ) { - /* compute smoothed energy-to-noise ratio per band */ - psSilk_VAD->NrgRatioSmth_Q8[ b ] = SKP_SMLAWB( psSilk_VAD->NrgRatioSmth_Q8[ b ], - NrgToNoiseRatio_Q8[ b ] - psSilk_VAD->NrgRatioSmth_Q8[ b ], smooth_coef_Q16 ); - - /* signal to noise ratio in dB per band */ - SNR_Q7 = 3 * ( SKP_Silk_lin2log( psSilk_VAD->NrgRatioSmth_Q8[b] ) - 8 * 128 ); - /* quality = sigmoid( 0.25 * ( SNR_dB - 16 ) ); */ - pQuality_Q15[ b ] = SKP_Silk_sigm_Q15( SKP_RSHIFT( SNR_Q7 - 16 * 128, 4 ) ); - } - - return( ret ); -} - -/**************************/ -/* Noise level estimation */ -/**************************/ -void SKP_Silk_VAD_GetNoiseLevels( - const SKP_int32 pX[ VAD_N_BANDS ], /* I subband energies */ - SKP_Silk_VAD_state *psSilk_VAD /* I/O Pointer to Silk VAD state */ -) -{ - SKP_int k; - SKP_int32 nl, nrg, inv_nrg; - SKP_int coef, min_coef; - - /* Initially faster smoothing */ - if( psSilk_VAD->counter < 1000 ) { /* 1000 = 20 sec */ - min_coef = SKP_DIV32_16( SKP_int16_MAX, SKP_RSHIFT( psSilk_VAD->counter, 4 ) + 1 ); - } else { - min_coef = 0; - } - - for( k = 0; k < VAD_N_BANDS; k++ ) { - /* Get old noise level estimate for current band */ - nl = psSilk_VAD->NL[ k ]; - SKP_assert( nl >= 0 ); - - /* Add bias */ - nrg = SKP_ADD_POS_SAT32( pX[ k ], psSilk_VAD->NoiseLevelBias[ k ] ); - SKP_assert( nrg > 0 ); - - /* Invert energies */ - inv_nrg = SKP_DIV32( SKP_int32_MAX, nrg ); - SKP_assert( inv_nrg >= 0 ); - - /* Less update when subband energy is high */ - if( nrg > SKP_LSHIFT( nl, 3 ) ) { - coef = VAD_NOISE_LEVEL_SMOOTH_COEF_Q16 >> 3; - } else if( nrg < nl ) { - coef = VAD_NOISE_LEVEL_SMOOTH_COEF_Q16; - } else { - coef = SKP_SMULWB( SKP_SMULWW( inv_nrg, nl ), VAD_NOISE_LEVEL_SMOOTH_COEF_Q16 << 1 ); - } - - /* Initially faster smoothing */ - coef = SKP_max_int( coef, min_coef ); - - /* Smooth inverse energies */ - psSilk_VAD->inv_NL[ k ] = SKP_SMLAWB( psSilk_VAD->inv_NL[ k ], inv_nrg - psSilk_VAD->inv_NL[ k ], coef ); - SKP_assert( psSilk_VAD->inv_NL[ k ] >= 0 ); - - /* Compute noise level by inverting again */ - nl = SKP_DIV32( SKP_int32_MAX, psSilk_VAD->inv_NL[ k ] ); - SKP_assert( nl >= 0 ); - - /* Limit noise levels (guarantee 7 bits of head room) */ - nl = SKP_min( nl, 0x00FFFFFF ); - - /* Store as part of state */ - psSilk_VAD->NL[ k ] = nl; - } - - /* Increment frame counter */ - psSilk_VAD->counter++; -} diff --git a/libs/silk/src/SKP_Silk_VQ_nearest_neighbor_FIX.c b/libs/silk/src/SKP_Silk_VQ_nearest_neighbor_FIX.c deleted file mode 100644 index 254823ed21..0000000000 --- a/libs/silk/src/SKP_Silk_VQ_nearest_neighbor_FIX.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_FIX.h" - -/* Entropy constrained MATRIX-weighted VQ, hard-coded to 5-element vectors, for a single input data vector */ -void SKP_Silk_VQ_WMat_EC_FIX( - SKP_int *ind, /* O index of best codebook vector */ - SKP_int32 *rate_dist_Q14, /* O best weighted quantization error + mu * rate*/ - const SKP_int16 *in_Q14, /* I input vector to be quantized */ - const SKP_int32 *W_Q18, /* I weighting matrix */ - const SKP_int16 *cb_Q14, /* I codebook */ - const SKP_int16 *cl_Q6, /* I code length for each codebook vector */ - const SKP_int mu_Q8, /* I tradeoff between weighted error and rate */ - SKP_int L /* I number of vectors in codebook */ -) -{ - SKP_int k; - const SKP_int16 *cb_row_Q14; - SKP_int16 diff_Q14[ 5 ]; - SKP_int32 sum1_Q14, sum2_Q16; - - /* Loop over codebook */ - *rate_dist_Q14 = SKP_int32_MAX; - cb_row_Q14 = cb_Q14; - for( k = 0; k < L; k++ ) { - diff_Q14[ 0 ] = in_Q14[ 0 ] - cb_row_Q14[ 0 ]; - diff_Q14[ 1 ] = in_Q14[ 1 ] - cb_row_Q14[ 1 ]; - diff_Q14[ 2 ] = in_Q14[ 2 ] - cb_row_Q14[ 2 ]; - diff_Q14[ 3 ] = in_Q14[ 3 ] - cb_row_Q14[ 3 ]; - diff_Q14[ 4 ] = in_Q14[ 4 ] - cb_row_Q14[ 4 ]; - - /* Weighted rate */ - sum1_Q14 = SKP_SMULBB( mu_Q8, cl_Q6[ k ] ); - - SKP_assert( sum1_Q14 >= 0 ); - - /* first row of W_Q18 */ - sum2_Q16 = SKP_SMULWB( W_Q18[ 1 ], diff_Q14[ 1 ] ); - sum2_Q16 = SKP_SMLAWB( sum2_Q16, W_Q18[ 2 ], diff_Q14[ 2 ] ); - sum2_Q16 = SKP_SMLAWB( sum2_Q16, W_Q18[ 3 ], diff_Q14[ 3 ] ); - sum2_Q16 = SKP_SMLAWB( sum2_Q16, W_Q18[ 4 ], diff_Q14[ 4 ] ); - sum2_Q16 = SKP_LSHIFT( sum2_Q16, 1 ); - sum2_Q16 = SKP_SMLAWB( sum2_Q16, W_Q18[ 0 ], diff_Q14[ 0 ] ); - sum1_Q14 = SKP_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 0 ] ); - - /* second row of W_Q18 */ - sum2_Q16 = SKP_SMULWB( W_Q18[ 7 ], diff_Q14[ 2 ] ); - sum2_Q16 = SKP_SMLAWB( sum2_Q16, W_Q18[ 8 ], diff_Q14[ 3 ] ); - sum2_Q16 = SKP_SMLAWB( sum2_Q16, W_Q18[ 9 ], diff_Q14[ 4 ] ); - sum2_Q16 = SKP_LSHIFT( sum2_Q16, 1 ); - sum2_Q16 = SKP_SMLAWB( sum2_Q16, W_Q18[ 6 ], diff_Q14[ 1 ] ); - sum1_Q14 = SKP_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 1 ] ); - - /* third row of W_Q18 */ - sum2_Q16 = SKP_SMULWB( W_Q18[ 13 ], diff_Q14[ 3 ] ); - sum2_Q16 = SKP_SMLAWB( sum2_Q16, W_Q18[ 14 ], diff_Q14[ 4 ] ); - sum2_Q16 = SKP_LSHIFT( sum2_Q16, 1 ); - sum2_Q16 = SKP_SMLAWB( sum2_Q16, W_Q18[ 12 ], diff_Q14[ 2 ] ); - sum1_Q14 = SKP_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 2 ] ); - - /* fourth row of W_Q18 */ - sum2_Q16 = SKP_SMULWB( W_Q18[ 19 ], diff_Q14[ 4 ] ); - sum2_Q16 = SKP_LSHIFT( sum2_Q16, 1 ); - sum2_Q16 = SKP_SMLAWB( sum2_Q16, W_Q18[ 18 ], diff_Q14[ 3 ] ); - sum1_Q14 = SKP_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 3 ] ); - - /* last row of W_Q18 */ - sum2_Q16 = SKP_SMULWB( W_Q18[ 24 ], diff_Q14[ 4 ] ); - sum1_Q14 = SKP_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 4 ] ); - - SKP_assert( sum1_Q14 >= 0 ); - - /* find best */ - if( sum1_Q14 < *rate_dist_Q14 ) { - *rate_dist_Q14 = sum1_Q14; - *ind = k; - } - - /* Go to next cbk vector */ - cb_row_Q14 += LTP_ORDER; - } -} diff --git a/libs/silk/src/SKP_Silk_ana_filt_bank_1.c b/libs/silk/src/SKP_Silk_ana_filt_bank_1.c deleted file mode 100644 index 0912a7b5f5..0000000000 --- a/libs/silk/src/SKP_Silk_ana_filt_bank_1.c +++ /dev/null @@ -1,80 +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_ana_filt_bank_1.c * - * * - * Split signal into two decimated bands using first-order allpass filters * - * * - * Copyright 2006 (c), Skype Limited * - * Date: 060221 * - * */ -#include "SKP_Silk_SigProc_FIX.h" - -/* Coefficients for 2-band filter bank based on first-order allpass filters */ -// old -static SKP_int16 A_fb1_20[ 1 ] = { 5394 << 1 }; -static SKP_int16 A_fb1_21[ 1 ] = { 20623 << 1 }; /* wrap-around to negative number is intentional */ - -/* Split signal into two decimated bands using first-order allpass filters */ -void SKP_Silk_ana_filt_bank_1( - const SKP_int16 *in, /* I: Input signal [N] */ - SKP_int32 *S, /* I/O: State vector [2] */ - SKP_int16 *outL, /* O: Low band [N/2] */ - SKP_int16 *outH, /* O: High band [N/2] */ - SKP_int32 *scratch, /* I: Scratch memory [3*N/2] */ // todo: remove - no longer used - const SKP_int32 N /* I: Number of input samples */ -) -{ - SKP_int k, N2 = SKP_RSHIFT( N, 1 ); - SKP_int32 in32, X, Y, out_1, out_2; - - /* Internal variables and state are in Q10 format */ - for( k = 0; k < N2; k++ ) { - /* Convert to Q10 */ - in32 = SKP_LSHIFT( (SKP_int32)in[ 2 * k ], 10 ); - - /* All-pass section for even input sample */ - Y = SKP_SUB32( in32, S[ 0 ] ); - X = SKP_SMLAWB( Y, Y, A_fb1_21[ 0 ] ); - out_1 = SKP_ADD32( S[ 0 ], X ); - S[ 0 ] = SKP_ADD32( in32, X ); - - /* Convert to Q10 */ - in32 = SKP_LSHIFT( (SKP_int32)in[ 2 * k + 1 ], 10 ); - - /* All-pass section for odd input sample */ - Y = SKP_SUB32( in32, S[ 1 ] ); - X = SKP_SMULWB( Y, A_fb1_20[ 0 ] ); - out_2 = SKP_ADD32( S[ 1 ], X ); - S[ 1 ] = SKP_ADD32( in32, X ); - - /* Add/subtract, convert back to int16 and store to output */ - outL[ k ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( SKP_ADD32( out_2, out_1 ), 11 ) ); - outH[ k ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( SKP_SUB32( out_2, out_1 ), 11 ) ); - } -} diff --git a/libs/silk/src/SKP_Silk_apply_sine_window_new.c b/libs/silk/src/SKP_Silk_apply_sine_window_new.c deleted file mode 100644 index 2d07a9f3a9..0000000000 --- a/libs/silk/src/SKP_Silk_apply_sine_window_new.c +++ /dev/null @@ -1,100 +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_SigProc_FIX.h" - -/* Apply sine window to signal vector. */ -/* Window types: */ -/* 1 -> sine window from 0 to pi/2 */ -/* 2 -> sine window from pi/2 to pi */ -/* Every other sample is linearly interpolated, for speed. */ -/* Window length must be between 16 and 120 (incl) and a multiple of 4. */ - -/* Matlab code for table: - for k=16:9*4:16+2*9*4, fprintf(' %7.d,', -round(65536*pi ./ (k:4:k+8*4))); fprintf('\n'); end -*/ -static SKP_int16 freq_table_Q16[ 27 ] = { - 12111, 9804, 8235, 7100, 6239, 5565, 5022, 4575, 4202, - 3885, 3612, 3375, 3167, 2984, 2820, 2674, 2542, 2422, - 2313, 2214, 2123, 2038, 1961, 1889, 1822, 1760, 1702, -}; - - -void SKP_Silk_apply_sine_window_new( - SKP_int16 px_win[], /* O Pointer to windowed signal */ - const SKP_int16 px[], /* I Pointer to input signal */ - const SKP_int win_type, /* I Selects a window type */ - const SKP_int length /* I Window length, multiple of 4 */ -) -{ - SKP_int k, f_Q16, c_Q16; - SKP_int32 S0_Q16, S1_Q16; - SKP_assert( win_type == 1 || win_type == 2 ); - - /* Length must be in a range from 16 to 120 and a multiple of 4 */ - SKP_assert( length >= 16 && length <= 120 ); - SKP_assert( ( length & 3 ) == 0 ); - - /* Input pointer must be 4-byte aligned */ - SKP_assert( ( ( SKP_int64 )( ( SKP_int8* )px - ( SKP_int8* )0 ) & 3 ) == 0 ); - - /* Frequency */ - k = ( length >> 2 ) - 4; - SKP_assert( k >= 0 && k <= 26 ); - f_Q16 = (SKP_int)freq_table_Q16[ k ]; - - /* Factor used for cosine approximation */ - c_Q16 = SKP_SMULWB( f_Q16, -f_Q16 ); - SKP_assert( c_Q16 >= -32768 ); - - /* initialize state */ - if( win_type == 1 ) { - /* start from 0 */ - S0_Q16 = 0; - /* approximation of sin(f) */ - S1_Q16 = f_Q16 + SKP_RSHIFT( length, 3 ); - } else { - /* start from 1 */ - S0_Q16 = ( 1 << 16 ); - /* approximation of cos(f) */ - S1_Q16 = ( 1 << 16 ) + SKP_RSHIFT( c_Q16, 1 ) + SKP_RSHIFT( length, 4 ); - } - - /* Uses the recursive equation: sin(n*f) = 2 * cos(f) * sin((n-1)*f) - sin((n-2)*f) */ - /* 4 samples at a time */ - for( k = 0; k < length; k += 4 ) { - px_win[ k ] = (SKP_int16)SKP_SMULWB( SKP_RSHIFT( S0_Q16 + S1_Q16, 1 ), px[ k ] ); - px_win[ k + 1 ] = (SKP_int16)SKP_SMULWB( S1_Q16, px[ k + 1] ); - S0_Q16 = SKP_SMULWB( S1_Q16, c_Q16 ) + SKP_LSHIFT( S1_Q16, 1 ) - S0_Q16 + 1; - S0_Q16 = SKP_min( S0_Q16, ( 1 << 16 ) ); - - px_win[ k + 2 ] = (SKP_int16)SKP_SMULWB( SKP_RSHIFT( S0_Q16 + S1_Q16, 1 ), px[ k + 2] ); - px_win[ k + 3 ] = (SKP_int16)SKP_SMULWB( S0_Q16, px[ k + 3 ] ); - S1_Q16 = SKP_SMULWB( S0_Q16, c_Q16 ) + SKP_LSHIFT( S0_Q16, 1 ) - S1_Q16; - S1_Q16 = SKP_min( S1_Q16, ( 1 << 16 ) ); - } -} diff --git a/libs/silk/src/SKP_Silk_array_maxabs.c b/libs/silk/src/SKP_Silk_array_maxabs.c deleted file mode 100644 index 092019e72a..0000000000 --- a/libs/silk/src/SKP_Silk_array_maxabs.c +++ /dev/null @@ -1,68 +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_int16_array_maxabs.c * - * * - * Function that returns the maximum absolut value of * - * the input vector * - * * - * Copyright 2006 (c), Skype Limited * - * Date: 060221 * - * */ -#include "SKP_Silk_SigProc_FIX.h" - -/* Function that returns the maximum absolut value of the input vector */ -SKP_int16 SKP_Silk_int16_array_maxabs( /* O Maximum absolute value, max: 2^15-1 */ - const SKP_int16 *vec, /* I Input vector [len] */ - const SKP_int32 len /* I Length of input vector */ -) -{ - SKP_int32 max = 0, i, lvl = 0, ind; - if( len == 0 ) return 0; - - ind = len - 1; - max = SKP_SMULBB( vec[ ind ], vec[ ind ] ); - for( i = len - 2; i >= 0; i-- ) { - lvl = SKP_SMULBB( vec[ i ], vec[ i ] ); - if( lvl > max ) { - max = lvl; - ind = i; - } - } - - /* Do not return 32768, as it will not fit in an int16 so may lead to problems later on */ - if( max >= 1073676289 ) { // (2^15-1)^2 = 1073676289 - return( SKP_int16_MAX ); - } else { - if( vec[ ind ] < 0 ) { - return( -vec[ ind ] ); - } else { - return( vec[ ind ] ); - } - } -} diff --git a/libs/silk/src/SKP_Silk_autocorr.c b/libs/silk/src/SKP_Silk_autocorr.c deleted file mode 100644 index 2be899c812..0000000000 --- a/libs/silk/src/SKP_Silk_autocorr.c +++ /dev/null @@ -1,81 +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_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 */ -void SKP_Silk_autocorr( - SKP_int32 *results, /* O Result (length correlationCount) */ - SKP_int *scale, /* O Scaling of the correlation vector */ - const SKP_int16 *inputData, /* I Input data to correlate */ - const SKP_int inputDataSize, /* I Length of input */ - const SKP_int correlationCount /* I Number of correlation taps to compute */ -) -{ - SKP_int i, lz, nRightShifts, corrCount; - SKP_int64 corr64; - - corrCount = SKP_min_int( inputDataSize, correlationCount ); - - /* compute energy (zero-lag correlation) */ - corr64 = SKP_Silk_inner_prod16_aligned_64( inputData, inputData, inputDataSize ); - - /* deal with all-zero input data */ - corr64 += 1; - - /* number of leading zeros */ - lz = SKP_Silk_CLZ64( corr64 ); - - /* scaling: number of right shifts applied to correlations */ - nRightShifts = 35 - lz; - *scale = nRightShifts; - - if( nRightShifts <= 0 ) { - results[ 0 ] = SKP_LSHIFT( (SKP_int32)SKP_CHECK_FIT32( corr64 ), -nRightShifts ); - - /* compute remaining correlations based on int32 inner product */ - for( i = 1; i < corrCount; i++ ) { - results[ i ] = SKP_LSHIFT( SKP_Silk_inner_prod_aligned( inputData, inputData + i, inputDataSize - i ), -nRightShifts ); - } - } else { - results[ 0 ] = (SKP_int32)SKP_CHECK_FIT32( SKP_RSHIFT64( corr64, nRightShifts ) ); - - /* compute remaining correlations based on int64 inner product */ - for( i = 1; i < corrCount; i++ ) { - results[ i ] = (SKP_int32)SKP_CHECK_FIT32( SKP_RSHIFT64( SKP_Silk_inner_prod16_aligned_64( inputData, inputData + i, inputDataSize - i ), nRightShifts ) ); - } - } -} diff --git a/libs/silk/src/SKP_Silk_biquad.c b/libs/silk/src/SKP_Silk_biquad.c deleted file mode 100644 index 8cbe0f062f..0000000000 --- a/libs/silk/src/SKP_Silk_biquad.c +++ /dev/null @@ -1,72 +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_biquad.c * - * * - * Second order ARMA filter * - * Can handle slowly varying filter coefficients * - * * - * Copyright 2006 (c), Skype Limited * - * Date: 060221 * - * */ -#include "SKP_Silk_SigProc_FIX.h" - -/* Second order ARMA filter */ -/* Can handle slowly varying filter coefficients */ -void SKP_Silk_biquad( - const SKP_int16 *in, /* I: input signal */ - const SKP_int16 *B, /* I: MA coefficients, Q13 [3] */ - const SKP_int16 *A, /* I: AR coefficients, Q13 [2] */ - SKP_int32 *S, /* I/O: state vector [2] */ - SKP_int16 *out, /* O: output signal */ - const SKP_int32 len /* I: signal length */ -) -{ - SKP_int k, in16; - SKP_int32 A0_neg, A1_neg, S0, S1, out32, tmp32; - - S0 = S[ 0 ]; - S1 = S[ 1 ]; - A0_neg = -A[ 0 ]; - A1_neg = -A[ 1 ]; - for( k = 0; k < len; k++ ) { - /* S[ 0 ], S[ 1 ]: Q13 */ - in16 = in[ k ]; - out32 = SKP_SMLABB( S0, in16, B[ 0 ] ); - - S0 = SKP_SMLABB( S1, in16, B[ 1 ] ); - S0 += SKP_LSHIFT( SKP_SMULWB( out32, A0_neg ), 3 ); - - S1 = SKP_LSHIFT( SKP_SMULWB( out32, A1_neg ), 3 ); - S1 = SKP_SMLABB( S1, in16, B[ 2 ] ); - tmp32 = SKP_RSHIFT_ROUND( out32, 13 ) + 1; - out[ k ] = (SKP_int16)SKP_SAT16( tmp32 ); - } - S[ 0 ] = S0; - S[ 1 ] = S1; -} diff --git a/libs/silk/src/SKP_Silk_biquad_alt.c b/libs/silk/src/SKP_Silk_biquad_alt.c deleted file mode 100644 index 5b6508bf16..0000000000 --- a/libs/silk/src/SKP_Silk_biquad_alt.c +++ /dev/null @@ -1,73 +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_biquad_alt.c * - * * - * Second order ARMA filter * - * Can handle slowly varying filter coefficients * - * */ -#include "SKP_Silk_SigProc_FIX.h" - - -/* Second order ARMA filter, alternative implementation */ -void SKP_Silk_biquad_alt( - const SKP_int16 *in, /* I: Input signal */ - const SKP_int32 *B_Q28, /* I: MA coefficients [3] */ - const SKP_int32 *A_Q28, /* I: AR coefficients [2] */ - SKP_int32 *S, /* I/O: State vector [2] */ - SKP_int16 *out, /* O: Output signal */ - const SKP_int32 len /* I: Signal length (must be even) */ -) -{ - /* DIRECT FORM II TRANSPOSED (uses 2 element state vector) */ - SKP_int k; - SKP_int32 inval, A0_U_Q28, A0_L_Q28, A1_U_Q28, A1_L_Q28, out32_Q14; - - /* Negate A_Q28 values and split in two parts */ - A0_L_Q28 = ( -A_Q28[ 0 ] ) & 0x00003FFF; /* lower part */ - A0_U_Q28 = SKP_RSHIFT( -A_Q28[ 0 ], 14 ); /* upper part */ - A1_L_Q28 = ( -A_Q28[ 1 ] ) & 0x00003FFF; /* lower part */ - A1_U_Q28 = SKP_RSHIFT( -A_Q28[ 1 ], 14 ); /* upper part */ - - for( k = 0; k < len; k++ ) { - /* S[ 0 ], S[ 1 ]: Q12 */ - inval = in[ k ]; - out32_Q14 = SKP_LSHIFT( SKP_SMLAWB( S[ 0 ], B_Q28[ 0 ], inval ), 2 ); - - S[ 0 ] = S[1] + SKP_RSHIFT_ROUND( SKP_SMULWB( out32_Q14, A0_L_Q28 ), 14 ); - S[ 0 ] = SKP_SMLAWB( S[ 0 ], out32_Q14, A0_U_Q28 ); - S[ 0 ] = SKP_SMLAWB( S[ 0 ], B_Q28[ 1 ], inval); - - S[ 1 ] = SKP_RSHIFT_ROUND( SKP_SMULWB( out32_Q14, A1_L_Q28 ), 14 ); - S[ 1 ] = SKP_SMLAWB( S[ 1 ], out32_Q14, A1_U_Q28 ); - S[ 1 ] = SKP_SMLAWB( S[ 1 ], B_Q28[ 2 ], inval ); - - /* Scale back to Q0 and saturate */ - out[ k ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT( out32_Q14 + (1<<14) - 1, 14 ) ); - } -} diff --git a/libs/silk/src/SKP_Silk_burg_modified.c b/libs/silk/src/SKP_Silk_burg_modified.c deleted file mode 100644 index f61f536312..0000000000 --- a/libs/silk/src/SKP_Silk_burg_modified.c +++ /dev/null @@ -1,228 +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_burg_modified.c * - * * - * Calculates the reflection coefficients from the input vector * - * Input vector contains nb_subfr sub vectors of length L_sub + D * - * * - * Copyright 2009 (c), Skype Limited * - * Date: 100105 * - */ - -#include "SKP_Silk_SigProc_FIX.h" - -#define MAX_FRAME_SIZE 544 // subfr_length * nb_subfr = ( 0.005 * 24000 + 16 ) * 4 = 544 -#define MAX_NB_SUBFR 4 - -#define QA 25 -#define N_BITS_HEAD_ROOM 2 -#define MIN_RSHIFTS -16 -#define MAX_RSHIFTS (32 - QA) - -/* Compute reflection coefficients from input signal */ -void SKP_Silk_burg_modified( - SKP_int32 *res_nrg, /* O residual energy */ - SKP_int *res_nrg_Q, /* O residual energy Q value */ - SKP_int32 A_Q16[], /* O prediction coefficients (length order) */ - const SKP_int16 x[], /* I input signal, length: nb_subfr * ( D + subfr_length ) */ - const SKP_int subfr_length, /* I input signal subframe length (including D preceeding samples) */ - const SKP_int nb_subfr, /* I number of subframes stacked in x */ - const SKP_int32 WhiteNoiseFrac_Q32, /* I fraction added to zero-lag autocorrelation */ - const SKP_int D /* I order */ -) -{ - SKP_int k, n, s, lz, rshifts, rshifts_extra; - SKP_int32 C0, num, nrg, rc_Q31, Atmp_QA, Atmp1, tmp1, tmp2, x1, x2; - const SKP_int16 *x_ptr; - - SKP_int32 C_first_row[ SKP_Silk_MAX_ORDER_LPC ]; - SKP_int32 C_last_row[ SKP_Silk_MAX_ORDER_LPC ]; - SKP_int32 Af_QA[ SKP_Silk_MAX_ORDER_LPC ]; - - SKP_int32 CAf[ SKP_Silk_MAX_ORDER_LPC + 1 ]; - SKP_int32 CAb[ SKP_Silk_MAX_ORDER_LPC + 1 ]; - - SKP_assert( subfr_length * nb_subfr <= MAX_FRAME_SIZE ); - SKP_assert( nb_subfr <= MAX_NB_SUBFR ); - - - /* Compute autocorrelations, added over subframes */ - SKP_Silk_sum_sqr_shift( &C0, &rshifts, x, nb_subfr * subfr_length ); - if( rshifts > MAX_RSHIFTS ) { - C0 = SKP_LSHIFT32( C0, rshifts - MAX_RSHIFTS ); - SKP_assert( C0 > 0 ); - rshifts = MAX_RSHIFTS; - } else { - lz = SKP_Silk_CLZ32( C0 ) - 1; - rshifts_extra = N_BITS_HEAD_ROOM - lz; - if( rshifts_extra > 0 ) { - rshifts_extra = SKP_min( rshifts_extra, MAX_RSHIFTS - rshifts ); - C0 = SKP_RSHIFT32( C0, rshifts_extra ); - } else { - rshifts_extra = SKP_max( rshifts_extra, MIN_RSHIFTS - rshifts ); - C0 = SKP_LSHIFT32( C0, -rshifts_extra ); - } - rshifts += rshifts_extra; - } - SKP_memset( C_first_row, 0, SKP_Silk_MAX_ORDER_LPC * sizeof( SKP_int32 ) ); - if( rshifts > 0 ) { - for( s = 0; s < nb_subfr; s++ ) { - x_ptr = x + s * subfr_length; - for( n = 1; n < D + 1; n++ ) { - C_first_row[ n - 1 ] += (SKP_int32)SKP_RSHIFT64( - SKP_Silk_inner_prod16_aligned_64( x_ptr, x_ptr + n, subfr_length - n ), rshifts ); - } - } - } else { - for( s = 0; s < nb_subfr; s++ ) { - x_ptr = x + s * subfr_length; - for( n = 1; n < D + 1; n++ ) { - C_first_row[ n - 1 ] += SKP_LSHIFT32( - SKP_Silk_inner_prod_aligned( x_ptr, x_ptr + n, subfr_length - n ), -rshifts ); - } - } - } - SKP_memcpy( C_last_row, C_first_row, SKP_Silk_MAX_ORDER_LPC * sizeof( SKP_int32 ) ); - - /* Initialize */ - CAb[ 0 ] = CAf[ 0 ] = C0 + SKP_SMMUL( WhiteNoiseFrac_Q32, C0 ) + 1; // Q(-rshifts) - - for( n = 0; n < D; n++ ) { - /* Update first row of correlation matrix (without first element) */ - /* Update last row of correlation matrix (without last element, stored in reversed order) */ - /* Update C * Af */ - /* Update C * flipud(Af) (stored in reversed order) */ - if( rshifts > -2 ) { - for( s = 0; s < nb_subfr; s++ ) { - x_ptr = x + s * subfr_length; - x1 = -SKP_LSHIFT32( (SKP_int32)x_ptr[ n ], 16 - rshifts ); // Q(16-rshifts) - x2 = -SKP_LSHIFT32( (SKP_int32)x_ptr[ subfr_length - n - 1 ], 16 - rshifts ); // Q(16-rshifts) - tmp1 = SKP_LSHIFT32( (SKP_int32)x_ptr[ n ], QA - 16 ); // Q(QA-16) - tmp2 = SKP_LSHIFT32( (SKP_int32)x_ptr[ subfr_length - n - 1 ], QA - 16 ); // Q(QA-16) - for( k = 0; k < n; k++ ) { - C_first_row[ k ] = SKP_SMLAWB( C_first_row[ k ], x1, x_ptr[ n - k - 1 ] ); // Q( -rshifts ) - C_last_row[ k ] = SKP_SMLAWB( C_last_row[ k ], x2, x_ptr[ subfr_length - n + k ] ); // Q( -rshifts ) - Atmp_QA = Af_QA[ k ]; - tmp1 = SKP_SMLAWB( tmp1, Atmp_QA, x_ptr[ n - k - 1 ] ); // Q(QA-16) - tmp2 = SKP_SMLAWB( tmp2, Atmp_QA, x_ptr[ subfr_length - n + k ] ); // Q(QA-16) - } - tmp1 = SKP_LSHIFT32( -tmp1, 32 - QA - rshifts ); // Q(16-rshifts) - tmp2 = SKP_LSHIFT32( -tmp2, 32 - QA - rshifts ); // Q(16-rshifts) - for( k = 0; k <= n; k++ ) { - CAf[ k ] = SKP_SMLAWB( CAf[ k ], tmp1, x_ptr[ n - k ] ); // Q( -rshift ) - CAb[ k ] = SKP_SMLAWB( CAb[ k ], tmp2, x_ptr[ subfr_length - n + k - 1 ] ); // Q( -rshift ) - } - } - } else { - for( s = 0; s < nb_subfr; s++ ) { - x_ptr = x + s * subfr_length; - x1 = -SKP_LSHIFT32( (SKP_int32)x_ptr[ n ], -rshifts ); // Q( -rshifts ) - x2 = -SKP_LSHIFT32( (SKP_int32)x_ptr[ subfr_length - n - 1 ], -rshifts ); // Q( -rshifts ) - tmp1 = SKP_LSHIFT32( (SKP_int32)x_ptr[ n ], 17 ); // Q17 - tmp2 = SKP_LSHIFT32( (SKP_int32)x_ptr[ subfr_length - n - 1 ], 17 ); // Q17 - for( k = 0; k < n; k++ ) { - C_first_row[ k ] = SKP_MLA( C_first_row[ k ], x1, x_ptr[ n - k - 1 ] ); // Q( -rshifts ) - C_last_row[ k ] = SKP_MLA( C_last_row[ k ], x2, x_ptr[ subfr_length - n + k ] ); // Q( -rshifts ) - Atmp1 = SKP_RSHIFT_ROUND( Af_QA[ k ], QA - 17 ); // Q17 - tmp1 = SKP_MLA( tmp1, x_ptr[ n - k - 1 ], Atmp1 ); // Q17 - tmp2 = SKP_MLA( tmp2, x_ptr[ subfr_length - n + k ], Atmp1 ); // Q17 - } - tmp1 = -tmp1; // Q17 - tmp2 = -tmp2; // Q17 - for( k = 0; k <= n; k++ ) { - CAf[ k ] = SKP_SMLAWW( CAf[ k ], tmp1, - SKP_LSHIFT32( (SKP_int32)x_ptr[ n - k ], -rshifts - 1 ) ); // Q( -rshift ) - CAb[ k ] = SKP_SMLAWW( CAb[ k ], tmp2, - SKP_LSHIFT32( (SKP_int32)x_ptr[ subfr_length - n + k - 1 ], -rshifts - 1 ) );// Q( -rshift ) - } - } - } - - /* Calculate nominator and denominator for the next order reflection (parcor) coefficient */ - tmp1 = C_first_row[ n ]; // Q( -rshifts ) - tmp2 = C_last_row[ n ]; // Q( -rshifts ) - num = 0; // Q( -rshifts ) - nrg = SKP_ADD32( CAb[ 0 ], CAf[ 0 ] ); // Q( 1-rshifts ) - for( k = 0; k < n; k++ ) { - Atmp_QA = Af_QA[ k ]; - lz = SKP_Silk_CLZ32( SKP_abs( Atmp_QA ) ) - 1; - lz = SKP_min( 32 - QA, lz ); - Atmp1 = SKP_LSHIFT32( Atmp_QA, lz ); // Q( QA + lz ) - - tmp1 = SKP_ADD_LSHIFT32( tmp1, SKP_SMMUL( C_last_row[ n - k - 1 ], Atmp1 ), 32 - QA - lz ); // Q( -rshifts ) - tmp2 = SKP_ADD_LSHIFT32( tmp2, SKP_SMMUL( C_first_row[ n - k - 1 ], Atmp1 ), 32 - QA - lz ); // Q( -rshifts ) - num = SKP_ADD_LSHIFT32( num, SKP_SMMUL( CAb[ n - k ], Atmp1 ), 32 - QA - lz ); // Q( -rshifts ) - nrg = SKP_ADD_LSHIFT32( nrg, SKP_SMMUL( SKP_ADD32( CAb[ k + 1 ], CAf[ k + 1 ] ), - Atmp1 ), 32 - QA - lz ); // Q( 1-rshifts ) - } - CAf[ n + 1 ] = tmp1; // Q( -rshifts ) - CAb[ n + 1 ] = tmp2; // Q( -rshifts ) - num = SKP_ADD32( num, tmp2 ); // Q( -rshifts ) - num = SKP_LSHIFT32( -num, 1 ); // Q( 1-rshifts ) - - /* Calculate the next order reflection (parcor) coefficient */ - if( SKP_abs( num ) < nrg ) { - rc_Q31 = SKP_DIV32_varQ( num, nrg, 31 ); - } else { - /* Negative energy or ratio too high; set remaining coefficients to zero and exit loop */ - SKP_memset( &Af_QA[ n ], 0, ( D - n ) * sizeof( SKP_int32 ) ); - SKP_assert( 0 ); - break; - } - - /* Update the AR coefficients */ - for( k = 0; k < (n + 1) >> 1; k++ ) { - tmp1 = Af_QA[ k ]; // QA - tmp2 = Af_QA[ n - k - 1 ]; // QA - Af_QA[ k ] = SKP_ADD_LSHIFT32( tmp1, SKP_SMMUL( tmp2, rc_Q31 ), 1 ); // QA - Af_QA[ n - k - 1 ] = SKP_ADD_LSHIFT32( tmp2, SKP_SMMUL( tmp1, rc_Q31 ), 1 ); // QA - } - Af_QA[ n ] = SKP_RSHIFT32( rc_Q31, 31 - QA ); // QA - - /* Update C * Af and C * Ab */ - for( k = 0; k <= n + 1; k++ ) { - tmp1 = CAf[ k ]; // Q( -rshifts ) - tmp2 = CAb[ n - k + 1 ]; // Q( -rshifts ) - CAf[ k ] = SKP_ADD_LSHIFT32( tmp1, SKP_SMMUL( tmp2, rc_Q31 ), 1 ); // Q( -rshifts ) - CAb[ n - k + 1 ] = SKP_ADD_LSHIFT32( tmp2, SKP_SMMUL( tmp1, rc_Q31 ), 1 ); // Q( -rshifts ) - } - } - - /* Return residual energy */ - nrg = CAf[ 0 ]; // Q( -rshifts ) - tmp1 = 1 << 16; // Q16 - for( k = 0; k < D; k++ ) { - Atmp1 = SKP_RSHIFT_ROUND( Af_QA[ k ], QA - 16 ); // Q16 - nrg = SKP_SMLAWW( nrg, CAf[ k + 1 ], Atmp1 ); // Q( -rshifts ) - tmp1 = SKP_SMLAWW( tmp1, Atmp1, Atmp1 ); // Q16 - A_Q16[ k ] = -Atmp1; - } - *res_nrg = SKP_SMLAWW( nrg, SKP_SMMUL( WhiteNoiseFrac_Q32, C0 ), -tmp1 ); // Q( -rshifts ) - *res_nrg_Q = -rshifts; -} diff --git a/libs/silk/src/SKP_Silk_bwexpander.c b/libs/silk/src/SKP_Silk_bwexpander.c deleted file mode 100644 index 4558efa273..0000000000 --- a/libs/silk/src/SKP_Silk_bwexpander.c +++ /dev/null @@ -1,49 +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_SigProc_FIX.h" - -/* Chirp (bandwidth expand) LP AR filter */ -void SKP_Silk_bwexpander( - SKP_int16 *ar, /* I/O AR filter to be expanded (without leading 1) */ - const SKP_int d, /* I Length of ar */ - SKP_int32 chirp_Q16 /* I Chirp factor (typically in the range 0 to 1) */ -) -{ - SKP_int i; - SKP_int32 chirp_minus_one_Q16; - - chirp_minus_one_Q16 = chirp_Q16 - 65536; - - /* NB: Dont use SKP_SMULWB, instead of SKP_RSHIFT_ROUND( SKP_MUL() , 16 ), below. */ - /* Bias in SKP_SMULWB can lead to unstable filters */ - for( i = 0; i < d - 1; i++ ) { - ar[ i ] = (SKP_int16)SKP_RSHIFT_ROUND( SKP_MUL( chirp_Q16, ar[ i ] ), 16 ); - chirp_Q16 += SKP_RSHIFT_ROUND( SKP_MUL( chirp_Q16, chirp_minus_one_Q16 ), 16 ); - } - ar[ d - 1 ] = (SKP_int16)SKP_RSHIFT_ROUND( SKP_MUL( chirp_Q16, ar[ d - 1 ] ), 16 ); -} diff --git a/libs/silk/src/SKP_Silk_bwexpander_32.c b/libs/silk/src/SKP_Silk_bwexpander_32.c deleted file mode 100644 index 6b74ca482c..0000000000 --- a/libs/silk/src/SKP_Silk_bwexpander_32.c +++ /dev/null @@ -1,46 +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_SigProc_FIX.h" - -/* Chirp (bandwidth expand) LP AR filter */ -void SKP_Silk_bwexpander_32( - SKP_int32 *ar, /* I/O AR filter to be expanded (without leading 1) */ - const SKP_int d, /* I Length of ar */ - SKP_int32 chirp_Q16 /* I Chirp factor in Q16 */ -) -{ - SKP_int i; - SKP_int32 tmp_chirp_Q16; - - tmp_chirp_Q16 = chirp_Q16; - for( i = 0; i < d - 1; i++ ) { - ar[ i ] = SKP_SMULWW( ar[ i ], tmp_chirp_Q16 ); - tmp_chirp_Q16 = SKP_SMULWW( chirp_Q16, tmp_chirp_Q16 ); - } - ar[ d - 1 ] = SKP_SMULWW( ar[ d - 1 ], tmp_chirp_Q16 ); -} diff --git a/libs/silk/src/SKP_Silk_code_signs.c b/libs/silk/src/SKP_Silk_code_signs.c deleted file mode 100644 index ba724172a2..0000000000 --- a/libs/silk/src/SKP_Silk_code_signs.c +++ /dev/null @@ -1,90 +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" - -//#define SKP_enc_map(a) ((a) > 0 ? 1 : 0) -//#define SKP_dec_map(a) ((a) > 0 ? 1 : -1) -/* shifting avoids if-statement */ -#define SKP_enc_map(a) ( SKP_RSHIFT( (a), 15 ) + 1 ) -#define SKP_dec_map(a) ( SKP_LSHIFT( (a), 1 ) - 1 ) - -/* Encodes signs of excitation */ -void SKP_Silk_encode_signs( - SKP_Silk_range_coder_state *sRC, /* I/O Range coder state */ - const SKP_int8 q[], /* I Pulse signal */ - const SKP_int length, /* I Length of input */ - const SKP_int sigtype, /* I Signal type */ - const SKP_int QuantOffsetType, /* I Quantization offset type */ - const SKP_int RateLevelIndex /* I Rate level index */ -) -{ - SKP_int i; - SKP_int inData; - SKP_uint16 cdf[ 3 ]; - - i = SKP_SMULBB( N_RATE_LEVELS - 1, SKP_LSHIFT( sigtype, 1 ) + QuantOffsetType ) + RateLevelIndex; - cdf[ 0 ] = 0; - cdf[ 1 ] = SKP_Silk_sign_CDF[ i ]; - cdf[ 2 ] = 65535; - - for( i = 0; i < length; i++ ) { - if( q[ i ] != 0 ) { - inData = SKP_enc_map( q[ i ] ); /* - = 0, + = 1 */ - SKP_Silk_range_encoder( sRC, inData, cdf ); - } - } -} - -/* Decodes signs of excitation */ -void SKP_Silk_decode_signs( - SKP_Silk_range_coder_state *sRC, /* I/O Range coder state */ - SKP_int q[], /* I/O pulse signal */ - const SKP_int length, /* I length of output */ - const SKP_int sigtype, /* I Signal type */ - const SKP_int QuantOffsetType, /* I Quantization offset type */ - const SKP_int RateLevelIndex /* I Rate Level Index */ -) -{ - SKP_int i; - SKP_int data; - SKP_uint16 cdf[ 3 ]; - - i = SKP_SMULBB( N_RATE_LEVELS - 1, SKP_LSHIFT( sigtype, 1 ) + QuantOffsetType ) + RateLevelIndex; - cdf[ 0 ] = 0; - cdf[ 1 ] = SKP_Silk_sign_CDF[ i ]; - cdf[ 2 ] = 65535; - - for( i = 0; i < length; i++ ) { - if( q[ i ] > 0 ) { - SKP_Silk_range_decoder( &data, sRC, cdf, 1 ); - /* attach sign */ - /* implementation with shift, subtraction, multiplication */ - q[ i ] *= SKP_dec_map( data ); - } - } -} diff --git a/libs/silk/src/SKP_Silk_common_pitch_est_defines.h b/libs/silk/src/SKP_Silk_common_pitch_est_defines.h deleted file mode 100644 index 5a08a7710f..0000000000 --- a/libs/silk/src/SKP_Silk_common_pitch_est_defines.h +++ /dev/null @@ -1,75 +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 SIGPROC_COMMON_PITCH_EST_DEFINES_H -#define SIGPROC_COMMON_PITCH_EST_DEFINES_H - -#include "SKP_Silk_SigProc_FIX.h" - -/************************************************************/ -/* Definitions For Fix pitch estimator */ -/************************************************************/ - -#define PITCH_EST_MAX_FS_KHZ 24 /* Maximum sampling frequency used */ - -#define PITCH_EST_FRAME_LENGTH_MS 40 /* 40 ms */ - -#define PITCH_EST_MAX_FRAME_LENGTH (PITCH_EST_FRAME_LENGTH_MS * PITCH_EST_MAX_FS_KHZ) -#define PITCH_EST_MAX_FRAME_LENGTH_ST_1 (PITCH_EST_MAX_FRAME_LENGTH >> 2) -#define PITCH_EST_MAX_FRAME_LENGTH_ST_2 (PITCH_EST_MAX_FRAME_LENGTH >> 1) -#define PITCH_EST_MAX_SF_FRAME_LENGTH (PITCH_EST_SUB_FRAME * PITCH_EST_MAX_FS_KHZ) - -#define PITCH_EST_MAX_LAG_MS 18 /* 18 ms -> 56 Hz */ -#define PITCH_EST_MIN_LAG_MS 2 /* 2 ms -> 500 Hz */ -#define PITCH_EST_MAX_LAG (PITCH_EST_MAX_LAG_MS * PITCH_EST_MAX_FS_KHZ) -#define PITCH_EST_MIN_LAG (PITCH_EST_MIN_LAG_MS * PITCH_EST_MAX_FS_KHZ) - -#define PITCH_EST_NB_SUBFR 4 - -#define PITCH_EST_D_SRCH_LENGTH 24 - -#define PITCH_EST_MAX_DECIMATE_STATE_LENGTH 7 - -#define PITCH_EST_NB_STAGE3_LAGS 5 - -#define PITCH_EST_NB_CBKS_STAGE2 3 -#define PITCH_EST_NB_CBKS_STAGE2_EXT 11 - -#define PITCH_EST_CB_mn2 1 -#define PITCH_EST_CB_mx2 2 - -#define PITCH_EST_NB_CBKS_STAGE3_MAX 34 -#define PITCH_EST_NB_CBKS_STAGE3_MID 24 -#define PITCH_EST_NB_CBKS_STAGE3_MIN 16 - -extern const SKP_int16 SKP_Silk_CB_lags_stage2[PITCH_EST_NB_SUBFR][PITCH_EST_NB_CBKS_STAGE2_EXT]; -extern const SKP_int16 SKP_Silk_CB_lags_stage3[PITCH_EST_NB_SUBFR][PITCH_EST_NB_CBKS_STAGE3_MAX]; -extern const SKP_int16 SKP_Silk_Lag_range_stage3[ SKP_Silk_PITCH_EST_MAX_COMPLEX + 1 ] [ PITCH_EST_NB_SUBFR ][ 2 ]; -extern const SKP_int16 SKP_Silk_cbk_sizes_stage3[ SKP_Silk_PITCH_EST_MAX_COMPLEX + 1 ]; -extern const SKP_int16 SKP_Silk_cbk_offsets_stage3[ SKP_Silk_PITCH_EST_MAX_COMPLEX + 1 ]; - -#endif diff --git a/libs/silk/src/SKP_Silk_control_audio_bandwidth.c b/libs/silk/src/SKP_Silk_control_audio_bandwidth.c deleted file mode 100644 index e977475569..0000000000 --- a/libs/silk/src/SKP_Silk_control_audio_bandwidth.c +++ /dev/null @@ -1,137 +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" - -/* Control internal sampling rate */ -SKP_int SKP_Silk_control_audio_bandwidth( - SKP_Silk_encoder_state *psEncC, /* I/O Pointer to Silk encoder state */ - const SKP_int32 TargetRate_bps /* I Target max bitrate (bps) */ -) -{ - SKP_int fs_kHz; - - fs_kHz = psEncC->fs_kHz; - if( fs_kHz == 0 ) { - /* Encoder has just been initialized */ - if( TargetRate_bps >= SWB2WB_BITRATE_BPS ) { - fs_kHz = 24; - } else if( TargetRate_bps >= WB2MB_BITRATE_BPS ) { - fs_kHz = 16; - } else if( TargetRate_bps >= MB2NB_BITRATE_BPS ) { - fs_kHz = 12; - } else { - fs_kHz = 8; - } - /* 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 ); - } else if( SKP_SMULBB( fs_kHz, 1000 ) > psEncC->API_fs_Hz || fs_kHz > psEncC->maxInternal_fs_kHz ) { - /* Make sure internal rate is not higher than external rate or maximum allowed */ - fs_kHz = SKP_DIV32_16( psEncC->API_fs_Hz, 1000 ); - fs_kHz = SKP_min( fs_kHz, psEncC->maxInternal_fs_kHz ); - } else { - /* State machine for the internal sampling rate switching */ - if( psEncC->API_fs_Hz > 8000 ) { - /* Accumulate the difference between the target rate and limit for switching down */ - psEncC->bitrateDiff += SKP_MUL( psEncC->PacketSize_ms, psEncC->TargetRate_bps - psEncC->bitrate_threshold_down ); - psEncC->bitrateDiff = SKP_min( psEncC->bitrateDiff, 0 ); - - if( psEncC->vadFlag == NO_VOICE_ACTIVITY ) { /* Low speech activity */ - /* Check if we should switch down */ -#if SWITCH_TRANSITION_FILTERING - if( ( psEncC->sLP.transition_frame_no == 0 ) && /* Transition phase not active */ - ( psEncC->bitrateDiff <= -ACCUM_BITS_DIFF_THRESHOLD || /* Bitrate threshold is met */ - ( psEncC->sSWBdetect.WB_detected * psEncC->fs_kHz == 24 ) ) ) { /* Forced down-switching due to WB input */ - psEncC->sLP.transition_frame_no = 1; /* Begin transition phase */ - psEncC->sLP.mode = 0; /* Switch down */ - } else if( - ( psEncC->sLP.transition_frame_no >= TRANSITION_FRAMES_DOWN ) && /* Transition phase complete */ - ( psEncC->sLP.mode == 0 ) ) { /* Ready to switch down */ - psEncC->sLP.transition_frame_no = 0; /* Ready for new transition phase */ -#else - if( psEncC->bitrateDiff <= -ACCUM_BITS_DIFF_THRESHOLD ) { /* Bitrate threshold is met */ -#endif - psEncC->bitrateDiff = 0; - - /* Switch to a lower sample frequency */ - if( psEncC->fs_kHz == 24 ) { - fs_kHz = 16; - } else if( psEncC->fs_kHz == 16 ) { - fs_kHz = 12; - } else { - SKP_assert( psEncC->fs_kHz == 12 ); - fs_kHz = 8; - } - } - - /* Check if we should switch up */ - if( ( ( psEncC->fs_kHz * 1000 < psEncC->API_fs_Hz ) && - ( psEncC->TargetRate_bps >= psEncC->bitrate_threshold_up ) && - ( psEncC->sSWBdetect.WB_detected * psEncC->fs_kHz < 16 ) ) && - ( ( ( psEncC->fs_kHz == 16 ) && ( psEncC->maxInternal_fs_kHz >= 24 ) ) || - ( ( psEncC->fs_kHz == 12 ) && ( psEncC->maxInternal_fs_kHz >= 16 ) ) || - ( ( psEncC->fs_kHz == 8 ) && ( psEncC->maxInternal_fs_kHz >= 12 ) ) ) -#if SWITCH_TRANSITION_FILTERING - && ( psEncC->sLP.transition_frame_no == 0 ) ) { /* No transition phase running, ready to switch */ - psEncC->sLP.mode = 1; /* Switch up */ -#else - ) { -#endif - psEncC->bitrateDiff = 0; - - /* Switch to a higher sample frequency */ - if( psEncC->fs_kHz == 8 ) { - fs_kHz = 12; - } else if( psEncC->fs_kHz == 12 ) { - fs_kHz = 16; - } else { - SKP_assert( psEncC->fs_kHz == 16 ); - fs_kHz = 24; - } - } - } - } - -#if SWITCH_TRANSITION_FILTERING - /* After switching up, stop transition filter during speech inactivity */ - if( ( psEncC->sLP.mode == 1 ) && - ( psEncC->sLP.transition_frame_no >= TRANSITION_FRAMES_UP ) && - ( psEncC->vadFlag == NO_VOICE_ACTIVITY ) ) { - - psEncC->sLP.transition_frame_no = 0; - - /* Reset transition filter state */ - SKP_memset( psEncC->sLP.In_LP_State, 0, 2 * sizeof( SKP_int32 ) ); - } -#endif - } - - - - return fs_kHz; -} diff --git a/libs/silk/src/SKP_Silk_control_codec_FIX.c b/libs/silk/src/SKP_Silk_control_codec_FIX.c deleted file mode 100644 index 3a9f1744a6..0000000000 --- a/libs/silk/src/SKP_Silk_control_codec_FIX.c +++ /dev/null @@ -1,403 +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_FIX.h" -#include "SKP_Silk_setup_complexity.h" - -SKP_INLINE SKP_int SKP_Silk_setup_resamplers_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk encoder state FIX */ - SKP_int fs_kHz /* I Internal sampling rate (kHz) */ -); - -SKP_INLINE SKP_int SKP_Silk_setup_packetsize_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk encoder state FIX */ - SKP_int PacketSize_ms /* I Packet length (ms) */ -); - -SKP_INLINE SKP_int SKP_Silk_setup_fs_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk encoder state FIX */ - SKP_int fs_kHz /* I Internal sampling rate (kHz) */ -); - -SKP_INLINE SKP_int SKP_Silk_setup_rate_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk encoder state FIX */ - SKP_int TargetRate_bps /* I Target max bitrate (if SNR_dB == 0) */ -); - -SKP_INLINE SKP_int SKP_Silk_setup_LBRR_FIX( - SKP_Silk_encoder_state_FIX *psEnc /* I/O Pointer to Silk encoder state FIX */ -); - -/* Control 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 DTX_enabled, /* I Enable / disable DTX */ - const SKP_int Complexity /* I Complexity (0->low; 1->medium; 2->high) */ -) -{ - SKP_int fs_kHz, ret = 0; - - if( psEnc->sCmn.controlled_since_last_payload != 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_FIX( 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_FIX( psEnc, fs_kHz ); - - /********************************************/ - /* Set packet size */ - /********************************************/ - ret += SKP_Silk_setup_packetsize_FIX( psEnc, PacketSize_ms ); - - /********************************************/ - /* Set internal sampling frequency */ - /********************************************/ - ret += SKP_Silk_setup_fs_FIX( psEnc, fs_kHz ); - - /********************************************/ - /* Set encoding complexity */ - /********************************************/ - ret += SKP_Silk_setup_complexity( &psEnc->sCmn, Complexity ); - - /********************************************/ - /* Set bitrate/coding quality */ - /********************************************/ - ret += SKP_Silk_setup_rate_FIX( 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_FIX( psEnc ); - - /********************************************/ - /* Set DTX mode */ - /********************************************/ - if( DTX_enabled < 0 || DTX_enabled > 1 ) { - ret = SKP_SILK_ENC_INVALID_DTX_SETTING; - } - psEnc->sCmn.useDTX = DTX_enabled; - psEnc->sCmn.controlled_since_last_payload = 1; - - return ret; -} - -/* Control low bitrate redundancy usage */ -void SKP_Silk_LBRR_ctrl_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I Encoder state FIX */ - SKP_Silk_encoder_control *psEncCtrlC /* I/O Encoder control */ -) -{ - SKP_int LBRR_usage; - - if( psEnc->sCmn.LBRR_enabled ) { - /* Control LBRR */ - - /* Usage Control based on sensitivity and packet loss caracteristics */ - /* For now only enable adding to next for active frames. Make more complex later */ - LBRR_usage = SKP_SILK_NO_LBRR; - if( psEnc->speech_activity_Q8 > SKP_FIX_CONST( LBRR_SPEECH_ACTIVITY_THRES, 8 ) && psEnc->sCmn.PacketLoss_perc > LBRR_LOSS_THRES ) { // nb! maybe multiply loss prob and speech activity - LBRR_usage = SKP_SILK_ADD_LBRR_TO_PLUS1; - } - psEncCtrlC->LBRR_usage = LBRR_usage; - } else { - psEncCtrlC->LBRR_usage = SKP_SILK_NO_LBRR; - } -} - -SKP_INLINE SKP_int SKP_Silk_setup_resamplers_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk encoder state FIX */ - SKP_int fs_kHz /* I Internal sampling rate (kHz) */ -) -{ - 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_int32 nSamples_temp = SKP_LSHIFT( psEnc->sCmn.frame_length, 1 ) + LA_SHAPE_MS * psEnc->sCmn.fs_kHz; - - 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 */ - - 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, 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 ); - - /* 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 ) ); - - /* 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, SKP_SMULBB( fs_kHz, 1000 ) ); - - } else { - /* Copy data */ - SKP_memcpy( x_buf_API_fs_Hz, psEnc->x_buf, 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 ); - } - } - } - - psEnc->sCmn.prev_API_fs_Hz = psEnc->sCmn.API_fs_Hz; - - return(ret); -} - -SKP_INLINE SKP_int SKP_Silk_setup_packetsize_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk encoder state FIX */ - SKP_int PacketSize_ms /* I Packet length (ms) */ -) -{ - SKP_int ret = SKP_SILK_NO_ERROR; - - /* Set packet size */ - if( ( PacketSize_ms != 20 ) && - ( PacketSize_ms != 40 ) && - ( PacketSize_ms != 60 ) && - ( PacketSize_ms != 80 ) && - ( PacketSize_ms != 100 ) ) { - ret = SKP_SILK_ENC_PACKET_SIZE_NOT_SUPPORTED; - } else { - if( PacketSize_ms != psEnc->sCmn.PacketSize_ms ) { - psEnc->sCmn.PacketSize_ms = PacketSize_ms; - - /* Packet length changes. Reset LBRR buffer */ - SKP_Silk_LBRR_reset( &psEnc->sCmn ); - } - } - return(ret); -} - -SKP_INLINE SKP_int SKP_Silk_setup_fs_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk encoder state FIX */ - SKP_int fs_kHz /* I Internal sampling rate (kHz) */ -) -{ - SKP_int ret = SKP_SILK_NO_ERROR; - - /* Set internal sampling frequency */ - if( psEnc->sCmn.fs_kHz != fs_kHz ) { - /* reset part of the state */ - SKP_memset( &psEnc->sShape, 0, sizeof( SKP_Silk_shape_state_FIX ) ); - SKP_memset( &psEnc->sPrefilt, 0, sizeof( SKP_Silk_prefilter_state_FIX ) ); - SKP_memset( &psEnc->sNSQ, 0, sizeof( SKP_Silk_nsq_state ) ); - SKP_memset( &psEnc->sPred, 0, sizeof( SKP_Silk_predict_state_FIX ) ); - SKP_memset( psEnc->sNSQ.xq, 0, ( 2 * MAX_FRAME_LENGTH ) * sizeof( SKP_int16 ) ); - SKP_memset( psEnc->sNSQ_LBRR.xq, 0, ( 2 * MAX_FRAME_LENGTH ) * sizeof( SKP_int16 ) ); - SKP_memset( psEnc->sCmn.LBRR_buffer, 0, MAX_LBRR_DELAY * sizeof( SKP_SILK_LBRR_struct ) ); -#if SWITCH_TRANSITION_FILTERING - SKP_memset( psEnc->sCmn.sLP.In_LP_State, 0, 2 * sizeof( SKP_int32 ) ); - if( psEnc->sCmn.sLP.mode == 1 ) { - /* Begin transition phase */ - psEnc->sCmn.sLP.transition_frame_no = 1; - } else { - /* End transition phase */ - psEnc->sCmn.sLP.transition_frame_no = 0; - } -#endif - psEnc->sCmn.inputBufIx = 0; - psEnc->sCmn.nFramesInPayloadBuf = 0; - psEnc->sCmn.nBytesInPayloadBuf = 0; - psEnc->sCmn.oldest_LBRR_idx = 0; - psEnc->sCmn.TargetRate_bps = 0; /* Ensures that psEnc->SNR_dB is recomputed */ - - SKP_memset( psEnc->sPred.prev_NLSFq_Q15, 0, MAX_LPC_ORDER * sizeof( SKP_int ) ); - - /* Initialize non-zero parameters */ - psEnc->sCmn.prevLag = 100; - psEnc->sCmn.prev_sigtype = SIG_TYPE_UNVOICED; - psEnc->sCmn.first_frame_after_reset = 1; - psEnc->sPrefilt.lagPrev = 100; - psEnc->sShape.LastGainIndex = 1; - psEnc->sNSQ.lagPrev = 100; - psEnc->sNSQ.prev_inv_gain_Q16 = 65536; - psEnc->sNSQ_LBRR.prev_inv_gain_Q16 = 65536; - - psEnc->sCmn.fs_kHz = fs_kHz; - if( psEnc->sCmn.fs_kHz == 8 ) { - psEnc->sCmn.predictLPCOrder = MIN_LPC_ORDER; - psEnc->sCmn.psNLSF_CB[ 0 ] = &SKP_Silk_NLSF_CB0_10; - psEnc->sCmn.psNLSF_CB[ 1 ] = &SKP_Silk_NLSF_CB1_10; - } else { - psEnc->sCmn.predictLPCOrder = MAX_LPC_ORDER; - psEnc->sCmn.psNLSF_CB[ 0 ] = &SKP_Silk_NLSF_CB0_16; - psEnc->sCmn.psNLSF_CB[ 1 ] = &SKP_Silk_NLSF_CB1_16; - } - psEnc->sCmn.frame_length = SKP_SMULBB( FRAME_LENGTH_MS, fs_kHz ); - psEnc->sCmn.subfr_length = SKP_DIV32_16( psEnc->sCmn.frame_length, NB_SUBFR ); - psEnc->sCmn.la_pitch = SKP_SMULBB( LA_PITCH_MS, fs_kHz ); - psEnc->sPred.min_pitch_lag = SKP_SMULBB( 3, fs_kHz ); - psEnc->sPred.max_pitch_lag = SKP_SMULBB( 18, fs_kHz ); - psEnc->sPred.pitch_LPC_win_length = SKP_SMULBB( FIND_PITCH_LPC_WIN_MS, fs_kHz ); - if( psEnc->sCmn.fs_kHz == 24 ) { - psEnc->mu_LTP_Q8 = SKP_FIX_CONST( MU_LTP_QUANT_SWB, 8 ); - psEnc->sCmn.bitrate_threshold_up = SKP_int32_MAX; - psEnc->sCmn.bitrate_threshold_down = SWB2WB_BITRATE_BPS; - } else if( psEnc->sCmn.fs_kHz == 16 ) { - psEnc->mu_LTP_Q8 = SKP_FIX_CONST( MU_LTP_QUANT_WB, 8 ); - psEnc->sCmn.bitrate_threshold_up = WB2SWB_BITRATE_BPS; - psEnc->sCmn.bitrate_threshold_down = WB2MB_BITRATE_BPS; - } else if( psEnc->sCmn.fs_kHz == 12 ) { - psEnc->mu_LTP_Q8 = SKP_FIX_CONST( MU_LTP_QUANT_MB, 8 ); - psEnc->sCmn.bitrate_threshold_up = MB2WB_BITRATE_BPS; - psEnc->sCmn.bitrate_threshold_down = MB2NB_BITRATE_BPS; - } else { - psEnc->mu_LTP_Q8 = SKP_FIX_CONST( MU_LTP_QUANT_NB, 8 ); - psEnc->sCmn.bitrate_threshold_up = NB2MB_BITRATE_BPS; - psEnc->sCmn.bitrate_threshold_down = 0; - } - psEnc->sCmn.fs_kHz_changed = 1; - - /* Check that settings are valid */ - SKP_assert( ( psEnc->sCmn.subfr_length * NB_SUBFR ) == psEnc->sCmn.frame_length ); - } - return( ret ); -} - -SKP_INLINE SKP_int SKP_Silk_setup_rate_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk encoder state FIX */ - SKP_int TargetRate_bps /* I Target max bitrate (if SNR_dB == 0) */ -) -{ - SKP_int k, ret = SKP_SILK_NO_ERROR; - SKP_int32 frac_Q6; - 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 { - rateTable = TargetRate_table_SWB; - } - 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; - } - } - } - return( ret ); -} - -SKP_INLINE SKP_int SKP_Silk_setup_LBRR_FIX( - SKP_Silk_encoder_state_FIX *psEnc /* I/O Pointer to Silk encoder state FIX */ -) -{ - SKP_int ret = SKP_SILK_NO_ERROR; -#if USE_LBRR - SKP_int32 LBRRRate_thres_bps; - - if( psEnc->sCmn.useInBandFEC < 0 || psEnc->sCmn.useInBandFEC > 1 ) { - ret = SKP_SILK_ENC_INVALID_INBAND_FEC_SETTING; - } - - psEnc->sCmn.LBRR_enabled = psEnc->sCmn.useInBandFEC; - if( psEnc->sCmn.fs_kHz == 8 ) { - LBRRRate_thres_bps = INBAND_FEC_MIN_RATE_BPS - 9000; - } else if( psEnc->sCmn.fs_kHz == 12 ) { - LBRRRate_thres_bps = INBAND_FEC_MIN_RATE_BPS - 6000;; - } else if( psEnc->sCmn.fs_kHz == 16 ) { - LBRRRate_thres_bps = INBAND_FEC_MIN_RATE_BPS - 3000; - } else { - LBRRRate_thres_bps = INBAND_FEC_MIN_RATE_BPS; - } - - if( psEnc->sCmn.TargetRate_bps >= LBRRRate_thres_bps ) { - /* Set gain increase / rate reduction for LBRR usage */ - /* Coarsely tuned with PESQ for now. */ - /* Linear regression coefs G = 8 - 0.5 * loss */ - /* Meaning that at 16% loss main rate and redundant rate is the same, -> G = 0 */ - psEnc->sCmn.LBRR_GainIncreases = SKP_max_int( 8 - SKP_RSHIFT( psEnc->sCmn.PacketLoss_perc, 1 ), 0 ); - - /* Set main stream rate compensation */ - if( psEnc->sCmn.LBRR_enabled && psEnc->sCmn.PacketLoss_perc > LBRR_LOSS_THRES ) { - /* Tuned to give approx same mean / weighted bitrate as no inband FEC */ - psEnc->inBandFEC_SNR_comp_Q8 = SKP_FIX_CONST( 6.0f, 8 ) - SKP_LSHIFT( psEnc->sCmn.LBRR_GainIncreases, 7 ); - } else { - psEnc->inBandFEC_SNR_comp_Q8 = 0; - psEnc->sCmn.LBRR_enabled = 0; - } - } else { - psEnc->inBandFEC_SNR_comp_Q8 = 0; - psEnc->sCmn.LBRR_enabled = 0; - } -#else - if( INBandFEC_enabled != 0 ) { - ret = SKP_SILK_ENC_INVALID_INBAND_FEC_SETTING; - } - psEnc->sCmn.LBRR_enabled = 0; -#endif - return ret; -} diff --git a/libs/silk/src/SKP_Silk_corrMatrix_FIX.c b/libs/silk/src/SKP_Silk_corrMatrix_FIX.c deleted file mode 100644 index 5d907f20f5..0000000000 --- a/libs/silk/src/SKP_Silk_corrMatrix_FIX.c +++ /dev/null @@ -1,152 +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. -***********************************************************************/ - -/********************************************************************** - * Correlation Matrix Computations for LS estimate. - **********************************************************************/ - -#include "SKP_Silk_main_FIX.h" - -/* Calculates correlation vector X'*t */ -void SKP_Silk_corrVector_FIX( - const SKP_int16 *x, /* I x vector [L + order - 1] used to form data matrix X */ - const SKP_int16 *t, /* I target vector [L] */ - const SKP_int L, /* I Length of vectors */ - const SKP_int order, /* I Max lag for correlation */ - SKP_int32 *Xt, /* O Pointer to X'*t correlation vector [order] */ - const SKP_int rshifts /* I Right shifts of correlations */ -) -{ - SKP_int lag, i; - const SKP_int16 *ptr1, *ptr2; - SKP_int32 inner_prod; - - ptr1 = &x[ order - 1 ]; /* Points to first sample of column 0 of X: X[:,0] */ - ptr2 = t; - /* Calculate X'*t */ - if( rshifts > 0 ) { - /* Right shifting used */ - for( lag = 0; lag < order; lag++ ) { - inner_prod = 0; - for( i = 0; i < L; i++ ) { - inner_prod += SKP_RSHIFT32( SKP_SMULBB( ptr1[ i ], ptr2[i] ), rshifts ); - } - Xt[ lag ] = inner_prod; /* X[:,lag]'*t */ - ptr1--; /* Go to next column of X */ - } - } else { - SKP_assert( rshifts == 0 ); - for( lag = 0; lag < order; lag++ ) { - Xt[ lag ] = SKP_Silk_inner_prod_aligned( ptr1, ptr2, L ); /* X[:,lag]'*t */ - ptr1--; /* Go to next column of X */ - } - } -} - -/* Calculates correlation matrix X'*X */ -void SKP_Silk_corrMatrix_FIX( - const SKP_int16 *x, /* I x vector [L + order - 1] used to form data matrix X */ - const SKP_int L, /* I Length of vectors */ - const SKP_int order, /* I Max lag for correlation */ - const SKP_int head_room, /* I Desired headroom */ - SKP_int32 *XX, /* O Pointer to X'*X correlation matrix [ order x order ]*/ - SKP_int *rshifts /* I/O Right shifts of correlations */ -) -{ - SKP_int i, j, lag, rshifts_local, head_room_rshifts; - SKP_int32 energy; - const SKP_int16 *ptr1, *ptr2; - - /* Calculate energy to find shift used to fit in 32 bits */ - SKP_Silk_sum_sqr_shift( &energy, &rshifts_local, x, L + order - 1 ); - - /* Add shifts to get the desired head room */ - head_room_rshifts = SKP_max( head_room - SKP_Silk_CLZ32( energy ), 0 ); - - energy = SKP_RSHIFT32( energy, head_room_rshifts ); - rshifts_local += head_room_rshifts; - - /* Calculate energy of first column (0) of X: X[:,0]'*X[:,0] */ - /* Remove contribution of first order - 1 samples */ - for( i = 0; i < order - 1; i++ ) { - energy -= SKP_RSHIFT32( SKP_SMULBB( x[ i ], x[ i ] ), rshifts_local ); - } - if( rshifts_local < *rshifts ) { - /* Adjust energy */ - energy = SKP_RSHIFT32( energy, *rshifts - rshifts_local ); - rshifts_local = *rshifts; - } - - /* Calculate energy of remaining columns of X: X[:,j]'*X[:,j] */ - /* Fill out the diagonal of the correlation matrix */ - matrix_ptr( XX, 0, 0, order ) = energy; - ptr1 = &x[ order - 1 ]; /* First sample of column 0 of X */ - for( j = 1; j < order; j++ ) { - energy = SKP_SUB32( energy, SKP_RSHIFT32( SKP_SMULBB( ptr1[ L - j ], ptr1[ L - j ] ), rshifts_local ) ); - energy = SKP_ADD32( energy, SKP_RSHIFT32( SKP_SMULBB( ptr1[ -j ], ptr1[ -j ] ), rshifts_local ) ); - matrix_ptr( XX, j, j, order ) = energy; - } - - ptr2 = &x[ order - 2 ]; /* First sample of column 1 of X */ - /* Calculate the remaining elements of the correlation matrix */ - if( rshifts_local > 0 ) { - /* Right shifting used */ - for( lag = 1; lag < order; lag++ ) { - /* Inner product of column 0 and column lag: X[:,0]'*X[:,lag] */ - energy = 0; - for( i = 0; i < L; i++ ) { - energy += SKP_RSHIFT32( SKP_SMULBB( ptr1[ i ], ptr2[i] ), rshifts_local ); - } - /* Calculate remaining off diagonal: X[:,j]'*X[:,j + lag] */ - matrix_ptr( XX, lag, 0, order ) = energy; - matrix_ptr( XX, 0, lag, order ) = energy; - for( j = 1; j < ( order - lag ); j++ ) { - energy = SKP_SUB32( energy, SKP_RSHIFT32( SKP_SMULBB( ptr1[ L - j ], ptr2[ L - j ] ), rshifts_local ) ); - energy = SKP_ADD32( energy, SKP_RSHIFT32( SKP_SMULBB( ptr1[ -j ], ptr2[ -j ] ), rshifts_local ) ); - matrix_ptr( XX, lag + j, j, order ) = energy; - matrix_ptr( XX, j, lag + j, order ) = energy; - } - ptr2--; /* Update pointer to first sample of next column (lag) in X */ - } - } else { - for( lag = 1; lag < order; lag++ ) { - /* Inner product of column 0 and column lag: X[:,0]'*X[:,lag] */ - energy = SKP_Silk_inner_prod_aligned( ptr1, ptr2, L ); - matrix_ptr( XX, lag, 0, order ) = energy; - matrix_ptr( XX, 0, lag, order ) = energy; - /* Calculate remaining off diagonal: X[:,j]'*X[:,j + lag] */ - for( j = 1; j < ( order - lag ); j++ ) { - energy = SKP_SUB32( energy, SKP_SMULBB( ptr1[ L - j ], ptr2[ L - j ] ) ); - energy = SKP_SMLABB( energy, ptr1[ -j ], ptr2[ -j ] ); - matrix_ptr( XX, lag + j, j, order ) = energy; - matrix_ptr( XX, j, lag + j, order ) = energy; - } - ptr2--;/* Update pointer to first sample of next column (lag) in X */ - } - } - *rshifts = rshifts_local; -} diff --git a/libs/silk/src/SKP_Silk_create_init_destroy.c b/libs/silk/src/SKP_Silk_create_init_destroy.c deleted file mode 100644 index 5d119dcc9e..0000000000 --- a/libs/silk/src/SKP_Silk_create_init_destroy.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 "SKP_Silk_main.h" - - -/************************/ -/* Init Decoder State */ -/************************/ -SKP_int SKP_Silk_init_decoder( - SKP_Silk_decoder_state *psDec /* I/O Decoder state pointer */ -) -{ - SKP_memset( psDec, 0, sizeof( SKP_Silk_decoder_state ) ); - /* Set sampling rate to 24 kHz, and init non-zero values */ - SKP_Silk_decoder_set_fs( psDec, 24 ); - - /* Used to deactivate e.g. LSF interpolation and fluctuation reduction */ - psDec->first_frame_after_reset = 1; - psDec->prev_inv_gain_Q16 = 65536; - - /* Reset CNG state */ - SKP_Silk_CNG_Reset( psDec ); - - SKP_Silk_PLC_Reset( psDec ); - - return(0); -} diff --git a/libs/silk/src/SKP_Silk_dec_API.c b/libs/silk/src/SKP_Silk_dec_API.c deleted file mode 100644 index 006a17ab15..0000000000 --- a/libs/silk/src/SKP_Silk_dec_API.c +++ /dev/null @@ -1,279 +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_SDK_API.h" -#include "SKP_Silk_main.h" - -/*********************/ -/* Decoder functions */ -/*********************/ - -SKP_int SKP_Silk_SDK_Get_Decoder_Size( SKP_int32 *decSizeBytes ) -{ - SKP_int ret = 0; - - *decSizeBytes = sizeof( SKP_Silk_decoder_state ); - - return ret; -} - -/* Reset decoder state */ -SKP_int SKP_Silk_SDK_InitDecoder( - void* decState /* I/O: State */ -) -{ - SKP_int ret = 0; - SKP_Silk_decoder_state *struc; - - struc = (SKP_Silk_decoder_state *)decState; - - ret = SKP_Silk_init_decoder( struc ); - - return ret; -} - -/* Decode a frame */ -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 */ - const SKP_uint8 *inData, /* I: Encoded input vector */ - const SKP_int nBytesIn, /* I: Number of input Bytes */ - SKP_int16 *samplesOut, /* O: Decoded output speech vector */ - SKP_int16 *nSamplesOut /* I/O: Number of samples (vector/decoded) */ -) -{ - SKP_int ret = 0, used_bytes, prev_fs_kHz; - SKP_Silk_decoder_state *psDec; - SKP_int16 samplesOutInternal[ MAX_API_FS_KHZ * FRAME_LENGTH_MS ]; - SKP_int16 *pSamplesOutInternal; - - psDec = (SKP_Silk_decoder_state *)decState; - - /* We need this buffer to have room for an internal frame */ - pSamplesOutInternal = samplesOut; - if( psDec->fs_kHz * 1000 > decControl->API_sampleRate ) { - pSamplesOutInternal = samplesOutInternal; - } - - /**********************************/ - /* Test if first frame in payload */ - /**********************************/ - if( psDec->moreInternalDecoderFrames == 0 ) { - /* First Frame in Payload */ - psDec->nFramesDecoded = 0; /* Used to count frames in packet */ - } - - if( psDec->moreInternalDecoderFrames == 0 && /* First frame in packet */ - lostFlag == 0 && /* Not packet loss */ - nBytesIn > MAX_ARITHM_BYTES ) { /* Too long payload */ - /* Avoid trying to decode a too large packet */ - lostFlag = 1; - ret = SKP_SILK_DEC_PAYLOAD_TOO_LARGE; - } - - /* Save previous sample frequency */ - prev_fs_kHz = psDec->fs_kHz; - - /* Call decoder for one frame */ - ret += SKP_Silk_decode_frame( psDec, pSamplesOutInternal, nSamplesOut, inData, nBytesIn, - lostFlag, &used_bytes ); - - if( used_bytes ) { /* Only Call if not a packet loss */ - if( psDec->nBytesLeft > 0 && psDec->FrameTermination == SKP_SILK_MORE_FRAMES && psDec->nFramesDecoded < 5 ) { - /* We have more frames in the Payload */ - psDec->moreInternalDecoderFrames = 1; - } else { - /* Last frame in Payload */ - psDec->moreInternalDecoderFrames = 0; - psDec->nFramesInPacket = psDec->nFramesDecoded; - - /* Track inband FEC usage */ - if( psDec->vadFlag == VOICE_ACTIVITY ) { - if( psDec->FrameTermination == SKP_SILK_LAST_FRAME ) { - psDec->no_FEC_counter++; - if( psDec->no_FEC_counter > NO_LBRR_THRES ) { - psDec->inband_FEC_offset = 0; - } - } else if( psDec->FrameTermination == SKP_SILK_LBRR_VER1 ) { - psDec->inband_FEC_offset = 1; /* FEC info with 1 packet delay */ - psDec->no_FEC_counter = 0; - } else if( psDec->FrameTermination == SKP_SILK_LBRR_VER2 ) { - psDec->inband_FEC_offset = 2; /* FEC info with 2 packets delay */ - psDec->no_FEC_counter = 0; - } - } - } - } - - if( MAX_API_FS_KHZ * 1000 < decControl->API_sampleRate || - 8000 > decControl->API_sampleRate ) { - ret = SKP_SILK_DEC_INVALID_SAMPLING_FREQUENCY; - return( ret ); - } - - /* Resample if needed */ - if( psDec->fs_kHz * 1000 != decControl->API_sampleRate ) { - SKP_int16 samplesOut_tmp[ MAX_API_FS_KHZ * FRAME_LENGTH_MS ]; - SKP_assert( psDec->fs_kHz <= MAX_API_FS_KHZ ); - - /* Copy to a tmp buffer as the resampling writes to samplesOut */ - SKP_memcpy( samplesOut_tmp, pSamplesOutInternal, *nSamplesOut * sizeof( SKP_int16 ) ); - - /* (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 ); - } - - /* Resample the output to API_sampleRate */ - ret += SKP_Silk_resampler( &psDec->resampler_state, samplesOut, samplesOut_tmp, *nSamplesOut ); - - /* Update the number of output samples */ - *nSamplesOut = SKP_DIV32( ( SKP_int32 )*nSamplesOut * decControl->API_sampleRate, psDec->fs_kHz * 1000 ); - } else if( prev_fs_kHz * 1000 > decControl->API_sampleRate ) { - SKP_memcpy( samplesOut, pSamplesOutInternal, *nSamplesOut * sizeof( SKP_int16 ) ); - } - - psDec->prev_API_sampleRate = decControl->API_sampleRate; - - /* Copy all parameters that are needed out of internal structure to the control stucture */ - decControl->frameSize = (SKP_uint16)( decControl->API_sampleRate / 50 ) ; - decControl->framesPerPacket = ( SKP_int )psDec->nFramesInPacket; - decControl->inBandFECOffset = ( SKP_int )psDec->inband_FEC_offset; - decControl->moreInternalDecoderFrames = ( SKP_int )psDec->moreInternalDecoderFrames; - - return ret; -} - -/* Function to find LBRR information in a packet */ -void SKP_Silk_SDK_search_for_LBRR( - const SKP_uint8 *inData, /* I: Encoded input vector */ - const SKP_int nBytesIn, /* I: Number of input Bytes */ - SKP_int lost_offset, /* I: Offset from lost packet */ - SKP_uint8 *LBRRData, /* O: LBRR payload */ - SKP_int16 *nLBRRBytes /* O: Number of LBRR Bytes */ -) -{ - SKP_Silk_decoder_state sDec; // Local decoder state to avoid interfering with running decoder */ - SKP_Silk_decoder_control sDecCtrl; - SKP_int TempQ[ MAX_FRAME_LENGTH ]; - - if( lost_offset < 1 || lost_offset > MAX_LBRR_DELAY ) { - /* No useful FEC in this packet */ - *nLBRRBytes = 0; - return; - } - - sDec.nFramesDecoded = 0; - sDec.fs_kHz = 0; /* Force update parameters LPC_order etc */ - sDec.lossCnt = 0; /* Avoid running bw expansion of the LPC parameters when searching for LBRR data */ - SKP_memset( sDec.prevNLSF_Q15, 0, MAX_LPC_ORDER * sizeof( SKP_int ) ); - SKP_Silk_range_dec_init( &sDec.sRC, inData, ( SKP_int32 )nBytesIn ); - - while(1) { - SKP_Silk_decode_parameters( &sDec, &sDecCtrl, TempQ, 0 ); - - if( sDec.sRC.error ) { - /* Corrupt stream */ - *nLBRRBytes = 0; - return; - }; - if( ( sDec.FrameTermination - 1 ) & lost_offset && sDec.FrameTermination > 0 && sDec.nBytesLeft >= 0 ) { - /* The wanted FEC is present in the packet */ - *nLBRRBytes = sDec.nBytesLeft; - SKP_memcpy( LBRRData, &inData[ nBytesIn - sDec.nBytesLeft ], sDec.nBytesLeft * sizeof( SKP_uint8 ) ); - break; - } - if( sDec.nBytesLeft > 0 && sDec.FrameTermination == SKP_SILK_MORE_FRAMES ) { - sDec.nFramesDecoded++; - } else { - LBRRData = NULL; - *nLBRRBytes = 0; - break; - } - } -} - -/* Getting type of content for a packet */ -void SKP_Silk_SDK_get_TOC( - const SKP_uint8 *inData, /* I: Encoded input vector */ - const SKP_int nBytesIn, /* I: Number of input bytes */ - SKP_Silk_TOC_struct *Silk_TOC /* O: Type of content */ -) -{ - SKP_Silk_decoder_state sDec; // Local Decoder state to avoid interfering with running decoder */ - SKP_Silk_decoder_control sDecCtrl; - SKP_int TempQ[ MAX_FRAME_LENGTH ]; - - sDec.nFramesDecoded = 0; - sDec.fs_kHz = 0; /* Force update parameters LPC_order etc */ - SKP_Silk_range_dec_init( &sDec.sRC, inData, ( SKP_int32 )nBytesIn ); - - Silk_TOC->corrupt = 0; - while( 1 ) { - SKP_Silk_decode_parameters( &sDec, &sDecCtrl, TempQ, 0 ); - - Silk_TOC->vadFlags[ sDec.nFramesDecoded ] = sDec.vadFlag; - Silk_TOC->sigtypeFlags[ sDec.nFramesDecoded ] = sDecCtrl.sigtype; - - if( sDec.sRC.error ) { - /* Corrupt stream */ - Silk_TOC->corrupt = 1; - break; - }; - - if( sDec.nBytesLeft > 0 && sDec.FrameTermination == SKP_SILK_MORE_FRAMES ) { - sDec.nFramesDecoded++; - } else { - break; - } - } - if( Silk_TOC->corrupt || sDec.FrameTermination == SKP_SILK_MORE_FRAMES || - sDec.nFramesInPacket > SILK_MAX_FRAMES_PER_PACKET ) { - /* Corrupt packet */ - SKP_memset( Silk_TOC, 0, sizeof( SKP_Silk_TOC_struct ) ); - Silk_TOC->corrupt = 1; - } else { - Silk_TOC->framesInPacket = sDec.nFramesDecoded + 1; - Silk_TOC->fs_kHz = sDec.fs_kHz; - if( sDec.FrameTermination == SKP_SILK_LAST_FRAME ) { - Silk_TOC->inbandLBRR = sDec.FrameTermination; - } else { - Silk_TOC->inbandLBRR = sDec.FrameTermination - 1; - } - } -} - -/**************************/ -/* Get the version number */ -/**************************/ -/* Return a pointer to string specifying the version */ -const char *SKP_Silk_SDK_get_version() -{ - static const char version[] = "1.0.8"; - return version; -} diff --git a/libs/silk/src/SKP_Silk_decode_core.c b/libs/silk/src/SKP_Silk_decode_core.c deleted file mode 100644 index 53b405dbd6..0000000000 --- a/libs/silk/src/SKP_Silk_decode_core.c +++ /dev/null @@ -1,241 +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" - - -void SKP_Silk_decode_short_term_prediction( -SKP_int32 *vec_Q10, -SKP_int32 *pres_Q10, -SKP_int32 *sLPC_Q14, -SKP_int16 *A_Q12_tmp, -SKP_int LPC_order, -SKP_int subfr_length -); - - -/**********************************************************/ -/* Core decoder. Performs inverse NSQ operation LTP + LPC */ -/**********************************************************/ -void SKP_Silk_decode_core( - SKP_Silk_decoder_state *psDec, /* I/O Decoder state */ - SKP_Silk_decoder_control *psDecCtrl, /* I Decoder control */ - SKP_int16 xq[], /* O Decoded speech */ - const SKP_int q[ MAX_FRAME_LENGTH ] /* I Pulse signal */ -) -{ - SKP_int i, k, lag = 0, start_idx, sLTP_buf_idx, NLSF_interpolation_flag, sigtype, LTP_scale_Q14; - SKP_int16 *A_Q12, *B_Q14, *pxq, A_Q12_tmp[ MAX_LPC_ORDER ]; - SKP_int16 sLTP[ MAX_FRAME_LENGTH ]; - SKP_int32 LTP_pred_Q14, Gain_Q16, inv_gain_Q16, inv_gain_Q32, gain_adj_Q16, rand_seed, offset_Q10, dither; - SKP_int32 *pred_lag_ptr, *pexc_Q10, *pres_Q10; - SKP_int32 vec_Q10[ MAX_FRAME_LENGTH / NB_SUBFR ]; - SKP_int32 FiltState[ MAX_LPC_ORDER ]; - - SKP_assert( psDec->prev_inv_gain_Q16 != 0 ); - - offset_Q10 = SKP_Silk_Quantization_Offsets_Q10[ psDecCtrl->sigtype ][ psDecCtrl->QuantOffsetType ]; - - if( psDecCtrl->NLSFInterpCoef_Q2 < ( 1 << 2 ) ) { - NLSF_interpolation_flag = 1; - } else { - NLSF_interpolation_flag = 0; - } - - - /* Decode excitation */ - rand_seed = psDecCtrl->Seed; - for( i = 0; i < psDec->frame_length; i++ ) { - rand_seed = SKP_RAND( rand_seed ); - /* dither = rand_seed < 0 ? 0xFFFFFFFF : 0; */ - dither = SKP_RSHIFT( rand_seed, 31 ); - - psDec->exc_Q10[ i ] = SKP_LSHIFT( ( SKP_int32 )q[ i ], 10 ) + offset_Q10; - psDec->exc_Q10[ i ] = ( psDec->exc_Q10[ i ] ^ dither ) - dither; - - rand_seed += q[ i ]; - } - - - pexc_Q10 = psDec->exc_Q10; - pres_Q10 = psDec->res_Q10; - pxq = &psDec->outBuf[ psDec->frame_length ]; - sLTP_buf_idx = psDec->frame_length; - /* Loop over subframes */ - for( k = 0; k < NB_SUBFR; k++ ) { - A_Q12 = psDecCtrl->PredCoef_Q12[ k >> 1 ]; - - /* Preload LPC coeficients to array on stack. Gives small performance gain */ - SKP_memcpy( A_Q12_tmp, A_Q12, psDec->LPC_order * sizeof( SKP_int16 ) ); - B_Q14 = &psDecCtrl->LTPCoef_Q14[ k * LTP_ORDER ]; - Gain_Q16 = psDecCtrl->Gains_Q16[ k ]; - LTP_scale_Q14 = psDecCtrl->LTP_scale_Q14; - sigtype = psDecCtrl->sigtype; - - inv_gain_Q16 = SKP_INVERSE32_varQ( SKP_max( Gain_Q16, 1 ), 32 ); - inv_gain_Q16 = SKP_min( inv_gain_Q16, SKP_int16_MAX ); - - /* Calculate Gain adjustment factor */ - gain_adj_Q16 = ( SKP_int32 )1 << 16; - if( inv_gain_Q16 != psDec->prev_inv_gain_Q16 ) { - gain_adj_Q16 = SKP_DIV32_varQ( inv_gain_Q16, psDec->prev_inv_gain_Q16, 16 ); - } - - /* Avoid abrupt transition from voiced PLC to unvoiced normal decoding */ - if( psDec->lossCnt && psDec->prev_sigtype == SIG_TYPE_VOICED && - psDecCtrl->sigtype == SIG_TYPE_UNVOICED && k < ( NB_SUBFR >> 1 ) ) { - - SKP_memset( B_Q14, 0, LTP_ORDER * sizeof( SKP_int16 ) ); - B_Q14[ LTP_ORDER/2 ] = ( SKP_int16 )1 << 12; /* 0.25 */ - - sigtype = SIG_TYPE_VOICED; - psDecCtrl->pitchL[ k ] = psDec->lagPrev; - LTP_scale_Q14 = ( SKP_int )1 << 14; - } - - if( sigtype == SIG_TYPE_VOICED ) { - /* Voiced */ - - lag = psDecCtrl->pitchL[ k ]; - /* Re-whitening */ - if( ( k & ( 3 - SKP_LSHIFT( NLSF_interpolation_flag, 1 ) ) ) == 0 ) { - /* Rewhiten with new A coefs */ - start_idx = psDec->frame_length - lag - psDec->LPC_order - LTP_ORDER / 2; - SKP_assert( start_idx >= 0 ); - SKP_assert( start_idx <= psDec->frame_length - psDec->LPC_order ); - - SKP_memset( FiltState, 0, psDec->LPC_order * sizeof( SKP_int32 ) ); /* Not really necessary, but Valgrind and Coverity will complain otherwise */ - SKP_Silk_MA_Prediction( &psDec->outBuf[ start_idx + k * ( psDec->frame_length >> 2 ) ], - A_Q12, FiltState, sLTP + start_idx, psDec->frame_length - start_idx, psDec->LPC_order ); - - /* After rewhitening the LTP state is unscaled */ - inv_gain_Q32 = SKP_LSHIFT( inv_gain_Q16, 16 ); - if( k == 0 ) { - /* Do LTP downscaling */ - inv_gain_Q32 = SKP_LSHIFT( SKP_SMULWB( inv_gain_Q32, psDecCtrl->LTP_scale_Q14 ), 2 ); - } - for( i = 0; i < (lag + LTP_ORDER/2); i++ ) { - psDec->sLTP_Q16[ sLTP_buf_idx - i - 1 ] = SKP_SMULWB( inv_gain_Q32, sLTP[ psDec->frame_length - i - 1 ] ); - } - } else { - /* Update LTP state when Gain changes */ - if( gain_adj_Q16 != ( SKP_int32 )1 << 16 ) { - for( i = 0; i < ( lag + LTP_ORDER / 2 ); i++ ) { - psDec->sLTP_Q16[ sLTP_buf_idx - i - 1 ] = SKP_SMULWW( gain_adj_Q16, psDec->sLTP_Q16[ sLTP_buf_idx - i - 1 ] ); - } - } - } - } - - /* Scale short term state */ - for( i = 0; i < MAX_LPC_ORDER; i++ ) { - psDec->sLPC_Q14[ i ] = SKP_SMULWW( gain_adj_Q16, psDec->sLPC_Q14[ i ] ); - } - - /* Save inv_gain */ - SKP_assert( inv_gain_Q16 != 0 ); - psDec->prev_inv_gain_Q16 = inv_gain_Q16; - - /* Long-term prediction */ - if( sigtype == SIG_TYPE_VOICED ) { - /* Setup pointer */ - pred_lag_ptr = &psDec->sLTP_Q16[ sLTP_buf_idx - lag + LTP_ORDER / 2 ]; - for( i = 0; i < psDec->subfr_length; i++ ) { - /* Unrolled loop */ - LTP_pred_Q14 = SKP_SMULWB( pred_lag_ptr[ 0 ], B_Q14[ 0 ] ); - LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -1 ], B_Q14[ 1 ] ); - LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -2 ], B_Q14[ 2 ] ); - LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -3 ], B_Q14[ 3 ] ); - LTP_pred_Q14 = SKP_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -4 ], B_Q14[ 4 ] ); - pred_lag_ptr++; - - /* Generate LPC residual */ - pres_Q10[ i ] = SKP_ADD32( pexc_Q10[ i ], SKP_RSHIFT_ROUND( LTP_pred_Q14, 4 ) ); - - /* Update states */ - psDec->sLTP_Q16[ sLTP_buf_idx ] = SKP_LSHIFT( pres_Q10[ i ], 6 ); - sLTP_buf_idx++; - } - } else { - SKP_memcpy( pres_Q10, pexc_Q10, psDec->subfr_length * sizeof( SKP_int32 ) ); - } - - SKP_Silk_decode_short_term_prediction(vec_Q10, pres_Q10, psDec->sLPC_Q14,A_Q12_tmp,psDec->LPC_order,psDec->subfr_length); - - /* Scale with Gain */ - for( i = 0; i < psDec->subfr_length; i++ ) { - pxq[ i ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND( SKP_SMULWW( vec_Q10[ i ], Gain_Q16 ), 10 ) ); - } - - /* Update LPC filter state */ - SKP_memcpy( psDec->sLPC_Q14, &psDec->sLPC_Q14[ psDec->subfr_length ], MAX_LPC_ORDER * sizeof( SKP_int32 ) ); - pexc_Q10 += psDec->subfr_length; - pres_Q10 += psDec->subfr_length; - pxq += psDec->subfr_length; - } - - /* Copy to output */ - SKP_memcpy( xq, &psDec->outBuf[ psDec->frame_length ], psDec->frame_length * sizeof( SKP_int16 ) ); - -} - -void SKP_Silk_decode_short_term_prediction( -SKP_int32 *vec_Q10, -SKP_int32 *pres_Q10, -SKP_int32 *sLPC_Q14, -SKP_int16 *A_Q12_tmp, -SKP_int LPC_order, -SKP_int subfr_length -) -{ - SKP_int i; - SKP_int32 LPC_pred_Q10; - SKP_int j; - for( i = 0; i < subfr_length; i++ ) { - /* Partially unrolled */ - LPC_pred_Q10 = SKP_SMULWB( sLPC_Q14[ MAX_LPC_ORDER + i - 1 ], A_Q12_tmp[ 0 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 2 ], A_Q12_tmp[ 1 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 3 ], A_Q12_tmp[ 2 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 4 ], A_Q12_tmp[ 3 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 5 ], A_Q12_tmp[ 4 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 6 ], A_Q12_tmp[ 5 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 7 ], A_Q12_tmp[ 6 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 8 ], A_Q12_tmp[ 7 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 9 ], A_Q12_tmp[ 8 ] ); - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 10 ], A_Q12_tmp[ 9 ] ); - - for( j = 10; j < LPC_order; j ++ ) { - LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - j - 1 ], A_Q12_tmp[ j ] ); - } - - /* Add prediction to LPC residual */ - vec_Q10[ i ] = SKP_ADD32( pres_Q10[ i ], LPC_pred_Q10 ); - - /* Update states */ - sLPC_Q14[ MAX_LPC_ORDER + i ] = SKP_LSHIFT( vec_Q10[ i ], 4 ); - } -} diff --git a/libs/silk/src/SKP_Silk_decode_frame.c b/libs/silk/src/SKP_Silk_decode_frame.c deleted file mode 100644 index 8b5c3b55cf..0000000000 --- a/libs/silk/src/SKP_Silk_decode_frame.c +++ /dev/null @@ -1,156 +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_PLC.h" - -/****************/ -/* Decode frame */ -/****************/ -SKP_int SKP_Silk_decode_frame( - SKP_Silk_decoder_state *psDec, /* I/O Pointer to Silk decoder state */ - SKP_int16 pOut[], /* O Pointer to output speech frame */ - SKP_int16 *pN, /* O Pointer to size of output frame */ - const SKP_uint8 pCode[], /* I Pointer to payload */ - const SKP_int nBytes, /* I Payload length */ - SKP_int action, /* I Action from Jitter Buffer */ - SKP_int *decBytes /* O Used bytes to decode this frame */ -) -{ - SKP_Silk_decoder_control sDecCtrl; - SKP_int L, fs_Khz_old, LPC_order_old, ret = 0; - SKP_int Pulses[ MAX_FRAME_LENGTH ]; - - - L = psDec->frame_length; - sDecCtrl.LTP_scale_Q14 = 0; - - /* Safety checks */ - SKP_assert( L > 0 && L <= MAX_FRAME_LENGTH ); - - /********************************************/ - /* Decode Frame if packet is not lost */ - /********************************************/ - *decBytes = 0; - if( action == 0 ) { - /********************************************/ - /* Initialize arithmetic coder */ - /********************************************/ - fs_Khz_old = psDec->fs_kHz; - LPC_order_old = psDec->LPC_order; - if( psDec->nFramesDecoded == 0 ) { - /* Initialize range decoder state */ - SKP_Silk_range_dec_init( &psDec->sRC, pCode, nBytes ); - } - - /********************************************/ - /* Decode parameters and pulse signal */ - /********************************************/ - SKP_Silk_decode_parameters( psDec, &sDecCtrl, Pulses, 1 ); - - - if( psDec->sRC.error ) { - psDec->nBytesLeft = 0; - - action = 1; /* PLC operation */ - /* revert fs if changed in decode_parameters */ - SKP_Silk_decoder_set_fs( psDec, fs_Khz_old ); - - /* Avoid crashing */ - *decBytes = psDec->sRC.bufferLength; - - if( psDec->sRC.error == RANGE_CODER_DEC_PAYLOAD_TOO_LONG ) { - ret = SKP_SILK_DEC_PAYLOAD_TOO_LARGE; - } else { - ret = SKP_SILK_DEC_PAYLOAD_ERROR; - } - } else { - *decBytes = psDec->sRC.bufferLength - psDec->nBytesLeft; - psDec->nFramesDecoded++; - - /* Update lengths. Sampling frequency could have changed */ - L = psDec->frame_length; - - /********************************************************/ - /* Run inverse NSQ */ - /********************************************************/ - SKP_Silk_decode_core( psDec, &sDecCtrl, pOut, Pulses ); - - /********************************************************/ - /* Update PLC state */ - /********************************************************/ - SKP_Silk_PLC( psDec, &sDecCtrl, pOut, L, action ); - - psDec->lossCnt = 0; - psDec->prev_sigtype = sDecCtrl.sigtype; - - /* A frame has been decoded without errors */ - psDec->first_frame_after_reset = 0; - } - } - /*************************************************************/ - /* Generate Concealment frame if packet is lost, or corrupt */ - /*************************************************************/ - if( action == 1 ) { - /* Handle packet loss by extrapolation */ - SKP_Silk_PLC( psDec, &sDecCtrl, pOut, L, action ); - } - - /*************************/ - /* Update output buffer. */ - /*************************/ - SKP_memcpy( psDec->outBuf, pOut, L * sizeof( SKP_int16 ) ); - - /****************************************************************/ - /* Ensure smooth connection of extrapolated and good frames */ - /****************************************************************/ - SKP_Silk_PLC_glue_frames( psDec, &sDecCtrl, pOut, L ); - - /************************************************/ - /* Comfort noise generation / estimation */ - /************************************************/ - SKP_Silk_CNG( psDec, &sDecCtrl, pOut , L ); - - /********************************************/ - /* HP filter output */ - /********************************************/ - SKP_assert( ( ( psDec->fs_kHz == 12 ) && ( L % 3 ) == 0 ) || - ( ( psDec->fs_kHz != 12 ) && ( L % 2 ) == 0 ) ); - SKP_Silk_biquad( pOut, psDec->HP_B, psDec->HP_A, psDec->HPState, pOut, L ); - - /********************************************/ - /* set output frame length */ - /********************************************/ - *pN = ( SKP_int16 )L; - - /* Update some decoder state variables */ - psDec->lagPrev = sDecCtrl.pitchL[ NB_SUBFR - 1 ]; - - - return ret; -} diff --git a/libs/silk/src/SKP_Silk_decode_parameters.c b/libs/silk/src/SKP_Silk_decode_parameters.c deleted file mode 100644 index 21bc08a6ca..0000000000 --- a/libs/silk/src/SKP_Silk_decode_parameters.c +++ /dev/null @@ -1,244 +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" - -/* Decode parameters from payload */ -void SKP_Silk_decode_parameters( - SKP_Silk_decoder_state *psDec, /* I/O State */ - SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */ - SKP_int q[], /* O Excitation signal */ - const SKP_int fullDecoding /* I Flag to tell if only arithmetic decoding */ -) -{ - SKP_int i, k, Ix, fs_kHz_dec, nBytesUsed; - SKP_int Ixs[ NB_SUBFR ]; - SKP_int GainsIndices[ NB_SUBFR ]; - SKP_int NLSFIndices[ NLSF_MSVQ_MAX_CB_STAGES ]; - SKP_int pNLSF_Q15[ MAX_LPC_ORDER ], pNLSF0_Q15[ MAX_LPC_ORDER ]; - const SKP_int16 *cbk_ptr_Q14; - const SKP_Silk_NLSF_CB_struct *psNLSF_CB = NULL; - SKP_Silk_range_coder_state *psRC = &psDec->sRC; - - /************************/ - /* Decode sampling rate */ - /************************/ - /* only done for first frame of packet */ - if( psDec->nFramesDecoded == 0 ) { - SKP_Silk_range_decoder( &Ix, psRC, SKP_Silk_SamplingRates_CDF, SKP_Silk_SamplingRates_offset ); - - /* check that sampling rate is supported */ - if( Ix < 0 || Ix > 3 ) { - psRC->error = RANGE_CODER_ILLEGAL_SAMPLING_RATE; - return; - } - fs_kHz_dec = SKP_Silk_SamplingRates_table[ Ix ]; - SKP_Silk_decoder_set_fs( psDec, fs_kHz_dec ); - } - - /*******************************************/ - /* Decode signal type and quantizer offset */ - /*******************************************/ - if( psDec->nFramesDecoded == 0 ) { - /* first frame in packet: independent coding */ - SKP_Silk_range_decoder( &Ix, psRC, SKP_Silk_type_offset_CDF, SKP_Silk_type_offset_CDF_offset ); - } else { - /* condidtional coding */ - SKP_Silk_range_decoder( &Ix, psRC, SKP_Silk_type_offset_joint_CDF[ psDec->typeOffsetPrev ], - SKP_Silk_type_offset_CDF_offset ); - } - psDecCtrl->sigtype = SKP_RSHIFT( Ix, 1 ); - psDecCtrl->QuantOffsetType = Ix & 1; - psDec->typeOffsetPrev = Ix; - - /****************/ - /* Decode gains */ - /****************/ - /* first subframe */ - if( psDec->nFramesDecoded == 0 ) { - /* first frame in packet: independent coding */ - SKP_Silk_range_decoder( &GainsIndices[ 0 ], psRC, SKP_Silk_gain_CDF[ psDecCtrl->sigtype ], SKP_Silk_gain_CDF_offset ); - } else { - /* condidtional coding */ - SKP_Silk_range_decoder( &GainsIndices[ 0 ], psRC, SKP_Silk_delta_gain_CDF, SKP_Silk_delta_gain_CDF_offset ); - } - - /* remaining subframes */ - for( i = 1; i < NB_SUBFR; i++ ) { - SKP_Silk_range_decoder( &GainsIndices[ i ], psRC, SKP_Silk_delta_gain_CDF, SKP_Silk_delta_gain_CDF_offset ); - } - - /* Dequant Gains */ - SKP_Silk_gains_dequant( psDecCtrl->Gains_Q16, GainsIndices, &psDec->LastGainIndex, psDec->nFramesDecoded ); - /****************/ - /* Decode NLSFs */ - /****************/ - /* Set pointer to NLSF VQ CB for the current signal type */ - psNLSF_CB = psDec->psNLSF_CB[ psDecCtrl->sigtype ]; - - /* Range decode NLSF path */ - SKP_Silk_range_decoder_multi( NLSFIndices, psRC, psNLSF_CB->StartPtr, psNLSF_CB->MiddleIx, psNLSF_CB->nStages ); - - /* From the NLSF path, decode an NLSF vector */ - SKP_Silk_NLSF_MSVQ_decode( pNLSF_Q15, psNLSF_CB, NLSFIndices, psDec->LPC_order ); - - /************************************/ - /* Decode NLSF interpolation factor */ - /************************************/ - SKP_Silk_range_decoder( &psDecCtrl->NLSFInterpCoef_Q2, psRC, SKP_Silk_NLSF_interpolation_factor_CDF, - SKP_Silk_NLSF_interpolation_factor_offset ); - - /* If just reset, e.g., because internal Fs changed, do not allow interpolation */ - /* improves the case of packet loss in the first frame after a switch */ - if( psDec->first_frame_after_reset == 1 ) { - psDecCtrl->NLSFInterpCoef_Q2 = 4; - } - - if( fullDecoding ) { - /* Convert NLSF parameters to AR prediction filter coefficients */ - SKP_Silk_NLSF2A_stable( psDecCtrl->PredCoef_Q12[ 1 ], pNLSF_Q15, psDec->LPC_order ); - - if( psDecCtrl->NLSFInterpCoef_Q2 < 4 ) { - /* Calculation of the interpolated NLSF0 vector from the interpolation factor, */ - /* the previous NLSF1, and the current NLSF1 */ - for( i = 0; i < psDec->LPC_order; i++ ) { - pNLSF0_Q15[ i ] = psDec->prevNLSF_Q15[ i ] + SKP_RSHIFT( SKP_MUL( psDecCtrl->NLSFInterpCoef_Q2, - ( pNLSF_Q15[ i ] - psDec->prevNLSF_Q15[ i ] ) ), 2 ); - } - - /* Convert NLSF parameters to AR prediction filter coefficients */ - SKP_Silk_NLSF2A_stable( psDecCtrl->PredCoef_Q12[ 0 ], pNLSF0_Q15, psDec->LPC_order ); - } else { - /* Copy LPC coefficients for first half from second half */ - SKP_memcpy( psDecCtrl->PredCoef_Q12[ 0 ], psDecCtrl->PredCoef_Q12[ 1 ], - psDec->LPC_order * sizeof( SKP_int16 ) ); - } - } - - SKP_memcpy( psDec->prevNLSF_Q15, pNLSF_Q15, psDec->LPC_order * sizeof( SKP_int ) ); - - /* After a packet loss do BWE of LPC coefs */ - if( psDec->lossCnt ) { - SKP_Silk_bwexpander( psDecCtrl->PredCoef_Q12[ 0 ], psDec->LPC_order, BWE_AFTER_LOSS_Q16 ); - SKP_Silk_bwexpander( psDecCtrl->PredCoef_Q12[ 1 ], psDec->LPC_order, BWE_AFTER_LOSS_Q16 ); - } - - if( psDecCtrl->sigtype == SIG_TYPE_VOICED ) { - /*********************/ - /* Decode pitch lags */ - /*********************/ - /* Get lag index */ - if( psDec->fs_kHz == 8 ) { - SKP_Silk_range_decoder( &Ixs[ 0 ], psRC, SKP_Silk_pitch_lag_NB_CDF, SKP_Silk_pitch_lag_NB_CDF_offset ); - } else if( psDec->fs_kHz == 12 ) { - SKP_Silk_range_decoder( &Ixs[ 0 ], psRC, SKP_Silk_pitch_lag_MB_CDF, SKP_Silk_pitch_lag_MB_CDF_offset ); - } else if( psDec->fs_kHz == 16 ) { - SKP_Silk_range_decoder( &Ixs[ 0 ], psRC, SKP_Silk_pitch_lag_WB_CDF, SKP_Silk_pitch_lag_WB_CDF_offset ); - } else { - SKP_Silk_range_decoder( &Ixs[ 0 ], psRC, SKP_Silk_pitch_lag_SWB_CDF, SKP_Silk_pitch_lag_SWB_CDF_offset ); - } - - /* Get countour index */ - if( psDec->fs_kHz == 8 ) { - /* Less codevectors used in 8 khz mode */ - SKP_Silk_range_decoder( &Ixs[ 1 ], psRC, SKP_Silk_pitch_contour_NB_CDF, SKP_Silk_pitch_contour_NB_CDF_offset ); - } else { - /* Joint for 12, 16, and 24 khz */ - SKP_Silk_range_decoder( &Ixs[ 1 ], psRC, SKP_Silk_pitch_contour_CDF, SKP_Silk_pitch_contour_CDF_offset ); - } - - /* Decode pitch values */ - SKP_Silk_decode_pitch( Ixs[ 0 ], Ixs[ 1 ], psDecCtrl->pitchL, psDec->fs_kHz ); - - /********************/ - /* Decode LTP gains */ - /********************/ - /* Decode PERIndex value */ - SKP_Silk_range_decoder( &psDecCtrl->PERIndex, psRC, SKP_Silk_LTP_per_index_CDF, - SKP_Silk_LTP_per_index_CDF_offset ); - - /* Decode Codebook Index */ - cbk_ptr_Q14 = SKP_Silk_LTP_vq_ptrs_Q14[ psDecCtrl->PERIndex ]; /* set pointer to start of codebook */ - - for( k = 0; k < NB_SUBFR; k++ ) { - SKP_Silk_range_decoder( &Ix, psRC, SKP_Silk_LTP_gain_CDF_ptrs[ psDecCtrl->PERIndex ], - SKP_Silk_LTP_gain_CDF_offsets[ psDecCtrl->PERIndex ] ); - - for( i = 0; i < LTP_ORDER; i++ ) { - psDecCtrl->LTPCoef_Q14[ k * LTP_ORDER + i ] = cbk_ptr_Q14[ Ix * LTP_ORDER + i ]; - } - } - - /**********************/ - /* Decode LTP scaling */ - /**********************/ - SKP_Silk_range_decoder( &Ix, psRC, SKP_Silk_LTPscale_CDF, SKP_Silk_LTPscale_offset ); - psDecCtrl->LTP_scale_Q14 = SKP_Silk_LTPScales_table_Q14[ Ix ]; - } else { - SKP_assert( psDecCtrl->sigtype == SIG_TYPE_UNVOICED ); - SKP_memset( psDecCtrl->pitchL, 0, NB_SUBFR * sizeof( SKP_int ) ); - SKP_memset( psDecCtrl->LTPCoef_Q14, 0, LTP_ORDER * NB_SUBFR * sizeof( SKP_int16 ) ); - psDecCtrl->PERIndex = 0; - psDecCtrl->LTP_scale_Q14 = 0; - } - - /***************/ - /* Decode seed */ - /***************/ - SKP_Silk_range_decoder( &Ix, psRC, SKP_Silk_Seed_CDF, SKP_Silk_Seed_offset ); - psDecCtrl->Seed = ( SKP_int32 )Ix; - /*********************************************/ - /* Decode quantization indices of excitation */ - /*********************************************/ - SKP_Silk_decode_pulses( psRC, psDecCtrl, q, psDec->frame_length ); - - /*********************************************/ - /* Decode VAD flag */ - /*********************************************/ - SKP_Silk_range_decoder( &psDec->vadFlag, psRC, SKP_Silk_vadflag_CDF, SKP_Silk_vadflag_offset ); - - /**************************************/ - /* Decode Frame termination indicator */ - /**************************************/ - SKP_Silk_range_decoder( &psDec->FrameTermination, psRC, SKP_Silk_FrameTermination_CDF, SKP_Silk_FrameTermination_offset ); - - /****************************************/ - /* get number of bytes used so far */ - /****************************************/ - SKP_Silk_range_coder_get_length( psRC, &nBytesUsed ); - psDec->nBytesLeft = psRC->bufferLength - nBytesUsed; - if( psDec->nBytesLeft < 0 ) { - psRC->error = RANGE_CODER_READ_BEYOND_BUFFER; - } - - /****************************************/ - /* check remaining bits in last byte */ - /****************************************/ - if( psDec->nBytesLeft == 0 ) { - SKP_Silk_range_coder_check_after_decoding( psRC ); - } -} diff --git a/libs/silk/src/SKP_Silk_decode_pitch.c b/libs/silk/src/SKP_Silk_decode_pitch.c deleted file mode 100644 index bde1581e26..0000000000 --- a/libs/silk/src/SKP_Silk_decode_pitch.c +++ /dev/null @@ -1,57 +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. -***********************************************************************/ - -/*********************************************************** -* Pitch analyser function -********************************************************** */ -#include "SKP_Silk_SigProc_FIX.h" -#include "SKP_Silk_common_pitch_est_defines.h" - -void SKP_Silk_decode_pitch( - SKP_int lagIndex, /* I */ - SKP_int contourIndex, /* O */ - SKP_int pitch_lags[], /* O 4 pitch values */ - SKP_int Fs_kHz /* I sampling frequency (kHz) */ -) -{ - SKP_int lag, i, min_lag; - - min_lag = SKP_SMULBB( PITCH_EST_MIN_LAG_MS, Fs_kHz ); - - /* Only for 24 / 16 kHz version for now */ - lag = min_lag + lagIndex; - if( Fs_kHz == 8 ) { - /* Only a small codebook for 8 khz */ - for( i = 0; i < PITCH_EST_NB_SUBFR; i++ ) { - pitch_lags[ i ] = lag + SKP_Silk_CB_lags_stage2[ i ][ contourIndex ]; - } - } else { - for( i = 0; i < PITCH_EST_NB_SUBFR; i++ ) { - pitch_lags[ i ] = lag + SKP_Silk_CB_lags_stage3[ i ][ contourIndex ]; - } - } -} diff --git a/libs/silk/src/SKP_Silk_decode_pulses.c b/libs/silk/src/SKP_Silk_decode_pulses.c deleted file mode 100644 index 22bbab2079..0000000000 --- a/libs/silk/src/SKP_Silk_decode_pulses.c +++ /dev/null @@ -1,105 +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" - -/*********************************************/ -/* Decode quantization indices of excitation */ -/*********************************************/ -void SKP_Silk_decode_pulses( - SKP_Silk_range_coder_state *psRC, /* I/O Range coder state */ - SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */ - SKP_int q[], /* O Excitation signal */ - const SKP_int frame_length /* I Frame length (preliminary) */ -) -{ - SKP_int i, j, k, iter, abs_q, nLS, bit; - SKP_int sum_pulses[ MAX_NB_SHELL_BLOCKS ], nLshifts[ MAX_NB_SHELL_BLOCKS ]; - SKP_int *pulses_ptr; - const SKP_uint16 *cdf_ptr; - - /*********************/ - /* Decode rate level */ - /*********************/ - SKP_Silk_range_decoder( &psDecCtrl->RateLevelIndex, psRC, - SKP_Silk_rate_levels_CDF[ psDecCtrl->sigtype ], SKP_Silk_rate_levels_CDF_offset ); - - /* Calculate number of shell blocks */ - iter = frame_length / SHELL_CODEC_FRAME_LENGTH; - - /***************************************************/ - /* Sum-Weighted-Pulses Decoding */ - /***************************************************/ - cdf_ptr = SKP_Silk_pulses_per_block_CDF[ psDecCtrl->RateLevelIndex ]; - for( i = 0; i < iter; i++ ) { - nLshifts[ i ] = 0; - SKP_Silk_range_decoder( &sum_pulses[ i ], psRC, cdf_ptr, SKP_Silk_pulses_per_block_CDF_offset ); - - /* LSB indication */ - while( sum_pulses[ i ] == ( MAX_PULSES + 1 ) ) { - nLshifts[ i ]++; - SKP_Silk_range_decoder( &sum_pulses[ i ], psRC, - SKP_Silk_pulses_per_block_CDF[ N_RATE_LEVELS - 1 ], SKP_Silk_pulses_per_block_CDF_offset ); - } - } - - /***************************************************/ - /* Shell decoding */ - /***************************************************/ - for( i = 0; i < iter; i++ ) { - if( sum_pulses[ i ] > 0 ) { - SKP_Silk_shell_decoder( &q[ SKP_SMULBB( i, SHELL_CODEC_FRAME_LENGTH ) ], psRC, sum_pulses[ i ] ); - } else { - SKP_memset( &q[ SKP_SMULBB( i, SHELL_CODEC_FRAME_LENGTH ) ], 0, SHELL_CODEC_FRAME_LENGTH * sizeof( SKP_int ) ); - } - } - - /***************************************************/ - /* LSB Decoding */ - /***************************************************/ - for( i = 0; i < iter; i++ ) { - if( nLshifts[ i ] > 0 ) { - nLS = nLshifts[ i ]; - pulses_ptr = &q[ SKP_SMULBB( i, SHELL_CODEC_FRAME_LENGTH ) ]; - for( k = 0; k < SHELL_CODEC_FRAME_LENGTH; k++ ) { - abs_q = pulses_ptr[ k ]; - for( j = 0; j < nLS; j++ ) { - abs_q = SKP_LSHIFT( abs_q, 1 ); - SKP_Silk_range_decoder( &bit, psRC, SKP_Silk_lsb_CDF, 1 ); - abs_q += bit; - } - pulses_ptr[ k ] = abs_q; - } - } - } - - /****************************************/ - /* Decode and add signs to pulse signal */ - /****************************************/ - SKP_Silk_decode_signs( psRC, q, frame_length, psDecCtrl->sigtype, - psDecCtrl->QuantOffsetType, psDecCtrl->RateLevelIndex); -} diff --git a/libs/silk/src/SKP_Silk_decoder_set_fs.c b/libs/silk/src/SKP_Silk_decoder_set_fs.c deleted file mode 100644 index 0a8ce03c69..0000000000 --- a/libs/silk/src/SKP_Silk_decoder_set_fs.c +++ /dev/null @@ -1,79 +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" - -/* Set decoder sampling rate */ -void SKP_Silk_decoder_set_fs( - SKP_Silk_decoder_state *psDec, /* I/O Decoder state pointer */ - SKP_int fs_kHz /* I Sampling frequency (kHz) */ -) -{ - if( psDec->fs_kHz != fs_kHz ) { - psDec->fs_kHz = fs_kHz; - psDec->frame_length = SKP_SMULBB( FRAME_LENGTH_MS, fs_kHz ); - psDec->subfr_length = SKP_SMULBB( FRAME_LENGTH_MS / NB_SUBFR, fs_kHz ); - if( psDec->fs_kHz == 8 ) { - psDec->LPC_order = MIN_LPC_ORDER; - psDec->psNLSF_CB[ 0 ] = &SKP_Silk_NLSF_CB0_10; - psDec->psNLSF_CB[ 1 ] = &SKP_Silk_NLSF_CB1_10; - } else { - psDec->LPC_order = MAX_LPC_ORDER; - psDec->psNLSF_CB[ 0 ] = &SKP_Silk_NLSF_CB0_16; - psDec->psNLSF_CB[ 1 ] = &SKP_Silk_NLSF_CB1_16; - } - /* Reset part of the decoder state */ - SKP_memset( psDec->sLPC_Q14, 0, MAX_LPC_ORDER * sizeof( SKP_int32 ) ); - SKP_memset( psDec->outBuf, 0, MAX_FRAME_LENGTH * sizeof( SKP_int16 ) ); - SKP_memset( psDec->prevNLSF_Q15, 0, MAX_LPC_ORDER * sizeof( SKP_int ) ); - - psDec->lagPrev = 100; - psDec->LastGainIndex = 1; - psDec->prev_sigtype = 0; - psDec->first_frame_after_reset = 1; - - if( fs_kHz == 24 ) { - psDec->HP_A = SKP_Silk_Dec_A_HP_24; - psDec->HP_B = SKP_Silk_Dec_B_HP_24; - } else if( fs_kHz == 16 ) { - psDec->HP_A = SKP_Silk_Dec_A_HP_16; - psDec->HP_B = SKP_Silk_Dec_B_HP_16; - } else if( fs_kHz == 12 ) { - psDec->HP_A = SKP_Silk_Dec_A_HP_12; - psDec->HP_B = SKP_Silk_Dec_B_HP_12; - } else if( fs_kHz == 8 ) { - psDec->HP_A = SKP_Silk_Dec_A_HP_8; - psDec->HP_B = SKP_Silk_Dec_B_HP_8; - } else { - /* unsupported sampling rate */ - SKP_assert( 0 ); - } - } - - /* Check that settings are valid */ - SKP_assert( psDec->frame_length > 0 && psDec->frame_length <= MAX_FRAME_LENGTH ); -} diff --git a/libs/silk/src/SKP_Silk_define.h b/libs/silk/src/SKP_Silk_define.h deleted file mode 100644 index 281d4fb20e..0000000000 --- a/libs/silk/src/SKP_Silk_define.h +++ /dev/null @@ -1,306 +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_DEFINE_H -#define SKP_SILK_DEFINE_H - -#include "SKP_Silk_errors.h" -#include "SKP_Silk_typedef.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - -#define MAX_FRAMES_PER_PACKET 5 - - - -/* Limits on bitrate */ -#define MIN_TARGET_RATE_BPS 5000 -#define MAX_TARGET_RATE_BPS 100000 - -/* Transition bitrates between modes */ -#define SWB2WB_BITRATE_BPS 25000 -#define WB2SWB_BITRATE_BPS 30000 -#define WB2MB_BITRATE_BPS 14000 -#define MB2WB_BITRATE_BPS 18000 -#define MB2NB_BITRATE_BPS 10000 -#define NB2MB_BITRATE_BPS 14000 - -/* Integration/hysteresis threshold for lowering internal sample frequency */ -/* 30000000 -> 6 sec if bitrate is 5000 bps below limit; 3 sec if bitrate is 10000 bps below limit */ -#define ACCUM_BITS_DIFF_THRESHOLD 30000000 -#define TARGET_RATE_TAB_SZ 8 - -/* DTX settings */ -#define NO_SPEECH_FRAMES_BEFORE_DTX 5 /* eq 100 ms */ -#define MAX_CONSECUTIVE_DTX 20 /* eq 400 ms */ - -#define USE_LBRR 1 - -/* Amount of concecutive no FEC packets before telling JB */ -#define NO_LBRR_THRES 10 - -/* Maximum delay between real packet and LBRR packet */ -#define MAX_LBRR_DELAY 2 -#define LBRR_IDX_MASK 1 - -#define INBAND_FEC_MIN_RATE_BPS 18000 /* Dont use inband FEC below this total target rate */ -#define LBRR_LOSS_THRES 1 /* Start adding LBRR at this loss rate */ - -/* LBRR usage defines */ -#define SKP_SILK_NO_LBRR 0 /* No LBRR information for this packet */ -#define SKP_SILK_ADD_LBRR_TO_PLUS1 1 /* Add LBRR for this packet to packet n + 1 */ -#define SKP_SILK_ADD_LBRR_TO_PLUS2 2 /* Add LBRR for this packet to packet n + 2 */ - -/* Frame termination indicator defines */ -#define SKP_SILK_LAST_FRAME 0 /* Last frames in packet */ -#define SKP_SILK_MORE_FRAMES 1 /* More frames to follow this one */ -#define SKP_SILK_LBRR_VER1 2 /* LBRR information from packet n - 1 */ -#define SKP_SILK_LBRR_VER2 3 /* LBRR information from packet n - 2 */ -#define SKP_SILK_EXT_LAYER 4 /* Extension layers added */ - -/* Number of Second order Sections for SWB detection HP filter */ -#define NB_SOS 3 -#define HP_8_KHZ_THRES 10 /* average energy per sample, above 8 kHz */ -#define CONCEC_SWB_SMPLS_THRES 480 * 15 /* 300 ms */ -#define WB_DETECT_ACTIVE_SPEECH_MS_THRES 15000 /* ms of active speech needed for WB detection */ - -/* Low complexity setting */ -#define LOW_COMPLEXITY_ONLY 0 - -/* 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 some embedded platforms */ -#define MAX_FS_KHZ 24 -#define MAX_API_FS_KHZ 48 - -/* Signal Types used by silk */ -#define SIG_TYPE_VOICED 0 -#define SIG_TYPE_UNVOICED 1 - -/* VAD Types used by silk */ -#define NO_VOICE_ACTIVITY 0 -#define VOICE_ACTIVITY 1 - -/* Number of samples per frame */ -#define FRAME_LENGTH_MS 20 -#define MAX_FRAME_LENGTH ( FRAME_LENGTH_MS * MAX_FS_KHZ ) - -/* Milliseconds of lookahead for pitch analysis */ -#define LA_PITCH_MS 2 -#define LA_PITCH_MAX ( LA_PITCH_MS * MAX_FS_KHZ ) - -/* Length of LPC window used in find pitch */ -#define FIND_PITCH_LPC_WIN_MS ( 20 + (LA_PITCH_MS << 1) ) -#define FIND_PITCH_LPC_WIN_MAX ( FIND_PITCH_LPC_WIN_MS * MAX_FS_KHZ ) - -/* Order of LPC used in find pitch */ -#define MAX_FIND_PITCH_LPC_ORDER 16 - -#define PITCH_EST_COMPLEXITY_HC_MODE SKP_Silk_PITCH_EST_MAX_COMPLEX -#define PITCH_EST_COMPLEXITY_MC_MODE SKP_Silk_PITCH_EST_MID_COMPLEX -#define PITCH_EST_COMPLEXITY_LC_MODE SKP_Silk_PITCH_EST_MIN_COMPLEX - -/* Milliseconds of lookahead for noise shape analysis */ -#define LA_SHAPE_MS 5 -#define LA_SHAPE_MAX ( LA_SHAPE_MS * MAX_FS_KHZ ) - -/* Max length of LPC window used in noise shape analysis */ -#define SHAPE_LPC_WIN_MAX ( 15 * MAX_FS_KHZ ) - -/* Max number of bytes in payload output buffer (may contain multiple frames) */ -#define MAX_ARITHM_BYTES 1024 - -#define RANGE_CODER_WRITE_BEYOND_BUFFER -1 -#define RANGE_CODER_CDF_OUT_OF_RANGE -2 -#define RANGE_CODER_NORMALIZATION_FAILED -3 -#define RANGE_CODER_ZERO_INTERVAL_WIDTH -4 -#define RANGE_CODER_DECODER_CHECK_FAILED -5 -#define RANGE_CODER_READ_BEYOND_BUFFER -6 -#define RANGE_CODER_ILLEGAL_SAMPLING_RATE -7 -#define RANGE_CODER_DEC_PAYLOAD_TOO_LONG -8 - -/* dB level of lowest gain quantization level */ -#define MIN_QGAIN_DB 6 -/* dB level of highest gain quantization level */ -#define MAX_QGAIN_DB 86 -/* Number of gain quantization levels */ -#define N_LEVELS_QGAIN 64 -/* Max increase in gain quantization index */ -#define MAX_DELTA_GAIN_QUANT 40 -/* Max decrease in gain quantization index */ -#define MIN_DELTA_GAIN_QUANT -4 - -/* Quantization offsets (multiples of 4) */ -#define OFFSET_VL_Q10 32 -#define OFFSET_VH_Q10 100 -#define OFFSET_UVL_Q10 100 -#define OFFSET_UVH_Q10 256 - -/* Maximum numbers of iterations used to stabilize a LPC vector */ -#define MAX_LPC_STABILIZE_ITERATIONS 20 - -#define MAX_LPC_ORDER 16 -#define MIN_LPC_ORDER 10 - -/* Find Pred Coef defines */ -#define LTP_ORDER 5 - -/* LTP quantization settings */ -#define NB_LTP_CBKS 3 - -/* Number of subframes */ -#define NB_SUBFR 4 - -/* Flag to use harmonic noise shaping */ -#define USE_HARM_SHAPING 1 - -/* Max LPC order of noise shaping filters */ -#define MAX_SHAPE_LPC_ORDER 16 - -#define HARM_SHAPE_FIR_TAPS 3 - -/* Maximum number of delayed decision states */ -#define MAX_DEL_DEC_STATES 4 - -#define LTP_BUF_LENGTH 512 -#define LTP_MASK (LTP_BUF_LENGTH - 1) - -#define DECISION_DELAY 32 -#define DECISION_DELAY_MASK (DECISION_DELAY - 1) - -/* number of subframes for excitation entropy coding */ -#define SHELL_CODEC_FRAME_LENGTH 16 -#define MAX_NB_SHELL_BLOCKS (MAX_FRAME_LENGTH / SHELL_CODEC_FRAME_LENGTH) - -/* number of rate levels, for entropy coding of excitation */ -#define N_RATE_LEVELS 10 - -/* maximum sum of pulses per shell coding frame */ -#define MAX_PULSES 18 - -#define MAX_MATRIX_SIZE MAX_LPC_ORDER /* Max of LPC Order and LTP order */ - -#if( MAX_LPC_ORDER > DECISION_DELAY ) -# define NSQ_LPC_BUF_LENGTH MAX_LPC_ORDER -#else -# define NSQ_LPC_BUF_LENGTH DECISION_DELAY -#endif - -/***********************/ -/* High pass filtering */ -/***********************/ -#define HIGH_PASS_INPUT 1 - -/***************************/ -/* Voice activity detector */ -/***************************/ -#define VAD_N_BANDS 4 - -#define VAD_INTERNAL_SUBFRAMES_LOG2 2 -#define VAD_INTERNAL_SUBFRAMES (1 << VAD_INTERNAL_SUBFRAMES_LOG2) - -#define VAD_NOISE_LEVEL_SMOOTH_COEF_Q16 1024 /* Must be < 4096 */ -#define VAD_NOISE_LEVELS_BIAS 50 - -/* Sigmoid settings */ -#define VAD_NEGATIVE_OFFSET_Q5 128 /* sigmoid is 0 at -128 */ -#define VAD_SNR_FACTOR_Q16 45000 - -/* smoothing for SNR measurement */ -#define VAD_SNR_SMOOTH_COEF_Q18 4096 - -/******************/ -/* NLSF quantizer */ -/******************/ -# define NLSF_MSVQ_MAX_CB_STAGES 10 /* Update manually when changing codebooks */ -# define NLSF_MSVQ_MAX_VECTORS_IN_STAGE 128 /* Update manually when changing codebooks */ -# define NLSF_MSVQ_MAX_VECTORS_IN_STAGE_TWO_TO_END 16 /* Update manually when changing codebooks */ - -#define NLSF_MSVQ_FLUCTUATION_REDUCTION 1 -#define MAX_NLSF_MSVQ_SURVIVORS 16 -#define MAX_NLSF_MSVQ_SURVIVORS_LC_MODE 2 -#define MAX_NLSF_MSVQ_SURVIVORS_MC_MODE 4 - -/* Based on above defines, calculate how much memory is necessary to allocate */ -#if( NLSF_MSVQ_MAX_VECTORS_IN_STAGE > ( MAX_NLSF_MSVQ_SURVIVORS_LC_MODE * NLSF_MSVQ_MAX_VECTORS_IN_STAGE_TWO_TO_END ) ) -# define NLSF_MSVQ_TREE_SEARCH_MAX_VECTORS_EVALUATED_LC_MODE NLSF_MSVQ_MAX_VECTORS_IN_STAGE -#else -# define NLSF_MSVQ_TREE_SEARCH_MAX_VECTORS_EVALUATED_LC_MODE MAX_NLSF_MSVQ_SURVIVORS_LC_MODE * NLSF_MSVQ_MAX_VECTORS_IN_STAGE_TWO_TO_END -#endif - -#if( NLSF_MSVQ_MAX_VECTORS_IN_STAGE > ( MAX_NLSF_MSVQ_SURVIVORS * NLSF_MSVQ_MAX_VECTORS_IN_STAGE_TWO_TO_END ) ) -# define NLSF_MSVQ_TREE_SEARCH_MAX_VECTORS_EVALUATED NLSF_MSVQ_MAX_VECTORS_IN_STAGE -#else -# define NLSF_MSVQ_TREE_SEARCH_MAX_VECTORS_EVALUATED MAX_NLSF_MSVQ_SURVIVORS * NLSF_MSVQ_MAX_VECTORS_IN_STAGE_TWO_TO_END -#endif - -#define NLSF_MSVQ_SURV_MAX_REL_RD 0.1f /* Must be < 0.5 */ - -/* Transition filtering for mode switching */ -#if SWITCH_TRANSITION_FILTERING -# define TRANSITION_TIME_UP_MS 5120 // 5120 = 64 * FRAME_LENGTH_MS * ( TRANSITION_INT_NUM - 1 ) = 64*(20*4) -# define TRANSITION_TIME_DOWN_MS 2560 // 2560 = 32 * FRAME_LENGTH_MS * ( TRANSITION_INT_NUM - 1 ) = 32*(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_UP ( TRANSITION_TIME_UP_MS / FRAME_LENGTH_MS ) -# define TRANSITION_FRAMES_DOWN ( TRANSITION_TIME_DOWN_MS / FRAME_LENGTH_MS ) -# define TRANSITION_INT_STEPS_UP ( TRANSITION_FRAMES_UP / ( TRANSITION_INT_NUM - 1 ) ) -# define TRANSITION_INT_STEPS_DOWN ( TRANSITION_FRAMES_DOWN / ( TRANSITION_INT_NUM - 1 ) ) -#endif - -/* Row based */ -#define matrix_ptr(Matrix_base_adr, row, column, N) *(Matrix_base_adr + ((row)*(N)+(column))) -#define matrix_adr(Matrix_base_adr, row, column, N) (Matrix_base_adr + ((row)*(N)+(column))) - -/* Column based */ -#ifndef matrix_c_ptr -# define matrix_c_ptr(Matrix_base_adr, row, column, M) *(Matrix_base_adr + ((row)+(M)*(column))) -#endif -#define matrix_c_adr(Matrix_base_adr, row, column, M) (Matrix_base_adr + ((row)+(M)*(column))) - -/* BWE factors to apply after packet loss */ -#define BWE_AFTER_LOSS_Q16 63570 - -/* Defines for CN generation */ -#define CNG_BUF_MASK_MAX 255 /* 2^floor(log2(MAX_FRAME_LENGTH))-1 */ -#define CNG_GAIN_SMTH_Q16 4634 /* 0.25^(1/4) */ -#define CNG_NLSF_SMTH_Q16 16348 /* 0.25 */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libs/silk/src/SKP_Silk_detect_SWB_input.c b/libs/silk/src/SKP_Silk_detect_SWB_input.c deleted file mode 100644 index ea64888004..0000000000 --- a/libs/silk/src/SKP_Silk_detect_SWB_input.c +++ /dev/null @@ -1,76 +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. -***********************************************************************/ - -/* - * Detect SWB input by measuring energy above 8 kHz. - */ - -#include "SKP_Silk_main.h" - -void SKP_Silk_detect_SWB_input( - SKP_Silk_detect_SWB_state *psSWBdetect, /* (I/O) encoder state */ - const SKP_int16 samplesIn[], /* (I) input to encoder */ - SKP_int nSamplesIn /* (I) length of input */ -) -{ - SKP_int HP_8_kHz_len, i, shift; - SKP_int16 in_HP_8_kHz[ MAX_FRAME_LENGTH ]; - SKP_int32 energy_32; - - /* High pass filter with cutoff at 8 khz */ - HP_8_kHz_len = SKP_min_int( nSamplesIn, MAX_FRAME_LENGTH ); - HP_8_kHz_len = SKP_max_int( HP_8_kHz_len, 0 ); - - /* Cutoff around 9 khz */ - /* A = conv(conv([8192,14613, 6868], [8192,12883, 7337]), [8192,11586, 7911]); */ - /* B = conv(conv([575, -948, 575], [575, -221, 575]), [575, 104, 575]); */ - SKP_Silk_biquad( samplesIn, SKP_Silk_SWB_detect_B_HP_Q13[ 0 ], SKP_Silk_SWB_detect_A_HP_Q13[ 0 ], - psSWBdetect->S_HP_8_kHz[ 0 ], in_HP_8_kHz, HP_8_kHz_len ); - for( i = 1; i < NB_SOS; i++ ) { - SKP_Silk_biquad( in_HP_8_kHz, SKP_Silk_SWB_detect_B_HP_Q13[ i ], SKP_Silk_SWB_detect_A_HP_Q13[ i ], - psSWBdetect->S_HP_8_kHz[ i ], in_HP_8_kHz, HP_8_kHz_len ); - } - - /* Calculate energy in HP signal */ - SKP_Silk_sum_sqr_shift( &energy_32, &shift, in_HP_8_kHz, HP_8_kHz_len ); - - /* Count concecutive samples above threshold, after adjusting threshold for number of input samples and shift */ - if( energy_32 > SKP_RSHIFT( SKP_SMULBB( HP_8_KHZ_THRES, HP_8_kHz_len ), shift ) ) { - psSWBdetect->ConsecSmplsAboveThres += nSamplesIn; - if( psSWBdetect->ConsecSmplsAboveThres > CONCEC_SWB_SMPLS_THRES ) { - psSWBdetect->SWB_detected = 1; - } - } else { - psSWBdetect->ConsecSmplsAboveThres -= nSamplesIn; - psSWBdetect->ConsecSmplsAboveThres = SKP_max( psSWBdetect->ConsecSmplsAboveThres, 0 ); - } - - /* If sufficient speech activity and no SWB detected, we detect the signal as being WB */ - if( ( psSWBdetect->ActiveSpeech_ms > WB_DETECT_ACTIVE_SPEECH_MS_THRES ) && ( psSWBdetect->SWB_detected == 0 ) ) { - psSWBdetect->WB_detected = 1; - } -} diff --git a/libs/silk/src/SKP_Silk_enc_API.c b/libs/silk/src/SKP_Silk_enc_API.c deleted file mode 100644 index bab0688b8b..0000000000 --- a/libs/silk/src/SKP_Silk_enc_API.c +++ /dev/null @@ -1,244 +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_define.h" -#include "SKP_Silk_main_FIX.h" -#include "SKP_Silk_SDK_API.h" -#include "SKP_Silk_control.h" -#include "SKP_Silk_typedef.h" -#include "SKP_Silk_structs.h" -#define SKP_Silk_EncodeControlStruct SKP_SILK_SDK_EncControlStruct - -/****************************************/ -/* Encoder functions */ -/****************************************/ - -SKP_int SKP_Silk_SDK_Get_Encoder_Size( SKP_int32 *encSizeBytes ) -{ - SKP_int ret = 0; - - *encSizeBytes = sizeof( SKP_Silk_encoder_state_FIX ); - - return ret; -} - - -/***************************************/ -/* Read control structure from encoder */ -/***************************************/ -SKP_int SKP_Silk_SDK_QueryEncoder( - const void *encState, /* I: State Vector */ - SKP_Silk_EncodeControlStruct *encStatus /* O: Control Structure */ -) -{ - SKP_Silk_encoder_state_FIX *psEnc; - SKP_int ret = 0; - - psEnc = ( SKP_Silk_encoder_state_FIX* )encState; - - encStatus->API_sampleRate = psEnc->sCmn.API_fs_Hz; - encStatus->maxInternalSampleRate = SKP_SMULBB( psEnc->sCmn.maxInternal_fs_kHz, 1000 ); - encStatus->packetSize = ( SKP_int )SKP_DIV32_16( psEnc->sCmn.API_fs_Hz * psEnc->sCmn.PacketSize_ms, 1000 ); /* convert samples -> 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; - return ret; -} - -/*************************/ -/* Init or Reset encoder */ -/*************************/ -SKP_int SKP_Silk_SDK_InitEncoder( - void *encState, /* I/O: State */ - SKP_Silk_EncodeControlStruct *encStatus /* O: Control structure */ -) -{ - SKP_Silk_encoder_state_FIX *psEnc; - SKP_int ret = 0; - - - psEnc = ( SKP_Silk_encoder_state_FIX* )encState; - - /* Reset Encoder */ - if( ret += SKP_Silk_init_encoder_FIX( psEnc ) ) { - SKP_assert( 0 ); - } - - /* Read control structure */ - if( ret += SKP_Silk_SDK_QueryEncoder( encState, encStatus ) ) { - SKP_assert( 0 ); - } - - - return ret; -} - -/**************************/ -/* Encode frame with Silk */ -/**************************/ -SKP_int SKP_Silk_SDK_Encode( - void *encState, /* I/O: State */ - const SKP_Silk_EncodeControlStruct *encControl, /* I: Control structure */ - const SKP_int16 *samplesIn, /* I: Speech sample input vector */ - SKP_int nSamplesIn, /* I: Number of samples in input vector */ - SKP_uint8 *outData, /* O: Encoded output vector */ - SKP_int16 *nBytesOut /* I/O: Number of bytes in outData (input: Max bytes) */ -) -{ - SKP_int max_internal_fs_kHz, PacketSize_ms, PacketLoss_perc, UseInBandFEC, UseDTX, ret = 0; - SKP_int nSamplesToBuffer, Complexity, input_10ms, nSamplesFromInput = 0; - SKP_int32 TargetRate_bps, API_fs_Hz; - SKP_int16 MaxBytesOut; - SKP_Silk_encoder_state_FIX *psEnc = ( SKP_Silk_encoder_state_FIX* )encState; - - 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->maxInternalSampleRate != 24000 ) ) ) { - ret = SKP_SILK_ENC_FS_NOT_SUPPORTED; - SKP_assert( 0 ); - return( ret ); - } - - /* 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 */ - PacketSize_ms = SKP_DIV32( 1000 * (SKP_int)encControl->packetSize, API_fs_Hz ); - TargetRate_bps = encControl->bitRate; - PacketLoss_perc = encControl->packetLossPercentage; - UseInBandFEC = encControl->useInBandFEC; - Complexity = encControl->complexity; - UseDTX = encControl->useDTX; - - /* Save values in state */ - psEnc->sCmn.API_fs_Hz = API_fs_Hz; - psEnc->sCmn.maxInternal_fs_kHz = max_internal_fs_kHz; - psEnc->sCmn.useInBandFEC = UseInBandFEC; - - /* Only accept input lengths that are a multiple of 10 ms */ - input_10ms = SKP_DIV32( 100 * nSamplesIn, API_fs_Hz ); - if( input_10ms * API_fs_Hz != 100 * nSamplesIn || nSamplesIn < 0 ) { - ret = SKP_SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES; - SKP_assert( 0 ); - return( ret ); - } - - TargetRate_bps = SKP_LIMIT( TargetRate_bps, MIN_TARGET_RATE_BPS, MAX_TARGET_RATE_BPS ); - if( ( ret = SKP_Silk_control_encoder_FIX( psEnc, PacketSize_ms, TargetRate_bps, - PacketLoss_perc, UseDTX, Complexity) ) != 0 ) { - SKP_assert( 0 ); - return( ret ); - } - - /* Make sure no more than one packet can be produced */ - if( 1000 * (SKP_int32)nSamplesIn > psEnc->sCmn.PacketSize_ms * API_fs_Hz ) { - ret = SKP_SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES; - SKP_assert( 0 ); - return( ret ); - } - -#if MAX_FS_KHZ > 16 - /* Detect energy above 8 kHz */ - if( SKP_min( API_fs_Hz, 1000 * max_internal_fs_kHz ) == 24000 && - psEnc->sCmn.sSWBdetect.SWB_detected == 0 && - psEnc->sCmn.sSWBdetect.WB_detected == 0 ) { - SKP_Silk_detect_SWB_input( &psEnc->sCmn.sSWBdetect, samplesIn, ( SKP_int )nSamplesIn ); - } -#endif - - /* Input buffering/resampling and encoding */ - MaxBytesOut = 0; /* return 0 output bytes if no encoder called */ - while( 1 ) { - nSamplesToBuffer = psEnc->sCmn.frame_length - psEnc->sCmn.inputBufIx; - if( 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 * input_10ms * psEnc->sCmn.fs_kHz ); - nSamplesFromInput = SKP_DIV32_16( nSamplesToBuffer * 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; - - /* Silk encoder */ - if( psEnc->sCmn.inputBufIx >= psEnc->sCmn.frame_length ) { - SKP_assert( psEnc->sCmn.inputBufIx == psEnc->sCmn.frame_length ); - - /* Enough data in input buffer, so encode */ - if( MaxBytesOut == 0 ) { - /* No payload obtained so far */ - MaxBytesOut = *nBytesOut; - if( ( ret = SKP_Silk_encode_frame_FIX( psEnc, outData, &MaxBytesOut, psEnc->sCmn.inputBuf ) ) != 0 ) { - SKP_assert( 0 ); - } - } else { - /* outData already contains a payload */ - if( ( ret = SKP_Silk_encode_frame_FIX( psEnc, outData, nBytesOut, psEnc->sCmn.inputBuf ) ) != 0 ) { - SKP_assert( 0 ); - } - /* Check that no second payload was created */ - SKP_assert( *nBytesOut == 0 ); - } - psEnc->sCmn.inputBufIx = 0; - psEnc->sCmn.controlled_since_last_payload = 0; - - if( nSamplesIn == 0 ) { - break; - } - } else { - break; - } - } - - *nBytesOut = MaxBytesOut; - if( psEnc->sCmn.useDTX && psEnc->sCmn.inDTX ) { - /* DTX simulation */ - *nBytesOut = 0; - } - - - return ret; -} diff --git a/libs/silk/src/SKP_Silk_encode_frame_FIX.c b/libs/silk/src/SKP_Silk_encode_frame_FIX.c deleted file mode 100644 index 3e77fb18cb..0000000000 --- a/libs/silk/src/SKP_Silk_encode_frame_FIX.c +++ /dev/null @@ -1,413 +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_FIX.h" -#include "SKP_Silk_tuning_parameters.h" - -/****************/ -/* Encode frame */ -/****************/ -SKP_int SKP_Silk_encode_frame_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk FIX encoder state */ - SKP_uint8 *pCode, /* O Pointer to payload */ - SKP_int16 *pnBytesOut, /* I/O Pointer to number of payload bytes */ - /* input: max length; output: used */ - const SKP_int16 *pIn /* I Pointer to input speech frame */ -) -{ - SKP_Silk_encoder_control_FIX sEncCtrl; - SKP_int nBytes, ret = 0; - SKP_int16 *x_frame, *res_pitch_frame; - SKP_int16 xfw[ MAX_FRAME_LENGTH ]; - SKP_int16 pIn_HP[ MAX_FRAME_LENGTH ]; - SKP_int16 res_pitch[ 2 * MAX_FRAME_LENGTH + LA_PITCH_MAX ]; - SKP_int LBRR_idx, frame_terminator, SNR_dB_Q7; - const SKP_uint16 *FrameTermination_CDF; - /* Low bitrate redundancy parameters */ - SKP_uint8 LBRRpayload[ MAX_ARITHM_BYTES ]; - SKP_int16 nBytesLBRR; - - - sEncCtrl.sCmn.Seed = psEnc->sCmn.frameCounter++ & 3; - /**************************************************************/ - /* Setup Input Pointers, and insert frame in input buffer */ - /*************************************************************/ - x_frame = psEnc->x_buf + psEnc->sCmn.frame_length; /* start of frame to encode */ - res_pitch_frame = res_pitch + psEnc->sCmn.frame_length; /* start of pitch LPC residual frame */ - - /****************************/ - /* Voice Activity Detection */ - /****************************/ - ret = SKP_Silk_VAD_GetSA_Q8( &psEnc->sCmn.sVAD, &psEnc->speech_activity_Q8, &SNR_dB_Q7, - sEncCtrl.input_quality_bands_Q15, &sEncCtrl.input_tilt_Q15, - pIn,psEnc->sCmn.frame_length ); - - /*******************************************/ - /* High-pass filtering of the input signal */ - /*******************************************/ -#if HIGH_PASS_INPUT - /* Variable high-pass filter */ - SKP_Silk_HP_variable_cutoff_FIX( psEnc, &sEncCtrl, pIn_HP, pIn ); -#else - SKP_memcpy( pIn_HP, pIn, psEnc->sCmn.frame_length * sizeof( SKP_int16 ) ); -#endif - -#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, pIn_HP, psEnc->sCmn.frame_length ); -#else - SKP_memcpy( x_frame + LA_SHAPE_MS * psEnc->sCmn.fs_kHz, pIn_HP,psEnc->sCmn.frame_length * sizeof( SKP_int16 ) ); -#endif - - /*****************************************/ - /* Find pitch lags, initial LPC analysis */ - /*****************************************/ - SKP_Silk_find_pitch_lags_FIX( psEnc, &sEncCtrl, res_pitch, x_frame ); - - /************************/ - /* Noise shape analysis */ - /************************/ - SKP_Silk_noise_shape_analysis_FIX( psEnc, &sEncCtrl, res_pitch_frame, x_frame ); - - /*****************************************/ - /* Prefiltering for noise shaper */ - /*****************************************/ - SKP_Silk_prefilter_FIX( psEnc, &sEncCtrl, xfw, x_frame ); - - /***************************************************/ - /* Find linear prediction coefficients (LPC + LTP) */ - /***************************************************/ - SKP_Silk_find_pred_coefs_FIX( psEnc, &sEncCtrl, res_pitch ); - - /****************************************/ - /* Process gains */ - /****************************************/ - SKP_Silk_process_gains_FIX( psEnc, &sEncCtrl ); - - - /****************************************/ - /* Low Bitrate Redundant Encoding */ - /****************************************/ - nBytesLBRR = MAX_ARITHM_BYTES; - SKP_Silk_LBRR_encode_FIX( psEnc, &sEncCtrl, LBRRpayload, &nBytesLBRR, xfw ); - - /*****************************************/ - /* Noise shaping quantization */ - /*****************************************/ - if( psEnc->sCmn.nStatesDelayedDecision > 1 || psEnc->sCmn.warping_Q16 > 0 ) { - SKP_Silk_NSQ_del_dec( &psEnc->sCmn, &sEncCtrl.sCmn, &psEnc->sNSQ, xfw, - psEnc->sCmn.q, sEncCtrl.sCmn.NLSFInterpCoef_Q2, - sEncCtrl.PredCoef_Q12[ 0 ], sEncCtrl.LTPCoef_Q14, sEncCtrl.AR2_Q13, sEncCtrl.HarmShapeGain_Q14, - sEncCtrl.Tilt_Q14, sEncCtrl.LF_shp_Q14, sEncCtrl.Gains_Q16, sEncCtrl.Lambda_Q10, - sEncCtrl.LTP_scale_Q14 ); - } else { - SKP_Silk_NSQ( &psEnc->sCmn, &sEncCtrl.sCmn, &psEnc->sNSQ, xfw, - psEnc->sCmn.q, sEncCtrl.sCmn.NLSFInterpCoef_Q2, - sEncCtrl.PredCoef_Q12[ 0 ], sEncCtrl.LTPCoef_Q14, sEncCtrl.AR2_Q13, sEncCtrl.HarmShapeGain_Q14, - sEncCtrl.Tilt_Q14, sEncCtrl.LF_shp_Q14, sEncCtrl.Gains_Q16, sEncCtrl.Lambda_Q10, - sEncCtrl.LTP_scale_Q14 ); - } - - /**************************************************/ - /* Convert speech activity into VAD and DTX flags */ - /**************************************************/ - if( psEnc->speech_activity_Q8 < SKP_FIX_CONST( SPEECH_ACTIVITY_DTX_THRES, 8 ) ) { - psEnc->sCmn.vadFlag = 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; - psEnc->sCmn.inDTX = 0; - } - } else { - psEnc->sCmn.noSpeechCounter = 0; - psEnc->sCmn.inDTX = 0; - psEnc->sCmn.vadFlag = VOICE_ACTIVITY; - } - - /****************************************/ - /* Initialize range coder */ - /****************************************/ - if( psEnc->sCmn.nFramesInPayloadBuf == 0 ) { - SKP_Silk_range_enc_init( &psEnc->sCmn.sRC ); - psEnc->sCmn.nBytesInPayloadBuf = 0; - } - - /****************************************/ - /* Encode Parameters */ - /****************************************/ - SKP_Silk_encode_parameters( &psEnc->sCmn, &sEncCtrl.sCmn, &psEnc->sCmn.sRC, psEnc->sCmn.q ); - FrameTermination_CDF = SKP_Silk_FrameTermination_CDF; - - /****************************************/ - /* Update Buffers and State */ - /****************************************/ - /* Update input buffer */ - SKP_memmove( psEnc->x_buf, &psEnc->x_buf[ psEnc->sCmn.frame_length ], - ( psEnc->sCmn.frame_length + LA_SHAPE_MS * psEnc->sCmn.fs_kHz ) * sizeof( SKP_int16 ) ); - - /* Parameters needed for next frame */ - psEnc->sCmn.prev_sigtype = sEncCtrl.sCmn.sigtype; - psEnc->sCmn.prevLag = sEncCtrl.sCmn.pitchL[ NB_SUBFR - 1]; - psEnc->sCmn.first_frame_after_reset = 0; - - if( psEnc->sCmn.sRC.error ) { - /* Encoder returned error: clear payload buffer */ - psEnc->sCmn.nFramesInPayloadBuf = 0; - } else { - psEnc->sCmn.nFramesInPayloadBuf++; - } - - /****************************************/ - /* Finalize payload and copy to output */ - /****************************************/ - if( psEnc->sCmn.nFramesInPayloadBuf * FRAME_LENGTH_MS >= psEnc->sCmn.PacketSize_ms ) { - - LBRR_idx = ( psEnc->sCmn.oldest_LBRR_idx + 1 ) & LBRR_IDX_MASK; - - /* Check if FEC information should be added */ - frame_terminator = SKP_SILK_LAST_FRAME; - if( psEnc->sCmn.LBRR_buffer[ LBRR_idx ].usage == SKP_SILK_ADD_LBRR_TO_PLUS1 ) { - frame_terminator = SKP_SILK_LBRR_VER1; - } - if( psEnc->sCmn.LBRR_buffer[ psEnc->sCmn.oldest_LBRR_idx ].usage == SKP_SILK_ADD_LBRR_TO_PLUS2 ) { - frame_terminator = SKP_SILK_LBRR_VER2; - LBRR_idx = psEnc->sCmn.oldest_LBRR_idx; - } - - /* Add the frame termination info to stream */ - SKP_Silk_range_encoder( &psEnc->sCmn.sRC, frame_terminator, FrameTermination_CDF ); - - /* Payload length so far */ - SKP_Silk_range_coder_get_length( &psEnc->sCmn.sRC, &nBytes ); - - /* Check that there is enough space in external output buffer, and move data */ - if( *pnBytesOut >= nBytes ) { - SKP_Silk_range_enc_wrap_up( &psEnc->sCmn.sRC ); - SKP_memcpy( pCode, psEnc->sCmn.sRC.buffer, nBytes * sizeof( SKP_uint8 ) ); - - if( frame_terminator > SKP_SILK_MORE_FRAMES && - *pnBytesOut >= nBytes + psEnc->sCmn.LBRR_buffer[ LBRR_idx ].nBytes ) { - /* Get old packet and add to payload. */ - SKP_memcpy( &pCode[ nBytes ], - psEnc->sCmn.LBRR_buffer[ LBRR_idx ].payload, - psEnc->sCmn.LBRR_buffer[ LBRR_idx ].nBytes * sizeof( SKP_uint8 ) ); - nBytes += psEnc->sCmn.LBRR_buffer[ LBRR_idx ].nBytes; - } - - *pnBytesOut = nBytes; - - /* Update FEC buffer */ - SKP_memcpy( psEnc->sCmn.LBRR_buffer[ psEnc->sCmn.oldest_LBRR_idx ].payload, LBRRpayload, - nBytesLBRR * sizeof( SKP_uint8 ) ); - psEnc->sCmn.LBRR_buffer[ psEnc->sCmn.oldest_LBRR_idx ].nBytes = nBytesLBRR; - /* The line below describes how FEC should be used */ - psEnc->sCmn.LBRR_buffer[ psEnc->sCmn.oldest_LBRR_idx ].usage = sEncCtrl.sCmn.LBRR_usage; - psEnc->sCmn.oldest_LBRR_idx = ( psEnc->sCmn.oldest_LBRR_idx + 1 ) & LBRR_IDX_MASK; - - } else { - /* Not enough space: Payload will be discarded */ - *pnBytesOut = 0; - nBytes = 0; - ret = SKP_SILK_ENC_PAYLOAD_BUF_TOO_SHORT; - } - - /* Reset the number of frames in payload buffer */ - psEnc->sCmn.nFramesInPayloadBuf = 0; - } else { - /* No payload this time */ - *pnBytesOut = 0; - - /* Encode that more frames follows */ - frame_terminator = SKP_SILK_MORE_FRAMES; - SKP_Silk_range_encoder( &psEnc->sCmn.sRC, frame_terminator, FrameTermination_CDF ); - - /* Payload length so far */ - SKP_Silk_range_coder_get_length( &psEnc->sCmn.sRC, &nBytes ); - - } - - /* Check for arithmetic coder errors */ - if( psEnc->sCmn.sRC.error ) { - ret = SKP_SILK_ENC_INTERNAL_ERROR; - } - - /* Simulate number of ms buffered in channel because of exceeding TargetRate */ - SKP_assert( ( 8 * 1000 * ( (SKP_int64)nBytes - (SKP_int64)psEnc->sCmn.nBytesInPayloadBuf ) ) == - SKP_SAT32( 8 * 1000 * ( (SKP_int64)nBytes - (SKP_int64)psEnc->sCmn.nBytesInPayloadBuf ) ) ); - SKP_assert( psEnc->sCmn.TargetRate_bps > 0 ); - psEnc->BufferedInChannel_ms += SKP_DIV32( 8 * 1000 * ( nBytes - psEnc->sCmn.nBytesInPayloadBuf ), psEnc->sCmn.TargetRate_bps ); - psEnc->BufferedInChannel_ms -= FRAME_LENGTH_MS; - psEnc->BufferedInChannel_ms = SKP_LIMIT_int( psEnc->BufferedInChannel_ms, 0, 100 ); - psEnc->sCmn.nBytesInPayloadBuf = nBytes; - - if( psEnc->speech_activity_Q8 > SKP_FIX_CONST( WB_DETECT_ACTIVE_SPEECH_LEVEL_THRES, 8 ) ) { - psEnc->sCmn.sSWBdetect.ActiveSpeech_ms = SKP_ADD_POS_SAT32( psEnc->sCmn.sSWBdetect.ActiveSpeech_ms, FRAME_LENGTH_MS ); - } - - - return( ret ); -} - -/* Low BitRate Redundancy encoding functionality. Reuse all parameters but encode residual with lower bitrate */ -void SKP_Silk_LBRR_encode_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk encoder state */ - SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O Pointer to Silk encoder control struct */ - SKP_uint8 *pCode, /* O Pointer to payload */ - SKP_int16 *pnBytesOut, /* I/O Pointer to number of payload bytes */ - SKP_int16 xfw[] /* I Input signal */ -) -{ - SKP_int TempGainsIndices[ NB_SUBFR ], frame_terminator; - SKP_int nBytes, nFramesInPayloadBuf; - SKP_int32 TempGains_Q16[ NB_SUBFR ]; - SKP_int typeOffset, LTP_scaleIndex, Rate_only_parameters = 0; - /*******************************************/ - /* Control use of inband LBRR */ - /*******************************************/ - SKP_Silk_LBRR_ctrl_FIX( psEnc, &psEncCtrl->sCmn ); - - if( psEnc->sCmn.LBRR_enabled ) { - /* Save original gains */ - SKP_memcpy( TempGainsIndices, psEncCtrl->sCmn.GainsIndices, NB_SUBFR * sizeof( SKP_int ) ); - SKP_memcpy( TempGains_Q16, psEncCtrl->Gains_Q16, NB_SUBFR * sizeof( SKP_int32 ) ); - - typeOffset = psEnc->sCmn.typeOffsetPrev; // Temp save as cannot be overwritten - LTP_scaleIndex = psEncCtrl->sCmn.LTP_scaleIndex; - - /* Set max rate where quant signal is encoded */ - if( psEnc->sCmn.fs_kHz == 8 ) { - Rate_only_parameters = 13500; - } else if( psEnc->sCmn.fs_kHz == 12 ) { - Rate_only_parameters = 15500; - } else if( psEnc->sCmn.fs_kHz == 16 ) { - Rate_only_parameters = 17500; - } else if( psEnc->sCmn.fs_kHz == 24 ) { - Rate_only_parameters = 19500; - } else { - SKP_assert( 0 ); - } - - if( psEnc->sCmn.Complexity > 0 && psEnc->sCmn.TargetRate_bps > Rate_only_parameters ) { - if( psEnc->sCmn.nFramesInPayloadBuf == 0 ) { - /* First frame in packet; copy everything */ - SKP_memcpy( &psEnc->sNSQ_LBRR, &psEnc->sNSQ, sizeof( SKP_Silk_nsq_state ) ); - - psEnc->sCmn.LBRRprevLastGainIndex = psEnc->sShape.LastGainIndex; - /* Increase Gains to get target LBRR rate */ - psEncCtrl->sCmn.GainsIndices[ 0 ] = psEncCtrl->sCmn.GainsIndices[ 0 ] + psEnc->sCmn.LBRR_GainIncreases; - psEncCtrl->sCmn.GainsIndices[ 0 ] = SKP_LIMIT_int( psEncCtrl->sCmn.GainsIndices[ 0 ], 0, N_LEVELS_QGAIN - 1 ); - } - /* Decode to get gains in sync with decoder */ - /* Overwrite unquantized gains with quantized gains */ - SKP_Silk_gains_dequant( psEncCtrl->Gains_Q16, psEncCtrl->sCmn.GainsIndices, - &psEnc->sCmn.LBRRprevLastGainIndex, psEnc->sCmn.nFramesInPayloadBuf ); - - /*****************************************/ - /* Noise shaping quantization */ - /*****************************************/ - if( psEnc->sCmn.nStatesDelayedDecision > 1 || psEnc->sCmn.warping_Q16 > 0 ) { - SKP_Silk_NSQ_del_dec( &psEnc->sCmn, &psEncCtrl->sCmn, &psEnc->sNSQ_LBRR, xfw, psEnc->sCmn.q_LBRR, - psEncCtrl->sCmn.NLSFInterpCoef_Q2, psEncCtrl->PredCoef_Q12[ 0 ], psEncCtrl->LTPCoef_Q14, - psEncCtrl->AR2_Q13, psEncCtrl->HarmShapeGain_Q14, psEncCtrl->Tilt_Q14, psEncCtrl->LF_shp_Q14, - psEncCtrl->Gains_Q16, psEncCtrl->Lambda_Q10, psEncCtrl->LTP_scale_Q14 ); - } else { - SKP_Silk_NSQ( &psEnc->sCmn, &psEncCtrl->sCmn, &psEnc->sNSQ_LBRR, xfw, psEnc->sCmn.q_LBRR, - psEncCtrl->sCmn.NLSFInterpCoef_Q2, psEncCtrl->PredCoef_Q12[ 0 ], psEncCtrl->LTPCoef_Q14, - psEncCtrl->AR2_Q13, psEncCtrl->HarmShapeGain_Q14, psEncCtrl->Tilt_Q14, psEncCtrl->LF_shp_Q14, - psEncCtrl->Gains_Q16, psEncCtrl->Lambda_Q10, psEncCtrl->LTP_scale_Q14 ); - } - } else { - SKP_memset( psEnc->sCmn.q_LBRR, 0, psEnc->sCmn.frame_length * sizeof( SKP_int8 ) ); - psEncCtrl->sCmn.LTP_scaleIndex = 0; - } - /****************************************/ - /* Initialize arithmetic coder */ - /****************************************/ - if( psEnc->sCmn.nFramesInPayloadBuf == 0 ) { - SKP_Silk_range_enc_init( &psEnc->sCmn.sRC_LBRR ); - psEnc->sCmn.nBytesInPayloadBuf = 0; - } - - /****************************************/ - /* Encode Parameters */ - /****************************************/ - SKP_Silk_encode_parameters( &psEnc->sCmn, &psEncCtrl->sCmn, - &psEnc->sCmn.sRC_LBRR, psEnc->sCmn.q_LBRR ); - - if( psEnc->sCmn.sRC_LBRR.error ) { - /* Encoder returned error: clear payload buffer */ - nFramesInPayloadBuf = 0; - } else { - nFramesInPayloadBuf = psEnc->sCmn.nFramesInPayloadBuf + 1; - } - - /****************************************/ - /* Finalize payload and copy to output */ - /****************************************/ - if( SKP_SMULBB( nFramesInPayloadBuf, FRAME_LENGTH_MS ) >= psEnc->sCmn.PacketSize_ms ) { - - /* Check if FEC information should be added */ - frame_terminator = SKP_SILK_LAST_FRAME; - - /* Add the frame termination info to stream */ - SKP_Silk_range_encoder( &psEnc->sCmn.sRC_LBRR, frame_terminator, SKP_Silk_FrameTermination_CDF ); - - /* Payload length so far */ - SKP_Silk_range_coder_get_length( &psEnc->sCmn.sRC_LBRR, &nBytes ); - - /* Check that there is enough space in external output buffer and move data */ - if( *pnBytesOut >= nBytes ) { - SKP_Silk_range_enc_wrap_up( &psEnc->sCmn.sRC_LBRR ); - SKP_memcpy( pCode, psEnc->sCmn.sRC_LBRR.buffer, nBytes * sizeof( SKP_uint8 ) ); - - *pnBytesOut = nBytes; - } else { - /* Not enough space: payload will be discarded */ - *pnBytesOut = 0; - SKP_assert( 0 ); - } - } else { - /* No payload this time */ - *pnBytesOut = 0; - - /* Encode that more frames follows */ - frame_terminator = SKP_SILK_MORE_FRAMES; - SKP_Silk_range_encoder( &psEnc->sCmn.sRC_LBRR, frame_terminator, SKP_Silk_FrameTermination_CDF ); - } - - /* Restore original Gains */ - SKP_memcpy( psEncCtrl->sCmn.GainsIndices, TempGainsIndices, NB_SUBFR * sizeof( SKP_int ) ); - SKP_memcpy( psEncCtrl->Gains_Q16, TempGains_Q16, NB_SUBFR * sizeof( SKP_int32 ) ); - - /* Restore LTP scale index and typeoffset */ - psEncCtrl->sCmn.LTP_scaleIndex = LTP_scaleIndex; - psEnc->sCmn.typeOffsetPrev = typeOffset; - } -} diff --git a/libs/silk/src/SKP_Silk_encode_parameters.c b/libs/silk/src/SKP_Silk_encode_parameters.c deleted file mode 100644 index c55a30f5c3..0000000000 --- a/libs/silk/src/SKP_Silk_encode_parameters.c +++ /dev/null @@ -1,162 +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 parameters to create the payload */ -/*******************************************/ -void SKP_Silk_encode_parameters( - SKP_Silk_encoder_state *psEncC, /* I/O Encoder state */ - SKP_Silk_encoder_control *psEncCtrlC, /* I/O Encoder control */ - SKP_Silk_range_coder_state *psRC, /* I/O Range encoder state */ - const SKP_int8 *q /* I Quantization indices */ -) -{ - SKP_int i, k, typeOffset; - const SKP_Silk_NLSF_CB_struct *psNLSF_CB; - - - /************************/ - /* Encode sampling rate */ - /************************/ - /* only done for first frame in packet */ - if( psEncC->nFramesInPayloadBuf == 0 ) { - /* get sampling rate index */ - for( i = 0; i < 3; i++ ) { - if( SKP_Silk_SamplingRates_table[ i ] == psEncC->fs_kHz ) { - break; - } - } - SKP_Silk_range_encoder( psRC, i, SKP_Silk_SamplingRates_CDF ); - } - - /*******************************************/ - /* Encode signal type and quantizer offset */ - /*******************************************/ - typeOffset = 2 * psEncCtrlC->sigtype + psEncCtrlC->QuantOffsetType; - if( psEncC->nFramesInPayloadBuf == 0 ) { - /* first frame in packet: independent coding */ - SKP_Silk_range_encoder( psRC, typeOffset, SKP_Silk_type_offset_CDF ); - } else { - /* condidtional coding */ - SKP_Silk_range_encoder( psRC, typeOffset, SKP_Silk_type_offset_joint_CDF[ psEncC->typeOffsetPrev ] ); - } - psEncC->typeOffsetPrev = typeOffset; - - /****************/ - /* Encode gains */ - /****************/ - /* first subframe */ - if( psEncC->nFramesInPayloadBuf == 0 ) { - /* first frame in packet: independent coding */ - SKP_Silk_range_encoder( psRC, psEncCtrlC->GainsIndices[ 0 ], SKP_Silk_gain_CDF[ psEncCtrlC->sigtype ] ); - } else { - /* condidtional coding */ - SKP_Silk_range_encoder( psRC, psEncCtrlC->GainsIndices[ 0 ], SKP_Silk_delta_gain_CDF ); - } - - /* remaining subframes */ - for( i = 1; i < NB_SUBFR; i++ ) { - SKP_Silk_range_encoder( psRC, psEncCtrlC->GainsIndices[ i ], SKP_Silk_delta_gain_CDF ); - } - - - /****************/ - /* Encode NLSFs */ - /****************/ - /* Range encoding of the NLSF path */ - psNLSF_CB = psEncC->psNLSF_CB[ psEncCtrlC->sigtype ]; - SKP_Silk_range_encoder_multi( psRC, psEncCtrlC->NLSFIndices, psNLSF_CB->StartPtr, psNLSF_CB->nStages ); - - /* Encode NLSF interpolation factor */ - SKP_assert( psEncC->useInterpolatedNLSFs == 1 || psEncCtrlC->NLSFInterpCoef_Q2 == ( 1 << 2 ) ); - SKP_Silk_range_encoder( psRC, psEncCtrlC->NLSFInterpCoef_Q2, SKP_Silk_NLSF_interpolation_factor_CDF ); - - - if( psEncCtrlC->sigtype == SIG_TYPE_VOICED ) { - /*********************/ - /* Encode pitch lags */ - /*********************/ - - - /* lag index */ - if( psEncC->fs_kHz == 8 ) { - SKP_Silk_range_encoder( psRC, psEncCtrlC->lagIndex, SKP_Silk_pitch_lag_NB_CDF ); - } else if( psEncC->fs_kHz == 12 ) { - SKP_Silk_range_encoder( psRC, psEncCtrlC->lagIndex, SKP_Silk_pitch_lag_MB_CDF ); - } else if( psEncC->fs_kHz == 16 ) { - SKP_Silk_range_encoder( psRC, psEncCtrlC->lagIndex, SKP_Silk_pitch_lag_WB_CDF ); - } else { - SKP_Silk_range_encoder( psRC, psEncCtrlC->lagIndex, SKP_Silk_pitch_lag_SWB_CDF ); - } - - - /* countour index */ - if( psEncC->fs_kHz == 8 ) { - /* Less codevectors used in 8 khz mode */ - SKP_Silk_range_encoder( psRC, psEncCtrlC->contourIndex, SKP_Silk_pitch_contour_NB_CDF ); - } else { - /* Joint for 12, 16, 24 khz */ - SKP_Silk_range_encoder( psRC, psEncCtrlC->contourIndex, SKP_Silk_pitch_contour_CDF ); - } - - /********************/ - /* Encode LTP gains */ - /********************/ - - /* PERIndex value */ - SKP_Silk_range_encoder( psRC, psEncCtrlC->PERIndex, SKP_Silk_LTP_per_index_CDF ); - - /* Codebook Indices */ - for( k = 0; k < NB_SUBFR; k++ ) { - SKP_Silk_range_encoder( psRC, psEncCtrlC->LTPIndex[ k ], SKP_Silk_LTP_gain_CDF_ptrs[ psEncCtrlC->PERIndex ] ); - } - - /**********************/ - /* Encode LTP scaling */ - /**********************/ - SKP_Silk_range_encoder( psRC, psEncCtrlC->LTP_scaleIndex, SKP_Silk_LTPscale_CDF ); - } - - - /***************/ - /* Encode seed */ - /***************/ - SKP_Silk_range_encoder( psRC, psEncCtrlC->Seed, SKP_Silk_Seed_CDF ); - - /*********************************************/ - /* Encode quantization indices of excitation */ - /*********************************************/ - SKP_Silk_encode_pulses( psRC, psEncCtrlC->sigtype, psEncCtrlC->QuantOffsetType, q, psEncC->frame_length ); - - - /*********************************************/ - /* Encode VAD flag */ - /*********************************************/ - SKP_Silk_range_encoder( psRC, psEncC->vadFlag, SKP_Silk_vadflag_CDF ); -} diff --git a/libs/silk/src/SKP_Silk_encode_pulses.c b/libs/silk/src/SKP_Silk_encode_pulses.c deleted file mode 100644 index b76b805da0..0000000000 --- a/libs/silk/src/SKP_Silk_encode_pulses.c +++ /dev/null @@ -1,195 +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 quantization indices of excitation */ -/*********************************************/ - -SKP_INLINE SKP_int combine_and_check( /* return ok */ - SKP_int *pulses_comb, /* O */ - const SKP_int *pulses_in, /* I */ - SKP_int max_pulses, /* I max value for sum of pulses */ - SKP_int len /* I number of output values */ -) -{ - SKP_int k, sum; - - for( k = 0; k < len; k++ ) { - sum = pulses_in[ 2 * k ] + pulses_in[ 2 * k + 1 ]; - if( sum > max_pulses ) { - return 1; - } - pulses_comb[ k ] = sum; - } - - return 0; -} - -/* Encode quantization indices of excitation */ -void SKP_Silk_encode_pulses( - SKP_Silk_range_coder_state *psRC, /* I/O Range coder state */ - const SKP_int sigtype, /* I Sigtype */ - const SKP_int QuantOffsetType,/* I QuantOffsetType */ - const SKP_int8 q[], /* I quantization indices */ - const SKP_int frame_length /* I Frame length */ -) -{ - SKP_int i, k, j, iter, bit, nLS, scale_down, RateLevelIndex = 0; - SKP_int32 abs_q, minSumBits_Q6, sumBits_Q6; - SKP_int abs_pulses[ MAX_FRAME_LENGTH ]; - SKP_int sum_pulses[ MAX_NB_SHELL_BLOCKS ]; - SKP_int nRshifts[ MAX_NB_SHELL_BLOCKS ]; - SKP_int pulses_comb[ 8 ]; - SKP_int *abs_pulses_ptr; - const SKP_int8 *pulses_ptr; - const SKP_uint16 *cdf_ptr; - const SKP_int16 *nBits_ptr; - - SKP_memset( pulses_comb, 0, 8 * sizeof( SKP_int ) ); // Fixing Valgrind reported problem - - /****************************/ - /* Prepare for shell coding */ - /****************************/ - /* Calculate number of shell blocks */ - iter = frame_length / SHELL_CODEC_FRAME_LENGTH; - - /* Take the absolute value of the pulses */ - for( i = 0; i < frame_length; i+=4 ) { - abs_pulses[i+0] = ( SKP_int )SKP_abs( q[ i + 0 ] ); - abs_pulses[i+1] = ( SKP_int )SKP_abs( q[ i + 1 ] ); - abs_pulses[i+2] = ( SKP_int )SKP_abs( q[ i + 2 ] ); - abs_pulses[i+3] = ( SKP_int )SKP_abs( q[ i + 3 ] ); - } - - /* Calc sum pulses per shell code frame */ - abs_pulses_ptr = abs_pulses; - for( i = 0; i < iter; i++ ) { - nRshifts[ i ] = 0; - - while( 1 ) { - /* 1+1 -> 2 */ - scale_down = combine_and_check( pulses_comb, abs_pulses_ptr, SKP_Silk_max_pulses_table[ 0 ], 8 ); - - /* 2+2 -> 4 */ - scale_down += combine_and_check( pulses_comb, pulses_comb, SKP_Silk_max_pulses_table[ 1 ], 4 ); - - /* 4+4 -> 8 */ - scale_down += combine_and_check( pulses_comb, pulses_comb, SKP_Silk_max_pulses_table[ 2 ], 2 ); - - /* 8+8 -> 16 */ - sum_pulses[ i ] = pulses_comb[ 0 ] + pulses_comb[ 1 ]; - if( sum_pulses[ i ] > SKP_Silk_max_pulses_table[ 3 ] ) { - scale_down++; - } - - if( scale_down ) { - /* We need to down scale the quantization signal */ - nRshifts[ i ]++; - for( k = 0; k < SHELL_CODEC_FRAME_LENGTH; k++ ) { - abs_pulses_ptr[ k ] = SKP_RSHIFT( abs_pulses_ptr[ k ], 1 ); - } - } else { - /* Jump out of while(1) loop and go to next shell coding frame */ - break; - } - } - abs_pulses_ptr += SHELL_CODEC_FRAME_LENGTH; - } - - /**************/ - /* Rate level */ - /**************/ - /* find rate level that leads to fewest bits for coding of pulses per block info */ - minSumBits_Q6 = SKP_int32_MAX; - for( k = 0; k < N_RATE_LEVELS - 1; k++ ) { - nBits_ptr = SKP_Silk_pulses_per_block_BITS_Q6[ k ]; - sumBits_Q6 = SKP_Silk_rate_levels_BITS_Q6[sigtype][ k ]; - for( i = 0; i < iter; i++ ) { - if( nRshifts[ i ] > 0 ) { - sumBits_Q6 += nBits_ptr[ MAX_PULSES + 1 ]; - } else { - sumBits_Q6 += nBits_ptr[ sum_pulses[ i ] ]; - } - } - if( sumBits_Q6 < minSumBits_Q6 ) { - minSumBits_Q6 = sumBits_Q6; - RateLevelIndex = k; - } - } - SKP_Silk_range_encoder( psRC, RateLevelIndex, SKP_Silk_rate_levels_CDF[ sigtype ] ); - - /***************************************************/ - /* Sum-Weighted-Pulses Encoding */ - /***************************************************/ - cdf_ptr = SKP_Silk_pulses_per_block_CDF[ RateLevelIndex ]; - for( i = 0; i < iter; i++ ) { - if( nRshifts[ i ] == 0 ) { - SKP_Silk_range_encoder( psRC, sum_pulses[ i ], cdf_ptr ); - } else { - SKP_Silk_range_encoder( psRC, MAX_PULSES + 1, cdf_ptr ); - for( k = 0; k < nRshifts[ i ] - 1; k++ ) { - SKP_Silk_range_encoder( psRC, MAX_PULSES + 1, SKP_Silk_pulses_per_block_CDF[ N_RATE_LEVELS - 1 ] ); - } - SKP_Silk_range_encoder( psRC, sum_pulses[ i ], SKP_Silk_pulses_per_block_CDF[ N_RATE_LEVELS - 1 ] ); - } - } - - /******************/ - /* Shell Encoding */ - /******************/ - for( i = 0; i < iter; i++ ) { - if( sum_pulses[ i ] > 0 ) { - SKP_Silk_shell_encoder( psRC, &abs_pulses[ i * SHELL_CODEC_FRAME_LENGTH ] ); - } - } - - /****************/ - /* LSB Encoding */ - /****************/ - for( i = 0; i < iter; i++ ) { - if( nRshifts[ i ] > 0 ) { - pulses_ptr = &q[ i * SHELL_CODEC_FRAME_LENGTH ]; - nLS = nRshifts[ i ] - 1; - for( k = 0; k < SHELL_CODEC_FRAME_LENGTH; k++ ) { - abs_q = (SKP_int8)SKP_abs( pulses_ptr[ k ] ); - for( j = nLS; j > 0; j-- ) { - bit = SKP_RSHIFT( abs_q, j ) & 1; - SKP_Silk_range_encoder( psRC, bit, SKP_Silk_lsb_CDF ); - } - bit = abs_q & 1; - SKP_Silk_range_encoder( psRC, bit, SKP_Silk_lsb_CDF ); - } - } - } - - /****************/ - /* Encode signs */ - /****************/ - SKP_Silk_encode_signs( psRC, q, frame_length, sigtype, QuantOffsetType, RateLevelIndex ); -} diff --git a/libs/silk/src/SKP_Silk_find_LPC_FIX.c b/libs/silk/src/SKP_Silk_find_LPC_FIX.c deleted file mode 100644 index 8df126e05c..0000000000 --- a/libs/silk/src/SKP_Silk_find_LPC_FIX.c +++ /dev/null @@ -1,151 +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_FIX.h" -#include "SKP_Silk_tuning_parameters.h" - -/* Finds LPC vector from correlations, and converts to NLSF */ -void SKP_Silk_find_LPC_FIX( - SKP_int NLSF_Q15[], /* O NLSFs */ - SKP_int *interpIndex, /* O NLSF interpolation index, only used for NLSF interpolation */ - const SKP_int prev_NLSFq_Q15[], /* I previous NLSFs, only used for NLSF interpolation */ - const SKP_int useInterpolatedNLSFs, /* I Flag */ - const SKP_int LPC_order, /* I LPC order */ - const SKP_int16 x[], /* I Input signal */ - const SKP_int subfr_length /* I Input signal subframe length including preceeding samples */ -) -{ - SKP_int k; - SKP_int32 a_Q16[ MAX_LPC_ORDER ]; - SKP_int isInterpLower, shift; - SKP_int16 S[ MAX_LPC_ORDER ]; - SKP_int32 res_nrg0, res_nrg1; - SKP_int rshift0, rshift1; - - /* Used only for LSF interpolation */ - SKP_int32 a_tmp_Q16[ MAX_LPC_ORDER ], res_nrg_interp, res_nrg, res_tmp_nrg, res_nrg_2nd; - SKP_int res_nrg_interp_Q, res_nrg_Q, res_tmp_nrg_Q, res_nrg_2nd_Q; - SKP_int16 a_tmp_Q12[ MAX_LPC_ORDER ]; - SKP_int NLSF0_Q15[ MAX_LPC_ORDER ]; - SKP_int16 LPC_res[ ( MAX_FRAME_LENGTH + NB_SUBFR * MAX_LPC_ORDER ) / 2 ]; - - /* Default: no interpolation */ - *interpIndex = 4; - - /* Burg AR analysis for the full frame */ - SKP_Silk_burg_modified( &res_nrg, &res_nrg_Q, a_Q16, x, subfr_length, NB_SUBFR, SKP_FIX_CONST( FIND_LPC_COND_FAC, 32 ), LPC_order ); - - SKP_Silk_bwexpander_32( a_Q16, LPC_order, SKP_FIX_CONST( FIND_LPC_CHIRP, 16 ) ); - - if( useInterpolatedNLSFs == 1 ) { - - /* Optimal solution for last 10 ms */ - SKP_Silk_burg_modified( &res_tmp_nrg, &res_tmp_nrg_Q, a_tmp_Q16, x + ( NB_SUBFR >> 1 ) * subfr_length, - subfr_length, ( NB_SUBFR >> 1 ), SKP_FIX_CONST( FIND_LPC_COND_FAC, 32 ), LPC_order ); - - SKP_Silk_bwexpander_32( a_tmp_Q16, LPC_order, SKP_FIX_CONST( FIND_LPC_CHIRP, 16 ) ); - - /* subtract residual energy here, as that's easier than adding it to the */ - /* residual energy of the first 10 ms in each iteration of the search below */ - shift = res_tmp_nrg_Q - res_nrg_Q; - if( shift >= 0 ) { - if( shift < 32 ) { - res_nrg = res_nrg - SKP_RSHIFT( res_tmp_nrg, shift ); - } - } else { - SKP_assert( shift > -32 ); - res_nrg = SKP_RSHIFT( res_nrg, -shift ) - res_tmp_nrg; - res_nrg_Q = res_tmp_nrg_Q; - } - - /* Convert to NLSFs */ - SKP_Silk_A2NLSF( NLSF_Q15, a_tmp_Q16, LPC_order ); - - /* Search over interpolation indices to find the one with lowest residual energy */ - res_nrg_2nd = SKP_int32_MAX; - for( k = 3; k >= 0; k-- ) { - /* Interpolate NLSFs for first half */ - SKP_Silk_interpolate( NLSF0_Q15, prev_NLSFq_Q15, NLSF_Q15, k, LPC_order ); - - /* Convert to LPC for residual energy evaluation */ - SKP_Silk_NLSF2A_stable( a_tmp_Q12, NLSF0_Q15, LPC_order ); - - /* Calculate residual energy with NLSF interpolation */ - SKP_memset( S, 0, LPC_order * sizeof( SKP_int16 ) ); - SKP_Silk_LPC_analysis_filter( x, a_tmp_Q12, S, LPC_res, 2 * subfr_length, LPC_order ); - - SKP_Silk_sum_sqr_shift( &res_nrg0, &rshift0, LPC_res + LPC_order, subfr_length - LPC_order ); - SKP_Silk_sum_sqr_shift( &res_nrg1, &rshift1, LPC_res + LPC_order + subfr_length, subfr_length - LPC_order ); - - /* Add subframe energies from first half frame */ - shift = rshift0 - rshift1; - if( shift >= 0 ) { - res_nrg1 = SKP_RSHIFT( res_nrg1, shift ); - res_nrg_interp_Q = -rshift0; - } else { - res_nrg0 = SKP_RSHIFT( res_nrg0, -shift ); - res_nrg_interp_Q = -rshift1; - } - res_nrg_interp = SKP_ADD32( res_nrg0, res_nrg1 ); - - /* Compare with first half energy without NLSF interpolation, or best interpolated value so far */ - shift = res_nrg_interp_Q - res_nrg_Q; - if( shift >= 0 ) { - if( SKP_RSHIFT( res_nrg_interp, shift ) < res_nrg ) { - isInterpLower = SKP_TRUE; - } else { - isInterpLower = SKP_FALSE; - } - } else { - if( -shift < 32 ) { - if( res_nrg_interp < SKP_RSHIFT( res_nrg, -shift ) ) { - isInterpLower = SKP_TRUE; - } else { - isInterpLower = SKP_FALSE; - } - } else { - isInterpLower = SKP_FALSE; - } - } - - /* Determine whether current interpolated NLSFs are best so far */ - if( isInterpLower == SKP_TRUE ) { - /* Interpolation has lower residual energy */ - res_nrg = res_nrg_interp; - res_nrg_Q = res_nrg_interp_Q; - *interpIndex = k; - } - res_nrg_2nd = res_nrg_interp; - res_nrg_2nd_Q = res_nrg_interp_Q; - } - } - - if( *interpIndex == 4 ) { - /* NLSF interpolation is currently inactive, calculate NLSFs from full frame AR coefficients */ - SKP_Silk_A2NLSF( NLSF_Q15, a_Q16, LPC_order ); - } -} diff --git a/libs/silk/src/SKP_Silk_find_LTP_FIX.c b/libs/silk/src/SKP_Silk_find_LTP_FIX.c deleted file mode 100644 index 366b655847..0000000000 --- a/libs/silk/src/SKP_Silk_find_LTP_FIX.c +++ /dev/null @@ -1,243 +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_FIX.h" -#include "SKP_Silk_tuning_parameters.h" - -/* Head room for correlations */ -#define LTP_CORRS_HEAD_ROOM 2 - -void SKP_Silk_fit_LTP( - SKP_int32 LTP_coefs_Q16[ LTP_ORDER ], - SKP_int16 LTP_coefs_Q14[ LTP_ORDER ] -); - -void SKP_Silk_find_LTP_FIX( - SKP_int16 b_Q14[ NB_SUBFR * LTP_ORDER ], /* O LTP coefs */ - SKP_int32 WLTP[ NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Weight for LTP quantization */ - SKP_int *LTPredCodGain_Q7, /* O LTP coding gain */ - const SKP_int16 r_first[], /* I residual signal after LPC signal + state for first 10 ms */ - const SKP_int16 r_last[], /* I residual signal after LPC signal + state for last 10 ms */ - const SKP_int lag[ NB_SUBFR ], /* I LTP lags */ - const SKP_int32 Wght_Q15[ NB_SUBFR ], /* I weights */ - const SKP_int subfr_length, /* I subframe length */ - const SKP_int mem_offset, /* I number of samples in LTP memory */ - SKP_int corr_rshifts[ NB_SUBFR ] /* O right shifts applied to correlations */ -) -{ - SKP_int i, k, lshift; - const SKP_int16 *r_ptr, *lag_ptr; - SKP_int16 *b_Q14_ptr; - - SKP_int32 regu; - SKP_int32 *WLTP_ptr; - SKP_int32 b_Q16[ LTP_ORDER ], delta_b_Q14[ LTP_ORDER ], d_Q14[ NB_SUBFR ], nrg[ NB_SUBFR ], g_Q26; - SKP_int32 w[ NB_SUBFR ], WLTP_max, max_abs_d_Q14, max_w_bits; - - SKP_int32 temp32, denom32; - SKP_int extra_shifts; - SKP_int rr_shifts, maxRshifts, maxRshifts_wxtra, LZs; - SKP_int32 LPC_res_nrg, LPC_LTP_res_nrg, div_Q16; - SKP_int32 Rr[ LTP_ORDER ], rr[ NB_SUBFR ]; - SKP_int32 wd, m_Q12; - - b_Q14_ptr = b_Q14; - WLTP_ptr = WLTP; - r_ptr = &r_first[ mem_offset ]; - for( k = 0; k < NB_SUBFR; k++ ) { - if( k == ( NB_SUBFR >> 1 ) ) { /* shift residual for last 10 ms */ - r_ptr = &r_last[ mem_offset ]; - } - lag_ptr = r_ptr - ( lag[ k ] + LTP_ORDER / 2 ); - - SKP_Silk_sum_sqr_shift( &rr[ k ], &rr_shifts, r_ptr, subfr_length ); /* rr[ k ] in Q( -rr_shifts ) */ - - /* Assure headroom */ - LZs = SKP_Silk_CLZ32( rr[k] ); - if( LZs < LTP_CORRS_HEAD_ROOM ) { - rr[ k ] = SKP_RSHIFT_ROUND( rr[ k ], LTP_CORRS_HEAD_ROOM - LZs ); - rr_shifts += ( LTP_CORRS_HEAD_ROOM - LZs ); - } - corr_rshifts[ k ] = rr_shifts; - SKP_Silk_corrMatrix_FIX( lag_ptr, subfr_length, LTP_ORDER, LTP_CORRS_HEAD_ROOM, WLTP_ptr, &corr_rshifts[ k ] ); /* WLTP_fix_ptr in Q( -corr_rshifts[ k ] ) */ - - /* The correlation vector always has lower max abs value than rr and/or RR so head room is assured */ - SKP_Silk_corrVector_FIX( lag_ptr, r_ptr, subfr_length, LTP_ORDER, Rr, corr_rshifts[ k ] ); /* Rr_fix_ptr in Q( -corr_rshifts[ k ] ) */ - if( corr_rshifts[ k ] > rr_shifts ) { - rr[ k ] = SKP_RSHIFT( rr[ k ], corr_rshifts[ k ] - rr_shifts ); /* rr[ k ] in Q( -corr_rshifts[ k ] ) */ - } - SKP_assert( rr[ k ] >= 0 ); - - regu = 1; - regu = SKP_SMLAWB( regu, rr[ k ], SKP_FIX_CONST( LTP_DAMPING/3, 16 ) ); - regu = SKP_SMLAWB( regu, matrix_ptr( WLTP_ptr, 0, 0, LTP_ORDER ), SKP_FIX_CONST( LTP_DAMPING/3, 16 ) ); - regu = SKP_SMLAWB( regu, matrix_ptr( WLTP_ptr, LTP_ORDER-1, LTP_ORDER-1, LTP_ORDER ), SKP_FIX_CONST( LTP_DAMPING/3, 16 ) ); - SKP_Silk_regularize_correlations_FIX( WLTP_ptr, &rr[k], regu, LTP_ORDER ); - - SKP_Silk_solve_LDL_FIX( WLTP_ptr, LTP_ORDER, Rr, b_Q16 ); /* WLTP_fix_ptr and Rr_fix_ptr both in Q(-corr_rshifts[k]) */ - - /* Limit and store in Q14 */ - SKP_Silk_fit_LTP( b_Q16, b_Q14_ptr ); - - /* Calculate residual energy */ - nrg[ k ] = SKP_Silk_residual_energy16_covar_FIX( b_Q14_ptr, WLTP_ptr, Rr, rr[ k ], LTP_ORDER, 14 ); /* nrg_fix in Q( -corr_rshifts[ k ] ) */ - - /* temp = Wght[ k ] / ( nrg[ k ] * Wght[ k ] + 0.01f * subfr_length ); */ - extra_shifts = SKP_min_int( corr_rshifts[ k ], LTP_CORRS_HEAD_ROOM ); - denom32 = SKP_LSHIFT_SAT32( SKP_SMULWB( nrg[ k ], Wght_Q15[ k ] ), 1 + extra_shifts ) + /* Q( -corr_rshifts[ k ] + extra_shifts ) */ - SKP_RSHIFT( SKP_SMULWB( subfr_length, 655 ), corr_rshifts[ k ] - extra_shifts ); /* Q( -corr_rshifts[ k ] + extra_shifts ) */ - denom32 = SKP_max( denom32, 1 ); - SKP_assert( ((SKP_int64)Wght_Q15[ k ] << 16 ) < SKP_int32_MAX ); /* Wght always < 0.5 in Q0 */ - temp32 = SKP_DIV32( SKP_LSHIFT( ( SKP_int32 )Wght_Q15[ k ], 16 ), denom32 ); /* Q( 15 + 16 + corr_rshifts[k] - extra_shifts ) */ - temp32 = SKP_RSHIFT( temp32, 31 + corr_rshifts[ k ] - extra_shifts - 26 ); /* Q26 */ - - /* Limit temp such that the below scaling never wraps around */ - WLTP_max = 0; - for( i = 0; i < LTP_ORDER * LTP_ORDER; i++ ) { - WLTP_max = SKP_max( WLTP_ptr[ i ], WLTP_max ); - } - lshift = SKP_Silk_CLZ32( WLTP_max ) - 1 - 3; /* keep 3 bits free for vq_nearest_neighbor_fix */ - SKP_assert( 26 - 18 + lshift >= 0 ); - if( 26 - 18 + lshift < 31 ) { - temp32 = SKP_min_32( temp32, SKP_LSHIFT( ( SKP_int32 )1, 26 - 18 + lshift ) ); - } - - SKP_Silk_scale_vector32_Q26_lshift_18( WLTP_ptr, temp32, LTP_ORDER * LTP_ORDER ); /* WLTP_ptr in Q( 18 - corr_rshifts[ k ] ) */ - - w[ k ] = matrix_ptr( WLTP_ptr, ( LTP_ORDER >> 1 ), ( LTP_ORDER >> 1 ), LTP_ORDER ); /* w in Q( 18 - corr_rshifts[ k ] ) */ - SKP_assert( w[k] >= 0 ); - - r_ptr += subfr_length; - b_Q14_ptr += LTP_ORDER; - WLTP_ptr += LTP_ORDER * LTP_ORDER; - } - - maxRshifts = 0; - for( k = 0; k < NB_SUBFR; k++ ) { - maxRshifts = SKP_max_int( corr_rshifts[ k ], maxRshifts ); - } - - /* Compute LTP coding gain */ - if( LTPredCodGain_Q7 != NULL ) { - LPC_LTP_res_nrg = 0; - LPC_res_nrg = 0; - SKP_assert( LTP_CORRS_HEAD_ROOM >= 2 ); /* Check that no overflow will happen when adding */ - for( k = 0; k < NB_SUBFR; k++ ) { - LPC_res_nrg = SKP_ADD32( LPC_res_nrg, SKP_RSHIFT( SKP_ADD32( SKP_SMULWB( rr[ k ], Wght_Q15[ k ] ), 1 ), 1 + ( maxRshifts - corr_rshifts[ k ] ) ) ); /* Q( -maxRshifts ) */ - LPC_LTP_res_nrg = SKP_ADD32( LPC_LTP_res_nrg, SKP_RSHIFT( SKP_ADD32( SKP_SMULWB( nrg[ k ], Wght_Q15[ k ] ), 1 ), 1 + ( maxRshifts - corr_rshifts[ k ] ) ) ); /* Q( -maxRshifts ) */ - } - LPC_LTP_res_nrg = SKP_max( LPC_LTP_res_nrg, 1 ); /* avoid division by zero */ - - div_Q16 = SKP_DIV32_varQ( LPC_res_nrg, LPC_LTP_res_nrg, 16 ); - *LTPredCodGain_Q7 = ( SKP_int )SKP_SMULBB( 3, SKP_Silk_lin2log( div_Q16 ) - ( 16 << 7 ) ); - - SKP_assert( *LTPredCodGain_Q7 == ( SKP_int )SKP_SAT16( SKP_MUL( 3, SKP_Silk_lin2log( div_Q16 ) - ( 16 << 7 ) ) ) ); - } - - /* smoothing */ - /* d = sum( B, 1 ); */ - b_Q14_ptr = b_Q14; - for( k = 0; k < NB_SUBFR; k++ ) { - d_Q14[ k ] = 0; - for( i = 0; i < LTP_ORDER; i++ ) { - d_Q14[ k ] += b_Q14_ptr[ i ]; - } - b_Q14_ptr += LTP_ORDER; - } - - /* m = ( w * d' ) / ( sum( w ) + 1e-3 ); */ - - /* Find maximum absolute value of d_Q14 and the bits used by w in Q0 */ - max_abs_d_Q14 = 0; - max_w_bits = 0; - for( k = 0; k < NB_SUBFR; k++ ) { - max_abs_d_Q14 = SKP_max_32( max_abs_d_Q14, SKP_abs( d_Q14[ k ] ) ); - /* w[ k ] is in Q( 18 - corr_rshifts[ k ] ) */ - /* Find bits needed in Q( 18 - maxRshifts ) */ - max_w_bits = SKP_max_32( max_w_bits, 32 - SKP_Silk_CLZ32( w[ k ] ) + corr_rshifts[ k ] - maxRshifts ); - } - - /* max_abs_d_Q14 = (5 << 15); worst case, i.e. LTP_ORDER * -SKP_int16_MIN */ - SKP_assert( max_abs_d_Q14 <= ( 5 << 15 ) ); - - /* How many bits is needed for w*d' in Q( 18 - maxRshifts ) in the worst case, of all d_Q14's being equal to max_abs_d_Q14 */ - extra_shifts = max_w_bits + 32 - SKP_Silk_CLZ32( max_abs_d_Q14 ) - 14; - - /* Subtract what we got available; bits in output var plus maxRshifts */ - extra_shifts -= ( 32 - 1 - 2 + maxRshifts ); /* Keep sign bit free as well as 2 bits for accumulation */ - extra_shifts = SKP_max_int( extra_shifts, 0 ); - - maxRshifts_wxtra = maxRshifts + extra_shifts; - - temp32 = SKP_RSHIFT( 262, maxRshifts + extra_shifts ) + 1; /* 1e-3f in Q( 18 - (maxRshifts + extra_shifts) ) */ - wd = 0; - for( k = 0; k < NB_SUBFR; k++ ) { - /* w has at least 2 bits of headroom so no overflow should happen */ - temp32 = SKP_ADD32( temp32, SKP_RSHIFT( w[ k ], maxRshifts_wxtra - corr_rshifts[ k ] ) ); /* Q( 18 - maxRshifts_wxtra ) */ - wd = SKP_ADD32( wd, SKP_LSHIFT( SKP_SMULWW( SKP_RSHIFT( w[ k ], maxRshifts_wxtra - corr_rshifts[ k ] ), d_Q14[ k ] ), 2 ) ); /* Q( 18 - maxRshifts_wxtra ) */ - } - m_Q12 = SKP_DIV32_varQ( wd, temp32, 12 ); - - b_Q14_ptr = b_Q14; - for( k = 0; k < NB_SUBFR; k++ ) { - /* w_fix[ k ] from Q( 18 - corr_rshifts[ k ] ) to Q( 16 ) */ - if( 2 - corr_rshifts[k] > 0 ) { - temp32 = SKP_RSHIFT( w[ k ], 2 - corr_rshifts[ k ] ); - } else { - temp32 = SKP_LSHIFT_SAT32( w[ k ], corr_rshifts[ k ] - 2 ); - } - - g_Q26 = SKP_MUL( - SKP_DIV32( - SKP_FIX_CONST( LTP_SMOOTHING, 26 ), - SKP_RSHIFT( SKP_FIX_CONST( LTP_SMOOTHING, 26 ), 10 ) + temp32 ), /* Q10 */ - SKP_LSHIFT_SAT32( SKP_SUB_SAT32( ( SKP_int32 )m_Q12, SKP_RSHIFT( d_Q14[ k ], 2 ) ), 4 ) ); /* Q16 */ - - temp32 = 0; - for( i = 0; i < LTP_ORDER; i++ ) { - delta_b_Q14[ i ] = SKP_max_16( b_Q14_ptr[ i ], 1638 ); /* 1638_Q14 = 0.1_Q0 */ - temp32 += delta_b_Q14[ i ]; /* Q14 */ - } - temp32 = SKP_DIV32( g_Q26, temp32 ); /* Q14->Q12 */ - for( i = 0; i < LTP_ORDER; i++ ) { - b_Q14_ptr[ i ] = SKP_LIMIT_32( ( SKP_int32 )b_Q14_ptr[ i ] + SKP_SMULWB( SKP_LSHIFT_SAT32( temp32, 4 ), delta_b_Q14[ i ] ), -16000, 28000 ); - } - b_Q14_ptr += LTP_ORDER; - } -} - -void SKP_Silk_fit_LTP( - SKP_int32 LTP_coefs_Q16[ LTP_ORDER ], - SKP_int16 LTP_coefs_Q14[ LTP_ORDER ] -) -{ - SKP_int i; - - for( i = 0; i < LTP_ORDER; i++ ) { - LTP_coefs_Q14[ i ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND( LTP_coefs_Q16[ i ], 2 ) ); - } -} diff --git a/libs/silk/src/SKP_Silk_find_pitch_lags_FIX.c b/libs/silk/src/SKP_Silk_find_pitch_lags_FIX.c deleted file mode 100644 index 810cd5355c..0000000000 --- a/libs/silk/src/SKP_Silk_find_pitch_lags_FIX.c +++ /dev/null @@ -1,125 +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_FIX.h" -#include "SKP_Silk_tuning_parameters.h" - -/* Find pitch lags */ -void SKP_Silk_find_pitch_lags_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O encoder state */ - SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */ - SKP_int16 res[], /* O residual */ - const SKP_int16 x[] /* I Speech signal */ -) -{ - SKP_Silk_predict_state_FIX *psPredSt = &psEnc->sPred; - SKP_int buf_len, i, scale; - SKP_int32 thrhld_Q15, res_nrg; - const SKP_int16 *x_buf, *x_buf_ptr; - SKP_int16 Wsig[ FIND_PITCH_LPC_WIN_MAX ], *Wsig_ptr; - SKP_int32 auto_corr[ MAX_FIND_PITCH_LPC_ORDER + 1 ]; - SKP_int16 rc_Q15[ MAX_FIND_PITCH_LPC_ORDER ]; - SKP_int32 A_Q24[ MAX_FIND_PITCH_LPC_ORDER ]; - SKP_int32 FiltState[ MAX_FIND_PITCH_LPC_ORDER ]; - SKP_int16 A_Q12[ MAX_FIND_PITCH_LPC_ORDER ]; - - /******************************************/ - /* Setup buffer lengths etc based on Fs */ - /******************************************/ - buf_len = SKP_ADD_LSHIFT( psEnc->sCmn.la_pitch, psEnc->sCmn.frame_length, 1 ); - - /* Safty check */ - SKP_assert( buf_len >= psPredSt->pitch_LPC_win_length ); - - x_buf = x - psEnc->sCmn.frame_length; - - /*************************************/ - /* Estimate LPC AR coefficients */ - /*************************************/ - - /* Calculate windowed signal */ - - /* First LA_LTP samples */ - x_buf_ptr = x_buf + buf_len - psPredSt->pitch_LPC_win_length; - Wsig_ptr = Wsig; - SKP_Silk_apply_sine_window_new( Wsig_ptr, x_buf_ptr, 1, psEnc->sCmn.la_pitch ); - - /* Middle un - windowed samples */ - Wsig_ptr += psEnc->sCmn.la_pitch; - x_buf_ptr += psEnc->sCmn.la_pitch; - SKP_memcpy( Wsig_ptr, x_buf_ptr, ( psPredSt->pitch_LPC_win_length - SKP_LSHIFT( psEnc->sCmn.la_pitch, 1 ) ) * sizeof( SKP_int16 ) ); - - /* Last LA_LTP samples */ - Wsig_ptr += psPredSt->pitch_LPC_win_length - SKP_LSHIFT( psEnc->sCmn.la_pitch, 1 ); - x_buf_ptr += psPredSt->pitch_LPC_win_length - SKP_LSHIFT( psEnc->sCmn.la_pitch, 1 ); - SKP_Silk_apply_sine_window_new( Wsig_ptr, x_buf_ptr, 2, psEnc->sCmn.la_pitch ); - - /* Calculate autocorrelation sequence */ - SKP_Silk_autocorr( auto_corr, &scale, Wsig, psPredSt->pitch_LPC_win_length, psEnc->sCmn.pitchEstimationLPCOrder + 1 ); - - /* Add white noise, as fraction of energy */ - auto_corr[ 0 ] = SKP_SMLAWB( auto_corr[ 0 ], auto_corr[ 0 ], SKP_FIX_CONST( FIND_PITCH_WHITE_NOISE_FRACTION, 16 ) ); - - /* Calculate the reflection coefficients using schur */ - res_nrg = SKP_Silk_schur( rc_Q15, auto_corr, psEnc->sCmn.pitchEstimationLPCOrder ); - - /* Prediction gain */ - psEncCtrl->predGain_Q16 = SKP_DIV32_varQ( auto_corr[ 0 ], SKP_max_int( res_nrg, 1 ), 16 ); - - /* Convert reflection coefficients to prediction coefficients */ - SKP_Silk_k2a( A_Q24, rc_Q15, psEnc->sCmn.pitchEstimationLPCOrder ); - - /* Convert From 32 bit Q24 to 16 bit Q12 coefs */ - for( i = 0; i < psEnc->sCmn.pitchEstimationLPCOrder; i++ ) { - A_Q12[ i ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT( A_Q24[ i ], 12 ) ); - } - - /* Do BWE */ - SKP_Silk_bwexpander( A_Q12, psEnc->sCmn.pitchEstimationLPCOrder, SKP_FIX_CONST( FIND_PITCH_BANDWITH_EXPANSION, 16 ) ); - - /*****************************************/ - /* LPC analysis filtering */ - /*****************************************/ - SKP_memset( FiltState, 0, psEnc->sCmn.pitchEstimationLPCOrder * sizeof( SKP_int32 ) ); /* Not really necessary, but Valgrind will complain otherwise */ - SKP_Silk_MA_Prediction( x_buf, A_Q12, FiltState, res, buf_len, psEnc->sCmn.pitchEstimationLPCOrder ); - SKP_memset( res, 0, psEnc->sCmn.pitchEstimationLPCOrder * sizeof( SKP_int16 ) ); - - /* Threshold for pitch estimator */ - thrhld_Q15 = SKP_FIX_CONST( 0.45, 15 ); - thrhld_Q15 = SKP_SMLABB( thrhld_Q15, SKP_FIX_CONST( -0.004, 15 ), psEnc->sCmn.pitchEstimationLPCOrder ); - thrhld_Q15 = SKP_SMLABB( thrhld_Q15, SKP_FIX_CONST( -0.1, 7 ), psEnc->speech_activity_Q8 ); - thrhld_Q15 = SKP_SMLABB( thrhld_Q15, SKP_FIX_CONST( 0.15, 15 ), psEnc->sCmn.prev_sigtype ); - thrhld_Q15 = SKP_SMLAWB( thrhld_Q15, SKP_FIX_CONST( -0.1, 16 ), psEncCtrl->input_tilt_Q15 ); - thrhld_Q15 = SKP_SAT16( thrhld_Q15 ); - - /*****************************************/ - /* Call pitch estimator */ - /*****************************************/ - psEncCtrl->sCmn.sigtype = SKP_Silk_pitch_analysis_core( res, psEncCtrl->sCmn.pitchL, &psEncCtrl->sCmn.lagIndex, - &psEncCtrl->sCmn.contourIndex, &psEnc->LTPCorr_Q15, psEnc->sCmn.prevLag, psEnc->sCmn.pitchEstimationThreshold_Q16, - ( SKP_int16 )thrhld_Q15, psEnc->sCmn.fs_kHz, psEnc->sCmn.pitchEstimationComplexity, SKP_FALSE ); -} diff --git a/libs/silk/src/SKP_Silk_find_pred_coefs_FIX.c b/libs/silk/src/SKP_Silk_find_pred_coefs_FIX.c deleted file mode 100644 index f076be86d4..0000000000 --- a/libs/silk/src/SKP_Silk_find_pred_coefs_FIX.c +++ /dev/null @@ -1,131 +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_FIX.h" - - -void SKP_Silk_find_pred_coefs_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O encoder state */ - SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */ - const SKP_int16 res_pitch[] /* I Residual from pitch analysis */ -) -{ - SKP_int i; - SKP_int32 WLTP[ NB_SUBFR * LTP_ORDER * LTP_ORDER ]; - SKP_int32 invGains_Q16[ NB_SUBFR ], local_gains[ NB_SUBFR ], Wght_Q15[ NB_SUBFR ]; - SKP_int NLSF_Q15[ MAX_LPC_ORDER ]; - const SKP_int16 *x_ptr; - SKP_int16 *x_pre_ptr, LPC_in_pre[ NB_SUBFR * MAX_LPC_ORDER + MAX_FRAME_LENGTH ]; - SKP_int32 tmp, min_gain_Q16; - SKP_int LTP_corrs_rshift[ NB_SUBFR ]; - - - /* weighting for weighted least squares */ - min_gain_Q16 = SKP_int32_MAX >> 6; - for( i = 0; i < NB_SUBFR; i++ ) { - min_gain_Q16 = SKP_min( min_gain_Q16, psEncCtrl->Gains_Q16[ i ] ); - } - for( i = 0; i < NB_SUBFR; i++ ) { - /* Divide to Q16 */ - SKP_assert( psEncCtrl->Gains_Q16[ i ] > 0 ); - /* Invert and normalize gains, and ensure that maximum invGains_Q16 is within range of a 16 bit int */ - invGains_Q16[ i ] = SKP_DIV32_varQ( min_gain_Q16, psEncCtrl->Gains_Q16[ i ], 16 - 2 ); - - /* Ensure Wght_Q15 a minimum value 1 */ - invGains_Q16[ i ] = SKP_max( invGains_Q16[ i ], 363 ); - - /* Square the inverted gains */ - SKP_assert( invGains_Q16[ i ] == SKP_SAT16( invGains_Q16[ i ] ) ); - tmp = SKP_SMULWB( invGains_Q16[ i ], invGains_Q16[ i ] ); - Wght_Q15[ i ] = SKP_RSHIFT( tmp, 1 ); - - /* Invert the inverted and normalized gains */ - local_gains[ i ] = SKP_DIV32( ( 1 << 16 ), invGains_Q16[ i ] ); - } - - if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) { - /**********/ - /* VOICED */ - /**********/ - SKP_assert( psEnc->sCmn.frame_length - psEnc->sCmn.predictLPCOrder >= psEncCtrl->sCmn.pitchL[ 0 ] + LTP_ORDER / 2 ); - - /* LTP analysis */ - SKP_Silk_find_LTP_FIX( psEncCtrl->LTPCoef_Q14, WLTP, &psEncCtrl->LTPredCodGain_Q7, res_pitch, - res_pitch + SKP_RSHIFT( psEnc->sCmn.frame_length, 1 ), psEncCtrl->sCmn.pitchL, Wght_Q15, - psEnc->sCmn.subfr_length, psEnc->sCmn.frame_length, LTP_corrs_rshift ); - - - /* Quantize LTP gain parameters */ - SKP_Silk_quant_LTP_gains_FIX( psEncCtrl->LTPCoef_Q14, psEncCtrl->sCmn.LTPIndex, &psEncCtrl->sCmn.PERIndex, - WLTP, psEnc->mu_LTP_Q8, psEnc->sCmn.LTPQuantLowComplexity ); - - /* Control LTP scaling */ - SKP_Silk_LTP_scale_ctrl_FIX( psEnc, psEncCtrl ); - - /* Create LTP residual */ - SKP_Silk_LTP_analysis_filter_FIX( LPC_in_pre, psEnc->x_buf + psEnc->sCmn.frame_length - psEnc->sCmn.predictLPCOrder, - psEncCtrl->LTPCoef_Q14, psEncCtrl->sCmn.pitchL, invGains_Q16, psEnc->sCmn.subfr_length, psEnc->sCmn.predictLPCOrder ); - - } else { - /************/ - /* UNVOICED */ - /************/ - /* Create signal with prepended subframes, scaled by inverse gains */ - x_ptr = psEnc->x_buf + psEnc->sCmn.frame_length - psEnc->sCmn.predictLPCOrder; - x_pre_ptr = LPC_in_pre; - for( i = 0; i < NB_SUBFR; i++ ) { - SKP_Silk_scale_copy_vector16( x_pre_ptr, x_ptr, invGains_Q16[ i ], - psEnc->sCmn.subfr_length + psEnc->sCmn.predictLPCOrder ); - x_pre_ptr += psEnc->sCmn.subfr_length + psEnc->sCmn.predictLPCOrder; - x_ptr += psEnc->sCmn.subfr_length; - } - - SKP_memset( psEncCtrl->LTPCoef_Q14, 0, NB_SUBFR * LTP_ORDER * sizeof( SKP_int16 ) ); - psEncCtrl->LTPredCodGain_Q7 = 0; - } - - /* LPC_in_pre contains the LTP-filtered input for voiced, and the unfiltered input for unvoiced */ - TIC(FIND_LPC) - SKP_Silk_find_LPC_FIX( NLSF_Q15, &psEncCtrl->sCmn.NLSFInterpCoef_Q2, psEnc->sPred.prev_NLSFq_Q15, - psEnc->sCmn.useInterpolatedNLSFs * ( 1 - psEnc->sCmn.first_frame_after_reset ), psEnc->sCmn.predictLPCOrder, - LPC_in_pre, psEnc->sCmn.subfr_length + psEnc->sCmn.predictLPCOrder ); - TOC(FIND_LPC) - - - /* Quantize LSFs */ - TIC(PROCESS_LSFS) - SKP_Silk_process_NLSFs_FIX( psEnc, psEncCtrl, NLSF_Q15 ); - TOC(PROCESS_LSFS) - - /* Calculate residual energy using quantized LPC coefficients */ - SKP_Silk_residual_energy_FIX( psEncCtrl->ResNrg, psEncCtrl->ResNrgQ, LPC_in_pre, psEncCtrl->PredCoef_Q12, local_gains, - psEnc->sCmn.subfr_length, psEnc->sCmn.predictLPCOrder ); - - /* Copy to prediction struct for use in next frame for fluctuation reduction */ - SKP_memcpy( psEnc->sPred.prev_NLSFq_Q15, NLSF_Q15, psEnc->sCmn.predictLPCOrder * sizeof( SKP_int ) ); - -} diff --git a/libs/silk/src/SKP_Silk_gain_quant.c b/libs/silk/src/SKP_Silk_gain_quant.c deleted file mode 100644 index c9b032e888..0000000000 --- a/libs/silk/src/SKP_Silk_gain_quant.c +++ /dev/null @@ -1,94 +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" - -#define OFFSET ( ( MIN_QGAIN_DB * 128 ) / 6 + 16 * 128 ) -#define SCALE_Q16 ( ( 65536 * ( N_LEVELS_QGAIN - 1 ) ) / ( ( ( MAX_QGAIN_DB - MIN_QGAIN_DB ) * 128 ) / 6 ) ) -#define INV_SCALE_Q16 ( ( 65536 * ( ( ( MAX_QGAIN_DB - MIN_QGAIN_DB ) * 128 ) / 6 ) ) / ( N_LEVELS_QGAIN - 1 ) ) - -/* Gain scalar quantization with hysteresis, uniform on log scale */ -void SKP_Silk_gains_quant( - SKP_int ind[ NB_SUBFR ], /* O gain indices */ - SKP_int32 gain_Q16[ NB_SUBFR ], /* I/O gains (quantized out) */ - SKP_int *prev_ind, /* I/O last index in previous frame */ - const SKP_int conditional /* I first gain is delta coded if 1 */ -) -{ - SKP_int k; - - for( k = 0; k < NB_SUBFR; k++ ) { - /* Add half of previous quantization error, convert to log scale, scale, floor() */ - ind[ k ] = SKP_SMULWB( SCALE_Q16, SKP_Silk_lin2log( gain_Q16[ k ] ) - OFFSET ); - - /* Round towards previous quantized gain (hysteresis) */ - if( ind[ k ] < *prev_ind ) { - ind[ k ]++; - } - - /* Compute delta indices and limit */ - if( k == 0 && conditional == 0 ) { - /* Full index */ - ind[ k ] = SKP_LIMIT_int( ind[ k ], 0, N_LEVELS_QGAIN - 1 ); - ind[ k ] = SKP_max_int( ind[ k ], *prev_ind + MIN_DELTA_GAIN_QUANT ); - *prev_ind = ind[ k ]; - } else { - /* Delta index */ - ind[ k ] = SKP_LIMIT_int( ind[ k ] - *prev_ind, MIN_DELTA_GAIN_QUANT, MAX_DELTA_GAIN_QUANT ); - /* Accumulate deltas */ - *prev_ind += ind[ k ]; - /* Shift to make non-negative */ - ind[ k ] -= MIN_DELTA_GAIN_QUANT; - } - - /* Convert to linear scale and scale */ - gain_Q16[ k ] = SKP_Silk_log2lin( SKP_min_32( SKP_SMULWB( INV_SCALE_Q16, *prev_ind ) + OFFSET, 3967 ) ); /* 3967 = 31 in Q7 */ - } -} - -/* Gains scalar dequantization, uniform on log scale */ -void SKP_Silk_gains_dequant( - SKP_int32 gain_Q16[ NB_SUBFR ], /* O quantized gains */ - const SKP_int ind[ NB_SUBFR ], /* I gain indices */ - SKP_int *prev_ind, /* I/O last index in previous frame */ - const SKP_int conditional /* I first gain is delta coded if 1 */ -) -{ - SKP_int k; - - for( k = 0; k < NB_SUBFR; k++ ) { - if( k == 0 && conditional == 0 ) { - *prev_ind = ind[ k ]; - } else { - /* Delta index */ - *prev_ind += ind[ k ] + MIN_DELTA_GAIN_QUANT; - } - - /* Convert to linear scale and scale */ - gain_Q16[ k ] = SKP_Silk_log2lin( SKP_min_32( SKP_SMULWB( INV_SCALE_Q16, *prev_ind ) + OFFSET, 3967 ) ); /* 3967 = 31 in Q7 */ - } -} diff --git a/libs/silk/src/SKP_Silk_init_encoder_FIX.c b/libs/silk/src/SKP_Silk_init_encoder_FIX.c deleted file mode 100644 index 54874411a6..0000000000 --- a/libs/silk/src/SKP_Silk_init_encoder_FIX.c +++ /dev/null @@ -1,56 +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_FIX.h" - -/*********************************/ -/* Initialize 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 ret = 0; - /* Clear the entire encoder state */ - SKP_memset( psEnc, 0, sizeof( SKP_Silk_encoder_state_FIX ) ); - -#if HIGH_PASS_INPUT - psEnc->variable_HP_smth1_Q15 = 200844; /* = SKP_Silk_log2(70)_Q0; */ - psEnc->variable_HP_smth2_Q15 = 200844; /* = SKP_Silk_log2(70)_Q0; */ -#endif - - /* 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 ); - - /* Initialize NSQ */ - psEnc->sNSQ.prev_inv_gain_Q16 = 65536; - psEnc->sNSQ_LBRR.prev_inv_gain_Q16 = 65536; - - return( ret ); -} diff --git a/libs/silk/src/SKP_Silk_inner_prod_aligned.c b/libs/silk/src/SKP_Silk_inner_prod_aligned.c deleted file mode 100644 index 2d0efe13ec..0000000000 --- a/libs/silk/src/SKP_Silk_inner_prod_aligned.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_inner_prod_aligned.c * - * * - * * - * Copyright 2008-2010 (c), Skype Limited * - * Date: 080601 * - * */ -#include "SKP_Silk_SigProc_FIX.h" - -/* sum= for(i=0;i6, 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 */ -) -{ - SKP_int i; - SKP_int32 sum = 0; - for( i = 0; i < len; i++ ) { - sum = SKP_SMLABB( sum, inVec1[ i ], inVec2[ i ] ); - } - 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 */ -) -{ - SKP_int i; - SKP_int64 sum = 0; - for( i = 0; i < len; i++ ) { - sum = SKP_SMLALBB( sum, inVec1[ i ], inVec2[ i ] ); - } - return sum; -} diff --git a/libs/silk/src/SKP_Silk_interpolate.c b/libs/silk/src/SKP_Silk_interpolate.c deleted file mode 100644 index 38e00c8fd1..0000000000 --- a/libs/silk/src/SKP_Silk_interpolate.c +++ /dev/null @@ -1,47 +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" - -/* Interpolate two vectors */ -void SKP_Silk_interpolate( - SKP_int xi[ MAX_LPC_ORDER ], /* O interpolated vector */ - const SKP_int x0[ MAX_LPC_ORDER ], /* I first vector */ - const SKP_int x1[ MAX_LPC_ORDER ], /* I second vector */ - const SKP_int ifact_Q2, /* I interp. factor, weight on 2nd vector */ - const SKP_int d /* I number of parameters */ -) -{ - SKP_int i; - - SKP_assert( ifact_Q2 >= 0 ); - SKP_assert( ifact_Q2 <= ( 1 << 2 ) ); - - for( i = 0; i < d; i++ ) { - xi[ i ] = ( SKP_int )( ( SKP_int32 )x0[ i ] + SKP_RSHIFT( SKP_MUL( ( SKP_int32 )x1[ i ] - ( SKP_int32 )x0[ i ], ifact_Q2 ), 2 ) ); - } -} diff --git a/libs/silk/src/SKP_Silk_k2a.c b/libs/silk/src/SKP_Silk_k2a.c deleted file mode 100644 index e7b67b8316..0000000000 --- a/libs/silk/src/SKP_Silk_k2a.c +++ /dev/null @@ -1,58 +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_k2a.c * - * * - * Step up function, converts reflection coefficients to prediction * - * coefficients * - * * - * Copyright 2008 (c), Skype Limited * - * Date: 080103 * - * */ -#include "SKP_Silk_SigProc_FIX.h" - -/* Step up function, converts reflection coefficients to prediction coefficients */ -void SKP_Silk_k2a( - SKP_int32 *A_Q24, /* O: Prediction coefficients [order] Q24 */ - const SKP_int16 *rc_Q15, /* I: Reflection coefficients [order] Q15 */ - const SKP_int32 order /* I: Prediction order */ -) -{ - SKP_int k, n; - SKP_int32 Atmp[ SKP_Silk_MAX_ORDER_LPC ]; - - for( k = 0; k < order; k++ ) { - for( n = 0; n < k; n++ ) { - Atmp[ n ] = A_Q24[ n ]; - } - for( n = 0; n < k; n++ ) { - A_Q24[ n ] = SKP_SMLAWB( A_Q24[ n ], SKP_LSHIFT( Atmp[ k - n - 1 ], 1 ), rc_Q15[ k ] ); - } - A_Q24[ k ] = -SKP_LSHIFT( (SKP_int32)rc_Q15[ k ], 9 ); - } -} diff --git a/libs/silk/src/SKP_Silk_k2a_Q16.c b/libs/silk/src/SKP_Silk_k2a_Q16.c deleted file mode 100644 index 97dd2114ff..0000000000 --- a/libs/silk/src/SKP_Silk_k2a_Q16.c +++ /dev/null @@ -1,58 +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_k2a.c * - * * - * Step up function, converts reflection coefficients to prediction * - * coefficients * - * * - * Copyright 2008 (c), Skype Limited * - * Date: 080103 * - * */ -#include "SKP_Silk_SigProc_FIX.h" - -/* Step up function, converts reflection coefficients to prediction coefficients */ -void SKP_Silk_k2a_Q16( - SKP_int32 *A_Q24, /* O: Prediction coefficients [order] Q24 */ - const SKP_int32 *rc_Q16, /* I: Reflection coefficients [order] Q16 */ - const SKP_int32 order /* I: Prediction order */ -) -{ - SKP_int k, n; - SKP_int32 Atmp[ SKP_Silk_MAX_ORDER_LPC ]; - - for( k = 0; k < order; k++ ) { - for( n = 0; n < k; n++ ) { - Atmp[ n ] = A_Q24[ n ]; - } - for( n = 0; n < k; n++ ) { - A_Q24[ n ] = SKP_SMLAWW( A_Q24[ n ], Atmp[ k - n - 1 ], rc_Q16[ k ] ); - } - A_Q24[ k ] = -SKP_LSHIFT( rc_Q16[ k ], 8 ); - } -} diff --git a/libs/silk/src/SKP_Silk_lin2log.c b/libs/silk/src/SKP_Silk_lin2log.c deleted file mode 100644 index bf8ad0b96b..0000000000 --- a/libs/silk/src/SKP_Silk_lin2log.c +++ /dev/null @@ -1,48 +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_lin2log.c * - * * - * Convert input to a log scale * - * Approximation of 128 * log2() * - * * - * Copyright 2006 (c), Skype Limited * - * Date: 060221 * - * */ -#include "SKP_Silk_SigProc_FIX.h" -/* Approximation of 128 * log2() (very close inverse of approx 2^() below) */ -/* Convert input to a log scale */ -SKP_int32 SKP_Silk_lin2log( const SKP_int32 inLin ) /* I: Input in linear scale */ -{ - SKP_int32 lz, frac_Q7; - - SKP_Silk_CLZ_FRAC( inLin, &lz, &frac_Q7 ); - - /* Piece-wise parabolic approximation */ - return( SKP_LSHIFT( 31 - lz, 7 ) + SKP_SMLAWB( frac_Q7, SKP_MUL( frac_Q7, 128 - frac_Q7 ), 179 ) ); -} diff --git a/libs/silk/src/SKP_Silk_log2lin.c b/libs/silk/src/SKP_Silk_log2lin.c deleted file mode 100644 index 86a73ffec6..0000000000 --- a/libs/silk/src/SKP_Silk_log2lin.c +++ /dev/null @@ -1,58 +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_log2lin.c * - * * - * Convert input to a linear scale * - * * - * Copyright 2006 (c), Skype Limited * - * Date: 060221 * - * */ -#include "SKP_Silk_SigProc_FIX.h" - -/* Approximation of 2^() (very close inverse of SKP_Silk_lin2log()) */ -/* Convert input to a linear scale */ -SKP_int32 SKP_Silk_log2lin( const SKP_int32 inLog_Q7 ) /* I: Input on log scale */ -{ - SKP_int32 out, frac_Q7; - - if( inLog_Q7 < 0 ) { - return 0; - } - - out = SKP_LSHIFT( 1, SKP_RSHIFT( inLog_Q7, 7 ) ); - frac_Q7 = inLog_Q7 & 0x7F; - if( inLog_Q7 < 2048 ) { - /* Piece-wise parabolic approximation */ - out = SKP_ADD_RSHIFT( out, SKP_MUL( out, SKP_SMLAWB( frac_Q7, SKP_MUL( frac_Q7, 128 - frac_Q7 ), -174 ) ), 7 ); - } else { - /* Piece-wise parabolic approximation */ - out = SKP_MLA( out, SKP_RSHIFT( out, 7 ), SKP_SMLAWB( frac_Q7, SKP_MUL( frac_Q7, 128 - frac_Q7 ), -174 ) ); - } - return out; -} diff --git a/libs/silk/src/SKP_Silk_macros.h b/libs/silk/src/SKP_Silk_macros.h deleted file mode 100644 index 00311c548d..0000000000 --- a/libs/silk/src/SKP_Silk_macros.h +++ /dev/null @@ -1,121 +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_API_C_H_ -#define _SKP_SILK_API_C_H_ - -// This is an inline header file for general platform. - -// (a32 * (SKP_int32)((SKP_int16)(b32))) >> 16 output have to be 32bit int -#define SKP_SMULWB(a32, b32) ((((a32) >> 16) * (SKP_int32)((SKP_int16)(b32))) + ((((a32) & 0x0000FFFF) * (SKP_int32)((SKP_int16)(b32))) >> 16)) - -// a32 + (b32 * (SKP_int32)((SKP_int16)(c32))) >> 16 output have to be 32bit int -#define SKP_SMLAWB(a32, b32, c32) ((a32) + ((((b32) >> 16) * (SKP_int32)((SKP_int16)(c32))) + ((((b32) & 0x0000FFFF) * (SKP_int32)((SKP_int16)(c32))) >> 16))) - -// (a32 * (b32 >> 16)) >> 16 -#define SKP_SMULWT(a32, b32) (((a32) >> 16) * ((b32) >> 16) + ((((a32) & 0x0000FFFF) * ((b32) >> 16)) >> 16)) - -// a32 + (b32 * (c32 >> 16)) >> 16 -#define SKP_SMLAWT(a32, b32, c32) ((a32) + (((b32) >> 16) * ((c32) >> 16)) + ((((b32) & 0x0000FFFF) * ((c32) >> 16)) >> 16)) - -// (SKP_int32)((SKP_int16)(a3))) * (SKP_int32)((SKP_int16)(b32)) output have to be 32bit int -#define SKP_SMULBB(a32, b32) ((SKP_int32)((SKP_int16)(a32)) * (SKP_int32)((SKP_int16)(b32))) - -// a32 + (SKP_int32)((SKP_int16)(b32)) * (SKP_int32)((SKP_int16)(c32)) output have to be 32bit int -#define SKP_SMLABB(a32, b32, c32) ((a32) + ((SKP_int32)((SKP_int16)(b32))) * (SKP_int32)((SKP_int16)(c32))) - -// (SKP_int32)((SKP_int16)(a32)) * (b32 >> 16) -#define SKP_SMULBT(a32, b32) ((SKP_int32)((SKP_int16)(a32)) * ((b32) >> 16)) - -// a32 + (SKP_int32)((SKP_int16)(b32)) * (c32 >> 16) -#define SKP_SMLABT(a32, b32, c32) ((a32) + ((SKP_int32)((SKP_int16)(b32))) * ((c32) >> 16)) - -// a64 + (b32 * c32) -#define SKP_SMLAL(a64, b32, c32) (SKP_ADD64((a64), ((SKP_int64)(b32) * (SKP_int64)(c32)))) - -// (a32 * b32) >> 16 -#define SKP_SMULWW(a32, b32) SKP_MLA(SKP_SMULWB((a32), (b32)), (a32), SKP_RSHIFT_ROUND((b32), 16)) - -// a32 + ((b32 * c32) >> 16) -#define SKP_SMLAWW(a32, b32, c32) SKP_MLA(SKP_SMLAWB((a32), (b32), (c32)), (b32), SKP_RSHIFT_ROUND((c32), 16)) - -/* add/subtract with output saturated */ -#define SKP_ADD_SAT32(a, b) ((((a) + (b)) & 0x80000000) == 0 ? \ - ((((a) & (b)) & 0x80000000) != 0 ? SKP_int32_MIN : (a)+(b)) : \ - ((((a) | (b)) & 0x80000000) == 0 ? SKP_int32_MAX : (a)+(b)) ) - -#define SKP_SUB_SAT32(a, b) ((((a)-(b)) & 0x80000000) == 0 ? \ - (( (a) & ((b)^0x80000000) & 0x80000000) ? SKP_int32_MIN : (a)-(b)) : \ - ((((a)^0x80000000) & (b) & 0x80000000) ? SKP_int32_MAX : (a)-(b)) ) - -SKP_INLINE SKP_int32 SKP_Silk_CLZ16(SKP_int16 in16) -{ - SKP_int32 out32 = 0; - if( in16 == 0 ) { - return 16; - } - /* test nibbles */ - if( in16 & 0xFF00 ) { - if( in16 & 0xF000 ) { - in16 >>= 12; - } else { - out32 += 4; - in16 >>= 8; - } - } else { - if( in16 & 0xFFF0 ) { - out32 += 8; - in16 >>= 4; - } else { - out32 += 12; - } - } - /* test bits and return */ - if( in16 & 0xC ) { - if( in16 & 0x8 ) - return out32 + 0; - else - return out32 + 1; - } else { - if( in16 & 0xE ) - return out32 + 2; - else - return out32 + 3; - } -} - -SKP_INLINE SKP_int32 SKP_Silk_CLZ32(SKP_int32 in32) -{ - /* test highest 16 bits and convert to SKP_int16 */ - if( in32 & 0xFFFF0000 ) { - return SKP_Silk_CLZ16((SKP_int16)(in32 >> 16)); - } else { - return SKP_Silk_CLZ16((SKP_int16)in32) + 16; - } -} - -#endif //_SKP_SILK_API_C_H_ diff --git a/libs/silk/src/SKP_Silk_main.h b/libs/silk/src/SKP_Silk_main.h deleted file mode 100644 index 5f31953e0f..0000000000 --- a/libs/silk/src/SKP_Silk_main.h +++ /dev/null @@ -1,387 +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_MAIN_H -#define SKP_SILK_MAIN_H - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include "SKP_Silk_SigProc_FIX.h" -#include "SKP_Silk_define.h" -#include "SKP_Silk_structs.h" -#include "SKP_Silk_tables.h" -#include "SKP_Silk_PLC.h" - - -/* Encodes signs of excitation */ -void SKP_Silk_encode_signs( - SKP_Silk_range_coder_state *psRC, /* I/O Range coder state */ - const SKP_int8 q[], /* I pulse signal */ - const SKP_int length, /* I length of input */ - const SKP_int sigtype, /* I Signal type */ - const SKP_int QuantOffsetType, /* I Quantization offset type */ - const SKP_int RateLevelIndex /* I Rate Level Index */ -); - -/* Decodes signs of excitation */ -void SKP_Silk_decode_signs( - SKP_Silk_range_coder_state *psRC, /* I/O Range coder state */ - SKP_int q[], /* I/O pulse signal */ - const SKP_int length, /* I length of output */ - const SKP_int sigtype, /* I Signal type */ - const SKP_int QuantOffsetType, /* I Quantization offset type */ - const SKP_int RateLevelIndex /* I Rate Level Index */ -); - -/* Control internal sampling rate */ -SKP_int SKP_Silk_control_audio_bandwidth( - SKP_Silk_encoder_state *psEncC, /* I/O Pointer to Silk encoder state */ - const SKP_int32 TargetRate_bps /* I Target max bitrate (bps) */ -); - -/***************/ -/* Shell coder */ -/***************/ - -/* Encode quantization indices of excitation */ -void SKP_Silk_encode_pulses( - SKP_Silk_range_coder_state *psRC, /* I/O Range coder state */ - const SKP_int sigtype, /* I Sigtype */ - const SKP_int QuantOffsetType, /* I QuantOffsetType */ - const SKP_int8 q[], /* I quantization indices */ - const SKP_int frame_length /* I Frame length */ -); - -/* Shell encoder, operates on one shell code frame of 16 pulses */ -void SKP_Silk_shell_encoder( - SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */ - const SKP_int *pulses0 /* I data: nonnegative pulse amplitudes */ -); - -/* Shell decoder, operates on one shell code frame of 16 pulses */ -void SKP_Silk_shell_decoder( - SKP_int *pulses0, /* O data: nonnegative pulse amplitudes */ - SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */ - const SKP_int pulses4 /* I number of pulses per pulse-subframe */ -); - -/***************/ -/* Range coder */ -/***************/ -/* Range encoder for one symbol */ -void SKP_Silk_range_encoder( - SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */ - const SKP_int data, /* I uncompressed data */ - const SKP_uint16 prob[] /* I cumulative density functions */ -); - -/* Range encoder for multiple symbols */ -void SKP_Silk_range_encoder_multi( - SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */ - const SKP_int data[], /* I uncompressed data [nSymbols] */ - const SKP_uint16 * const prob[], /* I cumulative density functions */ - const SKP_int nSymbols /* I number of data symbols */ -); - -/* Range decoder for one symbol */ -void SKP_Silk_range_decoder( - SKP_int data[], /* O uncompressed data */ - SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */ - const SKP_uint16 prob[], /* I cumulative density function */ - SKP_int probIx /* I initial (middle) entry of cdf */ -); - -/* Range decoder for multiple symbols */ -void SKP_Silk_range_decoder_multi( - SKP_int data[], /* O uncompressed data [nSymbols] */ - SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */ - const SKP_uint16 * const prob[], /* I cumulative density functions */ - const SKP_int probStartIx[], /* I initial (middle) entries of cdfs [nSymbols] */ - const SKP_int nSymbols /* I number of data symbols */ -); - -/* Initialize range coder structure for encoder */ -void SKP_Silk_range_enc_init( - SKP_Silk_range_coder_state *psRC /* O compressor data structure */ -); - -/* Initialize range coder structure for decoder */ -void SKP_Silk_range_dec_init( - SKP_Silk_range_coder_state *psRC, /* O compressor data structure */ - const SKP_uint8 buffer[], /* I buffer for compressed data [bufferLength] */ - const SKP_int32 bufferLength /* I buffer length (in bytes) */ -); - -/* Determine length of bitstream */ -SKP_int SKP_Silk_range_coder_get_length( /* O returns number of BITS in stream */ - const SKP_Silk_range_coder_state *psRC, /* I compressed data structure */ - SKP_int *nBytes /* O number of BYTES in stream */ -); - -/* Write decodable stream to buffer, and determine its length */ -void SKP_Silk_range_enc_wrap_up( - SKP_Silk_range_coder_state *psRC /* I/O compressed data structure */ -); - -/* Check that any remaining bits in the last byte are set to 1 */ -void SKP_Silk_range_coder_check_after_decoding( - SKP_Silk_range_coder_state *psRC /* I/O compressed data structure */ -); - -/* Gain scalar quantization with hysteresis, uniform on log scale */ -void SKP_Silk_gains_quant( - SKP_int ind[ NB_SUBFR ], /* O gain indices */ - SKP_int32 gain_Q16[ NB_SUBFR ], /* I/O gains (quantized out) */ - SKP_int *prev_ind, /* I/O last index in previous frame */ - const SKP_int conditional /* I first gain is delta coded if 1 */ -); - -/* Gains scalar dequantization, uniform on log scale */ -void SKP_Silk_gains_dequant( - SKP_int32 gain_Q16[ NB_SUBFR ], /* O quantized gains */ - const SKP_int ind[ NB_SUBFR ], /* I gain indices */ - SKP_int *prev_ind, /* I/O last index in previous frame */ - const SKP_int conditional /* I first gain is delta coded if 1 */ -); - -/* Convert NLSF parameters to stable AR prediction filter coefficients */ -void SKP_Silk_NLSF2A_stable( - SKP_int16 pAR_Q12[ MAX_LPC_ORDER ], /* O Stabilized AR coefs [LPC_order] */ - const SKP_int pNLSF[ MAX_LPC_ORDER ], /* I NLSF vector [LPC_order] */ - const SKP_int LPC_order /* I LPC/LSF order */ -); - -/* Interpolate two vectors */ -void SKP_Silk_interpolate( - SKP_int xi[ MAX_LPC_ORDER ], /* O interpolated vector */ - const SKP_int x0[ MAX_LPC_ORDER ], /* I first vector */ - const SKP_int x1[ MAX_LPC_ORDER ], /* I second vector */ - const SKP_int ifact_Q2, /* I interp. factor, weight on 2nd vector */ - const SKP_int d /* I number of parameters */ -); - -/***********************************/ -/* Noise shaping quantization (NSQ)*/ -/***********************************/ -void SKP_Silk_NSQ( - SKP_Silk_encoder_state *psEncC, /* I/O Encoder State */ - SKP_Silk_encoder_control *psEncCtrlC, /* I Encoder Control */ - SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */ - const SKP_int16 x[], /* I prefiltered input signal */ - SKP_int8 q[], /* O quantized qulse signal */ - const SKP_int LSFInterpFactor_Q2, /* I LSF interpolation factor in Q2 */ - const SKP_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefficients */ - const SKP_int16 LTPCoef_Q14[ LTP_ORDER * NB_SUBFR ], /* I Long term prediction coefficients */ - const SKP_int16 AR2_Q13[ NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I */ - const SKP_int HarmShapeGain_Q14[ NB_SUBFR ], /* I */ - const SKP_int Tilt_Q14[ NB_SUBFR ], /* I Spectral tilt */ - const SKP_int32 LF_shp_Q14[ NB_SUBFR ], /* I */ - const SKP_int32 Gains_Q16[ NB_SUBFR ], /* I */ - const SKP_int Lambda_Q10, /* I */ - const SKP_int LTP_scale_Q14 /* I LTP state scaling */ -); - -/* Noise shaping using delayed decision */ -void SKP_Silk_NSQ_del_dec( - SKP_Silk_encoder_state *psEncC, /* I/O Encoder State */ - SKP_Silk_encoder_control *psEncCtrlC, /* I Encoder Control */ - SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */ - const SKP_int16 x[], /* I Prefiltered input signal */ - SKP_int8 q[], /* O Quantized pulse signal */ - const SKP_int LSFInterpFactor_Q2, /* I LSF interpolation factor in Q2 */ - const SKP_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Prediction coefs */ - const SKP_int16 LTPCoef_Q14[ LTP_ORDER * NB_SUBFR ], /* I LT prediction coefs */ - const SKP_int16 AR2_Q13[ NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I */ - const SKP_int HarmShapeGain_Q14[ NB_SUBFR ], /* I */ - const SKP_int Tilt_Q14[ NB_SUBFR ], /* I Spectral tilt */ - const SKP_int32 LF_shp_Q14[ NB_SUBFR ], /* I */ - const SKP_int32 Gains_Q16[ NB_SUBFR ], /* I */ - const SKP_int Lambda_Q10, /* I */ - const SKP_int LTP_scale_Q14 /* I LTP state scaling */ -); - -/************/ -/* Silk VAD */ -/************/ -/* Initialize the Silk VAD */ -SKP_int SKP_Silk_VAD_Init( /* O Return value, 0 if success */ - SKP_Silk_VAD_state *psSilk_VAD /* I/O Pointer to Silk VAD state */ -); - -/* Silk VAD noise level estimation */ -void SKP_Silk_VAD_GetNoiseLevels( - const SKP_int32 pX[ VAD_N_BANDS ], /* I subband energies */ - SKP_Silk_VAD_state *psSilk_VAD /* I/O Pointer to Silk VAD state */ -); - -/* Get speech activity level in Q8 */ -SKP_int SKP_Silk_VAD_GetSA_Q8( /* O Return value, 0 if success */ - SKP_Silk_VAD_state *psSilk_VAD, /* I/O Silk VAD state */ - SKP_int *pSA_Q8, /* O Speech activity level in Q8 */ - SKP_int *pSNR_dB_Q7, /* O SNR for current frame in Q7 */ - SKP_int pQuality_Q15[ VAD_N_BANDS ], /* O Smoothed SNR for each band */ - SKP_int *pTilt_Q15, /* O current frame's frequency tilt */ - const SKP_int16 pIn[], /* I PCM input [framelength] */ - const SKP_int framelength /* I Input frame length */ -); - -/* Detect signal in 8 - 12 khz range */ -void SKP_Silk_detect_SWB_input( - SKP_Silk_detect_SWB_state *psSWBdetect, /* I/O Encoder state */ - const SKP_int16 samplesIn[], /* I Input to encoder */ - SKP_int nSamplesIn /* 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; */ -void SKP_Silk_LP_variable_cutoff( - SKP_Silk_LP_state *psLP, /* I/O LP filter state */ - SKP_int16 *out, /* O Low-pass filtered output signal */ - const SKP_int16 *in, /* I Input signal */ - const SKP_int frame_length /* I Frame length */ -); -#endif - -/****************************************************/ -/* Decoder Functions */ -/****************************************************/ -SKP_int SKP_Silk_create_decoder( - SKP_Silk_decoder_state **ppsDec /* I/O Decoder state pointer pointer */ -); - -SKP_int SKP_Silk_free_decoder( - SKP_Silk_decoder_state *psDec /* I/O Decoder state pointer */ -); - -SKP_int SKP_Silk_init_decoder( - SKP_Silk_decoder_state *psDec /* I/O Decoder state pointer */ -); - -/* Set decoder sampling rate */ -void SKP_Silk_decoder_set_fs( - SKP_Silk_decoder_state *psDec, /* I/O Decoder state pointer */ - SKP_int fs_kHz /* I Sampling frequency (kHz) */ -); - -/****************/ -/* Decode frame */ -/****************/ -SKP_int SKP_Silk_decode_frame( - SKP_Silk_decoder_state *psDec, /* I/O Pointer to Silk decoder state */ - SKP_int16 pOut[], /* O Pointer to output speech frame */ - SKP_int16 *pN, /* O Pointer to size of output frame */ - const SKP_uint8 pCode[], /* I Pointer to payload */ - const SKP_int nBytes, /* I Payload length */ - SKP_int action, /* I Action from Jitter Buffer */ - SKP_int *decBytes /* O Used bytes to decode this frame */ -); - -/* Decode parameters from payload */ -void SKP_Silk_decode_parameters( - SKP_Silk_decoder_state *psDec, /* I/O State */ - SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */ - SKP_int q[], /* O Excitation signal */ - const SKP_int fullDecoding /* I Flag to tell if only arithmetic decoding */ -); - -/* Core decoder. Performs inverse NSQ operation LTP + LPC */ -void SKP_Silk_decode_core( - SKP_Silk_decoder_state *psDec, /* I/O Decoder state */ - SKP_Silk_decoder_control *psDecCtrl, /* I Decoder control */ - SKP_int16 xq[], /* O Decoded speech */ - const SKP_int q[ MAX_FRAME_LENGTH ] /* I Pulse signal */ -); - -/* NLSF vector decoder */ -void SKP_Silk_NLSF_MSVQ_decode( - SKP_int *pNLSF_Q15, /* O Pointer to decoded output [LPC_ORDER x 1] */ - const SKP_Silk_NLSF_CB_struct *psNLSF_CB, /* I Pointer to NLSF codebook struct */ - const SKP_int *NLSFIndices, /* I Pointer to NLSF indices [nStages x 1] */ - const SKP_int LPC_order /* I LPC order */ -); - -/**********************/ -/* Arithmetic coding */ -/*********************/ - -/* Decode quantization indices of excitation (Shell coding) */ -void SKP_Silk_decode_pulses( - SKP_Silk_range_coder_state *psRC, /* I/O Range coder state */ - SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */ - SKP_int q[], /* O Excitation signal */ - const SKP_int frame_length /* I Frame length (preliminary) */ -); - -/******************/ -/* CNG */ -/******************/ - -/* Reset CNG */ -void SKP_Silk_CNG_Reset( - SKP_Silk_decoder_state *psDec /* I/O Decoder state */ -); - -/* Updates CNG estimate, and applies the CNG when packet was lost */ -void SKP_Silk_CNG( - SKP_Silk_decoder_state *psDec, /* I/O Decoder state */ - SKP_Silk_decoder_control *psDecCtrl, /* I/O Decoder control */ - SKP_int16 signal[], /* I/O Signal */ - SKP_int length /* I Length of residual */ -); - -/* Encoding of various parameters */ -void SKP_Silk_encode_parameters( - SKP_Silk_encoder_state *psEncC, /* I/O Encoder state */ - SKP_Silk_encoder_control *psEncCtrlC, /* I/O Encoder control */ - SKP_Silk_range_coder_state *psRC, /* I/O Range coder state */ - const SKP_int8 *q /* I Quantization indices */ -); - -/* Extract lowest layer encoding */ -void SKP_Silk_get_low_layer_internal( - const SKP_uint8 *indata, /* I: Encoded input vector */ - const SKP_int16 nBytesIn, /* I: Number of input Bytes */ - SKP_uint8 *Layer0data, /* O: Layer0 payload */ - SKP_int16 *nLayer0Bytes /* O: Number of FEC Bytes */ -); - -/* Resets LBRR buffer, used if packet size changes */ -void SKP_Silk_LBRR_reset( - SKP_Silk_encoder_state *psEncC /* I/O Pointer to Silk encoder state */ -); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libs/silk/src/SKP_Silk_main_FIX.h b/libs/silk/src/SKP_Silk_main_FIX.h deleted file mode 100644 index 7578b3ac72..0000000000 --- a/libs/silk/src/SKP_Silk_main_FIX.h +++ /dev/null @@ -1,328 +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_MAIN_FIX_H -#define SKP_SILK_MAIN_FIX_H - -#include -#include "SKP_Silk_SigProc_FIX.h" -#include "SKP_Silk_structs_FIX.h" -#include "SKP_Silk_main.h" -#include "SKP_Silk_PLC.h" -#define TIC(TAG_NAME) -#define TOC(TAG_NAME) - -#ifndef FORCE_CPP_BUILD -#ifdef __cplusplus -extern "C" -{ -#endif -#endif - -/*********************/ -/* Encoder Functions */ -/*********************/ - -/* 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 */ -); - -/* 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 DTX_enabled, /* I Enable / disable DTX */ - const SKP_int Complexity /* I Complexity (0->low; 1->medium; 2->high) */ -); - -/* Encoder main function */ -SKP_int SKP_Silk_encode_frame_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk FIX encoder state */ - SKP_uint8 *pCode, /* O Pointer to payload */ - SKP_int16 *pnBytesOut, /* I/O Pointer to number of payload bytes; */ - /* input: max length; output: used */ - const SKP_int16 *pIn /* I Pointer to input speech frame */ -); - -/* Low BitRate Redundancy encoding functionality. 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 */ - SKP_uint8 *pCode, /* O Pointer to payload */ - SKP_int16 *pnBytesOut, /* I/O Pointer to number of payload bytes */ - SKP_int16 xfw[] /* I Input signal */ -); - -/* High-pass filter with cutoff frequency adaptation based on pitch lag statistics */ -void SKP_Silk_HP_variable_cutoff_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O Encoder state */ - SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O Encoder control */ - SKP_int16 *out, /* O high-pass filtered output signal */ - const SKP_int16 *in /* I input signal */ -); - -/****************/ -/* Prefiltering */ -/****************/ -void SKP_Silk_prefilter_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O Encoder state */ - const SKP_Silk_encoder_control_FIX *psEncCtrl, /* I Encoder control */ - SKP_int16 xw[], /* O Weighted signal */ - const SKP_int16 x[] /* I Speech signal */ -); - -/**************************************************************/ -/* Compute noise shaping coefficients and initial gain values */ -/**************************************************************/ -void SKP_Silk_noise_shape_analysis_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O Encoder state FIX */ - SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O Encoder control FIX */ - const SKP_int16 *pitch_res, /* I LPC residual from pitch analysis */ - const SKP_int16 *x /* I Input signal [ frame_length + la_shape ] */ -); - -/* Autocorrelations for a warped frequency axis */ -void SKP_Silk_warped_autocorrelation_FIX( - SKP_int32 *corr, /* O Result [order + 1] */ - SKP_int *scale, /* O Scaling of the correlation vector */ - const SKP_int16 *input, /* I Input data to correlate */ - const SKP_int16 warping_Q16, /* I Warping coefficient */ - const SKP_int length, /* I Length of input */ - const SKP_int order /* I Correlation order (even) */ -); - -/* Processing of gains */ -void SKP_Silk_process_gains_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O Encoder state */ - SKP_Silk_encoder_control_FIX *psEncCtrl /* I/O Encoder control */ -); - -/* Control low bitrate redundancy usage */ -void SKP_Silk_LBRR_ctrl_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O encoder state */ - SKP_Silk_encoder_control *psEncCtrlC /* I/O encoder control */ -); - -/* Calculation of LTP state scaling */ -void SKP_Silk_LTP_scale_ctrl_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O encoder state */ - SKP_Silk_encoder_control_FIX *psEncCtrl /* I/O encoder control */ -); - -/**********************************************/ -/* Prediction Analysis */ -/**********************************************/ - -/* Find pitch lags */ -void SKP_Silk_find_pitch_lags_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O encoder state */ - SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */ - SKP_int16 res[], /* O residual */ - const SKP_int16 x[] /* I Speech signal */ -); - -void SKP_Silk_find_pred_coefs_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O encoder state */ - SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */ - const SKP_int16 res_pitch[] /* I Residual from pitch analysis */ -); - -void SKP_Silk_find_LPC_FIX( - SKP_int NLSF_Q15[], /* O NLSFs */ - SKP_int *interpIndex, /* O NLSF interpolation index, only used for NLSF interpolation */ - const SKP_int prev_NLSFq_Q15[], /* I previous NLSFs, only used for NLSF interpolation */ - const SKP_int useInterpolatedLSFs, /* I Flag */ - const SKP_int LPC_order, /* I LPC order */ - const SKP_int16 x[], /* I Input signal */ - const SKP_int subfr_length /* I Input signal subframe length including preceeding samples */ -); - -void SKP_Silk_LTP_analysis_filter_FIX( - SKP_int16 *LTP_res, /* O: LTP residual signal of length NB_SUBFR * ( pre_length + subfr_length ) */ - const SKP_int16 *x, /* I: Pointer to input signal with at least max( pitchL ) preceeding samples */ - const SKP_int16 LTPCoef_Q14[ LTP_ORDER * NB_SUBFR ],/* I: LTP_ORDER LTP coefficients for each NB_SUBFR subframe */ - const SKP_int pitchL[ NB_SUBFR ], /* I: Pitch lag, one for each subframe */ - const SKP_int32 invGains_Q16[ NB_SUBFR ], /* I: Inverse quantization gains, one for each subframe */ - const SKP_int subfr_length, /* I: Length of each subframe */ - const SKP_int pre_length /* I: Length of the preceeding samples starting at &x[0] for each subframe */ -); - -/* Finds LTP vector from correlations */ -void SKP_Silk_find_LTP_FIX( - SKP_int16 b_Q14[ NB_SUBFR * LTP_ORDER ], /* O LTP coefs */ - SKP_int32 WLTP[ NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Weight for LTP quantization */ - SKP_int *LTPredCodGain_Q7, /* O LTP coding gain */ - const SKP_int16 r_first[], /* I residual signal after LPC signal + state for first 10 ms */ - const SKP_int16 r_last[], /* I residual signal after LPC signal + state for last 10 ms */ - const SKP_int lag[ NB_SUBFR ], /* I LTP lags */ - const SKP_int32 Wght_Q15[ NB_SUBFR ], /* I weights */ - const SKP_int subfr_length, /* I subframe length */ - const SKP_int mem_offset, /* I number of samples in LTP memory */ - SKP_int corr_rshifts[ NB_SUBFR ] /* O right shifts applied to correlations */ -); - -/* LTP tap quantizer */ -void SKP_Silk_quant_LTP_gains_FIX( - SKP_int16 B_Q14[], /* I/O (un)quantized LTP gains */ - SKP_int cbk_index[], /* O Codebook Index */ - SKP_int *periodicity_index, /* O Periodicity Index */ - const SKP_int32 W_Q18[], /* I Error Weights in Q18 */ - SKP_int mu_Q8, /* I Mu value (R/D tradeoff) */ - SKP_int lowComplexity /* I Flag for low complexity */ -); - -/******************/ -/* NLSF Quantizer */ -/******************/ - -/* Limit, stabilize, convert and quantize NLSFs. */ -void SKP_Silk_process_NLSFs_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O encoder state */ - SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */ - SKP_int *pNLSF_Q15 /* I/O Normalized LSFs (quant out) (0 - (2^15-1)) */ -); - -/* NLSF vector encoder */ -void SKP_Silk_NLSF_MSVQ_encode_FIX( - SKP_int *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_Q6, /* 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 */ -); - -/* Rate-Distortion calculations for multiple input data vectors */ -void SKP_Silk_NLSF_VQ_rate_distortion_FIX( - SKP_int32 *pRD_Q20, /* O Rate-distortion values [psNLSF_CBS->nVectors*N] */ - const SKP_Silk_NLSF_CBS *psNLSF_CBS, /* I NLSF codebook stage struct */ - const SKP_int *in_Q15, /* I Input vectors to be quantized */ - const SKP_int *w_Q6, /* I Weight vector */ - const SKP_int32 *rate_acc_Q5, /* 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 LPC_order /* I LPC order */ -); - -/* Compute weighted quantization errors for an LPC_order element input vector, over one codebook stage */ -void SKP_Silk_NLSF_VQ_sum_error_FIX( - SKP_int32 *err_Q20, /* O Weighted quantization errors [N*K] */ - const SKP_int *in_Q15, /* I Input vectors to be quantized [N*LPC_order] */ - const SKP_int *w_Q6, /* I Weighting vectors [N*LPC_order] */ - const SKP_int16 *pCB_Q15, /* 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 LPC_order /* I Number of LPCs */ -); - -/* Entropy constrained MATRIX-weighted VQ, for a single input data vector */ -void SKP_Silk_VQ_WMat_EC_FIX( - SKP_int *ind, /* O index of best codebook vector */ - SKP_int32 *rate_dist_Q14, /* O best weighted quantization error + mu * rate*/ - const SKP_int16 *in_Q14, /* I input vector to be quantized */ - const SKP_int32 *W_Q18, /* I weighting matrix */ - const SKP_int16 *cb_Q14, /* I codebook */ - const SKP_int16 *cl_Q6, /* I code length for each codebook vector */ - const SKP_int mu_Q8, /* I tradeoff between weighted error and rate */ - SKP_int L /* I number of vectors in codebook */ -); - -/******************/ -/* Linear Algebra */ -/******************/ - -/* Calculates correlation matrix X'*X */ -void SKP_Silk_corrMatrix_FIX( - const SKP_int16 *x, /* I x vector [L + order - 1] used to form data matrix X */ - const SKP_int L, /* I Length of vectors */ - const SKP_int order, /* I Max lag for correlation */ - const SKP_int head_room, /* I Desired headroom */ - SKP_int32 *XX, /* O Pointer to X'*X correlation matrix [ order x order ]*/ - SKP_int *rshifts /* I/O Right shifts of correlations */ -); - -/* Calculates correlation vector X'*t */ -void SKP_Silk_corrVector_FIX( - const SKP_int16 *x, /* I x vector [L + order - 1] used to form data matrix X */ - const SKP_int16 *t, /* I Target vector [L] */ - const SKP_int L, /* I Length of vectors */ - const SKP_int order, /* I Max lag for correlation */ - SKP_int32 *Xt, /* O Pointer to X'*t correlation vector [order] */ - const SKP_int rshifts /* I Right shifts of correlations */ -); - -/* Add noise to matrix diagonal */ -void SKP_Silk_regularize_correlations_FIX( - SKP_int32 *XX, /* I/O Correlation matrices */ - SKP_int32 *xx, /* I/O Correlation values */ - SKP_int32 noise, /* I Noise to add */ - SKP_int D /* I Dimension of XX */ -); - -/* Solves Ax = b, assuming A is symmetric */ -void SKP_Silk_solve_LDL_FIX( - SKP_int32 *A, /* I Pointer to symetric square matrix A */ - SKP_int M, /* I Size of matrix */ - const SKP_int32 *b, /* I Pointer to b vector */ - SKP_int32 *x_Q16 /* O Pointer to x solution vector */ -); - -/* Residual energy: nrg = wxx - 2 * wXx * c + c' * wXX * c */ -SKP_int32 SKP_Silk_residual_energy16_covar_FIX( - const SKP_int16 *c, /* I Prediction vector */ - const SKP_int32 *wXX, /* I Correlation matrix */ - const SKP_int32 *wXx, /* I Correlation vector */ - SKP_int32 wxx, /* I Signal energy */ - SKP_int D, /* I Dimension */ - SKP_int cQ /* I Q value for c vector 0 - 15 */ -); - -/* Calculates residual energies of input subframes where all subframes have LPC_order */ -/* of preceeding samples */ -void SKP_Silk_residual_energy_FIX( - SKP_int32 nrgs[ NB_SUBFR ], /* O Residual energy per subframe */ - SKP_int nrgsQ[ NB_SUBFR ], /* O Q value per subframe */ - const SKP_int16 x[], /* I Input signal */ - SKP_int16 a_Q12[ 2 ][ MAX_LPC_ORDER ],/* I AR coefs for each frame half */ - const SKP_int32 gains[ NB_SUBFR ], /* I Quantization gains */ - const SKP_int subfr_length, /* I Subframe length */ - const SKP_int LPC_order /* I LPC order */ -); - -#ifndef FORCE_CPP_BUILD -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif /* FORCE_CPP_BUILD */ -#endif /* SKP_SILK_MAIN_FIX_H */ diff --git a/libs/silk/src/SKP_Silk_noise_shape_analysis_FIX.c b/libs/silk/src/SKP_Silk_noise_shape_analysis_FIX.c deleted file mode 100644 index 847d4ad3c0..0000000000 --- a/libs/silk/src/SKP_Silk_noise_shape_analysis_FIX.c +++ /dev/null @@ -1,482 +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_FIX.h" -#include "SKP_Silk_tuning_parameters.h" - -/* Compute gain to make warped filter coefficients have a zero mean log frequency response on a */ -/* non-warped frequency scale. (So that it can be implemented with a minimum-phase monic filter.) */ -SKP_INLINE SKP_int32 warped_gain( // gain in Q16 - const SKP_int32 *coefs_Q24, - SKP_int lambda_Q16, - SKP_int order -) { - SKP_int i; - SKP_int32 gain_Q24; - - lambda_Q16 = -lambda_Q16; - gain_Q24 = coefs_Q24[ order - 1 ]; - for( i = order - 2; i >= 0; i-- ) { - gain_Q24 = SKP_SMLAWB( coefs_Q24[ i ], gain_Q24, lambda_Q16 ); - } - gain_Q24 = SKP_SMLAWB( SKP_FIX_CONST( 1.0, 24 ), gain_Q24, -lambda_Q16 ); - return SKP_INVERSE32_varQ( gain_Q24, 40 ); -} - -/* Convert warped filter coefficients to monic pseudo-warped coefficients and limit maximum */ -/* amplitude of monic warped coefficients by using bandwidth expansion on the true coefficients */ -SKP_INLINE void limit_warped_coefs( - SKP_int32 *coefs_syn_Q24, - SKP_int32 *coefs_ana_Q24, - SKP_int lambda_Q16, - SKP_int32 limit_Q24, - SKP_int order -) { - SKP_int i, iter, ind = 0; - SKP_int32 tmp, maxabs_Q24, chirp_Q16, gain_syn_Q16, gain_ana_Q16; - SKP_int32 nom_Q16, den_Q24; - - /* Convert to monic coefficients */ - lambda_Q16 = -lambda_Q16; - for( i = order - 1; i > 0; i-- ) { - coefs_syn_Q24[ i - 1 ] = SKP_SMLAWB( coefs_syn_Q24[ i - 1 ], coefs_syn_Q24[ i ], lambda_Q16 ); - coefs_ana_Q24[ i - 1 ] = SKP_SMLAWB( coefs_ana_Q24[ i - 1 ], coefs_ana_Q24[ i ], lambda_Q16 ); - } - lambda_Q16 = -lambda_Q16; - nom_Q16 = SKP_SMLAWB( SKP_FIX_CONST( 1.0, 16 ), -lambda_Q16, lambda_Q16 ); - den_Q24 = SKP_SMLAWB( SKP_FIX_CONST( 1.0, 24 ), coefs_syn_Q24[ 0 ], lambda_Q16 ); - gain_syn_Q16 = SKP_DIV32_varQ( nom_Q16, den_Q24, 24 ); - den_Q24 = SKP_SMLAWB( SKP_FIX_CONST( 1.0, 24 ), coefs_ana_Q24[ 0 ], lambda_Q16 ); - gain_ana_Q16 = SKP_DIV32_varQ( nom_Q16, den_Q24, 24 ); - for( i = 0; i < order; i++ ) { - coefs_syn_Q24[ i ] = SKP_SMULWW( gain_syn_Q16, coefs_syn_Q24[ i ] ); - coefs_ana_Q24[ i ] = SKP_SMULWW( gain_ana_Q16, coefs_ana_Q24[ i ] ); - } - - for( iter = 0; iter < 10; iter++ ) { - /* Find maximum absolute value */ - maxabs_Q24 = -1; - for( i = 0; i < order; i++ ) { - tmp = SKP_max( SKP_abs_int32( coefs_syn_Q24[ i ] ), SKP_abs_int32( coefs_ana_Q24[ i ] ) ); - if( tmp > maxabs_Q24 ) { - maxabs_Q24 = tmp; - ind = i; - } - } - if( maxabs_Q24 <= limit_Q24 ) { - /* Coefficients are within range - done */ - return; - } - - /* Convert back to true warped coefficients */ - for( i = 1; i < order; i++ ) { - coefs_syn_Q24[ i - 1 ] = SKP_SMLAWB( coefs_syn_Q24[ i - 1 ], coefs_syn_Q24[ i ], lambda_Q16 ); - coefs_ana_Q24[ i - 1 ] = SKP_SMLAWB( coefs_ana_Q24[ i - 1 ], coefs_ana_Q24[ i ], lambda_Q16 ); - } - gain_syn_Q16 = SKP_INVERSE32_varQ( gain_syn_Q16, 32 ); - gain_ana_Q16 = SKP_INVERSE32_varQ( gain_ana_Q16, 32 ); - for( i = 0; i < order; i++ ) { - coefs_syn_Q24[ i ] = SKP_SMULWW( gain_syn_Q16, coefs_syn_Q24[ i ] ); - coefs_ana_Q24[ i ] = SKP_SMULWW( gain_ana_Q16, coefs_ana_Q24[ i ] ); - } - - /* Apply bandwidth expansion */ - chirp_Q16 = SKP_FIX_CONST( 0.99, 16 ) - SKP_DIV32_varQ( - SKP_SMULWB( maxabs_Q24 - limit_Q24, SKP_SMLABB( SKP_FIX_CONST( 0.8, 10 ), SKP_FIX_CONST( 0.1, 10 ), iter ) ), - SKP_MUL( maxabs_Q24, ind + 1 ), 22 ); - SKP_Silk_bwexpander_32( coefs_syn_Q24, order, chirp_Q16 ); - SKP_Silk_bwexpander_32( coefs_ana_Q24, order, chirp_Q16 ); - - /* Convert to monic warped coefficients */ - lambda_Q16 = -lambda_Q16; - for( i = order - 1; i > 0; i-- ) { - coefs_syn_Q24[ i - 1 ] = SKP_SMLAWB( coefs_syn_Q24[ i - 1 ], coefs_syn_Q24[ i ], lambda_Q16 ); - coefs_ana_Q24[ i - 1 ] = SKP_SMLAWB( coefs_ana_Q24[ i - 1 ], coefs_ana_Q24[ i ], lambda_Q16 ); - } - lambda_Q16 = -lambda_Q16; - nom_Q16 = SKP_SMLAWB( SKP_FIX_CONST( 1.0, 16 ), -lambda_Q16, lambda_Q16 ); - den_Q24 = SKP_SMLAWB( SKP_FIX_CONST( 1.0, 24 ), coefs_syn_Q24[ 0 ], lambda_Q16 ); - gain_syn_Q16 = SKP_DIV32_varQ( nom_Q16, den_Q24, 24 ); - den_Q24 = SKP_SMLAWB( SKP_FIX_CONST( 1.0, 24 ), coefs_ana_Q24[ 0 ], lambda_Q16 ); - gain_ana_Q16 = SKP_DIV32_varQ( nom_Q16, den_Q24, 24 ); - for( i = 0; i < order; i++ ) { - coefs_syn_Q24[ i ] = SKP_SMULWW( gain_syn_Q16, coefs_syn_Q24[ i ] ); - coefs_ana_Q24[ i ] = SKP_SMULWW( gain_ana_Q16, coefs_ana_Q24[ i ] ); - } - } - SKP_assert( 0 ); -} - -/**************************************************************/ -/* Compute noise shaping coefficients and initial gain values */ -/**************************************************************/ -void SKP_Silk_noise_shape_analysis_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O Encoder state FIX */ - SKP_Silk_encoder_control_FIX *psEncCtrl, /* I/O Encoder control FIX */ - const SKP_int16 *pitch_res, /* I LPC residual from pitch analysis */ - const SKP_int16 *x /* I Input signal [ frame_length + la_shape ] */ -) -{ - SKP_Silk_shape_state_FIX *psShapeSt = &psEnc->sShape; - SKP_int k, i, nSamples, Qnrg, b_Q14, warping_Q16, scale = 0; - SKP_int32 SNR_adj_dB_Q7, HarmBoost_Q16, HarmShapeGain_Q16, Tilt_Q16, tmp32; - SKP_int32 nrg, pre_nrg_Q30, log_energy_Q7, log_energy_prev_Q7, energy_variation_Q7; - SKP_int32 delta_Q16, BWExp1_Q16, BWExp2_Q16, gain_mult_Q16, gain_add_Q16, strength_Q16, b_Q8; - SKP_int32 auto_corr[ MAX_SHAPE_LPC_ORDER + 1 ]; - SKP_int32 refl_coef_Q16[ MAX_SHAPE_LPC_ORDER ]; - SKP_int32 AR1_Q24[ MAX_SHAPE_LPC_ORDER ]; - SKP_int32 AR2_Q24[ MAX_SHAPE_LPC_ORDER ]; - SKP_int16 x_windowed[ SHAPE_LPC_WIN_MAX ]; - const SKP_int16 *x_ptr, *pitch_res_ptr; - - SKP_int32 sqrt_nrg[ NB_SUBFR ], Qnrg_vec[ NB_SUBFR ]; - - /* 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_SMULWB( SKP_LSHIFT( ( SKP_int32 )psEnc->BufferedInChannel_ms, 7 ), - SKP_FIX_CONST( 0.05, 16 ) ); - - /* Reduce SNR_dB if inband FEC used */ - if( psEnc->speech_activity_Q8 > SKP_FIX_CONST( LBRR_SPEECH_ACTIVITY_THRES, 8 ) ) { - psEncCtrl->current_SNR_dB_Q7 -= SKP_RSHIFT( psEnc->inBandFEC_SNR_comp_Q8, 1 ); - } - - /****************/ - /* GAIN CONTROL */ - /****************/ - /* Input quality is the average of the quality in the lowest two VAD bands */ - psEncCtrl->input_quality_Q14 = ( SKP_int )SKP_RSHIFT( ( SKP_int32 )psEncCtrl->input_quality_bands_Q15[ 0 ] - + psEncCtrl->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 - - SKP_FIX_CONST( 18.0, 7 ), 4 ) ), 1 ); - - /* Reduce coding SNR during low speech activity */ - b_Q8 = SKP_FIX_CONST( 1.0, 8 ) - psEnc->speech_activity_Q8; - b_Q8 = SKP_SMULWB( SKP_LSHIFT( b_Q8, 8 ), b_Q8 ); - SNR_adj_dB_Q7 = SKP_SMLAWB( psEncCtrl->current_SNR_dB_Q7, - SKP_SMULBB( SKP_FIX_CONST( -BG_SNR_DECR_dB, 7 ) >> ( 4 + 1 ), b_Q8 ), // Q11 - SKP_SMULWB( SKP_FIX_CONST( 1.0, 14 ) + psEncCtrl->input_quality_Q14, psEncCtrl->coding_quality_Q14 ) ); // Q12 - - if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) { - /* Reduce gains for periodic signals */ - SNR_adj_dB_Q7 = SKP_SMLAWB( SNR_adj_dB_Q7, SKP_FIX_CONST( HARM_SNR_INCR_dB, 8 ), psEnc->LTPCorr_Q15 ); - } 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_FIX_CONST( 1.0, 14 ) - psEncCtrl->input_quality_Q14 ); - } - - /*************************/ - /* SPARSENESS PROCESSING */ - /*************************/ - /* Set quantizer offset */ - if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) { - /* Initally set to 0; may be overruled in process_gains(..) */ - psEncCtrl->sCmn.QuantOffsetType = 0; - psEncCtrl->sparseness_Q8 = 0; - } else { - /* Sparseness measure, based on relative fluctuations of energy per 2 milliseconds */ - nSamples = SKP_LSHIFT( psEnc->sCmn.fs_kHz, 1 ); - energy_variation_Q7 = 0; - log_energy_prev_Q7 = 0; - pitch_res_ptr = pitch_res; - for( k = 0; k < FRAME_LENGTH_MS / 2; k++ ) { - SKP_Silk_sum_sqr_shift( &nrg, &scale, pitch_res_ptr, nSamples ); - nrg += SKP_RSHIFT( nSamples, scale ); // Q(-scale) - - log_energy_Q7 = SKP_Silk_lin2log( nrg ); - if( k > 0 ) { - energy_variation_Q7 += SKP_abs( log_energy_Q7 - log_energy_prev_Q7 ); - } - log_energy_prev_Q7 = log_energy_Q7; - pitch_res_ptr += nSamples; - } - - psEncCtrl->sparseness_Q8 = SKP_RSHIFT( SKP_Silk_sigm_Q15( SKP_SMULWB( energy_variation_Q7 - - SKP_FIX_CONST( 5.0, 7 ), SKP_FIX_CONST( 0.1, 16 ) ) ), 7 ); - - /* Set quantization offset depending on sparseness measure */ - if( psEncCtrl->sparseness_Q8 > SKP_FIX_CONST( SPARSENESS_THRESHOLD_QNT_OFFSET, 8 ) ) { - psEncCtrl->sCmn.QuantOffsetType = 0; - } else { - psEncCtrl->sCmn.QuantOffsetType = 1; - } - - /* Increase coding SNR for sparse signals */ - SNR_adj_dB_Q7 = SKP_SMLAWB( SNR_adj_dB_Q7, SKP_FIX_CONST( SPARSE_SNR_INCR_dB, 15 ), psEncCtrl->sparseness_Q8 - SKP_FIX_CONST( 0.5, 8 ) ); - } - - /*******************************/ - /* Control bandwidth expansion */ - /*******************************/ - /* More BWE for signals with high prediction gain */ - strength_Q16 = SKP_SMULWB( psEncCtrl->predGain_Q16, SKP_FIX_CONST( FIND_PITCH_WHITE_NOISE_FRACTION, 16 ) ); - BWExp1_Q16 = BWExp2_Q16 = SKP_DIV32_varQ( SKP_FIX_CONST( BANDWIDTH_EXPANSION, 16 ), - SKP_SMLAWW( SKP_FIX_CONST( 1.0, 16 ), strength_Q16, strength_Q16 ), 16 ); - delta_Q16 = SKP_SMULWB( SKP_FIX_CONST( 1.0, 16 ) - SKP_SMULBB( 3, psEncCtrl->coding_quality_Q14 ), - SKP_FIX_CONST( LOW_RATE_BANDWIDTH_EXPANSION_DELTA, 16 ) ); - BWExp1_Q16 = SKP_SUB32( BWExp1_Q16, delta_Q16 ); - BWExp2_Q16 = SKP_ADD32( BWExp2_Q16, delta_Q16 ); - /* BWExp1 will be applied after BWExp2, so make it relative */ - BWExp1_Q16 = SKP_DIV32_16( SKP_LSHIFT( BWExp1_Q16, 14 ), SKP_RSHIFT( BWExp2_Q16, 2 ) ); - - if( psEnc->sCmn.warping_Q16 > 0 ) { - /* Slightly more warping in analysis will move quantization noise up in frequency, where it's better masked */ - warping_Q16 = SKP_SMLAWB( psEnc->sCmn.warping_Q16, psEncCtrl->coding_quality_Q14, SKP_FIX_CONST( 0.01, 18 ) ); - } else { - warping_Q16 = 0; - } - - /********************************************/ - /* Compute noise shaping AR coefs and gains */ - /********************************************/ - for( k = 0; k < NB_SUBFR; k++ ) { - /* Apply window: sine slope followed by flat part followed by cosine slope */ - SKP_int shift, slope_part, flat_part; - flat_part = psEnc->sCmn.fs_kHz * 5; - slope_part = SKP_RSHIFT( psEnc->sCmn.shapeWinLength - flat_part, 1 ); - - SKP_Silk_apply_sine_window_new( x_windowed, x_ptr, 1, slope_part ); - shift = slope_part; - SKP_memcpy( x_windowed + shift, x_ptr + shift, flat_part * sizeof(SKP_int16) ); - shift += flat_part; - SKP_Silk_apply_sine_window_new( x_windowed + shift, x_ptr + shift, 2, slope_part ); - - /* Update pointer: next LPC analysis block */ - x_ptr += psEnc->sCmn.subfr_length; - - if( psEnc->sCmn.warping_Q16 > 0 ) { - /* Calculate warped auto correlation */ - SKP_Silk_warped_autocorrelation_FIX( auto_corr, &scale, x_windowed, warping_Q16, psEnc->sCmn.shapeWinLength, psEnc->sCmn.shapingLPCOrder ); - } else { - /* Calculate regular auto correlation */ - SKP_Silk_autocorr( auto_corr, &scale, x_windowed, psEnc->sCmn.shapeWinLength, psEnc->sCmn.shapingLPCOrder + 1 ); - } - - /* Add white noise, as a fraction of energy */ - auto_corr[0] = SKP_ADD32( auto_corr[0], SKP_max_32( SKP_SMULWB( SKP_RSHIFT( auto_corr[ 0 ], 4 ), - SKP_FIX_CONST( SHAPE_WHITE_NOISE_FRACTION, 20 ) ), 1 ) ); - - /* Calculate the reflection coefficients using schur */ - nrg = SKP_Silk_schur64( refl_coef_Q16, auto_corr, psEnc->sCmn.shapingLPCOrder ); - SKP_assert( nrg >= 0 ); - - /* Convert reflection coefficients to prediction coefficients */ - SKP_Silk_k2a_Q16( AR2_Q24, refl_coef_Q16, psEnc->sCmn.shapingLPCOrder ); - - Qnrg = -scale; // range: -12...30 - SKP_assert( Qnrg >= -12 ); - SKP_assert( Qnrg <= 30 ); - - /* Make sure that Qnrg is an even number */ - if( Qnrg & 1 ) { - Qnrg -= 1; - nrg >>= 1; - } - - tmp32 = SKP_Silk_SQRT_APPROX( nrg ); - Qnrg >>= 1; // range: -6...15 - - sqrt_nrg[ k ] = tmp32; - Qnrg_vec[ k ] = Qnrg; - - psEncCtrl->Gains_Q16[ k ] = SKP_LSHIFT_SAT32( tmp32, 16 - Qnrg ); - - if( psEnc->sCmn.warping_Q16 > 0 ) { - /* Adjust gain for warping */ - gain_mult_Q16 = warped_gain( AR2_Q24, warping_Q16, psEnc->sCmn.shapingLPCOrder ); - SKP_assert( psEncCtrl->Gains_Q16[ k ] >= 0 ); - psEncCtrl->Gains_Q16[ k ] = SKP_SMULWW( psEncCtrl->Gains_Q16[ k ], gain_mult_Q16 ); - if( psEncCtrl->Gains_Q16[ k ] < 0 ) { - psEncCtrl->Gains_Q16[ k ] = SKP_int32_MAX; - } - } - - /* Bandwidth expansion for synthesis filter shaping */ - SKP_Silk_bwexpander_32( AR2_Q24, psEnc->sCmn.shapingLPCOrder, BWExp2_Q16 ); - - /* Compute noise shaping filter coefficients */ - SKP_memcpy( AR1_Q24, AR2_Q24, psEnc->sCmn.shapingLPCOrder * sizeof( SKP_int32 ) ); - - /* Bandwidth expansion for analysis filter shaping */ - SKP_assert( BWExp1_Q16 <= SKP_FIX_CONST( 1.0, 16 ) ); - SKP_Silk_bwexpander_32( AR1_Q24, psEnc->sCmn.shapingLPCOrder, BWExp1_Q16 ); - - /* Ratio of prediction gains, in energy domain */ - SKP_Silk_LPC_inverse_pred_gain_Q24( &pre_nrg_Q30, AR2_Q24, psEnc->sCmn.shapingLPCOrder ); - SKP_Silk_LPC_inverse_pred_gain_Q24( &nrg, AR1_Q24, psEnc->sCmn.shapingLPCOrder ); - - //psEncCtrl->GainsPre[ k ] = 1.0f - 0.7f * ( 1.0f - pre_nrg / nrg ) = 0.3f + 0.7f * pre_nrg / nrg; - pre_nrg_Q30 = SKP_LSHIFT32( SKP_SMULWB( pre_nrg_Q30, SKP_FIX_CONST( 0.7, 15 ) ), 1 ); - psEncCtrl->GainsPre_Q14[ k ] = ( SKP_int ) SKP_FIX_CONST( 0.3, 14 ) + SKP_DIV32_varQ( pre_nrg_Q30, nrg, 14 ); - - /* Convert to monic warped prediction coefficients and limit absolute values */ - limit_warped_coefs( AR2_Q24, AR1_Q24, warping_Q16, SKP_FIX_CONST( 3.999, 24 ), psEnc->sCmn.shapingLPCOrder ); - - /* Convert from Q24 to Q13 and store in int16 */ - for( i = 0; i < psEnc->sCmn.shapingLPCOrder; i++ ) { - psEncCtrl->AR1_Q13[ k * MAX_SHAPE_LPC_ORDER + i ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( AR1_Q24[ i ], 11 ) ); - psEncCtrl->AR2_Q13[ k * MAX_SHAPE_LPC_ORDER + i ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( AR2_Q24[ i ], 11 ) ); - } - } - - /*****************/ - /* Gain tweaking */ - /*****************/ - /* Increase gains during low speech activity and put lower limit on gains */ - gain_mult_Q16 = SKP_Silk_log2lin( -SKP_SMLAWB( -SKP_FIX_CONST( 16.0, 7 ), SNR_adj_dB_Q7, SKP_FIX_CONST( 0.16, 16 ) ) ); - gain_add_Q16 = SKP_Silk_log2lin( SKP_SMLAWB( SKP_FIX_CONST( 16.0, 7 ), SKP_FIX_CONST( NOISE_FLOOR_dB, 7 ), SKP_FIX_CONST( 0.16, 16 ) ) ); - tmp32 = SKP_Silk_log2lin( SKP_SMLAWB( SKP_FIX_CONST( 16.0, 7 ), SKP_FIX_CONST( RELATIVE_MIN_GAIN_dB, 7 ), SKP_FIX_CONST( 0.16, 16 ) ) ); - tmp32 = SKP_SMULWW( psEnc->avgGain_Q16, tmp32 ); - gain_add_Q16 = SKP_ADD_SAT32( gain_add_Q16, tmp32 ); - SKP_assert( gain_mult_Q16 >= 0 ); - - for( k = 0; k < NB_SUBFR; k++ ) { - psEncCtrl->Gains_Q16[ k ] = SKP_SMULWW( psEncCtrl->Gains_Q16[ k ], gain_mult_Q16 ); - if( psEncCtrl->Gains_Q16[ k ] < 0 ) { - psEncCtrl->Gains_Q16[ k ] = SKP_int32_MAX; - } - } - - for( k = 0; k < NB_SUBFR; k++ ) { - psEncCtrl->Gains_Q16[ k ] = SKP_ADD_POS_SAT32( psEncCtrl->Gains_Q16[ k ], gain_add_Q16 ); - psEnc->avgGain_Q16 = SKP_ADD_SAT32( - psEnc->avgGain_Q16, - SKP_SMULWB( - psEncCtrl->Gains_Q16[ k ] - psEnc->avgGain_Q16, - SKP_RSHIFT_ROUND( SKP_SMULBB( psEnc->speech_activity_Q8, SKP_FIX_CONST( GAIN_SMOOTHING_COEF, 10 ) ), 2 ) - ) ); - } - - /************************************************/ - /* Decrease level during fricatives (de-essing) */ - /************************************************/ - gain_mult_Q16 = SKP_FIX_CONST( 1.0, 16 ) + SKP_RSHIFT_ROUND( SKP_MLA( SKP_FIX_CONST( INPUT_TILT, 26 ), - psEncCtrl->coding_quality_Q14, SKP_FIX_CONST( HIGH_RATE_INPUT_TILT, 12 ) ), 10 ); - - if( psEncCtrl->input_tilt_Q15 <= 0 && psEncCtrl->sCmn.sigtype == SIG_TYPE_UNVOICED ) { - if( psEnc->sCmn.fs_kHz == 24 ) { - SKP_int32 essStrength_Q15 = SKP_SMULWW( -psEncCtrl->input_tilt_Q15, - SKP_SMULBB( psEnc->speech_activity_Q8, SKP_FIX_CONST( 1.0, 8 ) - psEncCtrl->sparseness_Q8 ) ); - tmp32 = SKP_Silk_log2lin( SKP_FIX_CONST( 16.0, 7 ) - SKP_SMULWB( essStrength_Q15, - SKP_SMULWB( SKP_FIX_CONST( DE_ESSER_COEF_SWB_dB, 7 ), SKP_FIX_CONST( 0.16, 17 ) ) ) ); - gain_mult_Q16 = SKP_SMULWW( gain_mult_Q16, tmp32 ); - } else if( psEnc->sCmn.fs_kHz == 16 ) { - SKP_int32 essStrength_Q15 = SKP_SMULWW(-psEncCtrl->input_tilt_Q15, - SKP_SMULBB( psEnc->speech_activity_Q8, SKP_FIX_CONST( 1.0, 8 ) - psEncCtrl->sparseness_Q8 )); - tmp32 = SKP_Silk_log2lin( SKP_FIX_CONST( 16.0, 7 ) - SKP_SMULWB( essStrength_Q15, - SKP_SMULWB( SKP_FIX_CONST( DE_ESSER_COEF_WB_dB, 7 ), SKP_FIX_CONST( 0.16, 17 ) ) ) ); - gain_mult_Q16 = SKP_SMULWW( gain_mult_Q16, tmp32 ); - } else { - SKP_assert( psEnc->sCmn.fs_kHz == 12 || psEnc->sCmn.fs_kHz == 8 ); - } - } - - for( k = 0; k < NB_SUBFR; k++ ) { - psEncCtrl->GainsPre_Q14[ k ] = SKP_SMULWB( gain_mult_Q16, psEncCtrl->GainsPre_Q14[ k ] ); - } - - /************************************************/ - /* Control low-frequency shaping and noise tilt */ - /************************************************/ - /* Less low frequency shaping for noisy inputs */ - strength_Q16 = SKP_MUL( SKP_FIX_CONST( LOW_FREQ_SHAPING, 0 ), SKP_FIX_CONST( 1.0, 16 ) + - SKP_SMULBB( SKP_FIX_CONST( LOW_QUALITY_LOW_FREQ_SHAPING_DECR, 1 ), psEncCtrl->input_quality_bands_Q15[ 0 ] - SKP_FIX_CONST( 1.0, 15 ) ) ); - if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) { - /* Reduce low frequencies quantization noise for periodic signals, depending on pitch lag */ - /*f = 400; freqz([1, -0.98 + 2e-4 * f], [1, -0.97 + 7e-4 * f], 2^12, Fs); axis([0, 1000, -10, 1])*/ - SKP_int fs_kHz_inv = SKP_DIV32_16( SKP_FIX_CONST( 0.2, 14 ), psEnc->sCmn.fs_kHz ); - for( k = 0; k < NB_SUBFR; k++ ) { - b_Q14 = fs_kHz_inv + SKP_DIV32_16( SKP_FIX_CONST( 3.0, 14 ), psEncCtrl->sCmn.pitchL[ k ] ); - /* Pack two coefficients in one int32 */ - psEncCtrl->LF_shp_Q14[ k ] = SKP_LSHIFT( SKP_FIX_CONST( 1.0, 14 ) - b_Q14 - SKP_SMULWB( strength_Q16, b_Q14 ), 16 ); - psEncCtrl->LF_shp_Q14[ k ] |= (SKP_uint16)( b_Q14 - SKP_FIX_CONST( 1.0, 14 ) ); - } - SKP_assert( SKP_FIX_CONST( HARM_HP_NOISE_COEF, 24 ) < SKP_FIX_CONST( 0.5, 24 ) ); // Guarantees that second argument to SMULWB() is within range of an SKP_int16 - Tilt_Q16 = - SKP_FIX_CONST( HP_NOISE_COEF, 16 ) - - SKP_SMULWB( SKP_FIX_CONST( 1.0, 16 ) - SKP_FIX_CONST( HP_NOISE_COEF, 16 ), - SKP_SMULWB( SKP_FIX_CONST( HARM_HP_NOISE_COEF, 24 ), psEnc->speech_activity_Q8 ) ); - } else { - b_Q14 = SKP_DIV32_16( 21299, psEnc->sCmn.fs_kHz ); // 1.3_Q0 = 21299_Q14 - /* Pack two coefficients in one int32 */ - psEncCtrl->LF_shp_Q14[ 0 ] = SKP_LSHIFT( SKP_FIX_CONST( 1.0, 14 ) - b_Q14 - - SKP_SMULWB( strength_Q16, SKP_SMULWB( SKP_FIX_CONST( 0.6, 16 ), b_Q14 ) ), 16 ); - psEncCtrl->LF_shp_Q14[ 0 ] |= (SKP_uint16)( b_Q14 - SKP_FIX_CONST( 1.0, 14 ) ); - for( k = 1; k < NB_SUBFR; k++ ) { - psEncCtrl->LF_shp_Q14[ k ] = psEncCtrl->LF_shp_Q14[ 0 ]; - } - Tilt_Q16 = -SKP_FIX_CONST( HP_NOISE_COEF, 16 ); - } - - /****************************/ - /* HARMONIC SHAPING CONTROL */ - /****************************/ - /* Control boosting of harmonic frequencies */ - HarmBoost_Q16 = SKP_SMULWB( SKP_SMULWB( SKP_FIX_CONST( 1.0, 17 ) - SKP_LSHIFT( psEncCtrl->coding_quality_Q14, 3 ), - psEnc->LTPCorr_Q15 ), SKP_FIX_CONST( LOW_RATE_HARMONIC_BOOST, 16 ) ); - - /* More harmonic boost for noisy input signals */ - HarmBoost_Q16 = SKP_SMLAWB( HarmBoost_Q16, - SKP_FIX_CONST( 1.0, 16 ) - SKP_LSHIFT( psEncCtrl->input_quality_Q14, 2 ), SKP_FIX_CONST( LOW_INPUT_QUALITY_HARMONIC_BOOST, 16 ) ); - - if( USE_HARM_SHAPING && psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) { - /* More harmonic noise shaping for high bitrates or noisy input */ - HarmShapeGain_Q16 = SKP_SMLAWB( SKP_FIX_CONST( HARMONIC_SHAPING, 16 ), - SKP_FIX_CONST( 1.0, 16 ) - SKP_SMULWB( SKP_FIX_CONST( 1.0, 18 ) - SKP_LSHIFT( psEncCtrl->coding_quality_Q14, 4 ), - psEncCtrl->input_quality_Q14 ), SKP_FIX_CONST( HIGH_RATE_OR_LOW_QUALITY_HARMONIC_SHAPING, 16 ) ); - - /* Less harmonic noise shaping for less periodic signals */ - HarmShapeGain_Q16 = SKP_SMULWB( SKP_LSHIFT( HarmShapeGain_Q16, 1 ), - SKP_Silk_SQRT_APPROX( SKP_LSHIFT( psEnc->LTPCorr_Q15, 15 ) ) ); - } else { - HarmShapeGain_Q16 = 0; - } - - /*************************/ - /* Smooth over subframes */ - /*************************/ - for( k = 0; k < NB_SUBFR; k++ ) { - psShapeSt->HarmBoost_smth_Q16 = - SKP_SMLAWB( psShapeSt->HarmBoost_smth_Q16, HarmBoost_Q16 - psShapeSt->HarmBoost_smth_Q16, SKP_FIX_CONST( SUBFR_SMTH_COEF, 16 ) ); - psShapeSt->HarmShapeGain_smth_Q16 = - SKP_SMLAWB( psShapeSt->HarmShapeGain_smth_Q16, HarmShapeGain_Q16 - psShapeSt->HarmShapeGain_smth_Q16, SKP_FIX_CONST( SUBFR_SMTH_COEF, 16 ) ); - psShapeSt->Tilt_smth_Q16 = - SKP_SMLAWB( psShapeSt->Tilt_smth_Q16, Tilt_Q16 - psShapeSt->Tilt_smth_Q16, SKP_FIX_CONST( SUBFR_SMTH_COEF, 16 ) ); - - psEncCtrl->HarmBoost_Q14[ k ] = ( SKP_int )SKP_RSHIFT_ROUND( psShapeSt->HarmBoost_smth_Q16, 2 ); - psEncCtrl->HarmShapeGain_Q14[ k ] = ( SKP_int )SKP_RSHIFT_ROUND( psShapeSt->HarmShapeGain_smth_Q16, 2 ); - psEncCtrl->Tilt_Q14[ k ] = ( SKP_int )SKP_RSHIFT_ROUND( psShapeSt->Tilt_smth_Q16, 2 ); - } -} diff --git a/libs/silk/src/SKP_Silk_pitch_analysis_core.c b/libs/silk/src/SKP_Silk_pitch_analysis_core.c deleted file mode 100644 index 50bd1499ae..0000000000 --- a/libs/silk/src/SKP_Silk_pitch_analysis_core.c +++ /dev/null @@ -1,707 +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. -***********************************************************************/ - -/*********************************************************** -* Pitch analyser function -********************************************************** */ -#include "SKP_Silk_SigProc_FIX.h" -#include "SKP_Silk_pitch_est_defines.h" -#include "SKP_Silk_common_pitch_est_defines.h" - -#define SCRATCH_SIZE 22 - -/************************************************************/ -/* Internally used functions */ -/************************************************************/ -void SKP_FIX_P_Ana_calc_corr_st3( - SKP_int32 cross_corr_st3[PITCH_EST_NB_SUBFR][PITCH_EST_NB_CBKS_STAGE3_MAX][PITCH_EST_NB_STAGE3_LAGS],/* (O) 3 DIM correlation array */ - const SKP_int16 signal[], /* I vector to correlate */ - SKP_int start_lag, /* I lag offset to search around */ - SKP_int sf_length, /* I length of a 5 ms subframe */ - SKP_int complexity /* I Complexity setting */ -); - -void SKP_FIX_P_Ana_calc_energy_st3( - SKP_int32 energies_st3[PITCH_EST_NB_SUBFR][PITCH_EST_NB_CBKS_STAGE3_MAX][PITCH_EST_NB_STAGE3_LAGS],/* (O) 3 DIM energy array */ - const SKP_int16 signal[], /* I vector to calc energy in */ - SKP_int start_lag, /* I lag offset to search around */ - SKP_int sf_length, /* I length of one 5 ms subframe */ - SKP_int complexity /* I Complexity setting */ -); - -SKP_int32 SKP_FIX_P_Ana_find_scaling( - const SKP_int16 *signal, - const SKP_int signal_length, - const SKP_int sum_sqr_len -); - -/*************************************************************/ -/* FIXED POINT CORE PITCH ANALYSIS FUNCTION */ -/*************************************************************/ -SKP_int SKP_Silk_pitch_analysis_core( /* O Voicing estimate: 0 voiced, 1 unvoiced */ - const SKP_int16 *signal, /* I Signal of length PITCH_EST_FRAME_LENGTH_MS*Fs_kHz */ - SKP_int *pitch_out, /* O 4 pitch lag values */ - SKP_int *lagIndex, /* O Lag Index */ - SKP_int *contourIndex, /* O Pitch contour Index */ - SKP_int *LTPCorr_Q15, /* I/O Normalized correlation; input: value from previous frame */ - SKP_int prevLag, /* I Last lag of previous frame; set to zero is unvoiced */ - const SKP_int32 search_thres1_Q16, /* I First stage threshold for lag candidates 0 - 1 */ - const SKP_int search_thres2_Q15, /* I Final threshold for lag candidates 0 - 1 */ - const SKP_int Fs_kHz, /* I Sample frequency (kHz) */ - const SKP_int complexity, /* I Complexity setting, 0-2, where 2 is highest */ - const SKP_int forLJC /* I 1 if this function is called from LJC code, 0 otherwise. */ -) -{ - SKP_int16 signal_8kHz[ PITCH_EST_MAX_FRAME_LENGTH_ST_2 ]; - SKP_int16 signal_4kHz[ PITCH_EST_MAX_FRAME_LENGTH_ST_1 ]; - SKP_int32 scratch_mem[ 3 * PITCH_EST_MAX_FRAME_LENGTH ]; - SKP_int16 *input_signal_ptr; - SKP_int32 filt_state[ PITCH_EST_MAX_DECIMATE_STATE_LENGTH ]; - SKP_int i, k, d, j; - SKP_int16 C[ PITCH_EST_NB_SUBFR ][ ( PITCH_EST_MAX_LAG >> 1 ) + 5 ]; - const SKP_int16 *target_ptr, *basis_ptr; - SKP_int32 cross_corr, normalizer, energy, shift, energy_basis, energy_target; - SKP_int d_srch[ PITCH_EST_D_SRCH_LENGTH ]; - SKP_int16 d_comp[ ( PITCH_EST_MAX_LAG >> 1 ) + 5 ]; - SKP_int Cmax, length_d_srch, length_d_comp; - SKP_int32 sum, threshold, temp32; - SKP_int CBimax, CBimax_new, CBimax_old, lag, start_lag, end_lag, lag_new; - SKP_int32 CC[ PITCH_EST_NB_CBKS_STAGE2_EXT ], CCmax, CCmax_b, CCmax_new_b, CCmax_new; - SKP_int32 energies_st3[ PITCH_EST_NB_SUBFR ][ PITCH_EST_NB_CBKS_STAGE3_MAX ][ PITCH_EST_NB_STAGE3_LAGS ]; - SKP_int32 crosscorr_st3[ PITCH_EST_NB_SUBFR ][ PITCH_EST_NB_CBKS_STAGE3_MAX ][ PITCH_EST_NB_STAGE3_LAGS ]; - SKP_int32 lag_counter; - SKP_int frame_length, frame_length_8kHz, frame_length_4kHz, max_sum_sq_length; - SKP_int sf_length, sf_length_8kHz, sf_length_4kHz; - SKP_int min_lag, min_lag_8kHz, min_lag_4kHz; - SKP_int max_lag, max_lag_8kHz, max_lag_4kHz; - SKP_int32 contour_bias, diff; - SKP_int32 lz, lshift; - SKP_int cbk_offset, cbk_size, nb_cbks_stage2; - SKP_int32 delta_lag_log2_sqr_Q7, lag_log2_Q7, prevLag_log2_Q7, prev_lag_bias_Q15, corr_thres_Q15; - - /* Check for valid sampling frequency */ - SKP_assert( Fs_kHz == 8 || Fs_kHz == 12 || Fs_kHz == 16 || Fs_kHz == 24 ); - - /* Check for valid complexity setting */ - SKP_assert( complexity >= SKP_Silk_PITCH_EST_MIN_COMPLEX ); - SKP_assert( complexity <= SKP_Silk_PITCH_EST_MAX_COMPLEX ); - - SKP_assert( search_thres1_Q16 >= 0 && search_thres1_Q16 <= (1<<16) ); - SKP_assert( search_thres2_Q15 >= 0 && search_thres2_Q15 <= (1<<15) ); - - /* Setup frame lengths max / min lag for the sampling frequency */ - frame_length = PITCH_EST_FRAME_LENGTH_MS * Fs_kHz; - frame_length_4kHz = PITCH_EST_FRAME_LENGTH_MS * 4; - frame_length_8kHz = PITCH_EST_FRAME_LENGTH_MS * 8; - sf_length = SKP_RSHIFT( frame_length, 3 ); - sf_length_4kHz = SKP_RSHIFT( frame_length_4kHz, 3 ); - sf_length_8kHz = SKP_RSHIFT( frame_length_8kHz, 3 ); - min_lag = PITCH_EST_MIN_LAG_MS * Fs_kHz; - min_lag_4kHz = PITCH_EST_MIN_LAG_MS * 4; - min_lag_8kHz = PITCH_EST_MIN_LAG_MS * 8; - max_lag = PITCH_EST_MAX_LAG_MS * Fs_kHz; - max_lag_4kHz = PITCH_EST_MAX_LAG_MS * 4; - max_lag_8kHz = PITCH_EST_MAX_LAG_MS * 8; - - SKP_memset( C, 0, sizeof( SKP_int16 ) * PITCH_EST_NB_SUBFR * ( ( PITCH_EST_MAX_LAG >> 1 ) + 5) ); - - /* Resample from input sampled at Fs_kHz to 8 kHz */ - if( Fs_kHz == 16 ) { - SKP_memset( filt_state, 0, 2 * sizeof( SKP_int32 ) ); - SKP_Silk_resampler_down2( filt_state, signal_8kHz, signal, frame_length ); - } else if ( Fs_kHz == 12 ) { - SKP_int32 R23[ 6 ]; - SKP_memset( R23, 0, 6 * sizeof( SKP_int32 ) ); - SKP_Silk_resampler_down2_3( R23, signal_8kHz, signal, PITCH_EST_FRAME_LENGTH_MS * 12 ); - } else if( Fs_kHz == 24 ) { - SKP_int32 filt_state_fix[ 8 ]; - SKP_memset( filt_state_fix, 0, 8 * sizeof(SKP_int32) ); - SKP_Silk_resampler_down3( filt_state_fix, signal_8kHz, signal, 24 * PITCH_EST_FRAME_LENGTH_MS ); - } else { - SKP_assert( Fs_kHz == 8 ); - SKP_memcpy( signal_8kHz, signal, frame_length_8kHz * sizeof(SKP_int16) ); - } - /* Decimate again to 4 kHz */ - SKP_memset( filt_state, 0, 2 * sizeof( SKP_int32 ) );/* Set state to zero */ - SKP_Silk_resampler_down2( filt_state, signal_4kHz, signal_8kHz, frame_length_8kHz ); - - /* Low-pass filter */ - for( i = frame_length_4kHz - 1; i > 0; i-- ) { - signal_4kHz[ i ] = SKP_ADD_SAT16( signal_4kHz[ i ], signal_4kHz[ i - 1 ] ); - } - - /******************************************************************************* - ** Scale 4 kHz signal down to prevent correlations measures from overflowing - ** find scaling as max scaling for each 8kHz(?) subframe - *******************************************************************************/ - - /* Inner product is calculated with different lengths, so scale for the worst case */ - max_sum_sq_length = SKP_max_32( sf_length_8kHz, SKP_RSHIFT( frame_length_4kHz, 1 ) ); - shift = SKP_FIX_P_Ana_find_scaling( signal_4kHz, frame_length_4kHz, max_sum_sq_length ); - if( shift > 0 ) { - for( i = 0; i < frame_length_4kHz; i++ ) { - signal_4kHz[ i ] = SKP_RSHIFT( signal_4kHz[ i ], shift ); - } - } - - /****************************************************************************** - * FIRST STAGE, operating in 4 khz - ******************************************************************************/ - target_ptr = &signal_4kHz[ SKP_RSHIFT( frame_length_4kHz, 1 ) ]; - for( k = 0; k < 2; k++ ) { - /* Check that we are within range of the array */ - SKP_assert( target_ptr >= signal_4kHz ); - SKP_assert( target_ptr + sf_length_8kHz <= signal_4kHz + frame_length_4kHz ); - - basis_ptr = target_ptr - min_lag_4kHz; - - /* Check that we are within range of the array */ - SKP_assert( basis_ptr >= signal_4kHz ); - SKP_assert( basis_ptr + sf_length_8kHz <= signal_4kHz + frame_length_4kHz ); - - normalizer = 0; - cross_corr = 0; - /* Calculate first vector products before loop */ - cross_corr = SKP_Silk_inner_prod_aligned( target_ptr, basis_ptr, sf_length_8kHz ); - normalizer = SKP_Silk_inner_prod_aligned( basis_ptr, basis_ptr, sf_length_8kHz ); - normalizer = SKP_ADD_SAT32( normalizer, SKP_SMULBB( sf_length_8kHz, 4000 ) ); - - temp32 = SKP_DIV32( cross_corr, SKP_Silk_SQRT_APPROX( normalizer ) + 1 ); - C[ k ][ min_lag_4kHz ] = (SKP_int16)SKP_SAT16( temp32 ); /* Q0 */ - - /* From now on normalizer is computed recursively */ - for( d = min_lag_4kHz + 1; d <= max_lag_4kHz; d++ ) { - basis_ptr--; - - /* Check that we are within range of the array */ - SKP_assert( basis_ptr >= signal_4kHz ); - SKP_assert( basis_ptr + sf_length_8kHz <= signal_4kHz + frame_length_4kHz ); - - cross_corr = SKP_Silk_inner_prod_aligned( target_ptr, basis_ptr, sf_length_8kHz ); - - /* Add contribution of new sample and remove contribution from oldest sample */ - normalizer += - SKP_SMULBB( basis_ptr[ 0 ], basis_ptr[ 0 ] ) - - SKP_SMULBB( basis_ptr[ sf_length_8kHz ], basis_ptr[ sf_length_8kHz ] ); - - temp32 = SKP_DIV32( cross_corr, SKP_Silk_SQRT_APPROX( normalizer ) + 1 ); - C[ k ][ d ] = (SKP_int16)SKP_SAT16( temp32 ); /* Q0 */ - } - /* Update target pointer */ - target_ptr += sf_length_8kHz; - } - - /* Combine two subframes into single correlation measure and apply short-lag bias */ - for( i = max_lag_4kHz; i >= min_lag_4kHz; i-- ) { - sum = (SKP_int32)C[ 0 ][ i ] + (SKP_int32)C[ 1 ][ i ]; /* Q0 */ - SKP_assert( SKP_RSHIFT( sum, 1 ) == SKP_SAT16( SKP_RSHIFT( sum, 1 ) ) ); - sum = SKP_RSHIFT( sum, 1 ); /* Q-1 */ - SKP_assert( SKP_LSHIFT( (SKP_int32)-i, 4 ) == SKP_SAT16( SKP_LSHIFT( (SKP_int32)-i, 4 ) ) ); - sum = SKP_SMLAWB( sum, sum, SKP_LSHIFT( -i, 4 ) ); /* Q-1 */ - SKP_assert( sum == SKP_SAT16( sum ) ); - C[ 0 ][ i ] = (SKP_int16)sum; /* Q-1 */ - } - - /* Sort */ - length_d_srch = 4 + 2 * complexity; - SKP_assert( 3 * length_d_srch <= PITCH_EST_D_SRCH_LENGTH ); - SKP_Silk_insertion_sort_decreasing_int16( &C[ 0 ][ min_lag_4kHz ], d_srch, max_lag_4kHz - min_lag_4kHz + 1, length_d_srch ); - - /* Escape if correlation is very low already here */ - target_ptr = &signal_4kHz[ SKP_RSHIFT( frame_length_4kHz, 1 ) ]; - energy = SKP_Silk_inner_prod_aligned( target_ptr, target_ptr, SKP_RSHIFT( frame_length_4kHz, 1 ) ); - energy = SKP_ADD_POS_SAT32( energy, 1000 ); /* Q0 */ - Cmax = (SKP_int)C[ 0 ][ min_lag_4kHz ]; /* Q-1 */ - threshold = SKP_SMULBB( Cmax, Cmax ); /* Q-2 */ - /* Compare in Q-2 domain */ - if( SKP_RSHIFT( energy, 4 + 2 ) > threshold ) { - SKP_memset( pitch_out, 0, PITCH_EST_NB_SUBFR * sizeof( SKP_int ) ); - *LTPCorr_Q15 = 0; - *lagIndex = 0; - *contourIndex = 0; - return 1; - } - - threshold = SKP_SMULWB( search_thres1_Q16, Cmax ); - for( i = 0; i < length_d_srch; i++ ) { - /* Convert to 8 kHz indices for the sorted correlation that exceeds the threshold */ - if( C[ 0 ][ min_lag_4kHz + i ] > threshold ) { - d_srch[ i ] = SKP_LSHIFT( d_srch[ i ] + min_lag_4kHz, 1 ); - } else { - length_d_srch = i; - break; - } - } - SKP_assert( length_d_srch > 0 ); - - for( i = min_lag_8kHz - 5; i < max_lag_8kHz + 5; i++ ) { - d_comp[ i ] = 0; - } - for( i = 0; i < length_d_srch; i++ ) { - d_comp[ d_srch[ i ] ] = 1; - } - - /* Convolution */ - for( i = max_lag_8kHz + 3; i >= min_lag_8kHz; i-- ) { - d_comp[ i ] += d_comp[ i - 1 ] + d_comp[ i - 2 ]; - } - - length_d_srch = 0; - for( i = min_lag_8kHz; i < max_lag_8kHz + 1; i++ ) { - if( d_comp[ i + 1 ] > 0 ) { - d_srch[ length_d_srch ] = i; - length_d_srch++; - } - } - - /* Convolution */ - for( i = max_lag_8kHz + 3; i >= min_lag_8kHz; i-- ) { - d_comp[ i ] += d_comp[ i - 1 ] + d_comp[ i - 2 ] + d_comp[ i - 3 ]; - } - - length_d_comp = 0; - for( i = min_lag_8kHz; i < max_lag_8kHz + 4; i++ ) { - if( d_comp[ i ] > 0 ) { - d_comp[ length_d_comp ] = i - 2; - length_d_comp++; - } - } - - /********************************************************************************** - ** SECOND STAGE, operating at 8 kHz, on lag sections with high correlation - *************************************************************************************/ - - /****************************************************************************** - ** Scale signal down to avoid correlations measures from overflowing - *******************************************************************************/ - /* find scaling as max scaling for each subframe */ - shift = SKP_FIX_P_Ana_find_scaling( signal_8kHz, frame_length_8kHz, sf_length_8kHz ); - if( shift > 0 ) { - for( i = 0; i < frame_length_8kHz; i++ ) { - signal_8kHz[ i ] = SKP_RSHIFT( signal_8kHz[ i ], shift ); - } - } - - /********************************************************************************* - * Find energy of each subframe projected onto its history, for a range of delays - *********************************************************************************/ - SKP_memset( C, 0, PITCH_EST_NB_SUBFR * ( ( PITCH_EST_MAX_LAG >> 1 ) + 5 ) * sizeof( SKP_int16 ) ); - - target_ptr = &signal_8kHz[ frame_length_4kHz ]; /* point to middle of frame */ - for( k = 0; k < PITCH_EST_NB_SUBFR; k++ ) { - - /* Check that we are within range of the array */ - SKP_assert( target_ptr >= signal_8kHz ); - SKP_assert( target_ptr + sf_length_8kHz <= signal_8kHz + frame_length_8kHz ); - - energy_target = SKP_Silk_inner_prod_aligned( target_ptr, target_ptr, sf_length_8kHz ); - // ToDo: Calculate 1 / energy_target here and save one division inside next for loop - for( j = 0; j < length_d_comp; j++ ) { - d = d_comp[ j ]; - basis_ptr = target_ptr - d; - - /* Check that we are within range of the array */ - SKP_assert( basis_ptr >= signal_8kHz ); - SKP_assert( basis_ptr + sf_length_8kHz <= signal_8kHz + frame_length_8kHz ); - - cross_corr = SKP_Silk_inner_prod_aligned( target_ptr, basis_ptr, sf_length_8kHz ); - energy_basis = SKP_Silk_inner_prod_aligned( basis_ptr, basis_ptr, sf_length_8kHz ); - if( cross_corr > 0 ) { - energy = SKP_max( energy_target, energy_basis ); /* Find max to make sure first division < 1.0 */ - lz = SKP_Silk_CLZ32( cross_corr ); - lshift = SKP_LIMIT_32( lz - 1, 0, 15 ); - temp32 = SKP_DIV32( SKP_LSHIFT( cross_corr, lshift ), SKP_RSHIFT( energy, 15 - lshift ) + 1 ); /* Q15 */ - SKP_assert( temp32 == SKP_SAT16( temp32 ) ); - temp32 = SKP_SMULWB( cross_corr, temp32 ); /* Q(-1), cc * ( cc / max(b, t) ) */ - temp32 = SKP_ADD_SAT32( temp32, temp32 ); /* Q(0) */ - lz = SKP_Silk_CLZ32( temp32 ); - lshift = SKP_LIMIT_32( lz - 1, 0, 15 ); - energy = SKP_min( energy_target, energy_basis ); - C[ k ][ d ] = SKP_DIV32( SKP_LSHIFT( temp32, lshift ), SKP_RSHIFT( energy, 15 - lshift ) + 1 ); // Q15 - } else { - C[ k ][ d ] = 0; - } - } - target_ptr += sf_length_8kHz; - } - - /* search over lag range and lags codebook */ - /* scale factor for lag codebook, as a function of center lag */ - - CCmax = SKP_int32_MIN; - CCmax_b = SKP_int32_MIN; - - CBimax = 0; /* To avoid returning undefined lag values */ - lag = -1; /* To check if lag with strong enough correlation has been found */ - - if( prevLag > 0 ) { - if( Fs_kHz == 12 ) { - prevLag = SKP_DIV32_16( SKP_LSHIFT( prevLag, 1 ), 3 ); - } else if( Fs_kHz == 16 ) { - prevLag = SKP_RSHIFT( prevLag, 1 ); - } else if( Fs_kHz == 24 ) { - prevLag = SKP_DIV32_16( prevLag, 3 ); - } - prevLag_log2_Q7 = SKP_Silk_lin2log( (SKP_int32)prevLag ); - } else { - prevLag_log2_Q7 = 0; - } - SKP_assert( search_thres2_Q15 == SKP_SAT16( search_thres2_Q15 ) ); - corr_thres_Q15 = SKP_RSHIFT( SKP_SMULBB( search_thres2_Q15, search_thres2_Q15 ), 13 ); - - /* If input is 8 khz use a larger codebook here because it is last stage */ - if( Fs_kHz == 8 && complexity > SKP_Silk_PITCH_EST_MIN_COMPLEX ) { - nb_cbks_stage2 = PITCH_EST_NB_CBKS_STAGE2_EXT; - } else { - nb_cbks_stage2 = PITCH_EST_NB_CBKS_STAGE2; - } - - for( k = 0; k < length_d_srch; k++ ) { - d = d_srch[ k ]; - for( j = 0; j < nb_cbks_stage2; j++ ) { - CC[ j ] = 0; - for( i = 0; i < PITCH_EST_NB_SUBFR; i++ ) { - /* Try all codebooks */ - CC[ j ] = CC[ j ] + (SKP_int32)C[ i ][ d + SKP_Silk_CB_lags_stage2[ i ][ j ] ]; - } - } - /* Find best codebook */ - CCmax_new = SKP_int32_MIN; - CBimax_new = 0; - for( i = 0; i < nb_cbks_stage2; i++ ) { - if( CC[ i ] > CCmax_new ) { - CCmax_new = CC[ i ]; - CBimax_new = i; - } - } - - /* Bias towards shorter lags */ - lag_log2_Q7 = SKP_Silk_lin2log( (SKP_int32)d ); /* Q7 */ - SKP_assert( lag_log2_Q7 == SKP_SAT16( lag_log2_Q7 ) ); - SKP_assert( PITCH_EST_NB_SUBFR * PITCH_EST_SHORTLAG_BIAS_Q15 == SKP_SAT16( PITCH_EST_NB_SUBFR * PITCH_EST_SHORTLAG_BIAS_Q15 ) ); - - if (forLJC) { - CCmax_new_b = CCmax_new; - } else { - CCmax_new_b = CCmax_new - SKP_RSHIFT( SKP_SMULBB( PITCH_EST_NB_SUBFR * PITCH_EST_SHORTLAG_BIAS_Q15, lag_log2_Q7 ), 7 ); /* Q15 */ - } - - /* Bias towards previous lag */ - SKP_assert( PITCH_EST_NB_SUBFR * PITCH_EST_PREVLAG_BIAS_Q15 == SKP_SAT16( PITCH_EST_NB_SUBFR * PITCH_EST_PREVLAG_BIAS_Q15 ) ); - if( prevLag > 0 ) { - delta_lag_log2_sqr_Q7 = lag_log2_Q7 - prevLag_log2_Q7; - SKP_assert( delta_lag_log2_sqr_Q7 == SKP_SAT16( delta_lag_log2_sqr_Q7 ) ); - delta_lag_log2_sqr_Q7 = SKP_RSHIFT( SKP_SMULBB( delta_lag_log2_sqr_Q7, delta_lag_log2_sqr_Q7 ), 7 ); - prev_lag_bias_Q15 = SKP_RSHIFT( SKP_SMULBB( PITCH_EST_NB_SUBFR * PITCH_EST_PREVLAG_BIAS_Q15, ( *LTPCorr_Q15 ) ), 15 ); /* Q15 */ - prev_lag_bias_Q15 = SKP_DIV32( SKP_MUL( prev_lag_bias_Q15, delta_lag_log2_sqr_Q7 ), delta_lag_log2_sqr_Q7 + ( 1 << 6 ) ); - CCmax_new_b -= prev_lag_bias_Q15; /* Q15 */ - } - - if ( CCmax_new_b > CCmax_b && /* Find maximum biased correlation */ - CCmax_new > corr_thres_Q15 && /* Correlation needs to be high enough to be voiced */ - SKP_Silk_CB_lags_stage2[ 0 ][ CBimax_new ] <= min_lag_8kHz /* Lag must be in range */ - ) { - CCmax_b = CCmax_new_b; - CCmax = CCmax_new; - lag = d; - CBimax = CBimax_new; - } - } - - if( lag == -1 ) { - /* No suitable candidate found */ - SKP_memset( pitch_out, 0, PITCH_EST_NB_SUBFR * sizeof( SKP_int ) ); - *LTPCorr_Q15 = 0; - *lagIndex = 0; - *contourIndex = 0; - return 1; - } - - if( Fs_kHz > 8 ) { - - /****************************************************************************** - ** Scale input signal down to avoid correlations measures from overflowing - *******************************************************************************/ - /* find scaling as max scaling for each subframe */ - shift = SKP_FIX_P_Ana_find_scaling( signal, frame_length, sf_length ); - if( shift > 0 ) { - /* Move signal to scratch mem because the input signal should be unchanged */ - /* Reuse the 32 bit scratch mem vector, use a 16 bit pointer from now */ - input_signal_ptr = (SKP_int16*)scratch_mem; - for( i = 0; i < frame_length; i++ ) { - input_signal_ptr[ i ] = SKP_RSHIFT( signal[ i ], shift ); - } - } else { - input_signal_ptr = (SKP_int16*)signal; - } - /*********************************************************************************/ - - /* Search in original signal */ - - CBimax_old = CBimax; - /* Compensate for decimation */ - SKP_assert( lag == SKP_SAT16( lag ) ); - if( Fs_kHz == 12 ) { - lag = SKP_RSHIFT( SKP_SMULBB( lag, 3 ), 1 ); - } else if( Fs_kHz == 16 ) { - lag = SKP_LSHIFT( lag, 1 ); - } else { - lag = SKP_SMULBB( lag, 3 ); - } - - lag = SKP_LIMIT_int( lag, min_lag, max_lag ); - start_lag = SKP_max_int( lag - 2, min_lag ); - end_lag = SKP_min_int( lag + 2, max_lag ); - lag_new = lag; /* to avoid undefined lag */ - CBimax = 0; /* to avoid undefined lag */ - SKP_assert( SKP_LSHIFT( CCmax, 13 ) >= 0 ); - *LTPCorr_Q15 = (SKP_int)SKP_Silk_SQRT_APPROX( SKP_LSHIFT( CCmax, 13 ) ); /* Output normalized correlation */ - - CCmax = SKP_int32_MIN; - /* pitch lags according to second stage */ - for( k = 0; k < PITCH_EST_NB_SUBFR; k++ ) { - pitch_out[ k ] = lag + 2 * SKP_Silk_CB_lags_stage2[ k ][ CBimax_old ]; - } - /* Calculate the correlations and energies needed in stage 3 */ - SKP_FIX_P_Ana_calc_corr_st3( crosscorr_st3, input_signal_ptr, start_lag, sf_length, complexity ); - SKP_FIX_P_Ana_calc_energy_st3( energies_st3, input_signal_ptr, start_lag, sf_length, complexity ); - - lag_counter = 0; - SKP_assert( lag == SKP_SAT16( lag ) ); - contour_bias = SKP_DIV32_16( PITCH_EST_FLATCONTOUR_BIAS_Q20, lag ); - - /* Setup cbk parameters acording to complexity setting */ - cbk_size = (SKP_int)SKP_Silk_cbk_sizes_stage3[ complexity ]; - cbk_offset = (SKP_int)SKP_Silk_cbk_offsets_stage3[ complexity ]; - - for( d = start_lag; d <= end_lag; d++ ) { - for( j = cbk_offset; j < ( cbk_offset + cbk_size ); j++ ) { - cross_corr = 0; - energy = 0; - for( k = 0; k < PITCH_EST_NB_SUBFR; k++ ) { - SKP_assert( PITCH_EST_NB_SUBFR == 4 ); - energy += SKP_RSHIFT( energies_st3[ k ][ j ][ lag_counter ], 2 ); /* use mean, to avoid overflow */ - SKP_assert( energy >= 0 ); - cross_corr += SKP_RSHIFT( crosscorr_st3[ k ][ j ][ lag_counter ], 2 ); /* use mean, to avoid overflow */ - } - if( cross_corr > 0 ) { - /* Divide cross_corr / energy and get result in Q15 */ - lz = SKP_Silk_CLZ32( cross_corr ); - /* Divide with result in Q13, cross_corr could be larger than energy */ - lshift = SKP_LIMIT_32( lz - 1, 0, 13 ); - CCmax_new = SKP_DIV32( SKP_LSHIFT( cross_corr, lshift ), SKP_RSHIFT( energy, 13 - lshift ) + 1 ); - CCmax_new = SKP_SAT16( CCmax_new ); - CCmax_new = SKP_SMULWB( cross_corr, CCmax_new ); - /* Saturate */ - if( CCmax_new > SKP_RSHIFT( SKP_int32_MAX, 3 ) ) { - CCmax_new = SKP_int32_MAX; - } else { - CCmax_new = SKP_LSHIFT( CCmax_new, 3 ); - } - /* Reduce depending on flatness of contour */ - diff = j - SKP_RSHIFT( PITCH_EST_NB_CBKS_STAGE3_MAX, 1 ); - diff = SKP_MUL( diff, diff ); - diff = SKP_int16_MAX - SKP_RSHIFT( SKP_MUL( contour_bias, diff ), 5 ); /* Q20 -> Q15 */ - SKP_assert( diff == SKP_SAT16( diff ) ); - CCmax_new = SKP_LSHIFT( SKP_SMULWB( CCmax_new, diff ), 1 ); - } else { - CCmax_new = 0; - } - - if( CCmax_new > CCmax && - ( d + (SKP_int)SKP_Silk_CB_lags_stage3[ 0 ][ j ] ) <= max_lag - ) { - CCmax = CCmax_new; - lag_new = d; - CBimax = j; - } - } - lag_counter++; - } - - for( k = 0; k < PITCH_EST_NB_SUBFR; k++ ) { - pitch_out[ k ] = lag_new + SKP_Silk_CB_lags_stage3[ k ][ CBimax ]; - } - *lagIndex = lag_new - min_lag; - *contourIndex = CBimax; - } else { - /* Save Lags and correlation */ - CCmax = SKP_max( CCmax, 0 ); - *LTPCorr_Q15 = (SKP_int)SKP_Silk_SQRT_APPROX( SKP_LSHIFT( CCmax, 13 ) ); /* Output normalized correlation */ - for( k = 0; k < PITCH_EST_NB_SUBFR; k++ ) { - pitch_out[ k ] = lag + SKP_Silk_CB_lags_stage2[ k ][ CBimax ]; - } - *lagIndex = lag - min_lag_8kHz; - *contourIndex = CBimax; - } - SKP_assert( *lagIndex >= 0 ); - /* return as voiced */ - return 0; -} - -/*************************************************************************/ -/* Calculates the correlations used in stage 3 search. In order to cover */ -/* the whole lag codebook for all the searched offset lags (lag +- 2), */ -/*************************************************************************/ -void SKP_FIX_P_Ana_calc_corr_st3( - SKP_int32 cross_corr_st3[ PITCH_EST_NB_SUBFR ][ PITCH_EST_NB_CBKS_STAGE3_MAX ][ PITCH_EST_NB_STAGE3_LAGS ],/* (O) 3 DIM correlation array */ - const SKP_int16 signal[], /* I vector to correlate */ - SKP_int start_lag, /* I lag offset to search around */ - SKP_int sf_length, /* I length of a 5 ms subframe */ - SKP_int complexity /* I Complexity setting */ -) -{ - const SKP_int16 *target_ptr, *basis_ptr; - SKP_int32 cross_corr; - SKP_int i, j, k, lag_counter; - SKP_int cbk_offset, cbk_size, delta, idx; - SKP_int32 scratch_mem[ SCRATCH_SIZE ]; - - SKP_assert( complexity >= SKP_Silk_PITCH_EST_MIN_COMPLEX ); - SKP_assert( complexity <= SKP_Silk_PITCH_EST_MAX_COMPLEX ); - - cbk_offset = SKP_Silk_cbk_offsets_stage3[ complexity ]; - cbk_size = SKP_Silk_cbk_sizes_stage3[ complexity ]; - - target_ptr = &signal[ SKP_LSHIFT( sf_length, 2 ) ]; /* Pointer to middle of frame */ - for( k = 0; k < PITCH_EST_NB_SUBFR; k++ ) { - lag_counter = 0; - - /* Calculate the correlations for each subframe */ - for( j = SKP_Silk_Lag_range_stage3[ complexity ][ k ][ 0 ]; j <= SKP_Silk_Lag_range_stage3[ complexity ][ k ][ 1 ]; j++ ) { - basis_ptr = target_ptr - ( start_lag + j ); - cross_corr = SKP_Silk_inner_prod_aligned( (SKP_int16*)target_ptr, (SKP_int16*)basis_ptr, sf_length ); - SKP_assert( lag_counter < SCRATCH_SIZE ); - scratch_mem[ lag_counter ] = cross_corr; - lag_counter++; - } - - delta = SKP_Silk_Lag_range_stage3[ complexity ][ k ][ 0 ]; - for( i = cbk_offset; i < ( cbk_offset + cbk_size ); i++ ) { - /* Fill out the 3 dim array that stores the correlations for */ - /* each code_book vector for each start lag */ - idx = SKP_Silk_CB_lags_stage3[ k ][ i ] - delta; - for( j = 0; j < PITCH_EST_NB_STAGE3_LAGS; j++ ) { - SKP_assert( idx + j < SCRATCH_SIZE ); - SKP_assert( idx + j < lag_counter ); - cross_corr_st3[ k ][ i ][ j ] = scratch_mem[ idx + j ]; - } - } - target_ptr += sf_length; - } -} - -/********************************************************************/ -/* Calculate the energies for first two subframes. The energies are */ -/* calculated recursively. */ -/********************************************************************/ -void SKP_FIX_P_Ana_calc_energy_st3( - SKP_int32 energies_st3[ PITCH_EST_NB_SUBFR ][ PITCH_EST_NB_CBKS_STAGE3_MAX ][ PITCH_EST_NB_STAGE3_LAGS ],/* (O) 3 DIM energy array */ - const SKP_int16 signal[], /* I vector to calc energy in */ - SKP_int start_lag, /* I lag offset to search around */ - SKP_int sf_length, /* I length of one 5 ms subframe */ - SKP_int complexity /* I Complexity setting */ -) -{ - const SKP_int16 *target_ptr, *basis_ptr; - SKP_int32 energy; - SKP_int k, i, j, lag_counter; - SKP_int cbk_offset, cbk_size, delta, idx; - SKP_int32 scratch_mem[ SCRATCH_SIZE ]; - - SKP_assert( complexity >= SKP_Silk_PITCH_EST_MIN_COMPLEX ); - SKP_assert( complexity <= SKP_Silk_PITCH_EST_MAX_COMPLEX ); - - cbk_offset = SKP_Silk_cbk_offsets_stage3[ complexity ]; - cbk_size = SKP_Silk_cbk_sizes_stage3[ complexity ]; - - target_ptr = &signal[ SKP_LSHIFT( sf_length, 2 ) ]; - for( k = 0; k < PITCH_EST_NB_SUBFR; k++ ) { - lag_counter = 0; - - /* Calculate the energy for first lag */ - basis_ptr = target_ptr - ( start_lag + SKP_Silk_Lag_range_stage3[ complexity ][ k ][ 0 ] ); - energy = SKP_Silk_inner_prod_aligned( basis_ptr, basis_ptr, sf_length ); - SKP_assert( energy >= 0 ); - scratch_mem[ lag_counter ] = energy; - lag_counter++; - - for( i = 1; i < ( SKP_Silk_Lag_range_stage3[ complexity ][ k ][ 1 ] - SKP_Silk_Lag_range_stage3[ complexity ][ k ][ 0 ] + 1 ); i++ ) { - /* remove part outside new window */ - energy -= SKP_SMULBB( basis_ptr[ sf_length - i ], basis_ptr[ sf_length - i ] ); - SKP_assert( energy >= 0 ); - - /* add part that comes into window */ - energy = SKP_ADD_SAT32( energy, SKP_SMULBB( basis_ptr[ -i ], basis_ptr[ -i ] ) ); - SKP_assert( energy >= 0 ); - SKP_assert( lag_counter < SCRATCH_SIZE ); - scratch_mem[ lag_counter ] = energy; - lag_counter++; - } - - delta = SKP_Silk_Lag_range_stage3[ complexity ][ k ][ 0 ]; - for( i = cbk_offset; i < ( cbk_offset + cbk_size ); i++ ) { - /* Fill out the 3 dim array that stores the correlations for */ - /* each code_book vector for each start lag */ - idx = SKP_Silk_CB_lags_stage3[ k ][ i ] - delta; - for( j = 0; j < PITCH_EST_NB_STAGE3_LAGS; j++ ) { - SKP_assert( idx + j < SCRATCH_SIZE ); - SKP_assert( idx + j < lag_counter ); - energies_st3[ k ][ i ][ j ] = scratch_mem[ idx + j ]; - SKP_assert( energies_st3[ k ][ i ][ j ] >= 0.0f ); - } - } - target_ptr += sf_length; - } -} - -SKP_int32 SKP_FIX_P_Ana_find_scaling( - const SKP_int16 *signal, - const SKP_int signal_length, - const SKP_int sum_sqr_len -) -{ - SKP_int32 nbits, x_max; - - x_max = SKP_Silk_int16_array_maxabs( signal, signal_length ); - - if( x_max < SKP_int16_MAX ) { - /* Number of bits needed for the sum of the squares */ - nbits = 32 - SKP_Silk_CLZ32( SKP_SMULBB( x_max, x_max ) ); - } else { - /* Here we don't know if x_max should have been SKP_int16_MAX + 1, so we expect the worst case */ - nbits = 30; - } - nbits += 17 - SKP_Silk_CLZ16( sum_sqr_len ); - - /* Without a guarantee of saturation, we need to keep the 31st bit free */ - if( nbits < 31 ) { - return 0; - } else { - return( nbits - 30 ); - } -} diff --git a/libs/silk/src/SKP_Silk_pitch_est_defines.h b/libs/silk/src/SKP_Silk_pitch_est_defines.h deleted file mode 100644 index 208c22d5c1..0000000000 --- a/libs/silk/src/SKP_Silk_pitch_est_defines.h +++ /dev/null @@ -1,39 +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 SIGPROCFIX_PITCH_EST_DEFINES_H -#define SIGPROCFIX_PITCH_EST_DEFINES_H - -/************************************************************/ -/* Definitions For Fix pitch estimator */ -/************************************************************/ - -#define PITCH_EST_SHORTLAG_BIAS_Q15 6554 /* 0.2f. for logarithmic weighting */ -#define PITCH_EST_PREVLAG_BIAS_Q15 6554 /* Prev lag bias */ -#define PITCH_EST_FLATCONTOUR_BIAS_Q20 52429 /* 0.05f */ - -#endif diff --git a/libs/silk/src/SKP_Silk_pitch_est_tables.c b/libs/silk/src/SKP_Silk_pitch_est_tables.c deleted file mode 100644 index 7609d77025..0000000000 --- a/libs/silk/src/SKP_Silk_pitch_est_tables.c +++ /dev/null @@ -1,88 +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_typedef.h" -#include "SKP_Silk_common_pitch_est_defines.h" - -/********************************************************/ -/* Auto Generated File from generate_pitch_est_tables.m */ -/********************************************************/ - -const SKP_int16 SKP_Silk_CB_lags_stage2[PITCH_EST_NB_SUBFR][PITCH_EST_NB_CBKS_STAGE2_EXT] = -{ - {0, 2,-1,-1,-1, 0, 0, 1, 1, 0, 1}, - {0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0}, - {0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0}, - {0,-1, 2, 1, 0, 1, 1, 0, 0,-1,-1} -}; - -const SKP_int16 SKP_Silk_CB_lags_stage3[PITCH_EST_NB_SUBFR][PITCH_EST_NB_CBKS_STAGE3_MAX] = -{ - {-9,-7,-6,-5,-5,-4,-4,-3,-3,-2,-2,-2,-1,-1,-1, 0, 0, 0, 1, 1, 0, 1, 2, 2, 2, 3, 3, 4, 4, 5, 6, 5, 6, 8}, - {-3,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0,-1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 2, 1, 2, 2, 2, 2, 3}, - { 3, 3, 2, 2, 2, 2, 1, 2, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,-1, 0, 0,-1,-1,-1,-1,-1,-2,-2,-2}, - { 9, 8, 6, 5, 6, 5, 4, 4, 3, 3, 2, 2, 2, 1, 0, 1, 1, 0, 0, 0,-1,-1,-1,-2,-2,-2,-3,-3,-4,-4,-5,-5,-6,-7} - }; - -const SKP_int16 SKP_Silk_Lag_range_stage3[ SKP_Silk_PITCH_EST_MAX_COMPLEX + 1 ] [ PITCH_EST_NB_SUBFR ][ 2 ] = -{ - /* Lags to search for low number of stage3 cbks */ - { - {-2,6}, - {-1,5}, - {-1,5}, - {-2,7} - }, - /* Lags to search for middle number of stage3 cbks */ - { - {-4,8}, - {-1,6}, - {-1,6}, - {-4,9} - }, - /* Lags to search for max number of stage3 cbks */ - { - {-9,12}, - {-3,7}, - {-2,7}, - {-7,13} - } -}; - -const SKP_int16 SKP_Silk_cbk_sizes_stage3[SKP_Silk_PITCH_EST_MAX_COMPLEX + 1] = -{ - PITCH_EST_NB_CBKS_STAGE3_MIN, - PITCH_EST_NB_CBKS_STAGE3_MID, - PITCH_EST_NB_CBKS_STAGE3_MAX -}; - -const SKP_int16 SKP_Silk_cbk_offsets_stage3[SKP_Silk_PITCH_EST_MAX_COMPLEX + 1] = -{ - ((PITCH_EST_NB_CBKS_STAGE3_MAX - PITCH_EST_NB_CBKS_STAGE3_MIN) >> 1), - ((PITCH_EST_NB_CBKS_STAGE3_MAX - PITCH_EST_NB_CBKS_STAGE3_MID) >> 1), - 0 -}; diff --git a/libs/silk/src/SKP_Silk_prefilter_FIX.c b/libs/silk/src/SKP_Silk_prefilter_FIX.c deleted file mode 100644 index 03de564da0..0000000000 --- a/libs/silk/src/SKP_Silk_prefilter_FIX.c +++ /dev/null @@ -1,200 +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_FIX.h" -#include "SKP_Silk_tuning_parameters.h" - -/* SKP_Silk_prefilter. Prefilter for finding Quantizer input signal */ -SKP_INLINE void SKP_Silk_prefilt_FIX( - SKP_Silk_prefilter_state_FIX *P, /* I/O state */ - SKP_int32 st_res_Q12[], /* I short term residual signal */ - SKP_int16 xw[], /* O prefiltered signal */ - SKP_int32 HarmShapeFIRPacked_Q12, /* I Harmonic shaping coeficients */ - SKP_int Tilt_Q14, /* I Tilt shaping coeficient */ - SKP_int32 LF_shp_Q14, /* I Low-frequancy shaping coeficients*/ - SKP_int lag, /* I Lag for harmonic shaping */ - SKP_int length /* I Length of signals */ -); -void SKP_Silk_warped_LPC_analysis_filter_FIX( - SKP_int32 state[], /* I/O State [order + 1] */ - SKP_int16 res[], /* O Residual signal [length] */ - const SKP_int16 coef_Q13[], /* I Coefficients [order] */ - const SKP_int16 input[], /* I Input signal [length] */ - const SKP_int16 lambda_Q16, /* I Warping factor */ - const SKP_int length, /* I Length of input signal */ - const SKP_int order /* I Filter order (even) */ -) -{ - SKP_int n, i; - SKP_int32 acc_Q11, tmp1, tmp2; - - /* Order must be even */ - SKP_assert( ( order & 1 ) == 0 ); - - for( n = 0; n < length; n++ ) { - /* Output of lowpass section */ - tmp2 = SKP_SMLAWB( state[ 0 ], state[ 1 ], lambda_Q16 ); - state[ 0 ] = SKP_LSHIFT( input[ n ], 14 ); - /* Output of allpass section */ - tmp1 = SKP_SMLAWB( state[ 1 ], state[ 2 ] - tmp2, lambda_Q16 ); - state[ 1 ] = tmp2; - acc_Q11 = SKP_SMULWB( tmp2, coef_Q13[ 0 ] ); - /* Loop over allpass sections */ - for( i = 2; i < order; i += 2 ) { - /* Output of allpass section */ - tmp2 = SKP_SMLAWB( state[ i ], state[ i + 1 ] - tmp1, lambda_Q16 ); - state[ i ] = tmp1; - acc_Q11 = SKP_SMLAWB( acc_Q11, tmp1, coef_Q13[ i - 1 ] ); - /* Output of allpass section */ - tmp1 = SKP_SMLAWB( state[ i + 1 ], state[ i + 2 ] - tmp2, lambda_Q16 ); - state[ i + 1 ] = tmp2; - acc_Q11 = SKP_SMLAWB( acc_Q11, tmp2, coef_Q13[ i ] ); - } - state[ order ] = tmp1; - acc_Q11 = SKP_SMLAWB( acc_Q11, tmp1, coef_Q13[ order - 1 ] ); - res[ n ] = ( SKP_int16 )SKP_SAT16( ( SKP_int32 )input[ n ] - SKP_RSHIFT_ROUND( acc_Q11, 11 ) ); - } -} - -void SKP_Silk_prefilter_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O Encoder state FIX */ - const SKP_Silk_encoder_control_FIX *psEncCtrl, /* I Encoder control FIX */ - SKP_int16 xw[], /* O Weighted signal */ - const SKP_int16 x[] /* I Speech signal */ -) -{ - SKP_Silk_prefilter_state_FIX *P = &psEnc->sPrefilt; - SKP_int j, k, lag; - SKP_int32 tmp_32; - const SKP_int16 *AR1_shp_Q13; - const SKP_int16 *px; - SKP_int16 *pxw; - SKP_int HarmShapeGain_Q12, Tilt_Q14; - SKP_int32 HarmShapeFIRPacked_Q12, LF_shp_Q14; - SKP_int32 x_filt_Q12[ MAX_FRAME_LENGTH / NB_SUBFR ]; - SKP_int16 st_res[ ( MAX_FRAME_LENGTH / NB_SUBFR ) + MAX_SHAPE_LPC_ORDER ]; - SKP_int16 B_Q12[ 2 ]; - - /* Setup pointers */ - px = x; - pxw = xw; - lag = P->lagPrev; - for( k = 0; k < NB_SUBFR; k++ ) { - /* Update Variables that change per sub frame */ - if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) { - lag = psEncCtrl->sCmn.pitchL[ k ]; - } - - /* Noise shape parameters */ - HarmShapeGain_Q12 = SKP_SMULWB( psEncCtrl->HarmShapeGain_Q14[ k ], 16384 - psEncCtrl->HarmBoost_Q14[ k ] ); - SKP_assert( HarmShapeGain_Q12 >= 0 ); - HarmShapeFIRPacked_Q12 = SKP_RSHIFT( HarmShapeGain_Q12, 2 ); - HarmShapeFIRPacked_Q12 |= SKP_LSHIFT( ( SKP_int32 )SKP_RSHIFT( HarmShapeGain_Q12, 1 ), 16 ); - Tilt_Q14 = psEncCtrl->Tilt_Q14[ k ]; - LF_shp_Q14 = psEncCtrl->LF_shp_Q14[ k ]; - AR1_shp_Q13 = &psEncCtrl->AR1_Q13[ k * MAX_SHAPE_LPC_ORDER ]; - - /* Short term FIR filtering*/ - SKP_Silk_warped_LPC_analysis_filter_FIX( P->sAR_shp, st_res, AR1_shp_Q13, px, - psEnc->sCmn.warping_Q16, psEnc->sCmn.subfr_length, psEnc->sCmn.shapingLPCOrder ); - - /* reduce (mainly) low frequencies during harmonic emphasis */ - B_Q12[ 0 ] = SKP_RSHIFT_ROUND( psEncCtrl->GainsPre_Q14[ k ], 2 ); - tmp_32 = SKP_SMLABB( SKP_FIX_CONST( INPUT_TILT, 26 ), psEncCtrl->HarmBoost_Q14[ k ], HarmShapeGain_Q12 ); /* Q26 */ - tmp_32 = SKP_SMLABB( tmp_32, psEncCtrl->coding_quality_Q14, SKP_FIX_CONST( HIGH_RATE_INPUT_TILT, 12 ) ); /* Q26 */ - tmp_32 = SKP_SMULWB( tmp_32, -psEncCtrl->GainsPre_Q14[ k ] ); /* Q24 */ - tmp_32 = SKP_RSHIFT_ROUND( tmp_32, 12 ); /* Q12 */ - B_Q12[ 1 ]= SKP_SAT16( tmp_32 ); - - x_filt_Q12[ 0 ] = SKP_SMLABB( SKP_SMULBB( st_res[ 0 ], B_Q12[ 0 ] ), P->sHarmHP, B_Q12[ 1 ] ); - for( j = 1; j < psEnc->sCmn.subfr_length; j++ ) { - x_filt_Q12[ j ] = SKP_SMLABB( SKP_SMULBB( st_res[ j ], B_Q12[ 0 ] ), st_res[ j - 1 ], B_Q12[ 1 ] ); - } - P->sHarmHP = st_res[ psEnc->sCmn.subfr_length - 1 ]; - - SKP_Silk_prefilt_FIX( P, x_filt_Q12, pxw, HarmShapeFIRPacked_Q12, Tilt_Q14, - LF_shp_Q14, lag, psEnc->sCmn.subfr_length ); - - px += psEnc->sCmn.subfr_length; - pxw += psEnc->sCmn.subfr_length; - } - - P->lagPrev = psEncCtrl->sCmn.pitchL[ NB_SUBFR - 1 ]; -} - -/* SKP_Silk_prefilter. Prefilter for finding Quantizer input signal */ -SKP_INLINE void SKP_Silk_prefilt_FIX( - SKP_Silk_prefilter_state_FIX *P, /* I/O state */ - SKP_int32 st_res_Q12[], /* I short term residual signal */ - SKP_int16 xw[], /* O prefiltered signal */ - SKP_int32 HarmShapeFIRPacked_Q12, /* I Harmonic shaping coeficients */ - SKP_int Tilt_Q14, /* I Tilt shaping coeficient */ - SKP_int32 LF_shp_Q14, /* I Low-frequancy shaping coeficients*/ - SKP_int lag, /* I Lag for harmonic shaping */ - SKP_int length /* I Length of signals */ -) -{ - SKP_int i, idx, LTP_shp_buf_idx; - SKP_int32 n_LTP_Q12, n_Tilt_Q10, n_LF_Q10; - SKP_int32 sLF_MA_shp_Q12, sLF_AR_shp_Q12; - SKP_int16 *LTP_shp_buf; - - /* To speed up use temp variables instead of using the struct */ - LTP_shp_buf = P->sLTP_shp; - LTP_shp_buf_idx = P->sLTP_shp_buf_idx; - sLF_AR_shp_Q12 = P->sLF_AR_shp_Q12; - sLF_MA_shp_Q12 = P->sLF_MA_shp_Q12; - - for( i = 0; i < length; i++ ) { - if( lag > 0 ) { - /* unrolled loop */ - SKP_assert( HARM_SHAPE_FIR_TAPS == 3 ); - idx = lag + LTP_shp_buf_idx; - n_LTP_Q12 = SKP_SMULBB( LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 - 1) & LTP_MASK ], HarmShapeFIRPacked_Q12 ); - n_LTP_Q12 = SKP_SMLABT( n_LTP_Q12, LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 ) & LTP_MASK ], HarmShapeFIRPacked_Q12 ); - n_LTP_Q12 = SKP_SMLABB( n_LTP_Q12, LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 + 1) & LTP_MASK ], HarmShapeFIRPacked_Q12 ); - } else { - n_LTP_Q12 = 0; - } - - n_Tilt_Q10 = SKP_SMULWB( sLF_AR_shp_Q12, Tilt_Q14 ); - n_LF_Q10 = SKP_SMLAWB( SKP_SMULWT( sLF_AR_shp_Q12, LF_shp_Q14 ), sLF_MA_shp_Q12, LF_shp_Q14 ); - - sLF_AR_shp_Q12 = SKP_SUB32( st_res_Q12[ i ], SKP_LSHIFT( n_Tilt_Q10, 2 ) ); - sLF_MA_shp_Q12 = SKP_SUB32( sLF_AR_shp_Q12, SKP_LSHIFT( n_LF_Q10, 2 ) ); - - LTP_shp_buf_idx = ( LTP_shp_buf_idx - 1 ) & LTP_MASK; - LTP_shp_buf[ LTP_shp_buf_idx ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND( sLF_MA_shp_Q12, 12 ) ); - - xw[i] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND( SKP_SUB32( sLF_MA_shp_Q12, n_LTP_Q12 ), 12 ) ); - } - - /* Copy temp variable back to state */ - P->sLF_AR_shp_Q12 = sLF_AR_shp_Q12; - P->sLF_MA_shp_Q12 = sLF_MA_shp_Q12; - P->sLTP_shp_buf_idx = LTP_shp_buf_idx; -} diff --git a/libs/silk/src/SKP_Silk_process_NLSFs_FIX.c b/libs/silk/src/SKP_Silk_process_NLSFs_FIX.c deleted file mode 100644 index 51c2c980f3..0000000000 --- a/libs/silk/src/SKP_Silk_process_NLSFs_FIX.c +++ /dev/null @@ -1,127 +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_FIX.h" - -/* Limit, stabilize, convert and quantize NLSFs. */ -void SKP_Silk_process_NLSFs_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 *pNLSF_Q15 /* I/O Normalized LSFs (quant out) (0 - (2^15-1)) */ -) -{ - SKP_int doInterpolate; - SKP_int pNLSFW_Q6[ MAX_LPC_ORDER ]; - SKP_int NLSF_mu_Q15, NLSF_mu_fluc_red_Q16; - SKP_int32 i_sqr_Q15; - const SKP_Silk_NLSF_CB_struct *psNLSF_CB; - - /* Used only for NLSF interpolation */ - SKP_int pNLSF0_temp_Q15[ MAX_LPC_ORDER ]; - SKP_int pNLSFW0_temp_Q6[ MAX_LPC_ORDER ]; - SKP_int i; - - SKP_assert( psEnc->speech_activity_Q8 >= 0 ); - SKP_assert( psEnc->speech_activity_Q8 <= 256 ); - SKP_assert( psEncCtrl->sparseness_Q8 >= 0 ); - SKP_assert( psEncCtrl->sparseness_Q8 <= 256 ); - SKP_assert( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED || psEncCtrl->sCmn.sigtype == SIG_TYPE_UNVOICED ); - - /***********************/ - /* Calculate mu values */ - /***********************/ - if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) { - /* NLSF_mu = 0.002f - 0.001f * psEnc->speech_activity; */ - /* NLSF_mu_fluc_red = 0.1f - 0.05f * psEnc->speech_activity; */ - NLSF_mu_Q15 = SKP_SMLAWB( 66, -8388, psEnc->speech_activity_Q8 ); - NLSF_mu_fluc_red_Q16 = SKP_SMLAWB( 6554, -838848, psEnc->speech_activity_Q8 ); - } else { - /* NLSF_mu = 0.005f - 0.004f * psEnc->speech_activity; */ - /* NLSF_mu_fluc_red = 0.2f - 0.1f * psEnc->speech_activity - 0.1f * psEncCtrl->sparseness; */ - NLSF_mu_Q15 = SKP_SMLAWB( 164, -33554, psEnc->speech_activity_Q8 ); - NLSF_mu_fluc_red_Q16 = SKP_SMLAWB( 13107, -1677696, psEnc->speech_activity_Q8 + psEncCtrl->sparseness_Q8 ); - } - SKP_assert( NLSF_mu_Q15 >= 0 ); - SKP_assert( NLSF_mu_Q15 <= 164 ); - SKP_assert( NLSF_mu_fluc_red_Q16 >= 0 ); - SKP_assert( NLSF_mu_fluc_red_Q16 <= 13107 ); - - NLSF_mu_Q15 = SKP_max( NLSF_mu_Q15, 1 ); - - /* Calculate NLSF weights */ - TIC(NLSF_weights_FIX) - SKP_Silk_NLSF_VQ_weights_laroia( pNLSFW_Q6, pNLSF_Q15, psEnc->sCmn.predictLPCOrder ); - TOC(NLSF_weights_FIX) - - /* Update NLSF weights for interpolated NLSFs */ - doInterpolate = ( psEnc->sCmn.useInterpolatedNLSFs == 1 ) && ( psEncCtrl->sCmn.NLSFInterpCoef_Q2 < ( 1 << 2 ) ); - if( doInterpolate ) { - - /* Calculate the interpolated NLSF vector for the first half */ - SKP_Silk_interpolate( pNLSF0_temp_Q15, psEnc->sPred.prev_NLSFq_Q15, pNLSF_Q15, - psEncCtrl->sCmn.NLSFInterpCoef_Q2, psEnc->sCmn.predictLPCOrder ); - - /* Calculate first half NLSF weights for the interpolated NLSFs */ - TIC(NLSF_weights_FIX) - SKP_Silk_NLSF_VQ_weights_laroia( pNLSFW0_temp_Q6, pNLSF0_temp_Q15, psEnc->sCmn.predictLPCOrder ); - TOC(NLSF_weights_FIX) - - /* Update NLSF weights with contribution from first half */ - i_sqr_Q15 = SKP_LSHIFT( SKP_SMULBB( psEncCtrl->sCmn.NLSFInterpCoef_Q2, psEncCtrl->sCmn.NLSFInterpCoef_Q2 ), 11 ); - for( i = 0; i < psEnc->sCmn.predictLPCOrder; i++ ) { - pNLSFW_Q6[ i ] = SKP_SMLAWB( SKP_RSHIFT( pNLSFW_Q6[ i ], 1 ), pNLSFW0_temp_Q6[ i ], i_sqr_Q15 ); - SKP_assert( pNLSFW_Q6[ i ] <= SKP_int16_MAX ); - SKP_assert( pNLSFW_Q6[ i ] >= 1 ); - } - } - - /* Set pointer to the NLSF codebook for the current signal type and LPC order */ - psNLSF_CB = psEnc->sCmn.psNLSF_CB[ psEncCtrl->sCmn.sigtype ]; - - /* Quantize NLSF parameters given the trained NLSF codebooks */ - TIC(MSVQ_encode_FIX) - SKP_Silk_NLSF_MSVQ_encode_FIX( psEncCtrl->sCmn.NLSFIndices, pNLSF_Q15, psNLSF_CB, - psEnc->sPred.prev_NLSFq_Q15, pNLSFW_Q6, NLSF_mu_Q15, NLSF_mu_fluc_red_Q16, - psEnc->sCmn.NLSF_MSVQ_Survivors, psEnc->sCmn.predictLPCOrder, psEnc->sCmn.first_frame_after_reset ); - TOC(MSVQ_encode_FIX) - - /* Convert quantized NLSFs back to LPC coefficients */ - SKP_Silk_NLSF2A_stable( psEncCtrl->PredCoef_Q12[ 1 ], pNLSF_Q15, psEnc->sCmn.predictLPCOrder ); - - if( doInterpolate ) { - /* Calculate the interpolated, quantized LSF vector for the first half */ - SKP_Silk_interpolate( pNLSF0_temp_Q15, psEnc->sPred.prev_NLSFq_Q15, pNLSF_Q15, - psEncCtrl->sCmn.NLSFInterpCoef_Q2, psEnc->sCmn.predictLPCOrder ); - - /* Convert back to LPC coefficients */ - SKP_Silk_NLSF2A_stable( psEncCtrl->PredCoef_Q12[ 0 ], pNLSF0_temp_Q15, psEnc->sCmn.predictLPCOrder ); - - } else { - /* Copy LPC coefficients for first half from second half */ - SKP_memcpy( psEncCtrl->PredCoef_Q12[ 0 ], psEncCtrl->PredCoef_Q12[ 1 ], psEnc->sCmn.predictLPCOrder * sizeof( SKP_int16 ) ); - } -} diff --git a/libs/silk/src/SKP_Silk_process_gains_FIX.c b/libs/silk/src/SKP_Silk_process_gains_FIX.c deleted file mode 100644 index f2f532b35c..0000000000 --- a/libs/silk/src/SKP_Silk_process_gains_FIX.c +++ /dev/null @@ -1,108 +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_FIX.h" -#include "SKP_Silk_tuning_parameters.h" - -/* Processing of gains */ -void SKP_Silk_process_gains_FIX( - SKP_Silk_encoder_state_FIX *psEnc, /* I/O Encoder state_FIX */ - SKP_Silk_encoder_control_FIX *psEncCtrl /* I/O Encoder control_FIX */ -) -{ - SKP_Silk_shape_state_FIX *psShapeSt = &psEnc->sShape; - SKP_int k; - SKP_int32 s_Q16, InvMaxSqrVal_Q16, gain, gain_squared, ResNrg, ResNrgPart, quant_offset_Q10; - - /* Gain reduction when LTP coding gain is high */ - if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) { - /*s = -0.5f * SKP_sigmoid( 0.25f * ( psEncCtrl->LTPredCodGain - 12.0f ) ); */ - s_Q16 = -SKP_Silk_sigm_Q15( SKP_RSHIFT_ROUND( psEncCtrl->LTPredCodGain_Q7 - SKP_FIX_CONST( 12.0, 7 ), 4 ) ); - for( k = 0; k < NB_SUBFR; k++ ) { - psEncCtrl->Gains_Q16[ k ] = SKP_SMLAWB( psEncCtrl->Gains_Q16[ k ], psEncCtrl->Gains_Q16[ k ], s_Q16 ); - } - } - - /* Limit the quantized signal */ - 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 ); - - for( k = 0; k < 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_int32_MAX; - } else { - ResNrgPart = SKP_LSHIFT( ResNrgPart, -psEncCtrl->ResNrgQ[ k ] ); - } - } - gain = psEncCtrl->Gains_Q16[ k ]; - gain_squared = SKP_ADD_SAT32( ResNrgPart, SKP_SMMUL( gain, gain ) ); - if( gain_squared < SKP_int16_MAX ) { - /* recalculate with higher precision */ - gain_squared = SKP_SMLAWW( SKP_LSHIFT( ResNrgPart, 16 ), gain, gain ); - SKP_assert( gain_squared > 0 ); - gain = SKP_Silk_SQRT_APPROX( gain_squared ); /* Q8 */ - psEncCtrl->Gains_Q16[ k ] = SKP_LSHIFT_SAT32( gain, 8 ); /* Q16 */ - } else { - gain = SKP_Silk_SQRT_APPROX( gain_squared ); /* Q0 */ - psEncCtrl->Gains_Q16[ k ] = SKP_LSHIFT_SAT32( gain, 16 ); /* Q16 */ - } - } - - /* Noise shaping quantization */ - SKP_Silk_gains_quant( psEncCtrl->sCmn.GainsIndices, psEncCtrl->Gains_Q16, - &psShapeSt->LastGainIndex, psEnc->sCmn.nFramesInPayloadBuf ); - /* Set quantizer offset for voiced signals. Larger offset when LTP coding gain is low or tilt is high (ie low-pass) */ - if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) { - if( psEncCtrl->LTPredCodGain_Q7 + SKP_RSHIFT( psEncCtrl->input_tilt_Q15, 8 ) > SKP_FIX_CONST( 1.0, 7 ) ) { - psEncCtrl->sCmn.QuantOffsetType = 0; - } else { - psEncCtrl->sCmn.QuantOffsetType = 1; - } - } - - /* Quantizer boundary adjustment */ - quant_offset_Q10 = SKP_Silk_Quantization_Offsets_Q10[ psEncCtrl->sCmn.sigtype ][ psEncCtrl->sCmn.QuantOffsetType ]; - psEncCtrl->Lambda_Q10 = SKP_FIX_CONST( LAMBDA_OFFSET, 10 ) - + SKP_SMULBB( SKP_FIX_CONST( LAMBDA_DELAYED_DECISIONS, 10 ), psEnc->sCmn.nStatesDelayedDecision ) - + SKP_SMULWB( SKP_FIX_CONST( LAMBDA_SPEECH_ACT, 18 ), psEnc->speech_activity_Q8 ) - + SKP_SMULWB( SKP_FIX_CONST( LAMBDA_INPUT_QUALITY, 12 ), psEncCtrl->input_quality_Q14 ) - + SKP_SMULWB( SKP_FIX_CONST( LAMBDA_CODING_QUALITY, 12 ), psEncCtrl->coding_quality_Q14 ) - + SKP_SMULWB( SKP_FIX_CONST( LAMBDA_QUANT_OFFSET, 16 ), quant_offset_Q10 ); - - SKP_assert( psEncCtrl->Lambda_Q10 > 0 ); - SKP_assert( psEncCtrl->Lambda_Q10 < SKP_FIX_CONST( 2, 10 ) ); -} diff --git a/libs/silk/src/SKP_Silk_quant_LTP_gains_FIX.c b/libs/silk/src/SKP_Silk_quant_LTP_gains_FIX.c deleted file mode 100644 index 944ffbc20f..0000000000 --- a/libs/silk/src/SKP_Silk_quant_LTP_gains_FIX.c +++ /dev/null @@ -1,105 +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_FIX.h" - -void SKP_Silk_quant_LTP_gains_FIX( - SKP_int16 B_Q14[], /* I/O (un)quantized LTP gains */ - SKP_int cbk_index[], /* O Codebook Index */ - SKP_int *periodicity_index, /* O Periodicity Index */ - const SKP_int32 W_Q18[], /* I Error Weights in Q18 */ - SKP_int mu_Q8, /* I Mu value (R/D tradeoff) */ - SKP_int lowComplexity /* I Flag for low complexity */ -) -{ - SKP_int j, k, temp_idx[ NB_SUBFR ], cbk_size; - const SKP_uint16 *cdf_ptr; - const SKP_int16 *cl_ptr; - const SKP_int16 *cbk_ptr_Q14; - const SKP_int16 *b_Q14_ptr; - const SKP_int32 *W_Q18_ptr; - SKP_int32 rate_dist_subfr, rate_dist, min_rate_dist; - - - - /***************************************************/ - /* iterate over different codebooks with different */ - /* rates/distortions, and choose best */ - /***************************************************/ - min_rate_dist = SKP_int32_MAX; - for( k = 0; k < 3; k++ ) { - cdf_ptr = SKP_Silk_LTP_gain_CDF_ptrs[ k ]; - cl_ptr = SKP_Silk_LTP_gain_BITS_Q6_ptrs[ k ]; - cbk_ptr_Q14 = SKP_Silk_LTP_vq_ptrs_Q14[ k ]; - cbk_size = SKP_Silk_LTP_vq_sizes[ k ]; - - /* Setup pointer to first subframe */ - W_Q18_ptr = W_Q18; - b_Q14_ptr = B_Q14; - - rate_dist = 0; - for( j = 0; j < NB_SUBFR; j++ ) { - - SKP_Silk_VQ_WMat_EC_FIX( - &temp_idx[ j ], /* O index of best codebook vector */ - &rate_dist_subfr, /* O best weighted quantization error + mu * rate */ - b_Q14_ptr, /* I input vector to be quantized */ - W_Q18_ptr, /* I weighting matrix */ - cbk_ptr_Q14, /* I codebook */ - cl_ptr, /* I code length for each codebook vector */ - mu_Q8, /* I tradeoff between weighted error and rate */ - cbk_size /* I number of vectors in codebook */ - ); - - rate_dist = SKP_ADD_POS_SAT32( rate_dist, rate_dist_subfr ); - - b_Q14_ptr += LTP_ORDER; - W_Q18_ptr += LTP_ORDER * LTP_ORDER; - } - - /* Avoid never finding a codebook */ - rate_dist = SKP_min( SKP_int32_MAX - 1, rate_dist ); - - if( rate_dist < min_rate_dist ) { - min_rate_dist = rate_dist; - SKP_memcpy( cbk_index, temp_idx, NB_SUBFR * sizeof( SKP_int ) ); - *periodicity_index = k; - } - - /* Break early in low-complexity mode if rate distortion is below threshold */ - if( lowComplexity && ( rate_dist < SKP_Silk_LTP_gain_middle_avg_RD_Q14 ) ) { - break; - } - } - - cbk_ptr_Q14 = SKP_Silk_LTP_vq_ptrs_Q14[ *periodicity_index ]; - for( j = 0; j < NB_SUBFR; j++ ) { - for( k = 0; k < LTP_ORDER; k++ ) { - B_Q14[ j * LTP_ORDER + k ] = cbk_ptr_Q14[ SKP_MLA( k, cbk_index[ j ], LTP_ORDER ) ]; - } - } -} diff --git a/libs/silk/src/SKP_Silk_range_coder.c b/libs/silk/src/SKP_Silk_range_coder.c deleted file mode 100644 index 9d7fdc2de4..0000000000 --- a/libs/silk/src/SKP_Silk_range_coder.c +++ /dev/null @@ -1,372 +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" - -/* Range encoder for one symbol */ -void SKP_Silk_range_encoder( - SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */ - const SKP_int data, /* I uncompressed data */ - const SKP_uint16 prob[] /* I cumulative density functions */ -) -{ - SKP_uint32 low_Q16, high_Q16; - SKP_uint32 base_tmp, range_Q32; - - /* Copy structure data */ - SKP_uint32 base_Q32 = psRC->base_Q32; - SKP_uint32 range_Q16 = psRC->range_Q16; - SKP_int32 bufferIx = psRC->bufferIx; - SKP_uint8 *buffer = psRC->buffer; - - if( psRC->error ) { - return; - } - - /* Update interval */ - low_Q16 = prob[ data ]; - high_Q16 = prob[ data + 1 ]; - base_tmp = base_Q32; /* save current base, to test for carry */ - base_Q32 += SKP_MUL_uint( range_Q16, low_Q16 ); - range_Q32 = SKP_MUL_uint( range_Q16, high_Q16 - low_Q16 ); - - /* Check for carry */ - if( base_Q32 < base_tmp ) { - /* Propagate carry in buffer */ - SKP_int bufferIx_tmp = bufferIx; - while( ( ++buffer[ --bufferIx_tmp ] ) == 0 ); - } - - /* Check normalization */ - if( range_Q32 & 0xFF000000 ) { - /* No normalization */ - range_Q16 = SKP_RSHIFT_uint( range_Q32, 16 ); - } else { - if( range_Q32 & 0xFFFF0000 ) { - /* Normalization of 8 bits shift */ - range_Q16 = SKP_RSHIFT_uint( range_Q32, 8 ); - } else { - /* Normalization of 16 bits shift */ - range_Q16 = range_Q32; - /* Make sure not to write beyond buffer */ - if( bufferIx >= psRC->bufferLength ) { - psRC->error = RANGE_CODER_WRITE_BEYOND_BUFFER; - return; - } - /* Write one byte to buffer */ - buffer[ bufferIx++ ] = (SKP_uint8)( SKP_RSHIFT_uint( base_Q32, 24 ) ); - base_Q32 = SKP_LSHIFT_ovflw( base_Q32, 8 ); - } - /* Make sure not to write beyond buffer */ - if( bufferIx >= psRC->bufferLength ) { - psRC->error = RANGE_CODER_WRITE_BEYOND_BUFFER; - return; - } - /* Write one byte to buffer */ - buffer[ bufferIx++ ] = (SKP_uint8)( SKP_RSHIFT_uint( base_Q32, 24 ) ); - base_Q32 = SKP_LSHIFT_ovflw( base_Q32, 8 ); - } - - /* Copy structure data back */ - psRC->base_Q32 = base_Q32; - psRC->range_Q16 = range_Q16; - psRC->bufferIx = bufferIx; -} - -/* Range encoder for multiple symbols */ -void SKP_Silk_range_encoder_multi( - SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */ - const SKP_int data[], /* I uncompressed data [nSymbols] */ - const SKP_uint16 * const prob[], /* I cumulative density functions */ - const SKP_int nSymbols /* I number of data symbols */ -) -{ - SKP_int k; - for( k = 0; k < nSymbols; k++ ) { - SKP_Silk_range_encoder( psRC, data[ k ], prob[ k ] ); - } -} - -/* Range decoder for one symbol */ -void SKP_Silk_range_decoder( - SKP_int data[], /* O uncompressed data */ - SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */ - const SKP_uint16 prob[], /* I cumulative density function */ - SKP_int probIx /* I initial (middle) entry of cdf */ -) -{ - SKP_uint32 low_Q16, high_Q16; - SKP_uint32 base_tmp, range_Q32; - - /* Copy structure data */ - SKP_uint32 base_Q32 = psRC->base_Q32; - SKP_uint32 range_Q16 = psRC->range_Q16; - SKP_int32 bufferIx = psRC->bufferIx; - SKP_uint8 *buffer = &psRC->buffer[ 4 ]; - - if( psRC->error ) { - /* Set output to zero */ - *data = 0; - return; - } - - high_Q16 = prob[ probIx ]; - base_tmp = SKP_MUL_uint( range_Q16, high_Q16 ); - if( base_tmp > base_Q32 ) { - while( 1 ) { - low_Q16 = prob[ --probIx ]; - base_tmp = SKP_MUL_uint( range_Q16, low_Q16 ); - if( base_tmp <= base_Q32 ) { - break; - } - high_Q16 = low_Q16; - /* Test for out of range */ - if( high_Q16 == 0 ) { - psRC->error = RANGE_CODER_CDF_OUT_OF_RANGE; - /* Set output to zero */ - *data = 0; - return; - } - } - } else { - while( 1 ) { - low_Q16 = high_Q16; - high_Q16 = prob[ ++probIx ]; - base_tmp = SKP_MUL_uint( range_Q16, high_Q16 ); - if( base_tmp > base_Q32 ) { - probIx--; - break; - } - /* Test for out of range */ - if( high_Q16 == 0xFFFF ) { - psRC->error = RANGE_CODER_CDF_OUT_OF_RANGE; - /* Set output to zero */ - *data = 0; - return; - } - } - } - *data = probIx; - base_Q32 -= SKP_MUL_uint( range_Q16, low_Q16 ); - range_Q32 = SKP_MUL_uint( range_Q16, high_Q16 - low_Q16 ); - - /* Check normalization */ - if( range_Q32 & 0xFF000000 ) { - /* No normalization */ - range_Q16 = SKP_RSHIFT_uint( range_Q32, 16 ); - } else { - if( range_Q32 & 0xFFFF0000 ) { - /* Normalization of 8 bits shift */ - range_Q16 = SKP_RSHIFT_uint( range_Q32, 8 ); - /* Check for errors */ - if( SKP_RSHIFT_uint( base_Q32, 24 ) ) { - psRC->error = RANGE_CODER_NORMALIZATION_FAILED; - /* Set output to zero */ - *data = 0; - return; - } - } else { - /* Normalization of 16 bits shift */ - range_Q16 = range_Q32; - /* Check for errors */ - if( SKP_RSHIFT( base_Q32, 16 ) ) { - psRC->error = RANGE_CODER_NORMALIZATION_FAILED; - /* Set output to zero */ - *data = 0; - return; - } - /* Update base */ - base_Q32 = SKP_LSHIFT_uint( base_Q32, 8 ); - /* Make sure not to read beyond buffer */ - if( bufferIx < psRC->bufferLength ) { - /* Read one byte from buffer */ - base_Q32 |= (SKP_uint32)buffer[ bufferIx++ ]; - } - } - /* Update base */ - base_Q32 = SKP_LSHIFT_uint( base_Q32, 8 ); - /* Make sure not to read beyond buffer */ - if( bufferIx < psRC->bufferLength ) { - /* Read one byte from buffer */ - base_Q32 |= (SKP_uint32)buffer[ bufferIx++ ]; - } - } - - /* Check for zero interval length */ - if( range_Q16 == 0 ) { - psRC->error = RANGE_CODER_ZERO_INTERVAL_WIDTH; - /* Set output to zero */ - *data = 0; - return; - } - - /* Copy structure data back */ - psRC->base_Q32 = base_Q32; - psRC->range_Q16 = range_Q16; - psRC->bufferIx = bufferIx; -} - -/* Range decoder for multiple symbols */ -void SKP_Silk_range_decoder_multi( - SKP_int data[], /* O uncompressed data [nSymbols] */ - SKP_Silk_range_coder_state *psRC, /* I/O compressor data structure */ - const SKP_uint16 * const prob[], /* I cumulative density functions */ - const SKP_int probStartIx[], /* I initial (middle) entries of cdfs [nSymbols] */ - const SKP_int nSymbols /* I number of data symbols */ -) -{ - SKP_int k; - for( k = 0; k < nSymbols; k++ ) { - SKP_Silk_range_decoder( &data[ k ], psRC, prob[ k ], probStartIx[ k ] ); - } -} - -/* Initialize range encoder */ -void SKP_Silk_range_enc_init( - SKP_Silk_range_coder_state *psRC /* O compressor data structure */ -) -{ - /* Initialize structure */ - psRC->bufferLength = MAX_ARITHM_BYTES; - psRC->range_Q16 = 0x0000FFFF; - psRC->bufferIx = 0; - psRC->base_Q32 = 0; - psRC->error = 0; -} - -/* Initialize range decoder */ -void SKP_Silk_range_dec_init( - SKP_Silk_range_coder_state *psRC, /* O compressor data structure */ - const SKP_uint8 buffer[], /* I buffer for compressed data [bufferLength] */ - const SKP_int32 bufferLength /* I buffer length (in bytes) */ -) -{ - /* check input */ - if( bufferLength > MAX_ARITHM_BYTES ) { - psRC->error = RANGE_CODER_DEC_PAYLOAD_TOO_LONG; - return; - } - /* Initialize structure */ - /* Copy to internal buffer */ - SKP_memcpy( psRC->buffer, buffer, bufferLength * sizeof( SKP_uint8 ) ); - psRC->bufferLength = bufferLength; - psRC->bufferIx = 0; - psRC->base_Q32 = - SKP_LSHIFT_uint( (SKP_uint32)buffer[ 0 ], 24 ) | - SKP_LSHIFT_uint( (SKP_uint32)buffer[ 1 ], 16 ) | - SKP_LSHIFT_uint( (SKP_uint32)buffer[ 2 ], 8 ) | - (SKP_uint32)buffer[ 3 ]; - psRC->range_Q16 = 0x0000FFFF; - psRC->error = 0; -} - -/* Determine length of bitstream */ -SKP_int SKP_Silk_range_coder_get_length( /* O returns number of BITS in stream */ - const SKP_Silk_range_coder_state *psRC, /* I compressed data structure */ - SKP_int *nBytes /* O number of BYTES in stream */ -) -{ - SKP_int nBits; - - /* Number of bits in stream */ - nBits = SKP_LSHIFT( psRC->bufferIx, 3 ) + SKP_Silk_CLZ32( psRC->range_Q16 - 1 ) - 14; - - *nBytes = SKP_RSHIFT( nBits + 7, 3 ); - - /* Return number of bits in bitstream */ - return nBits; -} - -/* Write shortest uniquely decodable stream to buffer, and determine its length */ -void SKP_Silk_range_enc_wrap_up( - SKP_Silk_range_coder_state *psRC /* I/O compressed data structure */ -) -{ - SKP_int bufferIx_tmp, bits_to_store, bits_in_stream, nBytes, mask; - SKP_uint32 base_Q24; - - /* Lower limit of interval, shifted 8 bits to the right */ - base_Q24 = SKP_RSHIFT_uint( psRC->base_Q32, 8 ); - - bits_in_stream = SKP_Silk_range_coder_get_length( psRC, &nBytes ); - - /* Number of additional bits (1..9) required to be stored to stream */ - bits_to_store = bits_in_stream - SKP_LSHIFT( psRC->bufferIx, 3 ); - /* Round up to required resolution */ - base_Q24 += SKP_RSHIFT_uint( 0x00800000, bits_to_store - 1 ); - base_Q24 &= SKP_LSHIFT_ovflw( 0xFFFFFFFF, 24 - bits_to_store ); - - /* Check for carry */ - if( base_Q24 & 0x01000000 ) { - /* Propagate carry in buffer */ - bufferIx_tmp = psRC->bufferIx; - while( ( ++( psRC->buffer[ --bufferIx_tmp ] ) ) == 0 ); - } - - /* Store to stream, making sure not to write beyond buffer */ - if( psRC->bufferIx < psRC->bufferLength ) { - psRC->buffer[ psRC->bufferIx++ ] = (SKP_uint8)SKP_RSHIFT_uint( base_Q24, 16 ); - if( bits_to_store > 8 ) { - if( psRC->bufferIx < psRC->bufferLength ) { - psRC->buffer[ psRC->bufferIx++ ] = (SKP_uint8)SKP_RSHIFT_uint( base_Q24, 8 ); - } - } - } - - /* Fill up any remaining bits in the last byte with 1s */ - if( bits_in_stream & 7 ) { - mask = SKP_RSHIFT( 0xFF, bits_in_stream & 7 ); - if( nBytes - 1 < psRC->bufferLength ) { - psRC->buffer[ nBytes - 1 ] |= mask; - } - } -} - -/* Check that any remaining bits in the last byte are set to 1 */ -void SKP_Silk_range_coder_check_after_decoding( - SKP_Silk_range_coder_state *psRC /* I/O compressed data structure */ -) -{ - SKP_int bits_in_stream, nBytes, mask; - - bits_in_stream = SKP_Silk_range_coder_get_length( psRC, &nBytes ); - - /* Make sure not to read beyond buffer */ - if( nBytes - 1 >= psRC->bufferLength ) { - psRC->error = RANGE_CODER_DECODER_CHECK_FAILED; - return; - } - - /* Test any remaining bits in last byte */ - if( bits_in_stream & 7 ) { - mask = SKP_RSHIFT( 0xFF, bits_in_stream & 7 ); - if( ( psRC->buffer[ nBytes - 1 ] & mask ) != mask ) { - psRC->error = RANGE_CODER_DECODER_CHECK_FAILED; - return; - } - } -} diff --git a/libs/silk/src/SKP_Silk_regularize_correlations_FIX.c b/libs/silk/src/SKP_Silk_regularize_correlations_FIX.c deleted file mode 100644 index 38d72b0e4a..0000000000 --- a/libs/silk/src/SKP_Silk_regularize_correlations_FIX.c +++ /dev/null @@ -1,43 +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_FIX.h" - -/* Add noise to matrix diagonal */ -void SKP_Silk_regularize_correlations_FIX( - SKP_int32 *XX, /* I/O Correlation matrices */ - SKP_int32 *xx, /* I/O Correlation values */ - SKP_int32 noise, /* I Noise to add */ - SKP_int D /* I Dimension of XX */ -) -{ - SKP_int i; - for( i = 0; i < D; i++ ) { - matrix_ptr( &XX[ 0 ], i, i, D ) = SKP_ADD32( matrix_ptr( &XX[ 0 ], i, i, D ), noise ); - } - xx[ 0 ] += noise; -} diff --git a/libs/silk/src/SKP_Silk_resampler.c b/libs/silk/src/SKP_Silk_resampler.c deleted file mode 100644 index 2b58ef10d6..0000000000 --- a/libs/silk/src/SKP_Silk_resampler.c +++ /dev/null @@ -1,323 +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. -***********************************************************************/ - -/* * - * File Name: SKP_Silk_resampler.c * - * * - * Description: Interface to collection of resamplers * - * * - * Copyright 2010 (c), Skype Limited * - * All rights reserved. * - * */ - -/* Matrix of resampling methods used: - * Fs_out (kHz) - * 8 12 16 24 32 44.1 48 - * - * 8 C UF U UF UF UF UF - * 12 AF C UF U UF UF UF - * 16 D AF C UF U UF UF - * Fs_in (kHz) 24 AIF D AF C UF UF U - * 32 UF AF D AF C UF UF - * 44.1 AMI AMI AMI AMI AMI C UF - * 48 DAF DAF AF D AF UF C - * - * default method: UF - * - * C -> Copy (no resampling) - * D -> Allpass-based 2x downsampling - * U -> Allpass-based 2x upsampling - * DAF -> Allpass-based 2x downsampling followed by AR2 filter followed by FIR interpolation - * UF -> Allpass-based 2x upsampling followed by FIR interpolation - * AMI -> ARMA4 filter followed by FIR interpolation - * AF -> AR2 filter followed by FIR interpolation - * - * Input signals sampled above 48 kHz are first downsampled to at most 48 kHz. - * Output signals sampled above 48 kHz are upsampled from at most 48 kHz. - */ - -#include "SKP_Silk_resampler_private.h" - -/* Greatest common divisor */ -static SKP_int32 gcd( - SKP_int32 a, - SKP_int32 b -) -{ - SKP_int32 tmp; - while( b > 0 ) { - tmp = a - b * SKP_DIV32( a, b ); - a = b; - b = tmp; - } - return a; -} - -/* Initialize/reset the resampler state for a given pair of input/output sampling rates */ -SKP_int SKP_Silk_resampler_init( - SKP_Silk_resampler_state_struct *S, /* I/O: Resampler state */ - SKP_int32 Fs_Hz_in, /* I: Input sampling rate (Hz) */ - SKP_int32 Fs_Hz_out /* I: Output sampling rate (Hz) */ -) -{ - SKP_int32 cycleLen, cyclesPerBatch, up2 = 0, down2 = 0; - - /* Clear state */ - SKP_memset( S, 0, sizeof( SKP_Silk_resampler_state_struct ) ); - - /* Input checking */ -#if RESAMPLER_SUPPORT_ABOVE_48KHZ - if( Fs_Hz_in < 8000 || Fs_Hz_in > 192000 || Fs_Hz_out < 8000 || Fs_Hz_out > 192000 ) { -#else - if( Fs_Hz_in < 8000 || Fs_Hz_in > 48000 || Fs_Hz_out < 8000 || Fs_Hz_out > 48000 ) { -#endif - SKP_assert( 0 ); - return -1; - } - -#if RESAMPLER_SUPPORT_ABOVE_48KHZ - /* Determine pre downsampling and post upsampling */ - if( Fs_Hz_in > 96000 ) { - S->nPreDownsamplers = 2; - S->down_pre_function = SKP_Silk_resampler_private_down4; - } else if( Fs_Hz_in > 48000 ) { - S->nPreDownsamplers = 1; - S->down_pre_function = SKP_Silk_resampler_down2; - } else { - S->nPreDownsamplers = 0; - S->down_pre_function = NULL; - } - - if( Fs_Hz_out > 96000 ) { - S->nPostUpsamplers = 2; - S->up_post_function = SKP_Silk_resampler_private_up4; - } else if( Fs_Hz_out > 48000 ) { - S->nPostUpsamplers = 1; - S->up_post_function = SKP_Silk_resampler_up2; - } else { - S->nPostUpsamplers = 0; - S->up_post_function = NULL; - } - - if( S->nPreDownsamplers + S->nPostUpsamplers > 0 ) { - /* Ratio of output/input samples */ - S->ratio_Q16 = SKP_LSHIFT32( SKP_DIV32( SKP_LSHIFT32( Fs_Hz_out, 13 ), Fs_Hz_in ), 3 ); - /* Make sure the ratio is rounded up */ - while( SKP_SMULWW( S->ratio_Q16, Fs_Hz_in ) < Fs_Hz_out ) S->ratio_Q16++; - - /* Batch size is 10 ms */ - S->batchSizePrePost = SKP_DIV32_16( Fs_Hz_in, 100 ); - - /* Convert sampling rate to those after pre-downsampling and before post-upsampling */ - Fs_Hz_in = SKP_RSHIFT( Fs_Hz_in, S->nPreDownsamplers ); - Fs_Hz_out = SKP_RSHIFT( Fs_Hz_out, S->nPostUpsamplers ); - } -#endif - - /* Number of samples processed per batch */ - /* First, try 10 ms frames */ - S->batchSize = SKP_DIV32_16( Fs_Hz_in, 100 ); - if( ( SKP_MUL( S->batchSize, 100 ) != Fs_Hz_in ) || ( Fs_Hz_in % 100 != 0 ) ) { - /* No integer number of input or output samples with 10 ms frames, use greatest common divisor */ - cycleLen = SKP_DIV32( Fs_Hz_in, gcd( Fs_Hz_in, Fs_Hz_out ) ); - cyclesPerBatch = SKP_DIV32( RESAMPLER_MAX_BATCH_SIZE_IN, cycleLen ); - if( cyclesPerBatch == 0 ) { - /* cycleLen too big, let's just use the maximum batch size. Some distortion will result. */ - S->batchSize = RESAMPLER_MAX_BATCH_SIZE_IN; - SKP_assert( 0 ); - } else { - S->batchSize = SKP_MUL( cyclesPerBatch, cycleLen ); - } - } - - - /* Find resampler with the right sampling ratio */ - if( Fs_Hz_out > Fs_Hz_in ) { - /* Upsample */ - if( Fs_Hz_out == SKP_MUL( Fs_Hz_in, 2 ) ) { /* Fs_out : Fs_in = 2 : 1 */ - /* Special case: directly use 2x upsampler */ - S->resampler_function = SKP_Silk_resampler_private_up2_HQ_wrapper; - } else { - /* Default resampler */ - S->resampler_function = SKP_Silk_resampler_private_IIR_FIR; - up2 = 1; - if( Fs_Hz_in > 24000 ) { - /* Low-quality all-pass upsampler */ - S->up2_function = SKP_Silk_resampler_up2; - } else { - /* High-quality all-pass upsampler */ - S->up2_function = SKP_Silk_resampler_private_up2_HQ; - } - } - } else if ( Fs_Hz_out < Fs_Hz_in ) { - /* Downsample */ - if( SKP_MUL( Fs_Hz_out, 4 ) == SKP_MUL( Fs_Hz_in, 3 ) ) { /* Fs_out : Fs_in = 3 : 4 */ - S->FIR_Fracs = 3; - S->Coefs = SKP_Silk_Resampler_3_4_COEFS; - S->resampler_function = SKP_Silk_resampler_private_down_FIR; - } else if( SKP_MUL( Fs_Hz_out, 3 ) == SKP_MUL( Fs_Hz_in, 2 ) ) { /* Fs_out : Fs_in = 2 : 3 */ - S->FIR_Fracs = 2; - S->Coefs = SKP_Silk_Resampler_2_3_COEFS; - S->resampler_function = SKP_Silk_resampler_private_down_FIR; - } else if( SKP_MUL( Fs_Hz_out, 2 ) == Fs_Hz_in ) { /* Fs_out : Fs_in = 1 : 2 */ - S->FIR_Fracs = 1; - S->Coefs = SKP_Silk_Resampler_1_2_COEFS; - S->resampler_function = SKP_Silk_resampler_private_down_FIR; - } else if( SKP_MUL( Fs_Hz_out, 8 ) == SKP_MUL( Fs_Hz_in, 3 ) ) { /* Fs_out : Fs_in = 3 : 8 */ - S->FIR_Fracs = 3; - S->Coefs = SKP_Silk_Resampler_3_8_COEFS; - S->resampler_function = SKP_Silk_resampler_private_down_FIR; - } else if( SKP_MUL( Fs_Hz_out, 3 ) == Fs_Hz_in ) { /* Fs_out : Fs_in = 1 : 3 */ - S->FIR_Fracs = 1; - S->Coefs = SKP_Silk_Resampler_1_3_COEFS; - S->resampler_function = SKP_Silk_resampler_private_down_FIR; - } else if( SKP_MUL( Fs_Hz_out, 4 ) == Fs_Hz_in ) { /* Fs_out : Fs_in = 1 : 4 */ - S->FIR_Fracs = 1; - down2 = 1; - S->Coefs = SKP_Silk_Resampler_1_2_COEFS; - S->resampler_function = SKP_Silk_resampler_private_down_FIR; - } else if( SKP_MUL( Fs_Hz_out, 6 ) == Fs_Hz_in ) { /* Fs_out : Fs_in = 1 : 6 */ - S->FIR_Fracs = 1; - down2 = 1; - S->Coefs = SKP_Silk_Resampler_1_3_COEFS; - S->resampler_function = SKP_Silk_resampler_private_down_FIR; - } else if( SKP_MUL( Fs_Hz_out, 441 ) == SKP_MUL( Fs_Hz_in, 80 ) ) { /* Fs_out : Fs_in = 80 : 441 */ - S->Coefs = SKP_Silk_Resampler_80_441_ARMA4_COEFS; - S->resampler_function = SKP_Silk_resampler_private_IIR_FIR; - } else if( SKP_MUL( Fs_Hz_out, 441 ) == SKP_MUL( Fs_Hz_in, 120 ) ) { /* Fs_out : Fs_in = 120 : 441 */ - S->Coefs = SKP_Silk_Resampler_120_441_ARMA4_COEFS; - S->resampler_function = SKP_Silk_resampler_private_IIR_FIR; - } else if( SKP_MUL( Fs_Hz_out, 441 ) == SKP_MUL( Fs_Hz_in, 160 ) ) { /* Fs_out : Fs_in = 160 : 441 */ - S->Coefs = SKP_Silk_Resampler_160_441_ARMA4_COEFS; - S->resampler_function = SKP_Silk_resampler_private_IIR_FIR; - } else if( SKP_MUL( Fs_Hz_out, 441 ) == SKP_MUL( Fs_Hz_in, 240 ) ) { /* Fs_out : Fs_in = 240 : 441 */ - S->Coefs = SKP_Silk_Resampler_240_441_ARMA4_COEFS; - S->resampler_function = SKP_Silk_resampler_private_IIR_FIR; - } else if( SKP_MUL( Fs_Hz_out, 441 ) == SKP_MUL( Fs_Hz_in, 320 ) ) { /* Fs_out : Fs_in = 320 : 441 */ - S->Coefs = SKP_Silk_Resampler_320_441_ARMA4_COEFS; - S->resampler_function = SKP_Silk_resampler_private_IIR_FIR; - } else { - /* Default resampler */ - S->resampler_function = SKP_Silk_resampler_private_IIR_FIR; - up2 = 1; - if( Fs_Hz_in > 24000 ) { - /* Low-quality all-pass upsampler */ - S->up2_function = SKP_Silk_resampler_up2; - } else { - /* High-quality all-pass upsampler */ - S->up2_function = SKP_Silk_resampler_private_up2_HQ; - } - } - } else { - /* Input and output sampling rates are equal: copy */ - S->resampler_function = SKP_Silk_resampler_private_copy; - } - - S->input2x = up2 | down2; - - /* Ratio of input/output samples */ - S->invRatio_Q16 = SKP_LSHIFT32( SKP_DIV32( SKP_LSHIFT32( Fs_Hz_in, 14 + up2 - down2 ), Fs_Hz_out ), 2 ); - /* Make sure the ratio is rounded up */ - while( SKP_SMULWW( S->invRatio_Q16, SKP_LSHIFT32( Fs_Hz_out, down2 ) ) < SKP_LSHIFT32( Fs_Hz_in, up2 ) ) { - S->invRatio_Q16++; - } - - S->magic_number = 123456789; - - return 0; -} - -/* Clear the states of all resampling filters, without resetting sampling rate ratio */ -SKP_int SKP_Silk_resampler_clear( - SKP_Silk_resampler_state_struct *S /* I/O: Resampler state */ -) -{ - /* Clear state */ - SKP_memset( S->sDown2, 0, sizeof( S->sDown2 ) ); - SKP_memset( S->sIIR, 0, sizeof( S->sIIR ) ); - SKP_memset( S->sFIR, 0, sizeof( S->sFIR ) ); -#if RESAMPLER_SUPPORT_ABOVE_48KHZ - SKP_memset( S->sDownPre, 0, sizeof( S->sDownPre ) ); - SKP_memset( S->sUpPost, 0, sizeof( S->sUpPost ) ); -#endif - return 0; -} - -/* Resampler: convert from one sampling rate to another */ -SKP_int SKP_Silk_resampler( - SKP_Silk_resampler_state_struct *S, /* I/O: Resampler state */ - SKP_int16 out[], /* O: Output signal */ - const SKP_int16 in[], /* I: Input signal */ - SKP_int32 inLen /* I: Number of input samples */ -) -{ - /* Verify that state was initialized and has not been corrupted */ - if( S->magic_number != 123456789 ) { - SKP_assert( 0 ); - return -1; - } - -#if RESAMPLER_SUPPORT_ABOVE_48KHZ - if( S->nPreDownsamplers + S->nPostUpsamplers > 0 ) { - /* The input and/or output sampling rate is above 48000 Hz */ - SKP_int32 nSamplesIn, nSamplesOut; - SKP_int16 in_buf[ 480 ], out_buf[ 480 ]; - - while( inLen > 0 ) { - /* Number of input and output samples to process */ - nSamplesIn = SKP_min( inLen, S->batchSizePrePost ); - nSamplesOut = SKP_SMULWB( S->ratio_Q16, nSamplesIn ); - - SKP_assert( SKP_RSHIFT32( nSamplesIn, S->nPreDownsamplers ) <= 480 ); - SKP_assert( SKP_RSHIFT32( nSamplesOut, S->nPostUpsamplers ) <= 480 ); - - if( S->nPreDownsamplers > 0 ) { - S->down_pre_function( S->sDownPre, in_buf, in, nSamplesIn ); - if( S->nPostUpsamplers > 0 ) { - S->resampler_function( S, out_buf, in_buf, SKP_RSHIFT32( nSamplesIn, S->nPreDownsamplers ) ); - S->up_post_function( S->sUpPost, out, out_buf, SKP_RSHIFT32( nSamplesOut, S->nPostUpsamplers ) ); - } else { - S->resampler_function( S, out, in_buf, SKP_RSHIFT32( nSamplesIn, S->nPreDownsamplers ) ); - } - } else { - S->resampler_function( S, out_buf, in, SKP_RSHIFT32( nSamplesIn, S->nPreDownsamplers ) ); - S->up_post_function( S->sUpPost, out, out_buf, SKP_RSHIFT32( nSamplesOut, S->nPostUpsamplers ) ); - } - - in += nSamplesIn; - out += nSamplesOut; - inLen -= nSamplesIn; - } - } else -#endif - { - /* Input and output sampling rate are at most 48000 Hz */ - S->resampler_function( S, out, in, inLen ); - } - - return 0; -} diff --git a/libs/silk/src/SKP_Silk_resampler_down2.c b/libs/silk/src/SKP_Silk_resampler_down2.c deleted file mode 100644 index c11c799e49..0000000000 --- a/libs/silk/src/SKP_Silk_resampler_down2.c +++ /dev/null @@ -1,77 +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_resampler_down2.c * - * * - * Downsample by a factor 2, mediocre quality * - * * - * Copyright 2010 (c), Skype Limited * - * */ - -#include "SKP_Silk_SigProc_FIX.h" -#include "SKP_Silk_resampler_rom.h" - -/* Downsample by a factor 2, mediocre quality */ -void SKP_Silk_resampler_down2( - SKP_int32 *S, /* I/O: State vector [ 2 ] */ - SKP_int16 *out, /* O: Output signal [ len ] */ - const SKP_int16 *in, /* I: Input signal [ floor(len/2) ] */ - SKP_int32 inLen /* I: Number of input samples */ -) -{ - SKP_int32 k, len2 = SKP_RSHIFT32( inLen, 1 ); - SKP_int32 in32, out32, Y, X; - - SKP_assert( SKP_Silk_resampler_down2_0 > 0 ); - SKP_assert( SKP_Silk_resampler_down2_1 < 0 ); - - /* Internal variables and state are in Q10 format */ - for( k = 0; k < len2; k++ ) { - /* Convert to Q10 */ - in32 = SKP_LSHIFT( (SKP_int32)in[ 2 * k ], 10 ); - - /* All-pass section for even input sample */ - Y = SKP_SUB32( in32, S[ 0 ] ); - X = SKP_SMLAWB( Y, Y, SKP_Silk_resampler_down2_1 ); - out32 = SKP_ADD32( S[ 0 ], X ); - S[ 0 ] = SKP_ADD32( in32, X ); - - /* Convert to Q10 */ - in32 = SKP_LSHIFT( (SKP_int32)in[ 2 * k + 1 ], 10 ); - - /* All-pass section for odd input sample, and add to output of previous section */ - Y = SKP_SUB32( in32, S[ 1 ] ); - X = SKP_SMULWB( Y, SKP_Silk_resampler_down2_0 ); - out32 = SKP_ADD32( out32, S[ 1 ] ); - out32 = SKP_ADD32( out32, X ); - S[ 1 ] = SKP_ADD32( in32, X ); - - /* Add, convert back to int16 and store to output */ - out[ k ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( out32, 11 ) ); - } -} diff --git a/libs/silk/src/SKP_Silk_resampler_down2_3.c b/libs/silk/src/SKP_Silk_resampler_down2_3.c deleted file mode 100644 index b7ffbcd188..0000000000 --- a/libs/silk/src/SKP_Silk_resampler_down2_3.c +++ /dev/null @@ -1,102 +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_resampler_down2_3.c * - * * - * Downsample by a factor 2/3, low quality * - * * - * Copyright 2010 (c), Skype Limited * - * */ - -#include "SKP_Silk_SigProc_FIX.h" -#include "SKP_Silk_resampler_private.h" - -#define ORDER_FIR 4 - -/* Downsample by a factor 2/3, low quality */ -void SKP_Silk_resampler_down2_3( - SKP_int32 *S, /* I/O: State vector [ 6 ] */ - SKP_int16 *out, /* O: Output signal [ floor(2*inLen/3) ] */ - const SKP_int16 *in, /* I: Input signal [ inLen ] */ - SKP_int32 inLen /* I: Number of input samples */ -) -{ - SKP_int32 nSamplesIn, counter, res_Q6; - SKP_int32 buf[ RESAMPLER_MAX_BATCH_SIZE_IN + ORDER_FIR ]; - SKP_int32 *buf_ptr; - - /* Copy buffered samples to start of buffer */ - SKP_memcpy( buf, S, ORDER_FIR * sizeof( SKP_int32 ) ); - - /* Iterate over blocks of frameSizeIn input samples */ - while( 1 ) { - nSamplesIn = SKP_min( inLen, RESAMPLER_MAX_BATCH_SIZE_IN ); - - /* Second-order AR filter (output in Q8) */ - SKP_Silk_resampler_private_AR2( &S[ ORDER_FIR ], &buf[ ORDER_FIR ], in, - SKP_Silk_Resampler_2_3_COEFS_LQ, nSamplesIn ); - - /* Interpolate filtered signal */ - buf_ptr = buf; - counter = nSamplesIn; - while( counter > 2 ) { - /* Inner product */ - res_Q6 = SKP_SMULWB( buf_ptr[ 0 ], SKP_Silk_Resampler_2_3_COEFS_LQ[ 2 ] ); - res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 1 ], SKP_Silk_Resampler_2_3_COEFS_LQ[ 3 ] ); - res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 2 ], SKP_Silk_Resampler_2_3_COEFS_LQ[ 5 ] ); - res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 3 ], SKP_Silk_Resampler_2_3_COEFS_LQ[ 4 ] ); - - /* Scale down, saturate and store in output array */ - *out++ = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( res_Q6, 6 ) ); - - res_Q6 = SKP_SMULWB( buf_ptr[ 1 ], SKP_Silk_Resampler_2_3_COEFS_LQ[ 4 ] ); - res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 2 ], SKP_Silk_Resampler_2_3_COEFS_LQ[ 5 ] ); - res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 3 ], SKP_Silk_Resampler_2_3_COEFS_LQ[ 3 ] ); - res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 4 ], SKP_Silk_Resampler_2_3_COEFS_LQ[ 2 ] ); - - /* Scale down, saturate and store in output array */ - *out++ = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( res_Q6, 6 ) ); - - buf_ptr += 3; - counter -= 3; - } - - in += nSamplesIn; - inLen -= nSamplesIn; - - if( inLen > 0 ) { - /* More iterations to do; copy last part of filtered signal to beginning of buffer */ - SKP_memcpy( buf, &buf[ nSamplesIn ], ORDER_FIR * sizeof( SKP_int32 ) ); - } else { - break; - } - } - - /* Copy last part of filtered signal to the state for the next call */ - SKP_memcpy( S, &buf[ nSamplesIn ], ORDER_FIR * sizeof( SKP_int32 ) ); -} diff --git a/libs/silk/src/SKP_Silk_resampler_down3.c b/libs/silk/src/SKP_Silk_resampler_down3.c deleted file mode 100644 index ff73e96b50..0000000000 --- a/libs/silk/src/SKP_Silk_resampler_down3.c +++ /dev/null @@ -1,93 +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_resampler_down3.c * - * * - * Downsample by a factor 3, low quality * - * * - * Copyright 2010 (c), Skype Limited * - * */ - -#include "SKP_Silk_SigProc_FIX.h" -#include "SKP_Silk_resampler_private.h" - -#define ORDER_FIR 6 - -/* Downsample by a factor 3, low quality */ -void SKP_Silk_resampler_down3( - SKP_int32 *S, /* I/O: State vector [ 8 ] */ - SKP_int16 *out, /* O: Output signal [ floor(inLen/3) ] */ - const SKP_int16 *in, /* I: Input signal [ inLen ] */ - SKP_int32 inLen /* I: Number of input samples */ -) -{ - SKP_int32 nSamplesIn, counter, res_Q6; - SKP_int32 buf[ RESAMPLER_MAX_BATCH_SIZE_IN + ORDER_FIR ]; - SKP_int32 *buf_ptr; - - /* Copy buffered samples to start of buffer */ - SKP_memcpy( buf, S, ORDER_FIR * sizeof( SKP_int32 ) ); - - /* Iterate over blocks of frameSizeIn input samples */ - while( 1 ) { - nSamplesIn = SKP_min( inLen, RESAMPLER_MAX_BATCH_SIZE_IN ); - - /* Second-order AR filter (output in Q8) */ - SKP_Silk_resampler_private_AR2( &S[ ORDER_FIR ], &buf[ ORDER_FIR ], in, - SKP_Silk_Resampler_1_3_COEFS_LQ, nSamplesIn ); - - /* Interpolate filtered signal */ - buf_ptr = buf; - counter = nSamplesIn; - while( counter > 2 ) { - /* Inner product */ - res_Q6 = SKP_SMULWB( SKP_ADD32( buf_ptr[ 0 ], buf_ptr[ 5 ] ), SKP_Silk_Resampler_1_3_COEFS_LQ[ 2 ] ); - res_Q6 = SKP_SMLAWB( res_Q6, SKP_ADD32( buf_ptr[ 1 ], buf_ptr[ 4 ] ), SKP_Silk_Resampler_1_3_COEFS_LQ[ 3 ] ); - res_Q6 = SKP_SMLAWB( res_Q6, SKP_ADD32( buf_ptr[ 2 ], buf_ptr[ 3 ] ), SKP_Silk_Resampler_1_3_COEFS_LQ[ 4 ] ); - - /* Scale down, saturate and store in output array */ - *out++ = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( res_Q6, 6 ) ); - - buf_ptr += 3; - counter -= 3; - } - - in += nSamplesIn; - inLen -= nSamplesIn; - - if( inLen > 0 ) { - /* More iterations to do; copy last part of filtered signal to beginning of buffer */ - SKP_memcpy( buf, &buf[ nSamplesIn ], ORDER_FIR * sizeof( SKP_int32 ) ); - } else { - break; - } - } - - /* Copy last part of filtered signal to the state for the next call */ - SKP_memcpy( S, &buf[ nSamplesIn ], ORDER_FIR * sizeof( SKP_int32 ) ); -} diff --git a/libs/silk/src/SKP_Silk_resampler_private.h b/libs/silk/src/SKP_Silk_resampler_private.h deleted file mode 100644 index 2beaa4b21f..0000000000 --- a/libs/silk/src/SKP_Silk_resampler_private.h +++ /dev/null @@ -1,130 +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. -***********************************************************************/ - -/* * - * File Name: SKP_Silk_resampler_structs.h * - * * - * Description: Structs for IIR/FIR resamplers * - * * - * Copyright 2010 (c), Skype Limited * - * All rights reserved. * - * * - * */ - -#ifndef SKP_Silk_RESAMPLER_H -#define SKP_Silk_RESAMPLER_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "SKP_Silk_SigProc_FIX.h" -#include "SKP_Silk_resampler_structs.h" -#include "SKP_Silk_resampler_rom.h" - -/* Number of input samples to process in the inner loop */ -#define RESAMPLER_MAX_BATCH_SIZE_IN 480 - -/* Description: Hybrid IIR/FIR polyphase implementation of resampling */ -void SKP_Silk_resampler_private_IIR_FIR( - void *SS, /* I/O: Resampler state */ - SKP_int16 out[], /* O: Output signal */ - const SKP_int16 in[], /* I: Input signal */ - SKP_int32 inLen /* I: Number of input samples */ -); - -/* Description: Hybrid IIR/FIR polyphase implementation of resampling */ -void SKP_Silk_resampler_private_down_FIR( - void *SS, /* I/O: Resampler state */ - SKP_int16 out[], /* O: Output signal */ - const SKP_int16 in[], /* I: Input signal */ - SKP_int32 inLen /* I: Number of input samples */ -); - -/* Copy */ -void SKP_Silk_resampler_private_copy( - void *SS, /* I/O: Resampler state (unused) */ - SKP_int16 out[], /* O: Output signal */ - const SKP_int16 in[], /* I: Input signal */ - SKP_int32 inLen /* I: Number of input samples */ -); - -/* Upsample by a factor 2, high quality */ -void SKP_Silk_resampler_private_up2_HQ_wrapper( - void *SS, /* I/O: Resampler state (unused) */ - SKP_int16 *out, /* O: Output signal [ 2 * len ] */ - const SKP_int16 *in, /* I: Input signal [ len ] */ - SKP_int32 len /* I: Number of input samples */ -); - -/* Upsample by a factor 2, high quality */ -void SKP_Silk_resampler_private_up2_HQ( - SKP_int32 *S, /* I/O: Resampler state [ 6 ] */ - SKP_int16 *out, /* O: Output signal [ 2 * len ] */ - const SKP_int16 *in, /* I: Input signal [ len ] */ - SKP_int32 len /* I: Number of input samples */ -); - -/* Upsample 4x, low quality */ -void SKP_Silk_resampler_private_up4( - SKP_int32 *S, /* I/O: State vector [ 2 ] */ - SKP_int16 *out, /* O: Output signal [ 4 * len ] */ - const SKP_int16 *in, /* I: Input signal [ len ] */ - SKP_int32 len /* I: Number of input samples */ -); - -/* Downsample 4x, low quality */ -void SKP_Silk_resampler_private_down4( - SKP_int32 *S, /* I/O: State vector [ 2 ] */ - SKP_int16 *out, /* O: Output signal [ floor(len/2) ] */ - const SKP_int16 *in, /* I: Input signal [ len ] */ - SKP_int32 inLen /* I: Number of input samples */ -); - -/* Second order AR filter */ -void SKP_Silk_resampler_private_AR2( - SKP_int32 S[], /* I/O: State vector [ 2 ] */ - SKP_int32 out_Q8[], /* O: Output signal */ - const SKP_int16 in[], /* I: Input signal */ - const SKP_int16 A_Q14[], /* I: AR coefficients, Q14 */ - SKP_int32 len /* I: Signal length */ -); - -/* Fourth order ARMA filter */ -void SKP_Silk_resampler_private_ARMA4( - SKP_int32 S[], /* I/O: State vector [ 4 ] */ - SKP_int16 out[], /* O: Output signal */ - const SKP_int16 in[], /* I: Input signal */ - const SKP_int16 Coef[], /* I: ARMA coefficients [ 7 ] */ - SKP_int32 len /* I: Signal length */ -); - - -#ifdef __cplusplus -} -#endif -#endif // SKP_Silk_RESAMPLER_H diff --git a/libs/silk/src/SKP_Silk_resampler_private_AR2.c b/libs/silk/src/SKP_Silk_resampler_private_AR2.c deleted file mode 100644 index d7d53ea956..0000000000 --- a/libs/silk/src/SKP_Silk_resampler_private_AR2.c +++ /dev/null @@ -1,58 +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_resampler_private_AR2. c * - * * - * Second order AR filter with single delay elements * - * * - * Copyright 2010 (c), Skype Limited * - * */ - -#include "SKP_Silk_SigProc_FIX.h" -#include "SKP_Silk_resampler_private.h" - -/* Second order AR filter with single delay elements */ -void SKP_Silk_resampler_private_AR2( - SKP_int32 S[], /* I/O: State vector [ 2 ] */ - SKP_int32 out_Q8[], /* O: Output signal */ - const SKP_int16 in[], /* I: Input signal */ - const SKP_int16 A_Q14[], /* I: AR coefficients, Q14 */ - SKP_int32 len /* I: Signal length */ -) -{ - SKP_int32 k; - SKP_int32 out32; - - for( k = 0; k < len; k++ ) { - out32 = SKP_ADD_LSHIFT32( S[ 0 ], (SKP_int32)in[ k ], 8 ); - out_Q8[ k ] = out32; - out32 = SKP_LSHIFT( out32, 2 ); - S[ 0 ] = SKP_SMLAWB( S[ 1 ], out32, A_Q14[ 0 ] ); - S[ 1 ] = SKP_SMULWB( out32, A_Q14[ 1 ] ); - } -} diff --git a/libs/silk/src/SKP_Silk_resampler_private_ARMA4.c b/libs/silk/src/SKP_Silk_resampler_private_ARMA4.c deleted file mode 100644 index 87eeed55b5..0000000000 --- a/libs/silk/src/SKP_Silk_resampler_private_ARMA4.c +++ /dev/null @@ -1,76 +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_resampler_private_ARMA4.c * - * * - * Fourth order ARMA filter, applies 64x gain * - * * - * Copyright 2010 (c), Skype Limited * - * */ - -#include "SKP_Silk_SigProc_FIX.h" -#include "SKP_Silk_resampler_private.h" - -/* Fourth order ARMA filter */ -/* Internally operates as two biquad filters in sequence. */ - -/* Coeffients are stored in a packed format: */ -/* { B1_Q14[1], B2_Q14[1], -A1_Q14[1], -A1_Q14[2], -A2_Q14[1], -A2_Q14[2], gain_Q16 } */ -/* where it is assumed that B*_Q14[0], B*_Q14[2], A*_Q14[0] are all 16384 */ -void SKP_Silk_resampler_private_ARMA4( - SKP_int32 S[], /* I/O: State vector [ 4 ] */ - SKP_int16 out[], /* O: Output signal */ - const SKP_int16 in[], /* I: Input signal */ - const SKP_int16 Coef[], /* I: ARMA coefficients [ 7 ] */ - SKP_int32 len /* I: Signal length */ -) -{ - SKP_int32 k; - SKP_int32 in_Q8, out1_Q8, out2_Q8, X; - - for( k = 0; k < len; k++ ) { - in_Q8 = SKP_LSHIFT32( (SKP_int32)in[ k ], 8 ); - - /* Outputs of first and second biquad */ - out1_Q8 = SKP_ADD_LSHIFT32( in_Q8, S[ 0 ], 2 ); - out2_Q8 = SKP_ADD_LSHIFT32( out1_Q8, S[ 2 ], 2 ); - - /* Update states, which are stored in Q6. Coefficients are in Q14 here */ - X = SKP_SMLAWB( S[ 1 ], in_Q8, Coef[ 0 ] ); - S[ 0 ] = SKP_SMLAWB( X, out1_Q8, Coef[ 2 ] ); - - X = SKP_SMLAWB( S[ 3 ], out1_Q8, Coef[ 1 ] ); - S[ 2 ] = SKP_SMLAWB( X, out2_Q8, Coef[ 4 ] ); - - S[ 1 ] = SKP_SMLAWB( SKP_RSHIFT32( in_Q8, 2 ), out1_Q8, Coef[ 3 ] ); - S[ 3 ] = SKP_SMLAWB( SKP_RSHIFT32( out1_Q8, 2 ), out2_Q8, Coef[ 5 ] ); - - /* Apply gain and store to output. The coefficient is in Q16 */ - out[ k ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT32( SKP_SMLAWB( 128, out2_Q8, Coef[ 6 ] ), 8 ) ); - } -} diff --git a/libs/silk/src/SKP_Silk_resampler_private_IIR_FIR.c b/libs/silk/src/SKP_Silk_resampler_private_IIR_FIR.c deleted file mode 100644 index c625f2c5e8..0000000000 --- a/libs/silk/src/SKP_Silk_resampler_private_IIR_FIR.c +++ /dev/null @@ -1,104 +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. -***********************************************************************/ - -/* * - * File Name: SKP_Silk_resampler_private_IIR_FIR.c * - * * - * Description: Hybrid IIR/FIR polyphase implementation of resampling * - * * - * Copyright 2010 (c), Skype Limited * - * All rights reserved. * - * */ - -#include "SKP_Silk_SigProc_FIX.h" -#include "SKP_Silk_resampler_private.h" -SKP_INLINE SKP_int16 *SKP_Silk_resampler_private_IIR_FIR_INTERPOL( - SKP_int16 * out, SKP_int16 * buf, SKP_int32 max_index_Q16 , SKP_int32 index_increment_Q16 ){ - SKP_int32 index_Q16, res_Q15; - SKP_int16 *buf_ptr; - SKP_int32 table_index; - /* Interpolate upsampled signal and store in output array */ - for( index_Q16 = 0; index_Q16 < max_index_Q16; index_Q16 += index_increment_Q16 ) { - table_index = SKP_SMULWB( index_Q16 & 0xFFFF, 144 ); - buf_ptr = &buf[ index_Q16 >> 16 ]; - - res_Q15 = SKP_SMULBB( buf_ptr[ 0 ], SKP_Silk_resampler_frac_FIR_144[ table_index ][ 0 ] ); - res_Q15 = SKP_SMLABB( res_Q15, buf_ptr[ 1 ], SKP_Silk_resampler_frac_FIR_144[ table_index ][ 1 ] ); - res_Q15 = SKP_SMLABB( res_Q15, buf_ptr[ 2 ], SKP_Silk_resampler_frac_FIR_144[ table_index ][ 2 ] ); - res_Q15 = SKP_SMLABB( res_Q15, buf_ptr[ 3 ], SKP_Silk_resampler_frac_FIR_144[ 143 - table_index ][ 2 ] ); - res_Q15 = SKP_SMLABB( res_Q15, buf_ptr[ 4 ], SKP_Silk_resampler_frac_FIR_144[ 143 - table_index ][ 1 ] ); - res_Q15 = SKP_SMLABB( res_Q15, buf_ptr[ 5 ], SKP_Silk_resampler_frac_FIR_144[ 143 - table_index ][ 0 ] ); - *out++ = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( res_Q15, 15 ) ); - } - return out; -} -/* Upsample using a combination of allpass-based 2x upsampling and FIR interpolation */ -void SKP_Silk_resampler_private_IIR_FIR( - void *SS, /* I/O: Resampler state */ - SKP_int16 out[], /* O: Output signal */ - const SKP_int16 in[], /* I: Input signal */ - SKP_int32 inLen /* I: Number of input samples */ -) -{ - SKP_Silk_resampler_state_struct *S = (SKP_Silk_resampler_state_struct *)SS; - SKP_int32 nSamplesIn; - SKP_int32 max_index_Q16, index_increment_Q16; - SKP_int16 buf[ 2 * RESAMPLER_MAX_BATCH_SIZE_IN + RESAMPLER_ORDER_FIR_144 ]; - - - /* Copy buffered samples to start of buffer */ - SKP_memcpy( buf, S->sFIR, RESAMPLER_ORDER_FIR_144 * sizeof( SKP_int32 ) ); - - /* Iterate over blocks of frameSizeIn input samples */ - index_increment_Q16 = S->invRatio_Q16; - while( 1 ) { - nSamplesIn = SKP_min( inLen, S->batchSize ); - - if( S->input2x == 1 ) { - /* Upsample 2x */ - S->up2_function( S->sIIR, &buf[ RESAMPLER_ORDER_FIR_144 ], in, nSamplesIn ); - } else { - /* Fourth-order ARMA filter */ - SKP_Silk_resampler_private_ARMA4( S->sIIR, &buf[ RESAMPLER_ORDER_FIR_144 ], in, S->Coefs, nSamplesIn ); - } - - max_index_Q16 = SKP_LSHIFT32( nSamplesIn, 16 + S->input2x ); /* +1 if 2x upsampling */ - out = SKP_Silk_resampler_private_IIR_FIR_INTERPOL(out, buf, max_index_Q16, index_increment_Q16); - in += nSamplesIn; - inLen -= nSamplesIn; - - if( inLen > 0 ) { - /* More iterations to do; copy last part of filtered signal to beginning of buffer */ - SKP_memcpy( buf, &buf[ nSamplesIn << S->input2x ], RESAMPLER_ORDER_FIR_144 * sizeof( SKP_int32 ) ); - } else { - break; - } - } - - /* Copy last part of filtered signal to the state for the next call */ - SKP_memcpy( S->sFIR, &buf[nSamplesIn << S->input2x ], RESAMPLER_ORDER_FIR_144 * sizeof( SKP_int32 ) ); -} diff --git a/libs/silk/src/SKP_Silk_resampler_private_copy.c b/libs/silk/src/SKP_Silk_resampler_private_copy.c deleted file mode 100644 index 8915a995a2..0000000000 --- a/libs/silk/src/SKP_Silk_resampler_private_copy.c +++ /dev/null @@ -1,49 +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. -***********************************************************************/ - -/* * - * File Name: SKP_Silk_resampler_private_copy.c * - * * - * Description: Copy. * - * * - * Copyright 2010 (c), Skype Limited * - * All rights reserved. * - * */ - -#include "SKP_Silk_SigProc_FIX.h" -#include "SKP_Silk_resampler_private.h" - -/* Copy */ -void SKP_Silk_resampler_private_copy( - void *SS, /* I/O: Resampler state (unused) */ - SKP_int16 out[], /* O: Output signal */ - const SKP_int16 in[], /* I: Input signal */ - SKP_int32 inLen /* I: Number of input samples */ -) -{ - SKP_memcpy( out, in, inLen * sizeof( SKP_int16 ) ); -} diff --git a/libs/silk/src/SKP_Silk_resampler_private_down4.c b/libs/silk/src/SKP_Silk_resampler_private_down4.c deleted file mode 100644 index 43c14ac927..0000000000 --- a/libs/silk/src/SKP_Silk_resampler_private_down4.c +++ /dev/null @@ -1,77 +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_resampler_private_down4.c * - * * - * Downsample by a factor 4 * - * * - * Copyright 2010 (c), Skype Limited * - * */ - -#include "SKP_Silk_SigProc_FIX.h" -#include "SKP_Silk_resampler_private.h" - -/* Downsample by a factor 4. Note: very low quality, only use with input sampling rates above 96 kHz. */ -void SKP_Silk_resampler_private_down4( - SKP_int32 *S, /* I/O: State vector [ 2 ] */ - SKP_int16 *out, /* O: Output signal [ floor(len/2) ] */ - const SKP_int16 *in, /* I: Input signal [ len ] */ - SKP_int32 inLen /* I: Number of input samples */ -) -{ - SKP_int32 k, len4 = SKP_RSHIFT32( inLen, 2 ); - SKP_int32 in32, out32, Y, X; - - SKP_assert( SKP_Silk_resampler_down2_0 > 0 ); - SKP_assert( SKP_Silk_resampler_down2_1 < 0 ); - - /* Internal variables and state are in Q10 format */ - for( k = 0; k < len4; k++ ) { - /* Add two input samples and convert to Q10 */ - in32 = SKP_LSHIFT( SKP_ADD32( (SKP_int32)in[ 4 * k ], (SKP_int32)in[ 4 * k + 1 ] ), 9 ); - - /* All-pass section for even input sample */ - Y = SKP_SUB32( in32, S[ 0 ] ); - X = SKP_SMLAWB( Y, Y, SKP_Silk_resampler_down2_1 ); - out32 = SKP_ADD32( S[ 0 ], X ); - S[ 0 ] = SKP_ADD32( in32, X ); - - /* Add two input samples and convert to Q10 */ - in32 = SKP_LSHIFT( SKP_ADD32( (SKP_int32)in[ 4 * k + 2 ], (SKP_int32)in[ 4 * k + 3 ] ), 9 ); - - /* All-pass section for odd input sample */ - Y = SKP_SUB32( in32, S[ 1 ] ); - X = SKP_SMULWB( Y, SKP_Silk_resampler_down2_0 ); - out32 = SKP_ADD32( out32, S[ 1 ] ); - out32 = SKP_ADD32( out32, X ); - S[ 1 ] = SKP_ADD32( in32, X ); - - /* Add, convert back to int16 and store to output */ - out[ k ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( out32, 11 ) ); - } -} diff --git a/libs/silk/src/SKP_Silk_resampler_private_down_FIR.c b/libs/silk/src/SKP_Silk_resampler_private_down_FIR.c deleted file mode 100644 index 00d8f9cafe..0000000000 --- a/libs/silk/src/SKP_Silk_resampler_private_down_FIR.c +++ /dev/null @@ -1,159 +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. -***********************************************************************/ - -/* * - * File Name: SKP_Silk_resampler_private_down_FIR.c * - * * - * Description: Hybrid IIR/FIR polyphase implementation of resampling * - * * - * Copyright 2010 (c), Skype Limited * - * All rights reserved. * - * */ - -#include "SKP_Silk_SigProc_FIX.h" -#include "SKP_Silk_resampler_private.h" -SKP_INLINE SKP_int16 *SKP_Silk_resampler_private_down_FIR_INTERPOL0( - SKP_int16 *out, SKP_int32 *buf2, const SKP_int16 *FIR_Coefs, SKP_int32 max_index_Q16, SKP_int32 index_increment_Q16){ - - SKP_int32 index_Q16, res_Q6; - SKP_int32 *buf_ptr; - for( index_Q16 = 0; index_Q16 < max_index_Q16; index_Q16 += index_increment_Q16 ) { - /* Integer part gives pointer to buffered input */ - buf_ptr = buf2 + SKP_RSHIFT( index_Q16, 16 ); - - /* Inner product */ - res_Q6 = SKP_SMULWB( SKP_ADD32( buf_ptr[ 0 ], buf_ptr[ 11 ] ), FIR_Coefs[ 0 ] ); - res_Q6 = SKP_SMLAWB( res_Q6, SKP_ADD32( buf_ptr[ 1 ], buf_ptr[ 10 ] ), FIR_Coefs[ 1 ] ); - res_Q6 = SKP_SMLAWB( res_Q6, SKP_ADD32( buf_ptr[ 2 ], buf_ptr[ 9 ] ), FIR_Coefs[ 2 ] ); - res_Q6 = SKP_SMLAWB( res_Q6, SKP_ADD32( buf_ptr[ 3 ], buf_ptr[ 8 ] ), FIR_Coefs[ 3 ] ); - res_Q6 = SKP_SMLAWB( res_Q6, SKP_ADD32( buf_ptr[ 4 ], buf_ptr[ 7 ] ), FIR_Coefs[ 4 ] ); - res_Q6 = SKP_SMLAWB( res_Q6, SKP_ADD32( buf_ptr[ 5 ], buf_ptr[ 6 ] ), FIR_Coefs[ 5 ] ); - - /* Scale down, saturate and store in output array */ - *out++ = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( res_Q6, 6 ) ); - } - return out; -} - -SKP_INLINE SKP_int16 *SKP_Silk_resampler_private_down_FIR_INTERPOL1( - SKP_int16 *out, SKP_int32 *buf2, const SKP_int16 *FIR_Coefs, SKP_int32 max_index_Q16, SKP_int32 index_increment_Q16, SKP_int32 FIR_Fracs){ - - SKP_int32 index_Q16, res_Q6; - SKP_int32 *buf_ptr; - SKP_int32 interpol_ind; - const SKP_int16 *interpol_ptr; - for( index_Q16 = 0; index_Q16 < max_index_Q16; index_Q16 += index_increment_Q16 ) { - /* Integer part gives pointer to buffered input */ - buf_ptr = buf2 + SKP_RSHIFT( index_Q16, 16 ); - - /* Fractional part gives interpolation coefficients */ - interpol_ind = SKP_SMULWB( index_Q16 & 0xFFFF, FIR_Fracs ); - - /* Inner product */ - interpol_ptr = &FIR_Coefs[ RESAMPLER_DOWN_ORDER_FIR / 2 * interpol_ind ]; - res_Q6 = SKP_SMULWB( buf_ptr[ 0 ], interpol_ptr[ 0 ] ); - res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 1 ], interpol_ptr[ 1 ] ); - res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 2 ], interpol_ptr[ 2 ] ); - res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 3 ], interpol_ptr[ 3 ] ); - res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 4 ], interpol_ptr[ 4 ] ); - res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 5 ], interpol_ptr[ 5 ] ); - interpol_ptr = &FIR_Coefs[ RESAMPLER_DOWN_ORDER_FIR / 2 * ( FIR_Fracs - 1 - interpol_ind ) ]; - res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 11 ], interpol_ptr[ 0 ] ); - res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 10 ], interpol_ptr[ 1 ] ); - res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 9 ], interpol_ptr[ 2 ] ); - res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 8 ], interpol_ptr[ 3 ] ); - res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 7 ], interpol_ptr[ 4 ] ); - res_Q6 = SKP_SMLAWB( res_Q6, buf_ptr[ 6 ], interpol_ptr[ 5 ] ); - - /* Scale down, saturate and store in output array */ - *out++ = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( res_Q6, 6 ) ); - } - return out; -} - - -/* Resample with a 2x downsampler (optional), a 2nd order AR filter followed by FIR interpolation */ -void SKP_Silk_resampler_private_down_FIR( - void *SS, /* I/O: Resampler state */ - SKP_int16 out[], /* O: Output signal */ - const SKP_int16 in[], /* I: Input signal */ - SKP_int32 inLen /* I: Number of input samples */ -) -{ - SKP_Silk_resampler_state_struct *S = (SKP_Silk_resampler_state_struct *)SS; - SKP_int32 nSamplesIn; - SKP_int32 max_index_Q16, index_increment_Q16; - SKP_int16 buf1[ RESAMPLER_MAX_BATCH_SIZE_IN / 2 ]; - SKP_int32 buf2[ RESAMPLER_MAX_BATCH_SIZE_IN + RESAMPLER_DOWN_ORDER_FIR ]; - const SKP_int16 *FIR_Coefs; - - /* Copy buffered samples to start of buffer */ - SKP_memcpy( buf2, S->sFIR, RESAMPLER_DOWN_ORDER_FIR * sizeof( SKP_int32 ) ); - - FIR_Coefs = &S->Coefs[ 2 ]; - - /* Iterate over blocks of frameSizeIn input samples */ - index_increment_Q16 = S->invRatio_Q16; - while( 1 ) { - nSamplesIn = SKP_min( inLen, S->batchSize ); - - if( S->input2x == 1 ) { - /* Downsample 2x */ - SKP_Silk_resampler_down2( S->sDown2, buf1, in, nSamplesIn ); - - nSamplesIn = SKP_RSHIFT32( nSamplesIn, 1 ); - - /* Second-order AR filter (output in Q8) */ - SKP_Silk_resampler_private_AR2( S->sIIR, &buf2[ RESAMPLER_DOWN_ORDER_FIR ], buf1, S->Coefs, nSamplesIn ); - } else { - /* Second-order AR filter (output in Q8) */ - SKP_Silk_resampler_private_AR2( S->sIIR, &buf2[ RESAMPLER_DOWN_ORDER_FIR ], in, S->Coefs, nSamplesIn ); - } - - max_index_Q16 = SKP_LSHIFT32( nSamplesIn, 16 ); - - /* Interpolate filtered signal */ - if( S->FIR_Fracs == 1 ) { - out = SKP_Silk_resampler_private_down_FIR_INTERPOL0(out, buf2, FIR_Coefs, max_index_Q16, index_increment_Q16); - } else { - out = SKP_Silk_resampler_private_down_FIR_INTERPOL1(out, buf2, FIR_Coefs, max_index_Q16, index_increment_Q16, S->FIR_Fracs); - } - - in += nSamplesIn << S->input2x; - inLen -= nSamplesIn << S->input2x; - - if( inLen > S->input2x ) { - /* More iterations to do; copy last part of filtered signal to beginning of buffer */ - SKP_memcpy( buf2, &buf2[ nSamplesIn ], RESAMPLER_DOWN_ORDER_FIR * sizeof( SKP_int32 ) ); - } else { - break; - } - } - - /* Copy last part of filtered signal to the state for the next call */ - SKP_memcpy( S->sFIR, &buf2[ nSamplesIn ], RESAMPLER_DOWN_ORDER_FIR * sizeof( SKP_int32 ) ); -} diff --git a/libs/silk/src/SKP_Silk_resampler_private_up2_HQ.c b/libs/silk/src/SKP_Silk_resampler_private_up2_HQ.c deleted file mode 100644 index d8e27efed0..0000000000 --- a/libs/silk/src/SKP_Silk_resampler_private_up2_HQ.c +++ /dev/null @@ -1,118 +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_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" - -/* Upsample by a factor 2, high quality */ -/* Uses 2nd order allpass filters for the 2x upsampling, followed by a */ -/* notch filter just above Nyquist. */ -void SKP_Silk_resampler_private_up2_HQ( - SKP_int32 *S, /* I/O: Resampler state [ 6 ] */ - SKP_int16 *out, /* O: Output signal [ 2 * len ] */ - const SKP_int16 *in, /* I: Input signal [ len ] */ - SKP_int32 len /* I: Number of INPUT samples */ -) -{ - SKP_int32 k; - SKP_int32 in32, out32_1, out32_2, Y, X; - - SKP_assert( SKP_Silk_resampler_up2_hq_0[ 0 ] > 0 ); - SKP_assert( SKP_Silk_resampler_up2_hq_0[ 1 ] < 0 ); - SKP_assert( SKP_Silk_resampler_up2_hq_1[ 0 ] > 0 ); - SKP_assert( SKP_Silk_resampler_up2_hq_1[ 1 ] < 0 ); - - /* Internal variables and state are in Q10 format */ - for( k = 0; k < len; k++ ) { - /* Convert to Q10 */ - in32 = SKP_LSHIFT( (SKP_int32)in[ k ], 10 ); - - /* First all-pass section for even output sample */ - Y = SKP_SUB32( in32, S[ 0 ] ); - X = SKP_SMULWB( Y, SKP_Silk_resampler_up2_hq_0[ 0 ] ); - out32_1 = SKP_ADD32( S[ 0 ], X ); - S[ 0 ] = SKP_ADD32( in32, X ); - - /* Second all-pass section for even output sample */ - Y = SKP_SUB32( out32_1, S[ 1 ] ); - X = SKP_SMLAWB( Y, Y, SKP_Silk_resampler_up2_hq_0[ 1 ] ); - out32_2 = SKP_ADD32( S[ 1 ], X ); - S[ 1 ] = SKP_ADD32( out32_1, X ); - - /* Biquad notch filter */ - out32_2 = SKP_SMLAWB( out32_2, S[ 5 ], SKP_Silk_resampler_up2_hq_notch[ 2 ] ); - out32_2 = SKP_SMLAWB( out32_2, S[ 4 ], SKP_Silk_resampler_up2_hq_notch[ 1 ] ); - out32_1 = SKP_SMLAWB( out32_2, S[ 4 ], SKP_Silk_resampler_up2_hq_notch[ 0 ] ); - S[ 5 ] = SKP_SUB32( out32_2, S[ 5 ] ); - - /* Apply gain in Q15, convert back to int16 and store to output */ - out[ 2 * k ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT32( - SKP_SMLAWB( 256, out32_1, SKP_Silk_resampler_up2_hq_notch[ 3 ] ), 9 ) ); - - /* First all-pass section for odd output sample */ - Y = SKP_SUB32( in32, S[ 2 ] ); - X = SKP_SMULWB( Y, SKP_Silk_resampler_up2_hq_1[ 0 ] ); - out32_1 = SKP_ADD32( S[ 2 ], X ); - S[ 2 ] = SKP_ADD32( in32, X ); - - /* Second all-pass section for odd output sample */ - Y = SKP_SUB32( out32_1, S[ 3 ] ); - X = SKP_SMLAWB( Y, Y, SKP_Silk_resampler_up2_hq_1[ 1 ] ); - out32_2 = SKP_ADD32( S[ 3 ], X ); - S[ 3 ] = SKP_ADD32( out32_1, X ); - - /* Biquad notch filter */ - out32_2 = SKP_SMLAWB( out32_2, S[ 4 ], SKP_Silk_resampler_up2_hq_notch[ 2 ] ); - out32_2 = SKP_SMLAWB( out32_2, S[ 5 ], SKP_Silk_resampler_up2_hq_notch[ 1 ] ); - out32_1 = SKP_SMLAWB( out32_2, S[ 5 ], SKP_Silk_resampler_up2_hq_notch[ 0 ] ); - S[ 4 ] = SKP_SUB32( out32_2, S[ 4 ] ); - - /* Apply gain in Q15, convert back to int16 and store to output */ - out[ 2 * k + 1 ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT32( - SKP_SMLAWB( 256, out32_1, SKP_Silk_resampler_up2_hq_notch[ 3 ] ), 9 ) ); - } -} - - -void SKP_Silk_resampler_private_up2_HQ_wrapper( - void *SS, /* I/O: Resampler state (unused) */ - SKP_int16 *out, /* O: Output signal [ 2 * len ] */ - const SKP_int16 *in, /* I: Input signal [ len ] */ - SKP_int32 len /* I: Number of input samples */ -) -{ - SKP_Silk_resampler_state_struct *S = (SKP_Silk_resampler_state_struct *)SS; - SKP_Silk_resampler_private_up2_HQ( S->sIIR, out, in, len ); -} diff --git a/libs/silk/src/SKP_Silk_resampler_private_up4.c b/libs/silk/src/SKP_Silk_resampler_private_up4.c deleted file mode 100644 index 763b7dae2d..0000000000 --- a/libs/silk/src/SKP_Silk_resampler_private_up4.c +++ /dev/null @@ -1,81 +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_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. */ -void SKP_Silk_resampler_private_up4( - SKP_int32 *S, /* I/O: State vector [ 2 ] */ - SKP_int16 *out, /* O: Output signal [ 4 * len ] */ - const SKP_int16 *in, /* I: Input signal [ len ] */ - SKP_int32 len /* I: Number of INPUT samples */ -) -{ - SKP_int32 k; - SKP_int32 in32, out32, Y, X; - SKP_int16 out16; - - SKP_assert( SKP_Silk_resampler_up2_lq_0 > 0 ); - SKP_assert( SKP_Silk_resampler_up2_lq_1 < 0 ); - - /* Internal variables and state are in Q10 format */ - for( k = 0; k < len; k++ ) { - /* Convert to Q10 */ - in32 = SKP_LSHIFT( (SKP_int32)in[ k ], 10 ); - - /* All-pass section for even output sample */ - Y = SKP_SUB32( in32, S[ 0 ] ); - X = SKP_SMULWB( Y, SKP_Silk_resampler_up2_lq_0 ); - out32 = SKP_ADD32( S[ 0 ], X ); - S[ 0 ] = SKP_ADD32( in32, X ); - - /* Convert back to int16 and store to output */ - out16 = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( out32, 10 ) ); - out[ 4 * k ] = out16; - out[ 4 * k + 1 ] = out16; - - /* All-pass section for odd output sample */ - Y = SKP_SUB32( in32, S[ 1 ] ); - X = SKP_SMLAWB( Y, Y, SKP_Silk_resampler_up2_lq_1 ); - out32 = SKP_ADD32( S[ 1 ], X ); - S[ 1 ] = SKP_ADD32( in32, X ); - - /* Convert back to int16 and store to output */ - out16 = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( out32, 10 ) ); - out[ 4 * k + 2 ] = out16; - out[ 4 * k + 3 ] = out16; - } -} diff --git a/libs/silk/src/SKP_Silk_resampler_rom.c b/libs/silk/src/SKP_Silk_resampler_rom.c deleted file mode 100644 index a27fcae6a3..0000000000 --- a/libs/silk/src/SKP_Silk_resampler_rom.c +++ /dev/null @@ -1,269 +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. -***********************************************************************/ - -/* * - * File Name: SKP_Silk_resampler_rom.c * - * * - * Description: Filter coefficients for IIR/FIR polyphase resampling * - * Total size: 550 Words (1.1 kB) * - * * - * Copyright 2010 (c), Skype Limited * - * All rights reserved. * - * */ - -#include "SKP_Silk_resampler_private.h" - -/* Tables for 2x downsampler */ -const SKP_int16 SKP_Silk_resampler_down2_0 = 9872; -const SKP_int16 SKP_Silk_resampler_down2_1 = 39809 - 65536; - -/* Tables for 2x upsampler, low quality */ -const SKP_int16 SKP_Silk_resampler_up2_lq_0 = 8102; -const SKP_int16 SKP_Silk_resampler_up2_lq_1 = 36783 - 65536; - -/* Tables for 2x upsampler, high quality */ -const SKP_int16 SKP_Silk_resampler_up2_hq_0[ 2 ] = { 4280, 33727 - 65536 }; -const SKP_int16 SKP_Silk_resampler_up2_hq_1[ 2 ] = { 16295, 54015 - 65536 }; -/* Matlab code for the notch filter coefficients: */ -/* B = [1, 0.12, 1]; A = [1, 0.055, 0.8]; G = 0.87; freqz(G * B, A, 2^14, 16e3); axis([0, 8000, -10, 1]); */ -/* fprintf('\t%6d, %6d, %6d, %6d\n', round(B(2)*2^16), round(-A(2)*2^16), round((1-A(3))*2^16), round(G*2^15)) */ -const SKP_int16 SKP_Silk_resampler_up2_hq_notch[ 4 ] = { 7864, -3604, 13107, 28508 }; - - -/* Tables with IIR and FIR coefficients for fractional downsamplers (70 Words) */ -SKP_DWORD_ALIGN const SKP_int16 SKP_Silk_Resampler_3_4_COEFS[ 2 + 3 * RESAMPLER_DOWN_ORDER_FIR / 2 ] = { - -18249, -12532, - -97, 284, -495, 309, 10268, 20317, - -94, 156, -48, -720, 5984, 18278, - -45, -4, 237, -847, 2540, 14662, -}; - -SKP_DWORD_ALIGN const SKP_int16 SKP_Silk_Resampler_2_3_COEFS[ 2 + 2 * RESAMPLER_DOWN_ORDER_FIR / 2 ] = { - -11891, -12486, - 20, 211, -657, 688, 8423, 15911, - -44, 197, -152, -653, 3855, 13015, -}; - -SKP_DWORD_ALIGN const SKP_int16 SKP_Silk_Resampler_1_2_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR / 2 ] = { - 2415, -13101, - 158, -295, -400, 1265, 4832, 7968, -}; - -SKP_DWORD_ALIGN const SKP_int16 SKP_Silk_Resampler_3_8_COEFS[ 2 + 3 * RESAMPLER_DOWN_ORDER_FIR / 2 ] = { - 13270, -13738, - -294, -123, 747, 2043, 3339, 3995, - -151, -311, 414, 1583, 2947, 3877, - -33, -389, 143, 1141, 2503, 3653, -}; - -SKP_DWORD_ALIGN const SKP_int16 SKP_Silk_Resampler_1_3_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR / 2 ] = { - 16643, -14000, - -331, 19, 581, 1421, 2290, 2845, -}; - -SKP_DWORD_ALIGN const SKP_int16 SKP_Silk_Resampler_2_3_COEFS_LQ[ 2 + 2 * 2 ] = { - -2797, -6507, - 4697, 10739, - 1567, 8276, -}; - -SKP_DWORD_ALIGN const SKP_int16 SKP_Silk_Resampler_1_3_COEFS_LQ[ 2 + 3 ] = { - 16777, -9792, - 890, 1614, 2148, -}; - - -/* Tables with coefficients for 4th order ARMA filter (35 Words), in a packed format: */ -/* { B1_Q14[1], B2_Q14[1], -A1_Q14[1], -A1_Q14[2], -A2_Q14[1], -A2_Q14[2], gain_Q16 } */ -/* where it is assumed that B*_Q14[0], B*_Q14[2], A*_Q14[0] are all 16384 */ -SKP_DWORD_ALIGN const SKP_int16 SKP_Silk_Resampler_320_441_ARMA4_COEFS[ 7 ] = { - 31454, 24746, -9706, -3386, -17911, -13243, 24797 -}; - -SKP_DWORD_ALIGN const SKP_int16 SKP_Silk_Resampler_240_441_ARMA4_COEFS[ 7 ] = { - 28721, 11254, 3189, -2546, -1495, -12618, 11562 -}; - -SKP_DWORD_ALIGN const SKP_int16 SKP_Silk_Resampler_160_441_ARMA4_COEFS[ 7 ] = { - 23492, -6457, 14358, -4856, 14654, -13008, 4456 -}; - -SKP_DWORD_ALIGN const SKP_int16 SKP_Silk_Resampler_120_441_ARMA4_COEFS[ 7 ] = { - 19311, -15569, 19489, -6950, 21441, -13559, 2370 -}; - -SKP_DWORD_ALIGN const SKP_int16 SKP_Silk_Resampler_80_441_ARMA4_COEFS[ 7 ] = { - 13248, -23849, 24126, -9486, 26806, -14286, 1065 -}; - -/* Table with interplation fractions of 1/288 : 2/288 : 287/288 (432 Words) */ -SKP_DWORD_ALIGN const SKP_int16 SKP_Silk_resampler_frac_FIR_144[ 144 ][ RESAMPLER_ORDER_FIR_144 / 2 ] = { - { -647, 1884, 30078}, - { -625, 1736, 30044}, - { -603, 1591, 30005}, - { -581, 1448, 29963}, - { -559, 1308, 29917}, - { -537, 1169, 29867}, - { -515, 1032, 29813}, - { -494, 898, 29755}, - { -473, 766, 29693}, - { -452, 636, 29627}, - { -431, 508, 29558}, - { -410, 383, 29484}, - { -390, 260, 29407}, - { -369, 139, 29327}, - { -349, 20, 29242}, - { -330, -97, 29154}, - { -310, -211, 29062}, - { -291, -324, 28967}, - { -271, -434, 28868}, - { -253, -542, 28765}, - { -234, -647, 28659}, - { -215, -751, 28550}, - { -197, -852, 28436}, - { -179, -951, 28320}, - { -162, -1048, 28200}, - { -144, -1143, 28077}, - { -127, -1235, 27950}, - { -110, -1326, 27820}, - { -94, -1414, 27687}, - { -77, -1500, 27550}, - { -61, -1584, 27410}, - { -45, -1665, 27268}, - { -30, -1745, 27122}, - { -15, -1822, 26972}, - { 0, -1897, 26820}, - { 15, -1970, 26665}, - { 29, -2041, 26507}, - { 44, -2110, 26346}, - { 57, -2177, 26182}, - { 71, -2242, 26015}, - { 84, -2305, 25845}, - { 97, -2365, 25673}, - { 110, -2424, 25498}, - { 122, -2480, 25320}, - { 134, -2534, 25140}, - { 146, -2587, 24956}, - { 157, -2637, 24771}, - { 168, -2685, 24583}, - { 179, -2732, 24392}, - { 190, -2776, 24199}, - { 200, -2819, 24003}, - { 210, -2859, 23805}, - { 220, -2898, 23605}, - { 229, -2934, 23403}, - { 238, -2969, 23198}, - { 247, -3002, 22992}, - { 255, -3033, 22783}, - { 263, -3062, 22572}, - { 271, -3089, 22359}, - { 279, -3114, 22144}, - { 286, -3138, 21927}, - { 293, -3160, 21709}, - { 300, -3180, 21488}, - { 306, -3198, 21266}, - { 312, -3215, 21042}, - { 318, -3229, 20816}, - { 323, -3242, 20589}, - { 328, -3254, 20360}, - { 333, -3263, 20130}, - { 338, -3272, 19898}, - { 342, -3278, 19665}, - { 346, -3283, 19430}, - { 350, -3286, 19194}, - { 353, -3288, 18957}, - { 356, -3288, 18718}, - { 359, -3286, 18478}, - { 362, -3283, 18238}, - { 364, -3279, 17996}, - { 366, -3273, 17753}, - { 368, -3266, 17509}, - { 369, -3257, 17264}, - { 371, -3247, 17018}, - { 372, -3235, 16772}, - { 372, -3222, 16525}, - { 373, -3208, 16277}, - { 373, -3192, 16028}, - { 373, -3175, 15779}, - { 373, -3157, 15529}, - { 372, -3138, 15279}, - { 371, -3117, 15028}, - { 370, -3095, 14777}, - { 369, -3072, 14526}, - { 368, -3048, 14274}, - { 366, -3022, 14022}, - { 364, -2996, 13770}, - { 362, -2968, 13517}, - { 359, -2940, 13265}, - { 357, -2910, 13012}, - { 354, -2880, 12760}, - { 351, -2848, 12508}, - { 348, -2815, 12255}, - { 344, -2782, 12003}, - { 341, -2747, 11751}, - { 337, -2712, 11500}, - { 333, -2676, 11248}, - { 328, -2639, 10997}, - { 324, -2601, 10747}, - { 320, -2562, 10497}, - { 315, -2523, 10247}, - { 310, -2482, 9998}, - { 305, -2442, 9750}, - { 300, -2400, 9502}, - { 294, -2358, 9255}, - { 289, -2315, 9009}, - { 283, -2271, 8763}, - { 277, -2227, 8519}, - { 271, -2182, 8275}, - { 265, -2137, 8032}, - { 259, -2091, 7791}, - { 252, -2045, 7550}, - { 246, -1998, 7311}, - { 239, -1951, 7072}, - { 232, -1904, 6835}, - { 226, -1856, 6599}, - { 219, -1807, 6364}, - { 212, -1758, 6131}, - { 204, -1709, 5899}, - { 197, -1660, 5668}, - { 190, -1611, 5439}, - { 183, -1561, 5212}, - { 175, -1511, 4986}, - { 168, -1460, 4761}, - { 160, -1410, 4538}, - { 152, -1359, 4317}, - { 145, -1309, 4098}, - { 137, -1258, 3880}, - { 129, -1207, 3664}, - { 121, -1156, 3450}, - { 113, -1105, 3238}, - { 105, -1054, 3028}, - { 97, -1003, 2820}, - { 89, -952, 2614}, - { 81, -901, 2409}, - { 73, -851, 2207}, -}; diff --git a/libs/silk/src/SKP_Silk_resampler_rom.h b/libs/silk/src/SKP_Silk_resampler_rom.h deleted file mode 100644 index cd3e58f928..0000000000 --- a/libs/silk/src/SKP_Silk_resampler_rom.h +++ /dev/null @@ -1,91 +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. -***********************************************************************/ - -/* * - * 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_ - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include "SKP_Silk_typedef.h" -#include "SKP_Silk_resampler_structs.h" - -#define RESAMPLER_DOWN_ORDER_FIR 12 -#define RESAMPLER_ORDER_FIR_144 6 - - -/* Tables for 2x downsampler. Values above 32767 intentionally wrap to a negative value. */ -extern const SKP_int16 SKP_Silk_resampler_down2_0; -extern const SKP_int16 SKP_Silk_resampler_down2_1; - -/* Tables for 2x upsampler, low quality. Values above 32767 intentionally wrap to a negative value. */ -extern const SKP_int16 SKP_Silk_resampler_up2_lq_0; -extern const SKP_int16 SKP_Silk_resampler_up2_lq_1; - -/* Tables for 2x upsampler, high quality. Values above 32767 intentionally wrap to a negative value. */ -extern const SKP_int16 SKP_Silk_resampler_up2_hq_0[ 2 ]; -extern const SKP_int16 SKP_Silk_resampler_up2_hq_1[ 2 ]; -extern const SKP_int16 SKP_Silk_resampler_up2_hq_notch[ 4 ]; - -/* Tables with IIR and FIR coefficients for fractional downsamplers */ -extern const SKP_int16 SKP_Silk_Resampler_3_4_COEFS[ 2 + 3 * RESAMPLER_DOWN_ORDER_FIR / 2 ]; -extern const SKP_int16 SKP_Silk_Resampler_2_3_COEFS[ 2 + 2 * RESAMPLER_DOWN_ORDER_FIR / 2 ]; -extern const SKP_int16 SKP_Silk_Resampler_1_2_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR / 2 ]; -extern const SKP_int16 SKP_Silk_Resampler_3_8_COEFS[ 2 + 3 * RESAMPLER_DOWN_ORDER_FIR / 2 ]; -extern const SKP_int16 SKP_Silk_Resampler_1_3_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR / 2 ]; -extern const SKP_int16 SKP_Silk_Resampler_2_3_COEFS_LQ[ 2 + 2 * 2 ]; -extern const SKP_int16 SKP_Silk_Resampler_1_3_COEFS_LQ[ 2 + 3 ]; - -/* Tables with coefficients for 4th order ARMA filter */ -extern const SKP_int16 SKP_Silk_Resampler_320_441_ARMA4_COEFS[ 7 ]; -extern const SKP_int16 SKP_Silk_Resampler_240_441_ARMA4_COEFS[ 7 ]; -extern const SKP_int16 SKP_Silk_Resampler_160_441_ARMA4_COEFS[ 7 ]; -extern const SKP_int16 SKP_Silk_Resampler_120_441_ARMA4_COEFS[ 7 ]; -extern const SKP_int16 SKP_Silk_Resampler_80_441_ARMA4_COEFS[ 7 ]; - -/* Table with interplation fractions of 1/288 : 2/288 : 287/288 (432 Words) */ -extern const SKP_int16 SKP_Silk_resampler_frac_FIR_144[ 144 ][ RESAMPLER_ORDER_FIR_144 / 2 ]; - -#ifdef __cplusplus -} -#endif - -#endif // _SKP_SILK_FIX_RESAMPLER_ROM_H_ diff --git a/libs/silk/src/SKP_Silk_resampler_structs.h b/libs/silk/src/SKP_Silk_resampler_structs.h deleted file mode 100644 index 7e8992a9f3..0000000000 --- a/libs/silk/src/SKP_Silk_resampler_structs.h +++ /dev/null @@ -1,79 +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. -***********************************************************************/ - -/* * - * File Name: SKP_Silk_resampler_structs.h * - * * - * Description: Structs for IIR/FIR resamplers * - * * - * Copyright 2010 (c), Skype Limited * - * All rights reserved. * - * * - * */ - -#ifndef SKP_Silk_RESAMPLER_STRUCTS_H -#define SKP_Silk_RESAMPLER_STRUCTS_H - -#ifdef __cplusplus -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 SKP_Silk_RESAMPLER_MAX_FIR_ORDER 16 -#define SKP_Silk_RESAMPLER_MAX_IIR_ORDER 6 - - -typedef struct _SKP_Silk_resampler_state_struct{ - SKP_int32 sIIR[ SKP_Silk_RESAMPLER_MAX_IIR_ORDER ]; /* this must be the first element of this struct */ - SKP_int32 sFIR[ SKP_Silk_RESAMPLER_MAX_FIR_ORDER ]; - SKP_int32 sDown2[ 2 ]; - void (*resampler_function)( void *, SKP_int16 *, const SKP_int16 *, SKP_int32 ); - void (*up2_function)( SKP_int32 *, SKP_int16 *, const SKP_int16 *, SKP_int32 ); - SKP_int32 batchSize; - SKP_int32 invRatio_Q16; - SKP_int32 FIR_Fracs; - SKP_int32 input2x; - const SKP_int16 *Coefs; -#if RESAMPLER_SUPPORT_ABOVE_48KHZ - SKP_int32 sDownPre[ 2 ]; - SKP_int32 sUpPost[ 2 ]; - void (*down_pre_function)( SKP_int32 *, SKP_int16 *, const SKP_int16 *, SKP_int32 ); - void (*up_post_function)( SKP_int32 *, SKP_int16 *, const SKP_int16 *, SKP_int32 ); - SKP_int32 batchSizePrePost; - SKP_int32 ratio_Q16; - SKP_int32 nPreDownsamplers; - SKP_int32 nPostUpsamplers; -#endif - SKP_int32 magic_number; -} SKP_Silk_resampler_state_struct; - -#ifdef __cplusplus -} -#endif -#endif /* SKP_Silk_RESAMPLER_STRUCTS_H */ diff --git a/libs/silk/src/SKP_Silk_resampler_up2.c b/libs/silk/src/SKP_Silk_resampler_up2.c deleted file mode 100644 index 4393b5020b..0000000000 --- a/libs/silk/src/SKP_Silk_resampler_up2.c +++ /dev/null @@ -1,75 +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_resampler_up2.c * - * * - * Upsample by a factor 2, low quality * - * * - * Copyright 2010 (c), Skype Limited * - * */ - -#include "SKP_Silk_SigProc_FIX.h" -#include "SKP_Silk_resampler_rom.h" - -/* Upsample by a factor 2, low quality */ -void SKP_Silk_resampler_up2( - SKP_int32 *S, /* I/O: State vector [ 2 ] */ - SKP_int16 *out, /* O: Output signal [ 2 * len ] */ - const SKP_int16 *in, /* I: Input signal [ len ] */ - SKP_int32 len /* I: Number of input samples */ -) -{ - SKP_int32 k; - SKP_int32 in32, out32, Y, X; - - SKP_assert( SKP_Silk_resampler_up2_lq_0 > 0 ); - SKP_assert( SKP_Silk_resampler_up2_lq_1 < 0 ); - /* Internal variables and state are in Q10 format */ - for( k = 0; k < len; k++ ) { - /* Convert to Q10 */ - in32 = SKP_LSHIFT( (SKP_int32)in[ k ], 10 ); - - /* All-pass section for even output sample */ - Y = SKP_SUB32( in32, S[ 0 ] ); - X = SKP_SMULWB( Y, SKP_Silk_resampler_up2_lq_0 ); - out32 = SKP_ADD32( S[ 0 ], X ); - S[ 0 ] = SKP_ADD32( in32, X ); - - /* Convert back to int16 and store to output */ - out[ 2 * k ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( out32, 10 ) ); - - /* All-pass section for odd output sample */ - Y = SKP_SUB32( in32, S[ 1 ] ); - X = SKP_SMLAWB( Y, Y, SKP_Silk_resampler_up2_lq_1 ); - out32 = SKP_ADD32( S[ 1 ], X ); - S[ 1 ] = SKP_ADD32( in32, X ); - - /* Convert back to int16 and store to output */ - out[ 2 * k + 1 ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( out32, 10 ) ); - } -} diff --git a/libs/silk/src/SKP_Silk_residual_energy16_FIX.c b/libs/silk/src/SKP_Silk_residual_energy16_FIX.c deleted file mode 100644 index 84eb72cf7f..0000000000 --- a/libs/silk/src/SKP_Silk_residual_energy16_FIX.c +++ /dev/null @@ -1,99 +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_FIX.h" - -/* Residual energy: nrg = wxx - 2 * wXx * c + c' * wXX * c */ -SKP_int32 SKP_Silk_residual_energy16_covar_FIX( - const SKP_int16 *c, /* I Prediction vector */ - const SKP_int32 *wXX, /* I Correlation matrix */ - const SKP_int32 *wXx, /* I Correlation vector */ - SKP_int32 wxx, /* I Signal energy */ - SKP_int D, /* I Dimension */ - SKP_int cQ /* I Q value for c vector 0 - 15 */ -) -{ - SKP_int i, j, lshifts, Qxtra; - SKP_int32 c_max, w_max, tmp, tmp2, nrg; - SKP_int cn[ MAX_MATRIX_SIZE ]; - const SKP_int32 *pRow; - - /* Safety checks */ - SKP_assert( D >= 0 ); - SKP_assert( D <= 16 ); - SKP_assert( cQ > 0 ); - SKP_assert( cQ < 16 ); - - lshifts = 16 - cQ; - Qxtra = lshifts; - - c_max = 0; - for( i = 0; i < D; i++ ) { - c_max = SKP_max_32( c_max, SKP_abs( ( SKP_int32 )c[ i ] ) ); - } - Qxtra = SKP_min_int( Qxtra, SKP_Silk_CLZ32( c_max ) - 17 ); - - w_max = SKP_max_32( wXX[ 0 ], wXX[ D * D - 1 ] ); - Qxtra = SKP_min_int( Qxtra, SKP_Silk_CLZ32( SKP_MUL( D, SKP_RSHIFT( SKP_SMULWB( w_max, c_max ), 4 ) ) ) - 5 ); - Qxtra = SKP_max_int( Qxtra, 0 ); - for( i = 0; i < D; i++ ) { - cn[ i ] = SKP_LSHIFT( ( SKP_int )c[ i ], Qxtra ); - SKP_assert( SKP_abs(cn[i]) <= ( SKP_int16_MAX + 1 ) ); /* Check that SKP_SMLAWB can be used */ - } - lshifts -= Qxtra; - - /* Compute wxx - 2 * wXx * c */ - tmp = 0; - for( i = 0; i < D; i++ ) { - tmp = SKP_SMLAWB( tmp, wXx[ i ], cn[ i ] ); - } - nrg = SKP_RSHIFT( wxx, 1 + lshifts ) - tmp; /* Q: -lshifts - 1 */ - - /* Add c' * wXX * c, assuming wXX is symmetric */ - tmp2 = 0; - for( i = 0; i < D; i++ ) { - tmp = 0; - pRow = &wXX[ i * D ]; - for( j = i + 1; j < D; j++ ) { - tmp = SKP_SMLAWB( tmp, pRow[ j ], cn[ j ] ); - } - tmp = SKP_SMLAWB( tmp, SKP_RSHIFT( pRow[ i ], 1 ), cn[ i ] ); - tmp2 = SKP_SMLAWB( tmp2, tmp, cn[ i ] ); - } - nrg = SKP_ADD_LSHIFT32( nrg, tmp2, lshifts ); /* Q: -lshifts - 1 */ - - /* Keep one bit free always, because we add them for LSF interpolation */ - if( nrg < 1 ) { - nrg = 1; - } else if( nrg > SKP_RSHIFT( SKP_int32_MAX, lshifts + 2 ) ) { - nrg = SKP_int32_MAX >> 1; - } else { - nrg = SKP_LSHIFT( nrg, lshifts + 1 ); /* Q0 */ - } - return nrg; - -} diff --git a/libs/silk/src/SKP_Silk_residual_energy_FIX.c b/libs/silk/src/SKP_Silk_residual_energy_FIX.c deleted file mode 100644 index 1912a09411..0000000000 --- a/libs/silk/src/SKP_Silk_residual_energy_FIX.c +++ /dev/null @@ -1,88 +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_FIX.h" - -/* Calculates residual energies of input subframes where all subframes have LPC_order */ -/* of preceeding samples */ -void SKP_Silk_residual_energy_FIX( - SKP_int32 nrgs[ NB_SUBFR ], /* O Residual energy per subframe */ - SKP_int nrgsQ[ NB_SUBFR ], /* O Q value per subframe */ - const SKP_int16 x[], /* I Input signal */ - SKP_int16 a_Q12[ 2 ][ MAX_LPC_ORDER ],/* I AR coefs for each frame half */ - const SKP_int32 gains[ NB_SUBFR ], /* I Quantization gains */ - const SKP_int subfr_length, /* I Subframe length */ - const SKP_int LPC_order /* I LPC order */ -) -{ - SKP_int offset, i, j, rshift, lz1, lz2; - SKP_int16 *LPC_res_ptr, LPC_res[ ( MAX_FRAME_LENGTH + NB_SUBFR * MAX_LPC_ORDER ) / 2 ]; - const SKP_int16 *x_ptr; - SKP_int16 S[ MAX_LPC_ORDER ]; - SKP_int32 tmp32; - - x_ptr = x; - offset = LPC_order + subfr_length; - - /* Filter input to create the LPC residual for each frame half, and measure subframe energies */ - for( i = 0; i < 2; i++ ) { - /* Calculate half frame LPC residual signal including preceeding samples */ - SKP_memset( S, 0, LPC_order * sizeof( SKP_int16 ) ); - SKP_Silk_LPC_analysis_filter( x_ptr, a_Q12[ i ], S, LPC_res, ( NB_SUBFR >> 1 ) * offset, LPC_order ); - - /* Point to first subframe of the just calculated LPC residual signal */ - LPC_res_ptr = LPC_res + LPC_order; - for( j = 0; j < ( NB_SUBFR >> 1 ); j++ ) { - /* Measure subframe energy */ - SKP_Silk_sum_sqr_shift( &nrgs[ i * ( NB_SUBFR >> 1 ) + j ], &rshift, LPC_res_ptr, subfr_length ); - - /* Set Q values for the measured energy */ - nrgsQ[ i * ( NB_SUBFR >> 1 ) + j ] = -rshift; - - /* Move to next subframe */ - LPC_res_ptr += offset; - } - /* Move to next frame half */ - x_ptr += ( NB_SUBFR >> 1 ) * offset; - } - - /* Apply the squared subframe gains */ - for( i = 0; i < NB_SUBFR; i++ ) { - /* Fully upscale gains and energies */ - lz1 = SKP_Silk_CLZ32( nrgs[ i ] ) - 1; - lz2 = SKP_Silk_CLZ32( gains[ i ] ) - 1; - - tmp32 = SKP_LSHIFT32( gains[ i ], lz2 ); - - /* Find squared gains */ - tmp32 = SKP_SMMUL( tmp32, tmp32 ); // Q( 2 * lz2 - 32 ) - - /* Scale energies */ - nrgs[ i ] = SKP_SMMUL( tmp32, SKP_LSHIFT32( nrgs[ i ], lz1 ) ); // Q( nrgsQ[ i ] + lz1 + 2 * lz2 - 32 - 32 ) - nrgsQ[ i ] += lz1 + 2 * lz2 - 32 - 32; - } -} diff --git a/libs/silk/src/SKP_Silk_scale_copy_vector16.c b/libs/silk/src/SKP_Silk_scale_copy_vector16.c deleted file mode 100644 index 27e5154680..0000000000 --- a/libs/silk/src/SKP_Silk_scale_copy_vector16.c +++ /dev/null @@ -1,45 +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_SigProc_FIX.h" - -/* Copy and multiply a vector by a constant */ -void SKP_Silk_scale_copy_vector16( - SKP_int16 *data_out, - const SKP_int16 *data_in, - SKP_int32 gain_Q16, /* (I): gain in Q16 */ - const SKP_int dataSize /* (I): length */ -) -{ - SKP_int i; - SKP_int32 tmp32; - - for( i = 0; i < dataSize; i++ ) { - tmp32 = SKP_SMULWB( gain_Q16, data_in[ i ] ); - data_out[ i ] = (SKP_int16)SKP_CHECK_FIT16( tmp32 ); - } -} diff --git a/libs/silk/src/SKP_Silk_scale_vector.c b/libs/silk/src/SKP_Silk_scale_vector.c deleted file mode 100644 index d95d4f6a8a..0000000000 --- a/libs/silk/src/SKP_Silk_scale_vector.c +++ /dev/null @@ -1,42 +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_SigProc_FIX.h" - -/* Multiply a vector by a constant */ -void SKP_Silk_scale_vector32_Q26_lshift_18( - SKP_int32 *data1, /* (I/O): Q0/Q18 */ - SKP_int32 gain_Q26, /* (I): Q26 */ - SKP_int dataSize /* (I): length */ -) -{ - SKP_int i; - - for( i = 0; i < dataSize; i++ ) { - data1[ i ] = (SKP_int32)SKP_CHECK_FIT32( SKP_RSHIFT64( SKP_SMULL( data1[ i ], gain_Q26 ), 8 ) );// OUTPUT: Q18 - } -} diff --git a/libs/silk/src/SKP_Silk_schur.c b/libs/silk/src/SKP_Silk_schur.c deleted file mode 100644 index 03d1f91a6d..0000000000 --- a/libs/silk/src/SKP_Silk_schur.c +++ /dev/null @@ -1,94 +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_schur.c * - * * - * Calculates the reflection coefficients from the correlation sequence * - * * - * Copyright 2008 (c), Skype Limited * - * Date: 080103 * - * */ -#include "SKP_Silk_SigProc_FIX.h" - -/* Faster than schur64(), but much less accurate. */ -/* uses SMLAWB(), requiring armv5E and higher. */ -SKP_int32 SKP_Silk_schur( /* O: Returns residual energy */ - SKP_int16 *rc_Q15, /* O: reflection coefficients [order] Q15 */ - const SKP_int32 *c, /* I: correlations [order+1] */ - const SKP_int32 order /* I: prediction order */ -) -{ - SKP_int k, n, lz; - SKP_int32 C[ SKP_Silk_MAX_ORDER_LPC + 1 ][ 2 ]; - SKP_int32 Ctmp1, Ctmp2, rc_tmp_Q15; - - /* Get number of leading zeros */ - lz = SKP_Silk_CLZ32( c[ 0 ] ); - - /* Copy correlations and adjust level to Q30 */ - if( lz < 2 ) { - /* lz must be 1, so shift one to the right */ - for( k = 0; k < order + 1; k++ ) { - C[ k ][ 0 ] = C[ k ][ 1 ] = SKP_RSHIFT( c[ k ], 1 ); - } - } else if( lz > 2 ) { - /* Shift to the left */ - lz -= 2; - for( k = 0; k < order + 1; k++ ) { - C[ k ][ 0 ] = C[ k ][ 1 ] = SKP_LSHIFT( c[k], lz ); - } - } else { - /* No need to shift */ - for( k = 0; k < order + 1; k++ ) { - C[ k ][ 0 ] = C[ k ][ 1 ] = c[ k ]; - } - } - - for( k = 0; k < order; k++ ) { - - /* Get reflection coefficient */ - rc_tmp_Q15 = -SKP_DIV32_16( C[ k + 1 ][ 0 ], SKP_max_32( SKP_RSHIFT( C[ 0 ][ 1 ], 15 ), 1 ) ); - - /* Clip (shouldn't happen for properly conditioned inputs) */ - rc_tmp_Q15 = SKP_SAT16( rc_tmp_Q15 ); - - /* Store */ - rc_Q15[ k ] = (SKP_int16)rc_tmp_Q15; - - /* Update correlations */ - for( n = 0; n < order - k; n++ ) { - Ctmp1 = C[ n + k + 1 ][ 0 ]; - Ctmp2 = C[ n ][ 1 ]; - C[ n + k + 1 ][ 0 ] = SKP_SMLAWB( Ctmp1, SKP_LSHIFT( Ctmp2, 1 ), rc_tmp_Q15 ); - C[ n ][ 1 ] = SKP_SMLAWB( Ctmp2, SKP_LSHIFT( Ctmp1, 1 ), rc_tmp_Q15 ); - } - } - - /* return residual energy */ - return C[0][1]; -} diff --git a/libs/silk/src/SKP_Silk_schur64.c b/libs/silk/src/SKP_Silk_schur64.c deleted file mode 100644 index 5078d154de..0000000000 --- a/libs/silk/src/SKP_Silk_schur64.c +++ /dev/null @@ -1,80 +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_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 rc_Q16[], /* O: Reflection coefficients [order] Q16 */ - const SKP_int32 c[], /* I: Correlations [order+1] */ - SKP_int32 order /* I: Prediction order */ -) -{ - SKP_int k, n; - SKP_int32 C[ SKP_Silk_MAX_ORDER_LPC + 1 ][ 2 ]; - SKP_int32 Ctmp1_Q30, Ctmp2_Q30, rc_tmp_Q31; - - /* Check for invalid input */ - if( c[ 0 ] <= 0 ) { - SKP_memset( rc_Q16, 0, order * sizeof( SKP_int32 ) ); - return 0; - } - - for( k = 0; k < order + 1; k++ ) { - C[ k ][ 0 ] = C[ k ][ 1 ] = c[ k ]; - } - - for( k = 0; k < order; k++ ) { - /* Get reflection coefficient: divide two Q30 values and get result in Q31 */ - rc_tmp_Q31 = SKP_DIV32_varQ( -C[ k + 1 ][ 0 ], C[ 0 ][ 1 ], 31 ); - - /* Save the output */ - rc_Q16[ k ] = SKP_RSHIFT_ROUND( rc_tmp_Q31, 15 ); - - /* Update correlations */ - for( n = 0; n < order - k; n++ ) { - Ctmp1_Q30 = C[ n + k + 1 ][ 0 ]; - Ctmp2_Q30 = C[ n ][ 1 ]; - - /* Multiply and add the highest int32 */ - C[ n + k + 1 ][ 0 ] = Ctmp1_Q30 + SKP_SMMUL( SKP_LSHIFT( Ctmp2_Q30, 1 ), rc_tmp_Q31 ); - C[ n ][ 1 ] = Ctmp2_Q30 + SKP_SMMUL( SKP_LSHIFT( Ctmp1_Q30, 1 ), rc_tmp_Q31 ); - } - } - - return C[ 0 ][ 1 ]; -} diff --git a/libs/silk/src/SKP_Silk_setup_complexity.h b/libs/silk/src/SKP_Silk_setup_complexity.h deleted file mode 100644 index 86f845bed7..0000000000 --- a/libs/silk/src/SKP_Silk_setup_complexity.h +++ /dev/null @@ -1,99 +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 Pointer to Silk encoder state */ - SKP_int Complexity /* I Complexity (0->low; 1->medium; 2->high) */ -) -{ - SKP_int ret = SKP_SILK_NO_ERROR; - - /* Check that settings are valid */ - if( LOW_COMPLEXITY_ONLY && Complexity != 0 ) { - ret = SKP_SILK_ENC_INVALID_COMPLEXITY_SETTING; - } - - /* Set encoding complexity */ - if( Complexity == 0 || LOW_COMPLEXITY_ONLY ) { - /* Low complexity */ - psEncC->Complexity = 0; - psEncC->pitchEstimationComplexity = PITCH_EST_COMPLEXITY_LC_MODE; - psEncC->pitchEstimationThreshold_Q16 = SKP_FIX_CONST( FIND_PITCH_CORRELATION_THRESHOLD_LC_MODE, 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 = MAX_NLSF_MSVQ_SURVIVORS_LC_MODE; - psEncC->warping_Q16 = 0; - } else if( Complexity == 1 ) { - /* Medium complexity */ - psEncC->Complexity = 1; - psEncC->pitchEstimationComplexity = PITCH_EST_COMPLEXITY_MC_MODE; - psEncC->pitchEstimationThreshold_Q16 = SKP_FIX_CONST( FIND_PITCH_CORRELATION_THRESHOLD_MC_MODE, 16 ); - psEncC->pitchEstimationLPCOrder = 12; - psEncC->shapingLPCOrder = 12; - psEncC->la_shape = 5 * psEncC->fs_kHz; - psEncC->nStatesDelayedDecision = 2; - psEncC->useInterpolatedNLSFs = 0; - psEncC->LTPQuantLowComplexity = 0; - psEncC->NLSF_MSVQ_Survivors = MAX_NLSF_MSVQ_SURVIVORS_MC_MODE; - psEncC->warping_Q16 = psEncC->fs_kHz * SKP_FIX_CONST( WARPING_MULTIPLIER, 16 ); - } else if( Complexity == 2 ) { - /* High complexity */ - psEncC->Complexity = 2; - psEncC->pitchEstimationComplexity = PITCH_EST_COMPLEXITY_HC_MODE; - psEncC->pitchEstimationThreshold_Q16 = SKP_FIX_CONST( FIND_PITCH_CORRELATION_THRESHOLD_HC_MODE, 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 = MAX_NLSF_MSVQ_SURVIVORS; - 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 = 5 * 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 ); - - return( ret ); -} diff --git a/libs/silk/src/SKP_Silk_shell_coder.c b/libs/silk/src/SKP_Silk_shell_coder.c deleted file mode 100644 index f315149957..0000000000 --- a/libs/silk/src/SKP_Silk_shell_coder.c +++ /dev/null @@ -1,155 +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" - -/* shell coder; pulse-subframe length is hardcoded */ - -SKP_INLINE void combine_pulses( - SKP_int *out, /* O: combined pulses vector [len] */ - const SKP_int *in, /* I: input vector [2 * len] */ - const SKP_int len /* I: number of OUTPUT samples */ -) -{ - SKP_int k; - for( k = 0; k < len; k++ ) { - out[ k ] = in[ 2 * k ] + in[ 2 * k + 1 ]; - } -} - -SKP_INLINE void encode_split( - SKP_Silk_range_coder_state *sRC, /* I/O: compressor data structure */ - const SKP_int p_child1, /* I: pulse amplitude of first child subframe */ - const SKP_int p, /* I: pulse amplitude of current subframe */ - const SKP_uint16 *shell_table /* I: table of shell cdfs */ -) -{ - const SKP_uint16 *cdf; - - if( p > 0 ) { - cdf = &shell_table[ SKP_Silk_shell_code_table_offsets[ p ] ]; - SKP_Silk_range_encoder( sRC, p_child1, cdf ); - } -} - -SKP_INLINE void decode_split( - SKP_int *p_child1, /* O: pulse amplitude of first child subframe */ - SKP_int *p_child2, /* O: pulse amplitude of second child subframe */ - SKP_Silk_range_coder_state *sRC, /* I/O: compressor data structure */ - const SKP_int p, /* I: pulse amplitude of current subframe */ - const SKP_uint16 *shell_table /* I: table of shell cdfs */ -) -{ - SKP_int cdf_middle; - const SKP_uint16 *cdf; - - if( p > 0 ) { - cdf_middle = SKP_RSHIFT( p, 1 ); - cdf = &shell_table[ SKP_Silk_shell_code_table_offsets[ p ] ]; - SKP_Silk_range_decoder( p_child1, sRC, cdf, cdf_middle ); - p_child2[ 0 ] = p - p_child1[ 0 ]; - } else { - p_child1[ 0 ] = 0; - p_child2[ 0 ] = 0; - } -} - -/* Shell encoder, operates on one shell code frame of 16 pulses */ -void SKP_Silk_shell_encoder( - SKP_Silk_range_coder_state *sRC, /* I/O compressor data structure */ - const SKP_int *pulses0 /* I data: nonnegative pulse amplitudes */ -) -{ - SKP_int pulses1[ 8 ], pulses2[ 4 ], pulses3[ 2 ], pulses4[ 1 ]; - - /* this function operates on one shell code frame of 16 pulses */ - SKP_assert( SHELL_CODEC_FRAME_LENGTH == 16 ); - - /* tree representation per pulse-subframe */ - combine_pulses( pulses1, pulses0, 8 ); - combine_pulses( pulses2, pulses1, 4 ); - combine_pulses( pulses3, pulses2, 2 ); - combine_pulses( pulses4, pulses3, 1 ); - - encode_split( sRC, pulses3[ 0 ], pulses4[ 0 ], SKP_Silk_shell_code_table3 ); - - encode_split( sRC, pulses2[ 0 ], pulses3[ 0 ], SKP_Silk_shell_code_table2 ); - - encode_split( sRC, pulses1[ 0 ], pulses2[ 0 ], SKP_Silk_shell_code_table1 ); - encode_split( sRC, pulses0[ 0 ], pulses1[ 0 ], SKP_Silk_shell_code_table0 ); - encode_split( sRC, pulses0[ 2 ], pulses1[ 1 ], SKP_Silk_shell_code_table0 ); - - encode_split( sRC, pulses1[ 2 ], pulses2[ 1 ], SKP_Silk_shell_code_table1 ); - encode_split( sRC, pulses0[ 4 ], pulses1[ 2 ], SKP_Silk_shell_code_table0 ); - encode_split( sRC, pulses0[ 6 ], pulses1[ 3 ], SKP_Silk_shell_code_table0 ); - - encode_split( sRC, pulses2[ 2 ], pulses3[ 1 ], SKP_Silk_shell_code_table2 ); - - encode_split( sRC, pulses1[ 4 ], pulses2[ 2 ], SKP_Silk_shell_code_table1 ); - encode_split( sRC, pulses0[ 8 ], pulses1[ 4 ], SKP_Silk_shell_code_table0 ); - encode_split( sRC, pulses0[ 10 ], pulses1[ 5 ], SKP_Silk_shell_code_table0 ); - - encode_split( sRC, pulses1[ 6 ], pulses2[ 3 ], SKP_Silk_shell_code_table1 ); - encode_split( sRC, pulses0[ 12 ], pulses1[ 6 ], SKP_Silk_shell_code_table0 ); - encode_split( sRC, pulses0[ 14 ], pulses1[ 7 ], SKP_Silk_shell_code_table0 ); -} - - -/* Shell decoder, operates on one shell code frame of 16 pulses */ -void SKP_Silk_shell_decoder( - SKP_int *pulses0, /* O data: nonnegative pulse amplitudes */ - SKP_Silk_range_coder_state *sRC, /* I/O compressor data structure */ - const SKP_int pulses4 /* I number of pulses per pulse-subframe */ -) -{ - SKP_int pulses3[ 2 ], pulses2[ 4 ], pulses1[ 8 ]; - - /* this function operates on one shell code frame of 16 pulses */ - SKP_assert( SHELL_CODEC_FRAME_LENGTH == 16 ); - - decode_split( &pulses3[ 0 ], &pulses3[ 1 ], sRC, pulses4, SKP_Silk_shell_code_table3 ); - - decode_split( &pulses2[ 0 ], &pulses2[ 1 ], sRC, pulses3[ 0 ], SKP_Silk_shell_code_table2 ); - - decode_split( &pulses1[ 0 ], &pulses1[ 1 ], sRC, pulses2[ 0 ], SKP_Silk_shell_code_table1 ); - decode_split( &pulses0[ 0 ], &pulses0[ 1 ], sRC, pulses1[ 0 ], SKP_Silk_shell_code_table0 ); - decode_split( &pulses0[ 2 ], &pulses0[ 3 ], sRC, pulses1[ 1 ], SKP_Silk_shell_code_table0 ); - - decode_split( &pulses1[ 2 ], &pulses1[ 3 ], sRC, pulses2[ 1 ], SKP_Silk_shell_code_table1 ); - decode_split( &pulses0[ 4 ], &pulses0[ 5 ], sRC, pulses1[ 2 ], SKP_Silk_shell_code_table0 ); - decode_split( &pulses0[ 6 ], &pulses0[ 7 ], sRC, pulses1[ 3 ], SKP_Silk_shell_code_table0 ); - - decode_split( &pulses2[ 2 ], &pulses2[ 3 ], sRC, pulses3[ 1 ], SKP_Silk_shell_code_table2 ); - - decode_split( &pulses1[ 4 ], &pulses1[ 5 ], sRC, pulses2[ 2 ], SKP_Silk_shell_code_table1 ); - decode_split( &pulses0[ 8 ], &pulses0[ 9 ], sRC, pulses1[ 4 ], SKP_Silk_shell_code_table0 ); - decode_split( &pulses0[ 10 ], &pulses0[ 11 ], sRC, pulses1[ 5 ], SKP_Silk_shell_code_table0 ); - - decode_split( &pulses1[ 6 ], &pulses1[ 7 ], sRC, pulses2[ 3 ], SKP_Silk_shell_code_table1 ); - decode_split( &pulses0[ 12 ], &pulses0[ 13 ], sRC, pulses1[ 6 ], SKP_Silk_shell_code_table0 ); - decode_split( &pulses0[ 14 ], &pulses0[ 15 ], sRC, pulses1[ 7 ], SKP_Silk_shell_code_table0 ); -} diff --git a/libs/silk/src/SKP_Silk_sigm_Q15.c b/libs/silk/src/SKP_Silk_sigm_Q15.c deleted file mode 100644 index 0dbcc1883c..0000000000 --- a/libs/silk/src/SKP_Silk_sigm_Q15.c +++ /dev/null @@ -1,77 +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_sigm_Q15.c * - * * - * Approximate sigmoid function * - * * - * Copyright 2006 (c), Skype Limited * - * Date: 060221 * - * */ -#include "SKP_Silk_SigProc_FIX.h" -/********************************/ -/* approximate sigmoid function */ -/********************************/ -/* fprintf(1, '%d, ', round(1024 * ([1 ./ (1 + exp(-(1:5))), 1] - 1 ./ (1 + exp(-(0:5)))))); */ -static const SKP_int32 sigm_LUT_slope_Q10[ 6 ] = { - 237, 153, 73, 30, 12, 7 -}; -/* fprintf(1, '%d, ', round(32767 * 1 ./ (1 + exp(-(0:5))))); */ -static const SKP_int32 sigm_LUT_pos_Q15[ 6 ] = { - 16384, 23955, 28861, 31213, 32178, 32548 -}; -/* fprintf(1, '%d, ', round(32767 * 1 ./ (1 + exp((0:5))))); */ -static const SKP_int32 sigm_LUT_neg_Q15[ 6 ] = { - 16384, 8812, 3906, 1554, 589, 219 -}; - -SKP_int SKP_Silk_sigm_Q15( SKP_int in_Q5 ) -{ - SKP_int ind; - - if( in_Q5 < 0 ) { - /* Negative input */ - in_Q5 = -in_Q5; - if( in_Q5 >= 6 * 32 ) { - return 0; /* Clip */ - } else { - /* Linear interpolation of look up table */ - ind = SKP_RSHIFT( in_Q5, 5 ); - return( sigm_LUT_neg_Q15[ ind ] - SKP_SMULBB( sigm_LUT_slope_Q10[ ind ], in_Q5 & 0x1F ) ); - } - } else { - /* Positive input */ - if( in_Q5 >= 6 * 32 ) { - return 32767; /* clip */ - } else { - /* Linear interpolation of look up table */ - ind = SKP_RSHIFT( in_Q5, 5 ); - return( sigm_LUT_pos_Q15[ ind ] + SKP_SMULBB( sigm_LUT_slope_Q10[ ind ], in_Q5 & 0x1F ) ); - } - } -} diff --git a/libs/silk/src/SKP_Silk_solve_LS_FIX.c b/libs/silk/src/SKP_Silk_solve_LS_FIX.c deleted file mode 100644 index 1e51c53536..0000000000 --- a/libs/silk/src/SKP_Silk_solve_LS_FIX.c +++ /dev/null @@ -1,241 +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_FIX.h" -#include "SKP_Silk_tuning_parameters.h" - -/*****************************/ -/* Internal function headers */ -/*****************************/ - -typedef struct { - SKP_int32 Q36_part; - SKP_int32 Q48_part; -} inv_D_t; - -/* Factorize square matrix A into LDL form */ -SKP_INLINE void SKP_Silk_LDL_factorize_FIX( - SKP_int32 *A, /* I/O Pointer to Symetric Square Matrix */ - SKP_int M, /* I Size of Matrix */ - SKP_int32 *L_Q16, /* I/O Pointer to Square Upper triangular Matrix */ - inv_D_t *inv_D /* I/O Pointer to vector holding inverted diagonal elements of D */ -); - -/* Solve Lx = b, when L is lower triangular and has ones on the diagonal */ -SKP_INLINE void SKP_Silk_LS_SolveFirst_FIX( - const SKP_int32 *L_Q16, /* I Pointer to Lower Triangular Matrix */ - SKP_int M, /* I Dim of Matrix equation */ - const SKP_int32 *b, /* I b Vector */ - SKP_int32 *x_Q16 /* O x Vector */ -); - -/* Solve L^t*x = b, where L is lower triangular with ones on the diagonal */ -SKP_INLINE void SKP_Silk_LS_SolveLast_FIX( - const SKP_int32 *L_Q16, /* I Pointer to Lower Triangular Matrix */ - const SKP_int M, /* I Dim of Matrix equation */ - const SKP_int32 *b, /* I b Vector */ - SKP_int32 *x_Q16 /* O x Vector */ -); - -SKP_INLINE void SKP_Silk_LS_divide_Q16_FIX( - SKP_int32 T[], /* I/O Numenator vector */ - inv_D_t *inv_D, /* I 1 / D vector */ - SKP_int M /* I dimension */ -); - -/* Solves Ax = b, assuming A is symmetric */ -void SKP_Silk_solve_LDL_FIX( - SKP_int32 *A, /* I Pointer to symetric square matrix A */ - SKP_int M, /* I Size of matrix */ - const SKP_int32 *b, /* I Pointer to b vector */ - SKP_int32 *x_Q16 /* O Pointer to x solution vector */ -) -{ - SKP_int32 L_Q16[ MAX_MATRIX_SIZE * MAX_MATRIX_SIZE ]; - SKP_int32 Y[ MAX_MATRIX_SIZE ]; - inv_D_t inv_D[ MAX_MATRIX_SIZE ]; - - SKP_assert( M <= MAX_MATRIX_SIZE ); - - /*************************************************** - Factorize A by LDL such that A = L*D*L', - where L is lower triangular with ones on diagonal - ****************************************************/ - SKP_Silk_LDL_factorize_FIX( A, M, L_Q16, inv_D ); - - /**************************************************** - * substitute D*L'*x = Y. ie: - L*D*L'*x = b => L*Y = b <=> Y = inv(L)*b - ******************************************************/ - SKP_Silk_LS_SolveFirst_FIX( L_Q16, M, b, Y ); - - /**************************************************** - D*L'*x = Y <=> L'*x = inv(D)*Y, because D is - diagonal just multiply with 1/d_i - ****************************************************/ - SKP_Silk_LS_divide_Q16_FIX( Y, inv_D, M ); - - /**************************************************** - x = inv(L') * inv(D) * Y - *****************************************************/ - SKP_Silk_LS_SolveLast_FIX( L_Q16, M, Y, x_Q16 ); -} - -SKP_INLINE void SKP_Silk_LDL_factorize_FIX( - SKP_int32 *A, /* I Pointer to Symetric Square Matrix */ - SKP_int M, /* I Size of Matrix */ - SKP_int32 *L_Q16, /* I/O Pointer to Square Upper triangular Matrix */ - inv_D_t *inv_D /* I/O Pointer to vector holding inverted diagonal elements of D */ -) -{ - SKP_int i, j, k, status, loop_count; - const SKP_int32 *ptr1, *ptr2; - SKP_int32 diag_min_value, tmp_32, err; - SKP_int32 v_Q0[ MAX_MATRIX_SIZE ], D_Q0[ MAX_MATRIX_SIZE ]; - SKP_int32 one_div_diag_Q36, one_div_diag_Q40, one_div_diag_Q48; - - SKP_assert( M <= MAX_MATRIX_SIZE ); - - status = 1; - diag_min_value = SKP_max_32( SKP_SMMUL( SKP_ADD_SAT32( A[ 0 ], A[ SKP_SMULBB( M, M ) - 1 ] ), SKP_FIX_CONST( FIND_LTP_COND_FAC, 31 ) ), 1 << 9 ); - for( loop_count = 0; loop_count < M && status == 1; loop_count++ ) { - status = 0; - for( j = 0; j < M; j++ ) { - ptr1 = matrix_adr( L_Q16, j, 0, M ); - tmp_32 = 0; - for( i = 0; i < j; i++ ) { - v_Q0[ i ] = SKP_SMULWW( D_Q0[ i ], ptr1[ i ] ); /* Q0 */ - tmp_32 = SKP_SMLAWW( tmp_32, v_Q0[ i ], ptr1[ i ] ); /* Q0 */ - } - tmp_32 = SKP_SUB32( matrix_ptr( A, j, j, M ), tmp_32 ); - - if( tmp_32 < diag_min_value ) { - tmp_32 = SKP_SUB32( SKP_SMULBB( loop_count + 1, diag_min_value ), tmp_32 ); - /* Matrix not positive semi-definite, or ill conditioned */ - for( i = 0; i < M; i++ ) { - matrix_ptr( A, i, i, M ) = SKP_ADD32( matrix_ptr( A, i, i, M ), tmp_32 ); - } - status = 1; - break; - } - D_Q0[ j ] = tmp_32; /* always < max(Correlation) */ - - /* two-step division */ - one_div_diag_Q36 = SKP_INVERSE32_varQ( tmp_32, 36 ); /* Q36 */ - one_div_diag_Q40 = SKP_LSHIFT( one_div_diag_Q36, 4 ); /* Q40 */ - err = SKP_SUB32( 1 << 24, SKP_SMULWW( tmp_32, one_div_diag_Q40 ) ); /* Q24 */ - one_div_diag_Q48 = SKP_SMULWW( err, one_div_diag_Q40 ); /* Q48 */ - - /* Save 1/Ds */ - inv_D[ j ].Q36_part = one_div_diag_Q36; - inv_D[ j ].Q48_part = one_div_diag_Q48; - - matrix_ptr( L_Q16, j, j, M ) = 65536; /* 1.0 in Q16 */ - ptr1 = matrix_adr( A, j, 0, M ); - ptr2 = matrix_adr( L_Q16, j + 1, 0, M ); - for( i = j + 1; i < M; i++ ) { - tmp_32 = 0; - for( k = 0; k < j; k++ ) { - tmp_32 = SKP_SMLAWW( tmp_32, v_Q0[ k ], ptr2[ k ] ); /* Q0 */ - } - tmp_32 = SKP_SUB32( ptr1[ i ], tmp_32 ); /* always < max(Correlation) */ - - /* tmp_32 / D_Q0[j] : Divide to Q16 */ - matrix_ptr( L_Q16, i, j, M ) = SKP_ADD32( SKP_SMMUL( tmp_32, one_div_diag_Q48 ), - SKP_RSHIFT( SKP_SMULWW( tmp_32, one_div_diag_Q36 ), 4 ) ); - - /* go to next column */ - ptr2 += M; - } - } - } - - SKP_assert( status == 0 ); -} - -SKP_INLINE void SKP_Silk_LS_divide_Q16_FIX( - SKP_int32 T[], /* I/O Numenator vector */ - inv_D_t *inv_D, /* I 1 / D vector */ - SKP_int M /* I Order */ -) -{ - SKP_int i; - SKP_int32 tmp_32; - SKP_int32 one_div_diag_Q36, one_div_diag_Q48; - - for( i = 0; i < M; i++ ) { - one_div_diag_Q36 = inv_D[ i ].Q36_part; - one_div_diag_Q48 = inv_D[ i ].Q48_part; - - tmp_32 = T[ i ]; - T[ i ] = SKP_ADD32( SKP_SMMUL( tmp_32, one_div_diag_Q48 ), SKP_RSHIFT( SKP_SMULWW( tmp_32, one_div_diag_Q36 ), 4 ) ); - } -} - -/* Solve Lx = b, when L is lower triangular and has ones on the diagonal */ -SKP_INLINE void SKP_Silk_LS_SolveFirst_FIX( - const SKP_int32 *L_Q16, /* I Pointer to Lower Triangular Matrix */ - SKP_int M, /* I Dim of Matrix equation */ - const SKP_int32 *b, /* I b Vector */ - SKP_int32 *x_Q16 /* O x Vector */ -) -{ - SKP_int i, j; - const SKP_int32 *ptr32; - SKP_int32 tmp_32; - - for( i = 0; i < M; i++ ) { - ptr32 = matrix_adr( L_Q16, i, 0, M ); - tmp_32 = 0; - for( j = 0; j < i; j++ ) { - tmp_32 = SKP_SMLAWW( tmp_32, ptr32[ j ], x_Q16[ j ] ); - } - x_Q16[ i ] = SKP_SUB32( b[ i ], tmp_32 ); - } -} - -/* Solve L^t*x = b, where L is lower triangular with ones on the diagonal */ -SKP_INLINE void SKP_Silk_LS_SolveLast_FIX( - const SKP_int32 *L_Q16, /* I Pointer to Lower Triangular Matrix */ - const SKP_int M, /* I Dim of Matrix equation */ - const SKP_int32 *b, /* I b Vector */ - SKP_int32 *x_Q16 /* O x Vector */ -) -{ - SKP_int i, j; - const SKP_int32 *ptr32; - SKP_int32 tmp_32; - - for( i = M - 1; i >= 0; i-- ) { - ptr32 = matrix_adr( L_Q16, 0, i, M ); - tmp_32 = 0; - for( j = M - 1; j > i; j-- ) { - tmp_32 = SKP_SMLAWW( tmp_32, ptr32[ SKP_SMULBB( j, M ) ], x_Q16[ j ] ); - } - x_Q16[ i ] = SKP_SUB32( b[ i ], tmp_32 ); - } -} diff --git a/libs/silk/src/SKP_Silk_sort.c b/libs/silk/src/SKP_Silk_sort.c deleted file mode 100644 index d4dde6ef1c..0000000000 --- a/libs/silk/src/SKP_Silk_sort.c +++ /dev/null @@ -1,147 +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. -***********************************************************************/ - -/* Insertion sort (fast for already almost sorted arrays): */ -/* Best case: O(n) for an already sorted array */ -/* Worst case: O(n^2) for an inversely sorted array */ -/* */ -/* Shell short: http://en.wikipedia.org/wiki/Shell_sort */ - -#include "SKP_Silk_SigProc_FIX.h" - -void SKP_Silk_insertion_sort_increasing( - SKP_int32 *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 output positions */ -) -{ - SKP_int32 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 for, 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_int16( - SKP_int16 *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 output positions */ -) -{ - SKP_int i, j; - SKP_int value; - - /* 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, decreasing 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 for, 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_increasing_all_values( - SKP_int *a, /* I/O: Unsorted / Sorted vector */ - const SKP_int L /* I: Vector length */ -) -{ - SKP_int 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/libs/silk/src/SKP_Silk_structs.h b/libs/silk/src/SKP_Silk_structs.h deleted file mode 100644 index 3b3b0d394b..0000000000 --- a/libs/silk/src/SKP_Silk_structs.h +++ /dev/null @@ -1,350 +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_STRUCTS_H -#define SKP_SILK_STRUCTS_H - -#include "SKP_Silk_typedef.h" -#include "SKP_Silk_SigProc_FIX.h" -#include "SKP_Silk_define.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - -/************************************/ -/* Noise shaping quantization state */ -/************************************/ -typedef struct { - SKP_int16 xq[ 2 * MAX_FRAME_LENGTH ]; /* Buffer for quantized output signal */ - SKP_int32 sLTP_shp_Q10[ 2 * MAX_FRAME_LENGTH ]; - SKP_int32 sLPC_Q14[ MAX_FRAME_LENGTH / NB_SUBFR + NSQ_LPC_BUF_LENGTH ]; - SKP_int32 sAR2_Q14[ MAX_SHAPE_LPC_ORDER ]; - SKP_int32 sLF_AR_shp_Q12; - SKP_int lagPrev; - SKP_int sLTP_buf_idx; - SKP_int sLTP_shp_buf_idx; - SKP_int32 rand_seed; - SKP_int32 prev_inv_gain_Q16; - SKP_int rewhite_flag; -} SKP_Silk_nsq_state; /* FIX*/ - -/* Struct for Low BitRate Redundant (LBRR) information */ -typedef struct { - SKP_uint8 payload[ MAX_ARITHM_BYTES ]; - SKP_int nBytes; /* Number of bytes in payload */ - SKP_int usage; /* Tells how the payload should be used as FEC */ -} SKP_SILK_LBRR_struct; - -/********************************/ -/* VAD state */ -/********************************/ -typedef struct { - SKP_int32 AnaState[ 2 ]; /* Analysis filterbank state: 0-8 kHz */ - SKP_int32 AnaState1[ 2 ]; /* Analysis filterbank state: 0-4 kHz */ - SKP_int32 AnaState2[ 2 ]; /* Analysis filterbank state: 0-2 kHz */ - SKP_int32 XnrgSubfr[ VAD_N_BANDS ]; /* Subframe energies */ - SKP_int32 NrgRatioSmth_Q8[ VAD_N_BANDS ]; /* Smoothed energy level in each band */ - SKP_int16 HPstate; /* State of differentiator in the lowest band */ - SKP_int32 NL[ VAD_N_BANDS ]; /* Noise energy level in each band */ - SKP_int32 inv_NL[ VAD_N_BANDS ]; /* Inverse noise energy level in each band */ - SKP_int32 NoiseLevelBias[ VAD_N_BANDS ]; /* Noise level estimator bias/offset */ - SKP_int32 counter; /* Frame counter used in the initial phase */ -} SKP_Silk_VAD_state; - -/*******************************/ -/* Range encoder/decoder state */ -/*******************************/ -typedef struct { - SKP_int32 bufferLength; - SKP_int32 bufferIx; - SKP_uint32 base_Q32; - SKP_uint32 range_Q16; - SKP_int32 error; - SKP_uint8 buffer[ MAX_ARITHM_BYTES ]; /* Buffer containing payload */ -} SKP_Silk_range_coder_state; - -/* Input frequency range detection struct */ -typedef struct { - SKP_int32 S_HP_8_kHz[ NB_SOS ][ 2 ]; /* HP filter State */ - SKP_int32 ConsecSmplsAboveThres; - SKP_int32 ActiveSpeech_ms; /* Accumulated time with active speech */ - SKP_int SWB_detected; /* Flag to indicate SWB input */ - SKP_int WB_detected; /* Flag to indicate WB input */ -} SKP_Silk_detect_SWB_state; - -#if SWITCH_TRANSITION_FILTERING -/* Variable cut-off low-pass filter state */ -typedef struct { - SKP_int32 In_LP_State[ 2 ]; /* Low pass filter state */ - SKP_int32 transition_frame_no; /* Counter which is mapped to a cut-off frequency */ - SKP_int mode; /* Operating mode, 0: switch down, 1: switch up */ -} SKP_Silk_LP_state; -#endif - -/* Structure for one stage of MSVQ */ -typedef struct { - const SKP_int32 nVectors; - const SKP_int16 *CB_NLSF_Q15; - const SKP_int16 *Rates_Q5; -} SKP_Silk_NLSF_CBS; - -/* Structure containing NLSF MSVQ codebook */ -typedef struct { - const SKP_int32 nStages; - - /* Fields for (de)quantizing */ - const SKP_Silk_NLSF_CBS *CBStages; - const SKP_int *NDeltaMin_Q15; - - /* Fields for arithmetic (de)coding */ - const SKP_uint16 *CDF; - const SKP_uint16 * const *StartPtr; - const SKP_int *MiddleIx; -} SKP_Silk_NLSF_CB_struct; - -/********************************/ -/* Encoder state */ -/********************************/ -typedef struct { - SKP_Silk_range_coder_state sRC; /* Range coder state */ - SKP_Silk_range_coder_state sRC_LBRR; /* Range coder state (for low bitrate redundancy) */ -#if HIGH_PASS_INPUT - SKP_int32 In_HP_State[ 2 ]; /* High pass filter state */ -#endif -#if SWITCH_TRANSITION_FILTERING - SKP_Silk_LP_state sLP; /* Low pass filter state */ -#endif - SKP_Silk_VAD_state sVAD; /* Voice activity detector state */ - - SKP_int LBRRprevLastGainIndex; - SKP_int prev_sigtype; - SKP_int typeOffsetPrev; /* Previous signal type and quantization offset */ - SKP_int prevLag; - SKP_int prev_lagIndex; - 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 fs_kHz; /* Internal sampling frequency (kHz) */ - SKP_int fs_kHz_changed; /* Did we switch yet? */ - SKP_int frame_length; /* Frame length (samples) */ - SKP_int subfr_length; /* Subframe length (samples) */ - SKP_int la_pitch; /* Look-ahead for pitch analysis (samples) */ - SKP_int la_shape; /* Look-ahead for noise shape analysis (samples) */ - SKP_int shapeWinLength; /* Window length for noise shape analysis (samples) */ - SKP_int32 TargetRate_bps; /* Target bitrate (bps) */ - SKP_int PacketSize_ms; /* Number of milliseconds to put in each packet */ - SKP_int PacketLoss_perc; /* Packet loss rate measured by farend */ - SKP_int32 frameCounter; - SKP_int Complexity; /* Complexity setting: 0-> low; 1-> medium; 2->high */ - SKP_int nStatesDelayedDecision; /* Number of states in delayed decision quantization */ - SKP_int useInterpolatedNLSFs; /* Flag for using NLSF interpolation */ - SKP_int shapingLPCOrder; /* Filter order for noise shaping filters */ - SKP_int predictLPCOrder; /* Filter order for prediction filters */ - SKP_int pitchEstimationComplexity; /* Complexity level for pitch estimator */ - SKP_int pitchEstimationLPCOrder; /* Whitening filter order for pitch estimator */ - SKP_int32 pitchEstimationThreshold_Q16; /* Threshold for pitch estimator */ - SKP_int LTPQuantLowComplexity; /* Flag for low complexity LTP quantization */ - SKP_int NLSF_MSVQ_Survivors; /* Number of survivors in NLSF MSVQ */ - SKP_int first_frame_after_reset; /* Flag for deactivating NLSF interp. and fluc. reduction after resets */ - 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 */ - - /* Input/output buffering */ - SKP_int16 inputBuf[ MAX_FRAME_LENGTH ]; /* buffer containin input signal */ - SKP_int inputBufIx; - SKP_int nFramesInPayloadBuf; /* number of frames sitting in outputBuf */ - SKP_int nBytesInPayloadBuf; /* number of bytes sitting in outputBuf */ - - /* Parameters For LTP scaling Control */ - SKP_int frames_since_onset; - - const SKP_Silk_NLSF_CB_struct *psNLSF_CB[ 2 ]; /* Pointers to voiced/unvoiced NLSF codebooks */ - - /* Struct for Inband LBRR */ - SKP_SILK_LBRR_struct LBRR_buffer[ MAX_LBRR_DELAY ]; - SKP_int oldest_LBRR_idx; - SKP_int useInBandFEC; /* Saves the API setting for query */ - SKP_int LBRR_enabled; - SKP_int LBRR_GainIncreases; /* Number of shifts to Gains to get LBRR rate Voiced frames */ - - /* Bitrate control */ - SKP_int32 bitrateDiff; /* Accumulated diff. between the target bitrate and the switch bitrates */ - SKP_int32 bitrate_threshold_up; /* Threshold for switching to a higher internal sample frequency */ - SKP_int32 bitrate_threshold_down; /* Threshold for switching to a lower internal sample frequency */ - - SKP_Silk_resampler_state_struct resampler_state; - - /* DTX */ - SKP_int noSpeechCounter; /* Counts concecutive nonactive frames, used by DTX */ - SKP_int useDTX; /* Flag to enable DTX */ - SKP_int inDTX; /* Flag to signal DTX period */ - SKP_int vadFlag; /* Flag to indicate Voice Activity */ - - /* Struct for detecting SWB input */ - SKP_Silk_detect_SWB_state sSWBdetect; - - - /* Buffers */ - SKP_int8 q[ MAX_FRAME_LENGTH ]; /* pulse signal buffer */ - SKP_int8 q_LBRR[ MAX_FRAME_LENGTH ]; /* pulse signal buffer */ - -} SKP_Silk_encoder_state; - - -/************************/ -/* Encoder control */ -/************************/ -typedef struct { - /* Quantization indices */ - SKP_int lagIndex; - SKP_int contourIndex; - SKP_int PERIndex; - SKP_int LTPIndex[ NB_SUBFR ]; - SKP_int NLSFIndices[ NLSF_MSVQ_MAX_CB_STAGES ]; /* NLSF path of quantized LSF vector */ - SKP_int NLSFInterpCoef_Q2; - SKP_int GainsIndices[ NB_SUBFR ]; - SKP_int32 Seed; - SKP_int LTP_scaleIndex; - SKP_int RateLevelIndex; - SKP_int QuantOffsetType; - SKP_int sigtype; - - /* Prediction and coding parameters */ - SKP_int pitchL[ NB_SUBFR ]; - - SKP_int LBRR_usage; /* Low bitrate redundancy usage */ -} SKP_Silk_encoder_control; - -/* Struct for Packet Loss Concealment */ -typedef struct { - SKP_int32 pitchL_Q8; /* Pitch lag to use for voiced concealment */ - SKP_int16 LTPCoef_Q14[ LTP_ORDER ]; /* LTP coeficients to use for voiced concealment */ - SKP_int16 prevLPC_Q12[ MAX_LPC_ORDER ]; - SKP_int last_frame_lost; /* Was previous frame lost */ - SKP_int32 rand_seed; /* Seed for unvoiced signal generation */ - SKP_int16 randScale_Q14; /* Scaling of unvoiced random signal */ - SKP_int32 conc_energy; - SKP_int conc_energy_shift; - SKP_int16 prevLTP_scale_Q14; - SKP_int32 prevGain_Q16[ NB_SUBFR ]; - SKP_int fs_kHz; -} SKP_Silk_PLC_struct; - -/* Struct for CNG */ -typedef struct { - SKP_int32 CNG_exc_buf_Q10[ MAX_FRAME_LENGTH ]; - SKP_int CNG_smth_NLSF_Q15[ MAX_LPC_ORDER ]; - SKP_int32 CNG_synth_state[ MAX_LPC_ORDER ]; - SKP_int32 CNG_smth_Gain_Q16; - SKP_int32 rand_seed; - SKP_int fs_kHz; -} SKP_Silk_CNG_struct; - -/********************************/ -/* Decoder state */ -/********************************/ -typedef struct { - SKP_Silk_range_coder_state sRC; /* Range coder state */ - SKP_int32 prev_inv_gain_Q16; - SKP_int32 sLTP_Q16[ 2 * MAX_FRAME_LENGTH ]; - SKP_int32 sLPC_Q14[ MAX_FRAME_LENGTH / NB_SUBFR + MAX_LPC_ORDER ]; - SKP_int32 exc_Q10[ MAX_FRAME_LENGTH ]; - SKP_int32 res_Q10[ MAX_FRAME_LENGTH ]; - SKP_int16 outBuf[ 2 * MAX_FRAME_LENGTH ]; /* Buffer for output signal */ - SKP_int lagPrev; /* Previous Lag */ - SKP_int LastGainIndex; /* Previous gain index */ - SKP_int LastGainIndex_EnhLayer; /* Previous gain index */ - SKP_int typeOffsetPrev; /* Previous signal type and quantization offset */ - SKP_int32 HPState[ DEC_HP_ORDER ]; /* HP filter state */ - const SKP_int16 *HP_A; /* HP filter AR coefficients */ - const SKP_int16 *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 frame_length; /* Frame length (samples) */ - SKP_int subfr_length; /* Subframe length (samples) */ - SKP_int LPC_order; /* LPC order */ - SKP_int prevNLSF_Q15[ MAX_LPC_ORDER ]; /* Used to interpolate LSFs */ - SKP_int first_frame_after_reset; /* Flag for deactivating NLSF interp. and fluc. reduction after resets */ - - /* For buffering payload in case of more frames per packet */ - SKP_int nBytesLeft; - SKP_int nFramesDecoded; - SKP_int nFramesInPacket; - SKP_int moreInternalDecoderFrames; - SKP_int FrameTermination; - - SKP_Silk_resampler_state_struct resampler_state; - - const SKP_Silk_NLSF_CB_struct *psNLSF_CB[ 2 ]; /* Pointers to voiced/unvoiced NLSF codebooks */ - - /* Parameters used to investigate if inband FEC is used */ - SKP_int vadFlag; - SKP_int no_FEC_counter; /* Counts number of frames wo inband FEC */ - SKP_int inband_FEC_offset; /* 0: no FEC, 1: FEC with 1 packet offset, 2: FEC w 2 packets offset */ - - /* CNG state */ - SKP_Silk_CNG_struct sCNG; - - /* Stuff used for PLC */ - SKP_int lossCnt; - SKP_int prev_sigtype; /* Previous sigtype */ - - SKP_Silk_PLC_struct sPLC; - - - -} SKP_Silk_decoder_state; - -/************************/ -/* Decoder control */ -/************************/ -typedef struct { - /* prediction and coding parameters */ - SKP_int pitchL[ NB_SUBFR ]; - SKP_int32 Gains_Q16[ NB_SUBFR ]; - SKP_int32 Seed; - /* holds interpolated and final coefficients, 4-byte aligned */ - SKP_DWORD_ALIGN SKP_int16 PredCoef_Q12[ 2 ][ MAX_LPC_ORDER ]; - SKP_int16 LTPCoef_Q14[ LTP_ORDER * NB_SUBFR ]; - SKP_int LTP_scale_Q14; - - /* quantization indices */ - SKP_int PERIndex; - SKP_int RateLevelIndex; - SKP_int QuantOffsetType; - SKP_int sigtype; - SKP_int NLSFInterpCoef_Q2; -} SKP_Silk_decoder_control; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libs/silk/src/SKP_Silk_structs_FIX.h b/libs/silk/src/SKP_Silk_structs_FIX.h deleted file mode 100644 index 09dcdc5055..0000000000 --- a/libs/silk/src/SKP_Silk_structs_FIX.h +++ /dev/null @@ -1,153 +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_STRUCTS_FIX_H -#define SKP_SILK_STRUCTS_FIX_H - -#include "SKP_Silk_typedef.h" -#include "SKP_Silk_main.h" -#include "SKP_Silk_structs.h" - - -#ifdef __cplusplus -extern "C" -{ -#endif - -/********************************/ -/* Noise shaping analysis state */ -/********************************/ -typedef struct { - SKP_int LastGainIndex; - SKP_int32 HarmBoost_smth_Q16; - SKP_int32 HarmShapeGain_smth_Q16; - SKP_int32 Tilt_smth_Q16; -} SKP_Silk_shape_state_FIX; - -/********************************/ -/* Prefilter state */ -/********************************/ -typedef struct { - SKP_int16 sLTP_shp[ LTP_BUF_LENGTH ]; - SKP_int32 sAR_shp[ MAX_SHAPE_LPC_ORDER + 1 ]; - SKP_int sLTP_shp_buf_idx; - SKP_int32 sLF_AR_shp_Q12; - SKP_int32 sLF_MA_shp_Q12; - SKP_int sHarmHP; - SKP_int32 rand_seed; - SKP_int lagPrev; -} SKP_Silk_prefilter_state_FIX; - -/*****************************/ -/* Prediction analysis state */ -/*****************************/ -typedef struct { - SKP_int pitch_LPC_win_length; - SKP_int min_pitch_lag; /* Lowest possible pitch lag (samples) */ - SKP_int max_pitch_lag; /* Highest possible pitch lag (samples) */ - SKP_int prev_NLSFq_Q15[ MAX_LPC_ORDER ]; /* Previously quantized NLSF vector */ -} SKP_Silk_predict_state_FIX; - - -/********************************/ -/* Encoder state FIX */ -/********************************/ -typedef struct { - SKP_Silk_encoder_state sCmn; /* Common struct, shared with floating-point code */ - -#if HIGH_PASS_INPUT - SKP_int32 variable_HP_smth1_Q15; /* State of first smoother */ - SKP_int32 variable_HP_smth2_Q15; /* State of second smoother */ -#endif - SKP_Silk_shape_state_FIX sShape; /* Shape state */ - SKP_Silk_prefilter_state_FIX sPrefilt; /* Prefilter State */ - SKP_Silk_predict_state_FIX sPred; /* Prediction state */ - SKP_Silk_nsq_state sNSQ; /* Noise Shape Quantizer State */ - SKP_Silk_nsq_state sNSQ_LBRR; /* Noise Shape Quantizer State ( for low bitrate redundancy ) */ - - /* 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_int mu_LTP_Q8; /* Rate-distortion tradeoff in LTP quantization */ - SKP_int32 SNR_dB_Q7; /* Quality setting */ - SKP_int32 avgGain_Q16; /* average gain during active speech */ - SKP_int32 avgGain_Q16_one_bit_per_sample; /* average gain during active speech */ - SKP_int BufferedInChannel_ms; /* Simulated number of ms buffer because of exceeded TargetRate_bps */ - SKP_int speech_activity_Q8; /* Speech activity in Q8 */ - - /* Parameters For LTP scaling Control */ - SKP_int prevLTPredCodGain_Q7; - SKP_int HPLTPredCodGain_Q7; - - SKP_int32 inBandFEC_SNR_comp_Q8; /* Compensation to SNR_dB when using inband FEC Voiced */ - -} SKP_Silk_encoder_state_FIX; - -/************************/ -/* Encoder control FIX */ -/************************/ -typedef struct { - SKP_Silk_encoder_control sCmn; /* Common struct, shared with floating-point code */ - - /* Prediction and coding parameters */ - SKP_int32 Gains_Q16[ NB_SUBFR ]; - SKP_DWORD_ALIGN SKP_int16 PredCoef_Q12[ 2 ][ MAX_LPC_ORDER ]; - SKP_int16 LTPCoef_Q14[ LTP_ORDER * NB_SUBFR ]; - SKP_int LTP_scale_Q14; - - /* Noise shaping parameters */ - /* Testing */ - SKP_DWORD_ALIGN SKP_int16 AR1_Q13[ NB_SUBFR * MAX_SHAPE_LPC_ORDER ]; - SKP_DWORD_ALIGN SKP_int16 AR2_Q13[ NB_SUBFR * MAX_SHAPE_LPC_ORDER ]; - SKP_int32 LF_shp_Q14[ NB_SUBFR ]; /* Packs two int16 coefficients per int32 value */ - SKP_int GainsPre_Q14[ NB_SUBFR ]; - SKP_int HarmBoost_Q14[ NB_SUBFR ]; - SKP_int Tilt_Q14[ NB_SUBFR ]; - SKP_int HarmShapeGain_Q14[ NB_SUBFR ]; - SKP_int Lambda_Q10; - SKP_int input_quality_Q14; - SKP_int coding_quality_Q14; - SKP_int32 pitch_freq_low_Hz; - SKP_int current_SNR_dB_Q7; - - /* measures */ - SKP_int sparseness_Q8; - SKP_int32 predGain_Q16; - SKP_int LTPredCodGain_Q7; - SKP_int input_quality_bands_Q15[ VAD_N_BANDS ]; - SKP_int input_tilt_Q15; - SKP_int32 ResNrg[ NB_SUBFR ]; /* Residual energy per subframe */ - SKP_int ResNrgQ[ NB_SUBFR ]; /* Q domain for the residual energy > 0 */ - -} SKP_Silk_encoder_control_FIX; - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libs/silk/src/SKP_Silk_sum_sqr_shift.c b/libs/silk/src/SKP_Silk_sum_sqr_shift.c deleted file mode 100644 index 129f705c94..0000000000 --- a/libs/silk/src/SKP_Silk_sum_sqr_shift.c +++ /dev/null @@ -1,99 +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_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( - SKP_int32 *energy, /* O Energy of x, after shifting to the right */ - SKP_int *shift, /* O Number of bits right shift applied to energy */ - const SKP_int16 *x, /* I Input vector */ - SKP_int len /* I Length of input vector */ -) -{ - SKP_int i, shft; - SKP_int32 in32, 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; - } - 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; - if( nrg < 0 ) { - /* Scale down */ - nrg = (SKP_int32)SKP_RSHIFT_uint( (SKP_uint32)nrg, 2 ); - shft = 2; - break; - } - } - 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 = (SKP_int32)SKP_ADD_RSHIFT_uint( nrg, (SKP_uint32)nrg_tmp, shft ); - if( nrg < 0 ) { - /* Scale down */ - nrg = (SKP_int32)SKP_RSHIFT_uint( (SKP_uint32)nrg, 2 ); - shft += 2; - } - } - if( i == len ) { - /* One sample left to process */ - nrg_tmp = SKP_SMULBB( x[ i ], x[ i ] ); - nrg = (SKP_int32)SKP_ADD_RSHIFT_uint( nrg, nrg_tmp, shft ); - } - - /* Make sure to have at least one extra leading zero (two leading zeros in total) */ - if( nrg & 0xC0000000 ) { - nrg = SKP_RSHIFT_uint( (SKP_uint32)nrg, 2 ); - shft += 2; - } - - /* Output arguments */ - *shift = shft; - *energy = nrg; -} diff --git a/libs/silk/src/SKP_Silk_tables.h b/libs/silk/src/SKP_Silk_tables.h deleted file mode 100644 index 46abc640f8..0000000000 --- a/libs/silk/src/SKP_Silk_tables.h +++ /dev/null @@ -1,168 +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_H -#define SKP_SILK_TABLES_H - -#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" -{ -#endif - -/* entropy coding tables */ -extern const SKP_uint16 SKP_Silk_type_offset_CDF[ 5 ]; /* 5 */ -extern const SKP_uint16 SKP_Silk_type_offset_joint_CDF[ 4 ][ 5 ]; /* 20 */ -extern const SKP_int SKP_Silk_type_offset_CDF_offset; - -extern const SKP_uint16 SKP_Silk_gain_CDF[ 2 ][ N_LEVELS_QGAIN + 1 ]; /* 130 */ -extern const SKP_int SKP_Silk_gain_CDF_offset; -extern const SKP_uint16 SKP_Silk_delta_gain_CDF[ MAX_DELTA_GAIN_QUANT - MIN_DELTA_GAIN_QUANT + 2 ]; /* 46 */ -extern const SKP_int SKP_Silk_delta_gain_CDF_offset; - -extern const SKP_uint16 SKP_Silk_pitch_lag_NB_CDF[ 8 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) + 2 ]; /* 130 */ -extern const SKP_int SKP_Silk_pitch_lag_NB_CDF_offset; -extern const SKP_uint16 SKP_Silk_pitch_lag_MB_CDF[ 12 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) + 2 ]; /* 194 */ -extern const SKP_int SKP_Silk_pitch_lag_MB_CDF_offset; -extern const SKP_uint16 SKP_Silk_pitch_lag_WB_CDF[ 16 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) + 2 ]; /* 258 */ -extern const SKP_int SKP_Silk_pitch_lag_WB_CDF_offset; -extern const SKP_uint16 SKP_Silk_pitch_lag_SWB_CDF[ 24 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) + 2 ]; /* 386 */ -extern const SKP_int SKP_Silk_pitch_lag_SWB_CDF_offset; - -extern const SKP_uint16 SKP_Silk_pitch_contour_CDF[ 35 ]; /* 35 */ -extern const SKP_int SKP_Silk_pitch_contour_CDF_offset; -extern const SKP_uint16 SKP_Silk_pitch_contour_NB_CDF[ 12 ]; /* 12 */ -extern const SKP_int SKP_Silk_pitch_contour_NB_CDF_offset; -extern const SKP_uint16 SKP_Silk_pitch_delta_CDF[23]; /* 23 */ -extern const SKP_int SKP_Silk_pitch_delta_CDF_offset; - -extern const SKP_uint16 SKP_Silk_pulses_per_block_CDF[ N_RATE_LEVELS ][ MAX_PULSES + 3 ]; /* 210 */ -extern const SKP_int SKP_Silk_pulses_per_block_CDF_offset; -extern const SKP_int16 SKP_Silk_pulses_per_block_BITS_Q6[ N_RATE_LEVELS - 1 ][ MAX_PULSES + 2 ]; /* 180 */ - -extern const SKP_uint16 SKP_Silk_rate_levels_CDF[ 2 ][ N_RATE_LEVELS ]; /* 20 */ -extern const SKP_int SKP_Silk_rate_levels_CDF_offset; -extern const SKP_int16 SKP_Silk_rate_levels_BITS_Q6[ 2 ][ N_RATE_LEVELS - 1 ]; /* 18 */ - -extern const SKP_int SKP_Silk_max_pulses_table[ 4 ]; /* 4 */ - -extern const SKP_uint16 SKP_Silk_shell_code_table0[ 33 ]; /* 33 */ -extern const SKP_uint16 SKP_Silk_shell_code_table1[ 52 ]; /* 52 */ -extern const SKP_uint16 SKP_Silk_shell_code_table2[ 102 ]; /* 102 */ -extern const SKP_uint16 SKP_Silk_shell_code_table3[ 207 ]; /* 207 */ -extern const SKP_uint16 SKP_Silk_shell_code_table_offsets[ 19 ]; /* 19 */ - -extern const SKP_uint16 SKP_Silk_lsb_CDF[ 3 ]; /* 3 */ - -extern const SKP_uint16 SKP_Silk_sign_CDF[ 36 ]; /* 36 */ - -extern const SKP_uint16 SKP_Silk_LTP_per_index_CDF[ 4 ]; /* 4 */ -extern const SKP_int SKP_Silk_LTP_per_index_CDF_offset; -extern const SKP_int16 * const SKP_Silk_LTP_gain_BITS_Q6_ptrs[ NB_LTP_CBKS ]; /* 3 */ -extern const SKP_uint16 * const SKP_Silk_LTP_gain_CDF_ptrs[ NB_LTP_CBKS ]; /* 3 */ -extern const SKP_int SKP_Silk_LTP_gain_CDF_offsets[ NB_LTP_CBKS ]; /* 3 */ -extern const SKP_int32 SKP_Silk_LTP_gain_middle_avg_RD_Q14; -extern const SKP_uint16 SKP_Silk_LTPscale_CDF[ 4 ]; /* 4 */ -extern const SKP_int SKP_Silk_LTPscale_offset; - -/* Tables for LTPScale */ -extern const SKP_int16 SKP_Silk_LTPScales_table_Q14[ 3 ]; - -extern const SKP_uint16 SKP_Silk_vadflag_CDF[ 3 ]; /* 3 */ -extern const SKP_int SKP_Silk_vadflag_offset; - -extern const SKP_int SKP_Silk_SamplingRates_table[ 4 ]; /* 4 */ -extern const SKP_uint16 SKP_Silk_SamplingRates_CDF[ 5 ]; /* 5 */ -extern const SKP_int SKP_Silk_SamplingRates_offset; - -extern const SKP_uint16 SKP_Silk_NLSF_interpolation_factor_CDF[ 6 ]; -extern const SKP_int SKP_Silk_NLSF_interpolation_factor_offset; - -/* NLSF codebooks */ -extern const SKP_Silk_NLSF_CB_struct SKP_Silk_NLSF_CB0_16, SKP_Silk_NLSF_CB1_16; -extern const SKP_Silk_NLSF_CB_struct SKP_Silk_NLSF_CB0_10, SKP_Silk_NLSF_CB1_10; - -/* quantization tables */ -extern const SKP_int16 * const SKP_Silk_LTP_vq_ptrs_Q14[ NB_LTP_CBKS ]; /* 168 */ -extern const SKP_int SKP_Silk_LTP_vq_sizes[ NB_LTP_CBKS ]; /* 3 */ - -/* Piece-wise linear mapping from bitrate in kbps to coding quality in dB SNR */ -extern const SKP_int32 TargetRate_table_NB[ TARGET_RATE_TAB_SZ ]; -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_int32 TargetRate_table_SWB[ TARGET_RATE_TAB_SZ ]; -extern const SKP_int32 SNR_table_Q1[ TARGET_RATE_TAB_SZ ]; - -extern const SKP_int32 SNR_table_one_bit_per_sample_Q7[ 4 ]; - -/* Filter coeficicnts for HP filter: 4. Order filter implementad as two biquad filters */ -extern const SKP_int16 SKP_Silk_SWB_detect_B_HP_Q13[ NB_SOS ][ 3 ]; -extern const SKP_int16 SKP_Silk_SWB_detect_A_HP_Q13[ NB_SOS ][ 2 ]; - -/* Decoder high-pass filter coefficients for 24 kHz sampling */ -extern const SKP_int16 SKP_Silk_Dec_A_HP_24[ DEC_HP_ORDER ]; /* 2 */ -extern const SKP_int16 SKP_Silk_Dec_B_HP_24[ DEC_HP_ORDER + 1 ]; /* 3 */ - -/* Decoder high-pass filter coefficients for 16 kHz sampling */ -extern const SKP_int16 SKP_Silk_Dec_A_HP_16[ DEC_HP_ORDER ]; /* 2 */ -extern const SKP_int16 SKP_Silk_Dec_B_HP_16[ DEC_HP_ORDER + 1 ]; /* 3 */ - -/* Decoder high-pass filter coefficients for 12 kHz sampling */ -extern const SKP_int16 SKP_Silk_Dec_A_HP_12[ DEC_HP_ORDER ]; /* 2 */ -extern const SKP_int16 SKP_Silk_Dec_B_HP_12[ DEC_HP_ORDER + 1 ]; /* 3 */ - -/* Decoder high-pass filter coefficients for 8 kHz sampling */ -extern const SKP_int16 SKP_Silk_Dec_A_HP_8[ DEC_HP_ORDER ]; /* 2 */ -extern const SKP_int16 SKP_Silk_Dec_B_HP_8[ DEC_HP_ORDER + 1 ]; /* 3 */ - -/* Table for frame termination indication */ -extern const SKP_uint16 SKP_Silk_FrameTermination_CDF[ 5 ]; -extern const SKP_int SKP_Silk_FrameTermination_offset; - -/* Table for random seed */ -extern const SKP_uint16 SKP_Silk_Seed_CDF[ 5 ]; -extern const SKP_int SKP_Silk_Seed_offset; - -/* 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 -} -#endif - -#endif diff --git a/libs/silk/src/SKP_Silk_tables_LTP.c b/libs/silk/src/SKP_Silk_tables_LTP.c deleted file mode 100644 index fefef03034..0000000000 --- a/libs/silk/src/SKP_Silk_tables_LTP.c +++ /dev/null @@ -1,324 +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_tables.h" - -const SKP_uint16 SKP_Silk_LTP_per_index_CDF[ 4 ] = { - 0, 20992, 40788, 65535 -}; - -const SKP_int SKP_Silk_LTP_per_index_CDF_offset = 1; - - -const SKP_uint16 SKP_Silk_LTP_gain_CDF_0[ 11 ] = { - 0, 49380, 54463, 56494, 58437, 60101, 61683, 62985, - 64066, 64823, 65535 -}; - -const SKP_uint16 SKP_Silk_LTP_gain_CDF_1[ 21 ] = { - 0, 25290, 30654, 35710, 40386, 42937, 45250, 47459, - 49411, 51348, 52974, 54517, 55976, 57423, 58865, 60285, - 61667, 62895, 63827, 64724, 65535 -}; - -const SKP_uint16 SKP_Silk_LTP_gain_CDF_2[ 41 ] = { - 0, 4958, 9439, 13581, 17638, 21651, 25015, 28025, - 30287, 32406, 34330, 36240, 38130, 39790, 41281, 42764, - 44229, 45676, 47081, 48431, 49675, 50849, 51932, 52966, - 53957, 54936, 55869, 56789, 57708, 58504, 59285, 60043, - 60796, 61542, 62218, 62871, 63483, 64076, 64583, 65062, - 65535 -}; - -const SKP_int SKP_Silk_LTP_gain_CDF_offsets[ 3 ] = { - 1, 3, 10 -}; - -const SKP_int32 SKP_Silk_LTP_gain_middle_avg_RD_Q14 = 11010; - -const SKP_int16 SKP_Silk_LTP_gain_BITS_Q6_0[ 10 ] = { - 26, 236, 321, 325, 339, 344, 362, 379, - 412, 418 -}; - -const SKP_int16 SKP_Silk_LTP_gain_BITS_Q6_1[ 20 ] = { - 88, 231, 237, 244, 300, 309, 313, 324, - 325, 341, 346, 351, 352, 352, 354, 356, - 367, 393, 396, 406 -}; - -const SKP_int16 SKP_Silk_LTP_gain_BITS_Q6_2[ 40 ] = { - 238, 248, 255, 257, 258, 274, 284, 311, - 317, 326, 326, 327, 339, 349, 350, 351, - 352, 355, 358, 366, 371, 379, 383, 387, - 388, 393, 394, 394, 407, 409, 412, 412, - 413, 422, 426, 432, 434, 449, 454, 455 -}; - -const SKP_uint16 * const SKP_Silk_LTP_gain_CDF_ptrs[ NB_LTP_CBKS ] = { - SKP_Silk_LTP_gain_CDF_0, - SKP_Silk_LTP_gain_CDF_1, - SKP_Silk_LTP_gain_CDF_2 -}; - -const SKP_int16 * const SKP_Silk_LTP_gain_BITS_Q6_ptrs[ NB_LTP_CBKS ] = { - SKP_Silk_LTP_gain_BITS_Q6_0, - SKP_Silk_LTP_gain_BITS_Q6_1, - SKP_Silk_LTP_gain_BITS_Q6_2 -}; - -const SKP_int16 SKP_Silk_LTP_gain_vq_0_Q14[ 10 ][ 5 ] = -{ -{ - 594, 984, 2840, 1021, 669 -}, -{ - 10, 35, 304, -1, 23 -}, -{ - -694, 1923, 4603, 2975, 2335 -}, -{ - 2437, 3176, 3778, 1940, 481 -}, -{ - 214, -46, 7870, 4406, -521 -}, -{ - -896, 4818, 8501, 1623, -887 -}, -{ - -696, 3178, 6480, -302, 1081 -}, -{ - 517, 599, 1002, 567, 560 -}, -{ - -2075, -834, 4712, -340, 896 -}, -{ - 1435, -644, 3993, -612, -2063 -} -}; - -const SKP_int16 SKP_Silk_LTP_gain_vq_1_Q14[ 20 ][ 5 ] = -{ -{ - 1655, 2918, 5001, 3010, 1775 -}, -{ - 113, 198, 856, 176, 178 -}, -{ - -843, 2479, 7858, 5371, 574 -}, -{ - 59, 5356, 7648, 2850, -315 -}, -{ - 3840, 4851, 6527, 1583, -1233 -}, -{ - 1620, 1760, 2330, 1876, 2045 -}, -{ - -545, 1854, 11792, 1547, -307 -}, -{ - -604, 689, 5369, 5074, 4265 -}, -{ - 521, -1331, 9829, 6209, -1211 -}, -{ - -1315, 6747, 9929, -1410, 546 -}, -{ - 117, -144, 2810, 1649, 5240 -}, -{ - 5392, 3476, 2425, -38, 633 -}, -{ - 14, -449, 5274, 3547, -171 -}, -{ - -98, 395, 9114, 1676, 844 -}, -{ - -908, 3843, 8861, -957, 1474 -}, -{ - 396, 6747, 5379, -329, 1269 -}, -{ - -335, 2830, 4281, 270, -54 -}, -{ - 1502, 5609, 8958, 6045, 2059 -}, -{ - -370, 479, 5267, 5726, 1174 -}, -{ - 5237, -1144, 6510, 455, 512 -} -}; - -const SKP_int16 SKP_Silk_LTP_gain_vq_2_Q14[ 40 ][ 5 ] = -{ -{ - -278, 415, 9345, 7106, -431 -}, -{ - -1006, 3863, 9524, 4724, -871 -}, -{ - -954, 4624, 11722, 973, -300 -}, -{ - -117, 7066, 8331, 1959, -901 -}, -{ - 593, 3412, 6070, 4914, 1567 -}, -{ - 54, -51, 12618, 4228, -844 -}, -{ - 3157, 4822, 5229, 2313, 717 -}, -{ - -244, 1161, 14198, 779, 69 -}, -{ - -1218, 5603, 12894, -2301, 1001 -}, -{ - -132, 3960, 9526, 577, 1806 -}, -{ - -1633, 8815, 10484, -2452, 895 -}, -{ - 235, 450, 1243, 667, 437 -}, -{ - 959, -2630, 10897, 8772, -1852 -}, -{ - 2420, 2046, 8893, 4427, -1569 -}, -{ - 23, 7091, 8356, -1285, 1508 -}, -{ - -1133, 835, 7662, 6043, 2800 -}, -{ - 439, 391, 11016, 2253, 1362 -}, -{ - -1020, 2876, 13436, 4015, -3020 -}, -{ - 1060, -2690, 13512, 5565, -1394 -}, -{ - -1420, 8007, 11421, -152, -1672 -}, -{ - -893, 2895, 15434, -1490, 159 -}, -{ - -1054, 428, 12208, 8538, -3344 -}, -{ - 1772, -1304, 7593, 6185, 561 -}, -{ - 525, -1207, 6659, 11151, -1170 -}, -{ - 439, 2667, 4743, 2359, 5515 -}, -{ - 2951, 7432, 7909, -230, -1564 -}, -{ - -72, 2140, 5477, 1391, 1580 -}, -{ - 476, -1312, 15912, 2174, -1027 -}, -{ - 5737, 441, 2493, 2043, 2757 -}, -{ - 228, -43, 1803, 6663, 7064 -}, -{ - 4596, 9182, 1917, -200, 203 -}, -{ - -704, 12039, 5451, -1188, 542 -}, -{ - 1782, -1040, 10078, 7513, -2767 -}, -{ - -2626, 7747, 9019, 62, 1710 -}, -{ - 235, -233, 2954, 10921, 1947 -}, -{ - 10854, 2814, 1232, -111, 222 -}, -{ - 2267, 2778, 12325, 156, -1658 -}, -{ - -2950, 8095, 16330, 268, -3626 -}, -{ - 67, 2083, 7950, -80, -2432 -}, -{ - 518, -66, 1718, 415, 11435 -} -}; - -const SKP_int16 * const SKP_Silk_LTP_vq_ptrs_Q14[ NB_LTP_CBKS ] = { - &SKP_Silk_LTP_gain_vq_0_Q14[ 0 ][ 0 ], - &SKP_Silk_LTP_gain_vq_1_Q14[ 0 ][ 0 ], - &SKP_Silk_LTP_gain_vq_2_Q14[ 0 ][ 0 ] -}; - -const SKP_int SKP_Silk_LTP_vq_sizes[ NB_LTP_CBKS ] = { - 10, 20, 40 -}; diff --git a/libs/silk/src/SKP_Silk_tables_NLSF_CB0_10.c b/libs/silk/src/SKP_Silk_tables_NLSF_CB0_10.c deleted file mode 100644 index c3caca3aaf..0000000000 --- a/libs/silk/src/SKP_Silk_tables_NLSF_CB0_10.c +++ /dev/null @@ -1,889 +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.29 + 2.66 kB */ -/**********************************************/ - -#include "SKP_Silk_structs.h" -#include "SKP_Silk_tables_NLSF_CB0_10.h" -#include "SKP_Silk_tables.h" - -const SKP_uint16 SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ NLSF_MSVQ_CB0_10_VECTORS + NLSF_MSVQ_CB0_10_STAGES ] = -{ - 0, - 2658, - 4420, - 6107, - 7757, - 9408, - 10955, - 12502, - 13983, - 15432, - 16882, - 18331, - 19750, - 21108, - 22409, - 23709, - 25010, - 26256, - 27501, - 28747, - 29965, - 31158, - 32351, - 33544, - 34736, - 35904, - 36997, - 38091, - 39185, - 40232, - 41280, - 42327, - 43308, - 44290, - 45271, - 46232, - 47192, - 48132, - 49032, - 49913, - 50775, - 51618, - 52462, - 53287, - 54095, - 54885, - 55675, - 56449, - 57222, - 57979, - 58688, - 59382, - 60076, - 60726, - 61363, - 61946, - 62505, - 63052, - 63543, - 63983, - 64396, - 64766, - 65023, - 65279, - 65535, - 0, - 4977, - 9542, - 14106, - 18671, - 23041, - 27319, - 31596, - 35873, - 39969, - 43891, - 47813, - 51652, - 55490, - 59009, - 62307, - 65535, - 0, - 8571, - 17142, - 25529, - 33917, - 42124, - 49984, - 57844, - 65535, - 0, - 8732, - 17463, - 25825, - 34007, - 42189, - 50196, - 58032, - 65535, - 0, - 8948, - 17704, - 25733, - 33762, - 41791, - 49821, - 57678, - 65535, - 0, - 4374, - 8655, - 12936, - 17125, - 21313, - 25413, - 29512, - 33611, - 37710, - 41809, - 45820, - 49832, - 53843, - 57768, - 61694, - 65535 -}; - -const SKP_uint16 * 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[ 65 ], - &SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ 82 ], - &SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ 91 ], - &SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ 100 ], - &SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ 109 ] -}; - -const SKP_int SKP_Silk_NLSF_MSVQ_CB0_10_CDF_middle_idx[ NLSF_MSVQ_CB0_10_STAGES ] = -{ - 23, - 8, - 5, - 5, - 5, - 9 -}; - -const SKP_int16 SKP_Silk_NLSF_MSVQ_CB0_10_rates_Q5[ NLSF_MSVQ_CB0_10_VECTORS ] = -{ - 148, 167, - 169, 170, - 170, 173, - 173, 175, - 176, 176, - 176, 177, - 179, 181, - 181, 181, - 183, 183, - 183, 184, - 185, 185, - 185, 185, - 186, 189, - 189, 189, - 191, 191, - 191, 194, - 194, 194, - 195, 195, - 196, 198, - 199, 200, - 201, 201, - 202, 203, - 204, 204, - 205, 205, - 206, 209, - 210, 210, - 213, 214, - 218, 220, - 221, 226, - 231, 234, - 239, 256, - 256, 256, - 119, 123, - 123, 123, - 125, 126, - 126, 126, - 128, 130, - 130, 131, - 131, 135, - 138, 139, - 94, 94, - 95, 95, - 96, 98, - 98, 99, - 93, 93, - 95, 96, - 96, 97, - 98, 100, - 92, 93, - 97, 97, - 97, 97, - 98, 98, - 125, 126, - 126, 127, - 127, 128, - 128, 128, - 128, 128, - 129, 129, - 129, 130, - 130, 131 -}; - -const SKP_int SKP_Silk_NLSF_MSVQ_CB0_10_ndelta_min_Q15[ 10 + 1 ] = -{ - 563, - 3, - 22, - 20, - 3, - 3, - 132, - 119, - 358, - 86, - 964 -}; - -const SKP_int16 SKP_Silk_NLSF_MSVQ_CB0_10_Q15[ 10 * NLSF_MSVQ_CB0_10_VECTORS ] = -{ - 2210, 4023, - 6981, 9260, - 12573, 15687, - 19207, 22383, - 25981, 29142, - 3285, 4172, - 6116, 10856, - 15289, 16826, - 19701, 22010, - 24721, 29313, - 1554, 2511, - 6577, 10337, - 13837, 16511, - 20086, 23214, - 26480, 29464, - 3062, 4017, - 5771, 10037, - 13365, 14952, - 20140, 22891, - 25229, 29603, - 2085, 3457, - 5934, 8718, - 11501, 13670, - 17997, 21817, - 24935, 28745, - 2776, 4093, - 6421, 10413, - 15111, 16806, - 20825, 23826, - 26308, 29411, - 2717, 4034, - 5697, 8463, - 14301, 16354, - 19007, 23413, - 25812, 28506, - 2872, 3702, - 5881, 11034, - 17141, 18879, - 21146, 23451, - 25817, 29600, - 2999, 4015, - 7357, 11219, - 12866, 17307, - 20081, 22644, - 26774, 29107, - 2942, 3866, - 5918, 11915, - 13909, 16072, - 20453, 22279, - 27310, 29826, - 2271, 3527, - 6606, 9729, - 12943, 17382, - 20224, 22345, - 24602, 28290, - 2207, 3310, - 5844, 9339, - 11141, 15651, - 18576, 21177, - 25551, 28228, - 3963, 4975, - 6901, 11588, - 13466, 15577, - 19231, 21368, - 25510, 27759, - 2749, 3549, - 6966, 13808, - 15653, 17645, - 20090, 22599, - 26467, 28537, - 2126, 3504, - 5109, 9954, - 12550, 14620, - 19703, 21687, - 26457, 29106, - 3966, 5745, - 7442, 9757, - 14468, 16404, - 19135, 23048, - 25375, 28391, - 3197, 4751, - 6451, 9298, - 13038, 14874, - 17962, 20627, - 23835, 28464, - 3195, 4081, - 6499, 12252, - 14289, 16040, - 18357, 20730, - 26980, 29309, - 1533, 2471, - 4486, 7796, - 12332, 15758, - 19567, 22298, - 25673, 29051, - 2002, 2971, - 4985, 8083, - 13181, 15435, - 18237, 21517, - 24595, 28351, - 3808, 4925, - 6710, 10201, - 12011, 14300, - 18457, 20391, - 26525, 28956, - 2281, 3418, - 4979, 8726, - 15964, 18104, - 20250, 22771, - 25286, 28954, - 3051, 5479, - 7290, 9848, - 12744, 14503, - 18665, 23684, - 26065, 28947, - 2364, 3565, - 5502, 9621, - 14922, 16621, - 19005, 20996, - 26310, 29302, - 4093, 5212, - 6833, 9880, - 16303, 18286, - 20571, 23614, - 26067, 29128, - 2941, 3996, - 6038, 10638, - 12668, 14451, - 16798, 19392, - 26051, 28517, - 3863, 5212, - 7019, 9468, - 11039, 13214, - 19942, 22344, - 25126, 29539, - 4615, 6172, - 7853, 10252, - 12611, 14445, - 19719, 22441, - 24922, 29341, - 3566, 4512, - 6985, 8684, - 10544, 16097, - 18058, 22475, - 26066, 28167, - 4481, 5489, - 7432, 11414, - 13191, 15225, - 20161, 22258, - 26484, 29716, - 3320, 4320, - 6621, 9867, - 11581, 14034, - 21168, 23210, - 26588, 29903, - 3794, 4689, - 6916, 8655, - 10143, 16144, - 19568, 21588, - 27557, 29593, - 2446, 3276, - 5918, 12643, - 16601, 18013, - 21126, 23175, - 27300, 29634, - 2450, 3522, - 5437, 8560, - 15285, 19911, - 21826, 24097, - 26567, 29078, - 2580, 3796, - 5580, 8338, - 9969, 12675, - 18907, 22753, - 25450, 29292, - 3325, 4312, - 6241, 7709, - 9164, 14452, - 21665, 23797, - 27096, 29857, - 3338, 4163, - 7738, 11114, - 12668, 14753, - 16931, 22736, - 25671, 28093, - 3840, 4755, - 7755, 13471, - 15338, 17180, - 20077, 22353, - 27181, 29743, - 2504, 4079, - 8351, 12118, - 15046, 18595, - 21684, 24704, - 27519, 29937, - 5234, 6342, - 8267, 11821, - 15155, 16760, - 20667, 23488, - 25949, 29307, - 2681, 3562, - 6028, 10827, - 18458, 20458, - 22303, 24701, - 26912, 29956, - 3374, 4528, - 6230, 8256, - 9513, 12730, - 18666, 20720, - 26007, 28425, - 2731, 3629, - 8320, 12450, - 14112, 16431, - 18548, 22098, - 25329, 27718, - 3481, 4401, - 7321, 9319, - 11062, 13093, - 15121, 22315, - 26331, 28740, - 3577, 4945, - 6669, 8792, - 10299, 12645, - 19505, 24766, - 26996, 29634, - 4058, 5060, - 7288, 10190, - 11724, 13936, - 15849, 18539, - 26701, 29845, - 4262, 5390, - 7057, 8982, - 10187, 15264, - 20480, 22340, - 25958, 28072, - 3404, 4329, - 6629, 7946, - 10121, 17165, - 19640, 22244, - 25062, 27472, - 3157, 4168, - 6195, 9319, - 10771, 13325, - 15416, 19816, - 24672, 27634, - 2503, 3473, - 5130, 6767, - 8571, 14902, - 19033, 21926, - 26065, 28728, - 4133, 5102, - 7553, 10054, - 11757, 14924, - 17435, 20186, - 23987, 26272, - 4972, 6139, - 7894, 9633, - 11320, 14295, - 21737, 24306, - 26919, 29907, - 2958, 3816, - 6851, 9204, - 10895, 18052, - 20791, 23338, - 27556, 29609, - 5234, 6028, - 8034, 10154, - 11242, 14789, - 18948, 20966, - 26585, 29127, - 5241, 6838, - 10526, 12819, - 14681, 17328, - 19928, 22336, - 26193, 28697, - 3412, 4251, - 5988, 7094, - 9907, 18243, - 21669, 23777, - 26969, 29087, - 2470, 3217, - 7797, 15296, - 17365, 19135, - 21979, 24256, - 27322, 29442, - 4939, 5804, - 8145, 11809, - 13873, 15598, - 17234, 19423, - 26476, 29645, - 5051, 6167, - 8223, 9655, - 12159, 17995, - 20464, 22832, - 26616, 28462, - 4987, 5907, - 9319, 11245, - 13132, 15024, - 17485, 22687, - 26011, 28273, - 5137, 6884, - 11025, 14950, - 17191, 19425, - 21807, 24393, - 26938, 29288, - 7057, 7884, - 9528, 10483, - 10960, 14811, - 19070, 21675, - 25645, 28019, - 6759, 7160, - 8546, 11779, - 12295, 13023, - 16627, 21099, - 24697, 28287, - 3863, 9762, - 11068, 11445, - 12049, 13960, - 18085, 21507, - 25224, 28997, - 397, 335, - 651, 1168, - 640, 765, - 465, 331, - 214, -194, - -578, -647, - -657, 750, - 564, 613, - 549, 630, - 304, -52, - 828, 922, - 443, 111, - 138, 124, - 169, 14, - 144, 83, - 132, 58, - -413, -752, - 869, 336, - 385, 69, - 56, 830, - -227, -266, - -368, -440, - -1195, 163, - 126, -228, - 802, 156, - 188, 120, - 376, 59, - -358, -558, - -1326, -254, - -202, -789, - 296, 92, - -70, -129, - -718, -1135, - 292, -29, - -631, 487, - -157, -153, - -279, 2, - -419, -342, - -34, -514, - -799, -1571, - -687, -609, - -546, -130, - -215, -252, - -446, -574, - -1337, 207, - -72, 32, - 103, -642, - 942, 733, - 187, 29, - -211, -814, - 143, 225, - 20, 24, - -268, -377, - 1623, 1133, - 667, 164, - 307, 366, - 187, 34, - 62, -313, - -832, -1482, - -1181, 483, - -42, -39, - -450, -1406, - -587, -52, - -760, 334, - 98, -60, - -500, -488, - -1058, 299, - 131, -250, - -251, -703, - 1037, 568, - -413, -265, - 1687, 573, - 345, 323, - 98, 61, - -102, 31, - 135, 149, - 617, 365, - -39, 34, - -611, 1201, - 1421, 736, - -414, -393, - -492, -343, - -316, -532, - 528, 172, - 90, 322, - -294, -319, - -541, 503, - 639, 401, - 1, -149, - -73, -167, - 150, 118, - 308, 218, - 121, 195, - -143, -261, - -1013, -802, - 387, 436, - 130, -427, - -448, -681, - 123, -87, - -251, -113, - 274, 310, - 445, 501, - 354, 272, - 141, -285, - 569, 656, - 37, -49, - 251, -386, - -263, 1122, - 604, 606, - 336, 95, - 34, 0, - 85, 180, - 207, -367, - -622, 1070, - -6, -79, - -160, -92, - -137, -276, - -323, -371, - -696, -1036, - 407, 102, - -86, -214, - -482, -647, - -28, -291, - -97, -180, - -250, -435, - -18, -76, - -332, 410, - 407, 168, - 539, 411, - 254, 111, - 58, -145, - 200, 30, - 187, 116, - 131, -367, - -475, 781, - -559, 561, - 195, -115, - 8, -168, - 30, 55, - -122, 131, - 82, -5, - -273, -50, - -632, 668, - 4, 32, - -26, -279, - 315, 165, - 197, 377, - 155, -41, - -138, -324, - -109, -617, - 360, 98, - -53, -319, - -114, -245, - -82, 507, - 468, 263, - -137, -389, - 652, 354, - -18, -227, - -462, -135, - 317, 53, - -16, 66, - -72, -126, - -356, -347, - -328, -72, - -337, 324, - 152, 349, - 169, -196, - 179, 254, - 260, 325, - -74, -80, - 75, -31, - 270, 275, - 87, 278, - -446, -301, - 309, 71, - -25, -242, - 516, 161, - -162, -83, - 329, 230, - -311, -259, - 177, -26, - -462, 89, - 257, 6, - -130, -93, - -456, -317, - -221, -206, - -417, -182, - -74, 234, - 48, 261, - 359, 231, - 258, 85, - -282, 252, - -147, -222, - 251, -207, - 443, 123, - -417, -36, - 273, -241, - 240, -112, - 44, -167, - 126, -124, - -77, 58, - -401, 333, - -118, 82, - 126, 151, - -433, 359, - -130, -102, - 131, -244, - 86, 85, - -462, 414, - -240, 16, - 145, 28, - -205, -481, - 373, 293, - -72, -174, - 62, 259, - -8, -18, - 362, 233, - 185, 43, - 278, 27, - 193, 570, - -248, 189, - 92, 31, - -275, -3, - 243, 176, - 438, 209, - 206, -51, - 79, 109, - 168, -185, - -308, -68, - -618, 385, - -310, -108, - -164, 165, - 61, -152, - -101, -412, - -268, -257, - -40, -20, - -28, -158, - -301, 271, - 380, -338, - -367, -132, - 64, 114, - -131, -225, - -156, -260, - -63, -116, - 155, -586, - -202, 254, - -287, 178, - 227, -106, - -294, 164, - 298, -100, - 185, 317, - 193, -45, - 28, 80, - -87, -433, - 22, -48, - 48, -237, - -229, -139, - 120, -364, - 268, -136, - 396, 125, - 130, -89, - -272, 118, - -256, -68, - -451, 488, - 143, -165, - -48, -190, - 106, 219, - 47, 435, - 245, 97, - 75, -418, - 121, -187, - 570, -200, - -351, 225, - -21, -217, - 234, -111, - 194, 14, - 242, 118, - 140, -397, - 355, 361, - -45, -195 -}; - -const SKP_Silk_NLSF_CBS SKP_Silk_NLSF_CB0_10_Stage_info[ NLSF_MSVQ_CB0_10_STAGES ] = -{ - { 64, &SKP_Silk_NLSF_MSVQ_CB0_10_Q15[ 10 * 0 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates_Q5[ 0 ] }, - { 16, &SKP_Silk_NLSF_MSVQ_CB0_10_Q15[ 10 * 64 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates_Q5[ 64 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB0_10_Q15[ 10 * 80 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates_Q5[ 80 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB0_10_Q15[ 10 * 88 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates_Q5[ 88 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB0_10_Q15[ 10 * 96 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates_Q5[ 96 ] }, - { 16, &SKP_Silk_NLSF_MSVQ_CB0_10_Q15[ 10 * 104 ], &SKP_Silk_NLSF_MSVQ_CB0_10_rates_Q5[ 104 ] } -}; - -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, - SKP_Silk_NLSF_MSVQ_CB0_10_CDF_start_ptr, - SKP_Silk_NLSF_MSVQ_CB0_10_CDF_middle_idx -}; diff --git a/libs/silk/src/SKP_Silk_tables_NLSF_CB0_10.h b/libs/silk/src/SKP_Silk_tables_NLSF_CB0_10.h deleted file mode 100644 index 8455e33bec..0000000000 --- a/libs/silk/src/SKP_Silk_tables_NLSF_CB0_10.h +++ /dev/null @@ -1,50 +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_CB0_10_H -#define SKP_SILK_TABLES_NLSF_CB0_10_H - -#include "SKP_Silk_define.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -#define NLSF_MSVQ_CB0_10_STAGES 6 -#define NLSF_MSVQ_CB0_10_VECTORS 120 - -/* NLSF codebook entropy coding tables */ -extern const SKP_uint16 SKP_Silk_NLSF_MSVQ_CB0_10_CDF[ NLSF_MSVQ_CB0_10_VECTORS + NLSF_MSVQ_CB0_10_STAGES ]; -extern const SKP_uint16 * const SKP_Silk_NLSF_MSVQ_CB0_10_CDF_start_ptr[ NLSF_MSVQ_CB0_10_STAGES ]; -extern const SKP_int SKP_Silk_NLSF_MSVQ_CB0_10_CDF_middle_idx[ NLSF_MSVQ_CB0_10_STAGES ]; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libs/silk/src/SKP_Silk_tables_NLSF_CB0_16.c b/libs/silk/src/SKP_Silk_tables_NLSF_CB0_16.c deleted file mode 100644 index d7423719e3..0000000000 --- a/libs/silk/src/SKP_Silk_tables_NLSF_CB0_16.c +++ /dev/null @@ -1,1319 +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.51 + 7.38 kB */ -/**********************************************/ - -#include "SKP_Silk_structs.h" -#include "SKP_Silk_tables_NLSF_CB0_16.h" -#include "SKP_Silk_tables.h" - -const SKP_uint16 SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ NLSF_MSVQ_CB0_16_VECTORS + NLSF_MSVQ_CB0_16_STAGES ] = -{ - 0, - 1449, - 2749, - 4022, - 5267, - 6434, - 7600, - 8647, - 9695, - 10742, - 11681, - 12601, - 13444, - 14251, - 15008, - 15764, - 16521, - 17261, - 18002, - 18710, - 19419, - 20128, - 20837, - 21531, - 22225, - 22919, - 23598, - 24277, - 24956, - 25620, - 26256, - 26865, - 27475, - 28071, - 28667, - 29263, - 29859, - 30443, - 31026, - 31597, - 32168, - 32727, - 33273, - 33808, - 34332, - 34855, - 35379, - 35902, - 36415, - 36927, - 37439, - 37941, - 38442, - 38932, - 39423, - 39914, - 40404, - 40884, - 41364, - 41844, - 42324, - 42805, - 43285, - 43754, - 44224, - 44694, - 45164, - 45623, - 46083, - 46543, - 46993, - 47443, - 47892, - 48333, - 48773, - 49213, - 49653, - 50084, - 50515, - 50946, - 51377, - 51798, - 52211, - 52614, - 53018, - 53422, - 53817, - 54212, - 54607, - 55002, - 55388, - 55775, - 56162, - 56548, - 56910, - 57273, - 57635, - 57997, - 58352, - 58698, - 59038, - 59370, - 59702, - 60014, - 60325, - 60630, - 60934, - 61239, - 61537, - 61822, - 62084, - 62346, - 62602, - 62837, - 63072, - 63302, - 63517, - 63732, - 63939, - 64145, - 64342, - 64528, - 64701, - 64867, - 65023, - 65151, - 65279, - 65407, - 65535, - 0, - 5099, - 9982, - 14760, - 19538, - 24213, - 28595, - 32976, - 36994, - 41012, - 44944, - 48791, - 52557, - 56009, - 59388, - 62694, - 65535, - 0, - 9955, - 19697, - 28825, - 36842, - 44686, - 52198, - 58939, - 65535, - 0, - 8949, - 17335, - 25720, - 33926, - 41957, - 49987, - 57845, - 65535, - 0, - 9724, - 18642, - 26998, - 35355, - 43532, - 51534, - 59365, - 65535, - 0, - 8750, - 17499, - 26249, - 34448, - 42471, - 50494, - 58178, - 65535, - 0, - 8730, - 17273, - 25816, - 34176, - 42536, - 50203, - 57869, - 65535, - 0, - 8769, - 17538, - 26307, - 34525, - 42742, - 50784, - 58319, - 65535, - 0, - 8736, - 17101, - 25466, - 33653, - 41839, - 50025, - 57864, - 65535, - 0, - 4368, - 8735, - 12918, - 17100, - 21283, - 25465, - 29558, - 33651, - 37744, - 41836, - 45929, - 50022, - 54027, - 57947, - 61782, - 65535 -}; - -const SKP_uint16 * 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[ 129 ], - &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 146 ], - &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 155 ], - &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 164 ], - &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 173 ], - &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 182 ], - &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 191 ], - &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 200 ], - &SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ 209 ] -}; - -const SKP_int SKP_Silk_NLSF_MSVQ_CB0_16_CDF_middle_idx[ NLSF_MSVQ_CB0_16_STAGES ] = -{ - 42, - 8, - 4, - 5, - 5, - 5, - 5, - 5, - 5, - 9 -}; - -const SKP_int16 SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ NLSF_MSVQ_CB0_16_VECTORS ] = -{ - 176, 181, - 182, 183, - 186, 186, - 191, 191, - 191, 196, - 197, 201, - 203, 206, - 206, 206, - 207, 207, - 209, 209, - 209, 209, - 210, 210, - 210, 211, - 211, 211, - 212, 214, - 216, 216, - 217, 217, - 217, 217, - 218, 218, - 219, 219, - 220, 221, - 222, 223, - 223, 223, - 223, 224, - 224, 224, - 225, 225, - 226, 226, - 226, 226, - 227, 227, - 227, 227, - 227, 227, - 228, 228, - 228, 228, - 229, 229, - 229, 230, - 230, 230, - 231, 231, - 231, 231, - 232, 232, - 232, 232, - 233, 234, - 235, 235, - 235, 236, - 236, 236, - 236, 237, - 237, 237, - 237, 240, - 240, 240, - 240, 241, - 242, 243, - 244, 244, - 247, 247, - 248, 248, - 248, 249, - 251, 255, - 255, 256, - 260, 260, - 261, 264, - 264, 266, - 266, 268, - 271, 274, - 276, 279, - 288, 288, - 288, 288, - 118, 120, - 121, 121, - 122, 125, - 125, 129, - 129, 130, - 131, 132, - 136, 137, - 138, 145, - 87, 88, - 91, 97, - 98, 100, - 105, 106, - 92, 95, - 95, 96, - 97, 97, - 98, 99, - 88, 92, - 95, 95, - 96, 97, - 98, 109, - 93, 93, - 93, 96, - 97, 97, - 99, 101, - 93, 94, - 94, 95, - 95, 99, - 99, 99, - 93, 93, - 93, 96, - 96, 97, - 100, 102, - 93, 95, - 95, 96, - 96, 96, - 98, 99, - 125, 125, - 127, 127, - 127, 127, - 128, 128, - 128, 128, - 128, 128, - 129, 130, - 131, 132 -}; - -const SKP_int SKP_Silk_NLSF_MSVQ_CB0_16_ndelta_min_Q15[ 16 + 1 ] = -{ - 266, - 3, - 40, - 3, - 3, - 16, - 78, - 89, - 107, - 141, - 188, - 146, - 272, - 240, - 235, - 215, - 632 -}; - -const SKP_int16 SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * NLSF_MSVQ_CB0_16_VECTORS ] = -{ - 1170, 2278, 3658, 5374, - 7666, 9113, 11298, 13304, - 15371, 17549, 19587, 21487, - 23798, 26038, 28318, 30201, - 1628, 2334, 4115, 6036, - 7818, 9544, 11777, 14021, - 15787, 17408, 19466, 21261, - 22886, 24565, 26714, 28059, - 1724, 2670, 4056, 6532, - 8357, 10119, 12093, 14061, - 16491, 18795, 20417, 22402, - 24251, 26224, 28410, 29956, - 1493, 3427, 4789, 6399, - 8435, 10168, 12000, 14066, - 16229, 18210, 20040, 22098, - 24153, 26095, 28183, 30121, - 1119, 2089, 4295, 6245, - 8691, 10741, 12688, 15057, - 17028, 18792, 20717, 22514, - 24497, 26548, 28619, 30630, - 1363, 2417, 3927, 5556, - 7422, 9315, 11879, 13767, - 16143, 18520, 20458, 22578, - 24539, 26436, 28318, 30318, - 1122, 2503, 5216, 7148, - 9310, 11078, 13175, 14800, - 16864, 18700, 20436, 22488, - 24572, 26602, 28555, 30426, - 600, 1317, 2970, 5609, - 7694, 9784, 12169, 14087, - 16379, 18378, 20551, 22686, - 24739, 26697, 28646, 30355, - 941, 1882, 4274, 5540, - 8482, 9858, 11940, 14287, - 16091, 18501, 20326, 22612, - 24711, 26638, 28814, 30430, - 635, 1699, 4376, 5948, - 8097, 10115, 12274, 14178, - 16111, 17813, 19695, 21773, - 23927, 25866, 28022, 30134, - 1408, 2222, 3524, 5615, - 7345, 8849, 10989, 12772, - 15352, 17026, 18919, 21062, - 23329, 25215, 27209, 29023, - 701, 1307, 3548, 6301, - 7744, 9574, 11227, 12978, - 15170, 17565, 19775, 22097, - 24230, 26335, 28377, 30231, - 1752, 2364, 4879, 6569, - 7813, 9796, 11199, 14290, - 15795, 18000, 20396, 22417, - 24308, 26124, 28360, 30633, - 901, 1629, 3356, 4635, - 7256, 8767, 9971, 11558, - 15215, 17544, 19523, 21852, - 23900, 25978, 28133, 30184, - 981, 1669, 3323, 4693, - 6213, 8692, 10614, 12956, - 15211, 17711, 19856, 22122, - 24344, 26592, 28723, 30481, - 1607, 2577, 4220, 5512, - 8532, 10388, 11627, 13671, - 15752, 17199, 19840, 21859, - 23494, 25786, 28091, 30131, - 811, 1471, 3144, 5041, - 7430, 9389, 11174, 13255, - 15157, 16741, 19583, 22167, - 24115, 26142, 28383, 30395, - 1543, 2144, 3629, 6347, - 7333, 9339, 10710, 13596, - 15099, 17340, 20102, 21886, - 23732, 25637, 27818, 29917, - 492, 1185, 2940, 5488, - 7095, 8751, 11596, 13579, - 16045, 18015, 20178, 22127, - 24265, 26406, 28484, 30357, - 1547, 2282, 3693, 6341, - 7758, 9607, 11848, 13236, - 16564, 18069, 19759, 21404, - 24110, 26606, 28786, 30655, - 685, 1338, 3409, 5262, - 6950, 9222, 11414, 14523, - 16337, 17893, 19436, 21298, - 23293, 25181, 27973, 30520, - 887, 1581, 3057, 4318, - 7192, 8617, 10047, 13106, - 16265, 17893, 20233, 22350, - 24379, 26384, 28314, 30189, - 2285, 3745, 5662, 7576, - 9323, 11320, 13239, 15191, - 17175, 19225, 21108, 22972, - 24821, 26655, 28561, 30460, - 1496, 2108, 3448, 6898, - 8328, 9656, 11252, 12823, - 14979, 16482, 18180, 20085, - 22962, 25160, 27705, 29629, - 575, 1261, 3861, 6627, - 8294, 10809, 12705, 14768, - 17076, 19047, 20978, 23055, - 24972, 26703, 28720, 30345, - 1682, 2213, 3882, 6238, - 7208, 9646, 10877, 13431, - 14805, 16213, 17941, 20873, - 23550, 25765, 27756, 29461, - 888, 1616, 3924, 5195, - 7206, 8647, 9842, 11473, - 16067, 18221, 20343, 22774, - 24503, 26412, 28054, 29731, - 805, 1454, 2683, 4472, - 7936, 9360, 11398, 14345, - 16205, 17832, 19453, 21646, - 23899, 25928, 28387, 30463, - 1640, 2383, 3484, 5082, - 6032, 8606, 11640, 12966, - 15842, 17368, 19346, 21182, - 23638, 25889, 28368, 30299, - 1632, 2204, 4510, 7580, - 8718, 10512, 11962, 14096, - 15640, 17194, 19143, 22247, - 24563, 26561, 28604, 30509, - 2043, 2612, 3985, 6851, - 8038, 9514, 10979, 12789, - 15426, 16728, 18899, 20277, - 22902, 26209, 28711, 30618, - 2224, 2798, 4465, 5320, - 7108, 9436, 10986, 13222, - 14599, 18317, 20141, 21843, - 23601, 25700, 28184, 30582, - 835, 1541, 4083, 5769, - 7386, 9399, 10971, 12456, - 15021, 18642, 20843, 23100, - 25292, 26966, 28952, 30422, - 1795, 2343, 4809, 5896, - 7178, 8545, 10223, 13370, - 14606, 16469, 18273, 20736, - 23645, 26257, 28224, 30390, - 1734, 2254, 4031, 5188, - 6506, 7872, 9651, 13025, - 14419, 17305, 19495, 22190, - 24403, 26302, 28195, 30177, - 1841, 2349, 3968, 4764, - 6376, 9825, 11048, 13345, - 14682, 16252, 18183, 21363, - 23918, 26156, 28031, 29935, - 1432, 2047, 5631, 6927, - 8198, 9675, 11358, 13506, - 14802, 16419, 18339, 22019, - 24124, 26177, 28130, 30586, - 1730, 2320, 3744, 4808, - 6007, 9666, 10997, 13622, - 15234, 17495, 20088, 22002, - 23603, 25400, 27379, 29254, - 1267, 1915, 5483, 6812, - 8229, 9919, 11589, 13337, - 14747, 17965, 20552, 22167, - 24519, 26819, 28883, 30642, - 1526, 2229, 4240, 7388, - 8953, 10450, 11899, 13718, - 16861, 18323, 20379, 22672, - 24797, 26906, 28906, 30622, - 2175, 2791, 4104, 6875, - 8612, 9798, 12152, 13536, - 15623, 17682, 19213, 21060, - 24382, 26760, 28633, 30248, - 454, 1231, 4339, 5738, - 7550, 9006, 10320, 13525, - 16005, 17849, 20071, 21992, - 23949, 26043, 28245, 30175, - 2250, 2791, 4230, 5283, - 6762, 10607, 11879, 13821, - 15797, 17264, 20029, 22266, - 24588, 26437, 28244, 30419, - 1696, 2216, 4308, 8385, - 9766, 11030, 12556, 14099, - 16322, 17640, 19166, 20590, - 23967, 26858, 28798, 30562, - 2452, 3236, 4369, 6118, - 7156, 9003, 11509, 12796, - 15749, 17291, 19491, 22241, - 24530, 26474, 28273, 30073, - 1811, 2541, 3555, 5480, - 9123, 10527, 11894, 13659, - 15262, 16899, 19366, 21069, - 22694, 24314, 27256, 29983, - 1553, 2246, 4559, 5500, - 6754, 7874, 11739, 13571, - 15188, 17879, 20281, 22510, - 24614, 26649, 28786, 30755, - 1982, 2768, 3834, 5964, - 8732, 9908, 11797, 14813, - 16311, 17946, 21097, 22851, - 24456, 26304, 28166, 29755, - 1824, 2529, 3817, 5449, - 6854, 8714, 10381, 12286, - 14194, 15774, 19524, 21374, - 23695, 26069, 28096, 30212, - 2212, 2854, 3947, 5898, - 9930, 11556, 12854, 14788, - 16328, 17700, 20321, 22098, - 23672, 25291, 26976, 28586, - 2023, 2599, 4024, 4916, - 6613, 11149, 12457, 14626, - 16320, 17822, 19673, 21172, - 23115, 26051, 28825, 30758, - 1628, 2206, 3467, 4364, - 8679, 10173, 11864, 13679, - 14998, 16938, 19207, 21364, - 23850, 26115, 28124, 30273, - 2014, 2603, 4114, 7254, - 8516, 10043, 11822, 13503, - 16329, 17826, 19697, 21280, - 23151, 24661, 26807, 30161, - 2376, 2980, 4422, 5770, - 7016, 9723, 11125, 13516, - 15485, 16985, 19160, 20587, - 24401, 27180, 29046, 30647, - 2454, 3502, 4624, 6019, - 7632, 8849, 10792, 13964, - 15523, 17085, 19611, 21238, - 22856, 25108, 28106, 29890, - 1573, 2274, 3308, 5999, - 8977, 10104, 12457, 14258, - 15749, 18180, 19974, 21253, - 23045, 25058, 27741, 30315, - 1943, 2730, 4140, 6160, - 7491, 8986, 11309, 12775, - 14820, 16558, 17909, 19757, - 21512, 23605, 27274, 29527, - 2021, 2582, 4494, 5835, - 6993, 8245, 9827, 14733, - 16462, 17894, 19647, 21083, - 23764, 26667, 29072, 30990, - 1052, 1775, 3218, 4378, - 7666, 9403, 11248, 13327, - 14972, 17962, 20758, 22354, - 25071, 27209, 29001, 30609, - 2218, 2866, 4223, 5352, - 6581, 9980, 11587, 13121, - 15193, 16583, 18386, 20080, - 22013, 25317, 28127, 29880, - 2146, 2840, 4397, 5840, - 7449, 8721, 10512, 11936, - 13595, 17253, 19310, 20891, - 23417, 25627, 27749, 30231, - 1972, 2619, 3756, 6367, - 7641, 8814, 12286, 13768, - 15309, 18036, 19557, 20904, - 22582, 24876, 27800, 30440, - 2005, 2577, 4272, 7373, - 8558, 10223, 11770, 13402, - 16502, 18000, 19645, 21104, - 22990, 26806, 29505, 30942, - 1153, 1822, 3724, 5443, - 6990, 8702, 10289, 11899, - 13856, 15315, 17601, 21064, - 23692, 26083, 28586, 30639, - 1304, 1869, 3318, 7195, - 9613, 10733, 12393, 13728, - 15822, 17474, 18882, 20692, - 23114, 25540, 27684, 29244, - 2093, 2691, 4018, 6658, - 7947, 9147, 10497, 11881, - 15888, 17821, 19333, 21233, - 23371, 25234, 27553, 29998, - 575, 1331, 5304, 6910, - 8425, 10086, 11577, 13498, - 16444, 18527, 20565, 22847, - 24914, 26692, 28759, 30157, - 1435, 2024, 3283, 4156, - 7611, 10592, 12049, 13927, - 15459, 18413, 20495, 22270, - 24222, 26093, 28065, 30099, - 1632, 2168, 5540, 7478, - 8630, 10391, 11644, 14321, - 15741, 17357, 18756, 20434, - 22799, 26060, 28542, 30696, - 1407, 2245, 3405, 5639, - 9419, 10685, 12104, 13495, - 15535, 18357, 19996, 21689, - 24351, 26550, 28853, 30564, - 1675, 2226, 4005, 8223, - 9975, 11155, 12822, 14316, - 16504, 18137, 19574, 21050, - 22759, 24912, 28296, 30634, - 1080, 1614, 3622, 7565, - 8748, 10303, 11713, 13848, - 15633, 17434, 19761, 21825, - 23571, 25393, 27406, 29063, - 1693, 2229, 3456, 4354, - 5670, 10890, 12563, 14167, - 15879, 17377, 19817, 21971, - 24094, 26131, 28298, 30099, - 2042, 2959, 4195, 5740, - 7106, 8267, 11126, 14973, - 16914, 18295, 20532, 21982, - 23711, 25769, 27609, 29351, - 984, 1612, 3808, 5265, - 6885, 8411, 9547, 10889, - 12522, 16520, 19549, 21639, - 23746, 26058, 28310, 30374, - 2036, 2538, 4166, 7761, - 9146, 10412, 12144, 13609, - 15588, 17169, 18559, 20113, - 21820, 24313, 28029, 30612, - 1871, 2355, 4061, 5143, - 7464, 10129, 11941, 15001, - 16680, 18354, 19957, 22279, - 24861, 26872, 28988, 30615, - 2566, 3161, 4643, 6227, - 7406, 9970, 11618, 13416, - 15889, 17364, 19121, 20817, - 22592, 24720, 28733, 31082, - 1700, 2327, 4828, 5939, - 7567, 9154, 11087, 12771, - 14209, 16121, 20222, 22671, - 24648, 26656, 28696, 30745, - 3169, 3873, 5046, 6868, - 8184, 9480, 12335, 14068, - 15774, 17971, 20231, 21711, - 23520, 25245, 27026, 28730, - 1564, 2391, 4229, 6730, - 8905, 10459, 13026, 15033, - 17265, 19809, 21849, 23741, - 25490, 27312, 29061, 30527, - 2864, 3559, 4719, 6441, - 9592, 11055, 12763, 14784, - 16428, 18164, 20486, 22262, - 24183, 26263, 28383, 30224, - 2673, 3449, 4581, 5983, - 6863, 8311, 12464, 13911, - 15738, 17791, 19416, 21182, - 24025, 26561, 28723, 30440, - 2419, 3049, 4274, 6384, - 8564, 9661, 11288, 12676, - 14447, 17578, 19816, 21231, - 23099, 25270, 26899, 28926, - 1278, 2001, 3000, 5353, - 9995, 11777, 13018, 14570, - 16050, 17762, 19982, 21617, - 23371, 25083, 27656, 30172, - 932, 1624, 2798, 4570, - 8592, 9988, 11552, 13050, - 16921, 18677, 20415, 22810, - 24817, 26819, 28804, 30385, - 2324, 2973, 4156, 5702, - 6919, 8806, 10259, 12503, - 15015, 16567, 19418, 21375, - 22943, 24550, 27024, 29849, - 1564, 2373, 3455, 4907, - 5975, 7436, 11786, 14505, - 16107, 18148, 20019, 21653, - 23740, 25814, 28578, 30372, - 3025, 3729, 4866, 6520, - 9487, 10943, 12358, 14258, - 16174, 17501, 19476, 21408, - 23227, 24906, 27347, 29407, - 1270, 1965, 6802, 7995, - 9204, 10828, 12507, 14230, - 15759, 17860, 20369, 22502, - 24633, 26514, 28535, 30525, - 2210, 2749, 4266, 7487, - 9878, 11018, 12823, 14431, - 16247, 18626, 20450, 22054, - 23739, 25291, 27074, 29169, - 1275, 1926, 4330, 6573, - 8441, 10920, 13260, 15008, - 16927, 18573, 20644, 22217, - 23983, 25474, 27372, 28645, - 3015, 3670, 5086, 6372, - 7888, 9309, 10966, 12642, - 14495, 16172, 18080, 19972, - 22454, 24899, 27362, 29975, - 2882, 3733, 5113, 6482, - 8125, 9685, 11598, 13288, - 15405, 17192, 20178, 22426, - 24801, 27014, 29212, 30811, - 2300, 2968, 4101, 5442, - 6327, 7910, 12455, 13862, - 15747, 17505, 19053, 20679, - 22615, 24658, 27499, 30065, - 2257, 2940, 4430, 5991, - 7042, 8364, 9414, 11224, - 15723, 17420, 19253, 21469, - 23915, 26053, 28430, 30384, - 1227, 2045, 3818, 5011, - 6990, 9231, 11024, 13011, - 17341, 19017, 20583, 22799, - 25195, 26876, 29351, 30805, - 1354, 1924, 3789, 8077, - 10453, 11639, 13352, 14817, - 16743, 18189, 20095, 22014, - 24593, 26677, 28647, 30256, - 3142, 4049, 6197, 7417, - 8753, 10156, 11533, 13181, - 15947, 17655, 19606, 21402, - 23487, 25659, 28123, 30304, - 1317, 2263, 4725, 7611, - 9667, 11634, 14143, 16258, - 18724, 20698, 22379, 24007, - 25775, 27251, 28930, 30593, - 1570, 2323, 3818, 6215, - 9893, 11556, 13070, 14631, - 16152, 18290, 21386, 23346, - 25114, 26923, 28712, 30168, - 2297, 3905, 6287, 8558, - 10668, 12766, 15019, 17102, - 19036, 20677, 22341, 23871, - 25478, 27085, 28851, 30520, - 1915, 2507, 4033, 5749, - 7059, 8871, 10659, 12198, - 13937, 15383, 16869, 18707, - 23175, 25818, 28514, 30501, - 2404, 2918, 5190, 6252, - 7426, 9887, 12387, 14795, - 16754, 18368, 20338, 22003, - 24236, 26456, 28490, 30397, - 1621, 2227, 3479, 5085, - 9425, 12892, 14246, 15652, - 17205, 18674, 20446, 22209, - 23778, 25867, 27931, 30093, - 1869, 2390, 4105, 7021, - 11221, 12775, 14059, 15590, - 17024, 18608, 20595, 22075, - 23649, 25154, 26914, 28671, - 2551, 3252, 4688, 6562, - 7869, 9125, 10475, 11800, - 15402, 18780, 20992, 22555, - 24289, 25968, 27465, 29232, - 2705, 3493, 4735, 6360, - 7905, 9352, 11538, 13430, - 15239, 16919, 18619, 20094, - 21800, 23342, 25200, 29257, - 2166, 2791, 4011, 5081, - 5896, 9038, 13407, 14703, - 16543, 18189, 19896, 21857, - 24872, 26971, 28955, 30514, - 1865, 3021, 4696, 6534, - 8343, 9914, 12789, 14103, - 16533, 17729, 21340, 22439, - 24873, 26330, 28428, 30154, - 3369, 4345, 6573, 8763, - 10309, 11713, 13367, 14784, - 16483, 18145, 19839, 21247, - 23292, 25477, 27555, 29447, - 1265, 2184, 5443, 7893, - 10591, 13139, 15105, 16639, - 18402, 19826, 21419, 22995, - 24719, 26437, 28363, 30125, - 1584, 2004, 3535, 4450, - 8662, 10764, 12832, 14978, - 16972, 18794, 20932, 22547, - 24636, 26521, 28701, 30567, - 3419, 4528, 6602, 7890, - 9508, 10875, 12771, 14357, - 16051, 18330, 20630, 22490, - 25070, 26936, 28946, 30542, - 1726, 2252, 4597, 6950, - 8379, 9823, 11363, 12794, - 14306, 15476, 16798, 18018, - 21671, 25550, 28148, 30367, - 3385, 3870, 5307, 6388, - 7141, 8684, 12695, 14939, - 16480, 18277, 20537, 22048, - 23947, 25965, 28214, 29956, - 2771, 3306, 4450, 5560, - 6453, 9493, 13548, 14754, - 16743, 18447, 20028, 21736, - 23746, 25353, 27141, 29066, - 3028, 3900, 6617, 7893, - 9211, 10480, 12047, 13583, - 15182, 16662, 18502, 20092, - 22190, 24358, 26302, 28957, - 2000, 2550, 4067, 6837, - 9628, 11002, 12594, 14098, - 15589, 17195, 18679, 20099, - 21530, 23085, 24641, 29022, - 2844, 3302, 5103, 6107, - 6911, 8598, 12416, 14054, - 16026, 18567, 20672, 22270, - 23952, 25771, 27658, 30026, - 4043, 5150, 7268, 9056, - 10916, 12638, 14543, 16184, - 17948, 19691, 21357, 22981, - 24825, 26591, 28479, 30233, - 2109, 2625, 4320, 5525, - 7454, 10220, 12980, 14698, - 17627, 19263, 20485, 22381, - 24279, 25777, 27847, 30458, - 1550, 2667, 6473, 9496, - 10985, 12352, 13795, 15233, - 17099, 18642, 20461, 22116, - 24197, 26291, 28403, 30132, - 2411, 3084, 4145, 5394, - 6367, 8154, 13125, 16049, - 17561, 19125, 21258, 22762, - 24459, 26317, 28255, 29702, - 4159, 4516, 5956, 7635, - 8254, 8980, 11208, 14133, - 16210, 17875, 20196, 21864, - 23840, 25747, 28058, 30012, - 2026, 2431, 2845, 3618, - 7950, 9802, 12721, 14460, - 16576, 18984, 21376, 23319, - 24961, 26718, 28971, 30640, - 3429, 3833, 4472, 4912, - 7723, 10386, 12981, 15322, - 16699, 18807, 20778, 22551, - 24627, 26494, 28334, 30482, - 4740, 5169, 5796, 6485, - 6998, 8830, 11777, 14414, - 16831, 18413, 20789, 22369, - 24236, 25835, 27807, 30021, - 150, 168, -17, -107, - -142, -229, -320, -406, - -503, -620, -867, -935, - -902, -680, -398, -114, - -398, -355, 49, 255, - 114, 260, 399, 264, - 317, 431, 514, 531, - 435, 356, 238, 106, - -43, -36, -169, -224, - -391, -633, -776, -970, - -844, -455, -181, -12, - 85, 85, 164, 195, - 122, 85, -158, -640, - -903, 9, 7, -124, - 149, 32, 220, 369, - 242, 115, 79, 84, - -146, -216, -70, 1024, - 751, 574, 440, 377, - 352, 203, 30, 16, - -3, 81, 161, 100, - -148, -176, 933, 750, - 404, 171, -2, -146, - -411, -442, -541, -552, - -442, -269, -240, -52, - 603, 635, 405, 178, - 215, 19, -153, -167, - -290, -219, 151, 271, - 151, 119, 303, 266, - 100, 69, -293, -657, - 939, 659, 442, 351, - 132, 98, -16, -1, - -135, -200, -223, -89, - 167, 154, 172, 237, - -45, -183, -228, -486, - 263, 608, 158, -125, - -390, -227, -118, 43, - -457, -392, -769, -840, - 20, -117, -194, -189, - -173, -173, -33, 32, - 174, 144, 115, 167, - 57, 44, 14, 147, - 96, -54, -142, -129, - -254, -331, 304, 310, - -52, -419, -846, -1060, - -88, -123, -202, -343, - -554, -961, -951, 327, - 159, 81, 255, 227, - 120, 203, 256, 192, - 164, 224, 290, 195, - 216, 209, 128, 832, - 1028, 889, 698, 504, - 408, 355, 218, 32, - -115, -84, -276, -100, - -312, -484, 899, 682, - 465, 456, 241, -12, - -275, -425, -461, -367, - -33, -28, -102, -194, - -527, 863, 906, 463, - 245, 13, -212, -305, - -105, 163, 279, 176, - 93, 67, 115, 192, - 61, -50, -132, -175, - -224, -271, -629, -252, - 1158, 972, 638, 280, - 300, 326, 143, -152, - -214, -287, 53, -42, - -236, -352, -423, -248, - -129, -163, -178, -119, - 85, 57, 514, 382, - 374, 402, 424, 423, - 271, 197, 97, 40, - 39, -97, -191, -164, - -230, -256, -410, 396, - 327, 127, 10, -119, - -167, -291, -274, -141, - -99, -226, -218, -139, - -224, -209, -268, -442, - -413, 222, 58, 521, - 344, 258, 76, -42, - -142, -165, -123, -92, - 47, 8, -3, -191, - -11, -164, -167, -351, - -740, 311, 538, 291, - 184, 29, -105, 9, - -30, -54, -17, -77, - -271, -412, -622, -648, - 476, 186, -66, -197, - -73, -94, -15, 47, - 28, 112, -58, -33, - 65, 19, 84, 86, - 276, 114, 472, 786, - 799, 625, 415, 178, - -35, -26, 5, 9, - 83, 39, 37, 39, - -184, -374, -265, -362, - -501, 337, 716, 478, - -60, -125, -163, 362, - 17, -122, -233, 279, - 138, 157, 318, 193, - 189, 209, 266, 252, - -46, -56, -277, -429, - 464, 386, 142, 44, - -43, 66, 264, 182, - 47, 14, -26, -79, - 49, 15, -128, -203, - -400, -478, 325, 27, - 234, 411, 205, 129, - 12, 58, 123, 57, - 171, 137, 96, 128, - -32, 134, -12, 57, - 119, 26, -22, -165, - -500, -701, -528, -116, - 64, -8, 97, -9, - -162, -66, -156, -194, - -303, -546, -341, 546, - 358, 95, 45, 76, - 270, 403, 205, 100, - 123, 50, -53, -144, - -110, -13, 32, -228, - -130, 353, 296, 56, - -372, -253, 365, 73, - 10, -34, -139, -191, - -96, 5, 44, -85, - -179, -129, -192, -246, - -85, -110, -155, -44, - -27, 145, 138, 79, - 32, -148, -577, -634, - 191, 94, -9, -35, - -77, -84, -56, -171, - -298, -271, -243, -156, - -328, -235, -76, -128, - -121, 129, 13, -22, - 32, 45, -248, -65, - 193, -81, 299, 57, - -147, 192, -165, -354, - -334, -106, -156, -40, - -3, -68, 124, -257, - 78, 124, 170, 412, - 227, 105, -104, 12, - 154, 250, 274, 258, - 4, -27, 235, 152, - 51, 338, 300, 7, - -314, -411, 215, 170, - -9, -93, -77, 76, - 67, 54, 200, 315, - 163, 72, -91, -402, - 158, 187, -156, -91, - 290, 267, 167, 91, - 140, 171, 112, 9, - -42, -177, -440, 385, - 80, 15, 172, 129, - 41, -129, -372, -24, - -75, -30, -170, 10, - -118, 57, 78, -101, - 232, 161, 123, 256, - 277, 101, -192, -629, - -100, -60, -232, 66, - 13, -13, -80, -239, - 239, 37, 32, 89, - -319, -579, 450, 360, - 3, -29, -299, -89, - -54, -110, -246, -164, - 6, -188, 338, 176, - -92, 197, 137, 134, - 12, -2, 56, -183, - 114, -36, -131, -204, - 75, -25, -174, 191, - -15, -290, -429, -267, - 79, 37, 106, 23, - -384, 425, 70, -14, - 212, 105, 15, -2, - -42, -37, -123, 108, - 28, -48, 193, 197, - 173, -33, 37, 73, - -57, 256, 137, -58, - -430, -228, 217, -51, - -10, -58, -6, 22, - 104, 61, -119, 169, - 144, 16, -46, -394, - 60, 454, -80, -298, - -65, 25, 0, -24, - -65, -417, 465, 276, - -3, -194, -13, 130, - 19, -6, -21, -24, - -180, -53, -85, 20, - 118, 147, 113, -75, - -289, 226, -122, 227, - 270, 125, 109, 197, - 125, 138, 44, 60, - 25, -55, -167, -32, - -139, -193, -173, -316, - 287, -208, 253, 239, - 27, -80, -188, -28, - -182, -235, 156, -117, - 128, -48, -58, -226, - 172, 181, 167, 19, - 62, 10, 2, 181, - 151, 108, -16, -11, - -78, -331, 411, 133, - 17, 104, 64, -184, - 24, -30, -3, -283, - 121, 204, -8, -199, - -21, -80, -169, -157, - -191, -136, 81, 155, - 14, -131, 244, 74, - -57, -47, -280, 347, - 111, -77, -128, -142, - -194, -125, -6, -68, - 91, 1, 23, 14, - -154, -34, 23, -38, - -343, 503, 146, -38, - -46, -41, 58, 31, - 63, -48, -117, 45, - 28, 1, -89, -5, - -44, -29, -448, 487, - 204, 81, 46, -106, - -302, 380, 120, -38, - -12, -39, 70, -3, - 25, -65, 30, -11, - 34, -15, 22, -115, - 0, -79, -83, 45, - 114, 43, 150, 36, - 233, 149, 195, 5, - 25, -52, -475, 274, - 28, -39, -8, -66, - -255, 258, 56, 143, - -45, -190, 165, -60, - 20, 2, 125, -129, - 51, -8, -335, 288, - 38, 59, 25, -42, - 23, -118, -112, 11, - -55, -133, -109, 24, - -105, 78, -64, -245, - 202, -65, -127, 162, - 40, -94, 89, -85, - -119, -103, 97, 9, - -70, -28, 194, 86, - -112, -92, -114, 74, - -49, 46, -84, -178, - 113, 52, -205, 333, - 88, 222, 56, -55, - 13, 86, 4, -77, - 224, 114, -105, 112, - 125, -29, -18, -144, - 22, -58, -99, 28, - 114, -66, -32, -169, - -314, 285, 72, -74, - 179, 28, -79, -182, - 13, -55, 147, 13, - 12, -54, 31, -84, - -17, -75, -228, 83, - -375, 436, 110, -63, - -27, -136, 169, -56, - -8, -171, 184, -42, - 148, 68, 204, 235, - 110, -229, 91, 171, - -43, -3, -26, -99, - -111, 71, -170, 202, - -67, 181, -37, 109, - -120, 3, -55, -260, - -16, 152, 91, 142, - 42, 44, 134, 47, - 17, -35, 22, 79, - -169, 41, 46, 277, - -93, -49, -126, 37, - -103, -34, -22, -90, - -134, -205, 92, -9, - 1, -195, -239, 45, - 54, 18, -23, -1, - -80, -98, -20, -261, - 306, 72, 20, -89, - -217, 11, 6, -82, - 89, 13, -129, -89, - 83, -71, -55, 130, - -98, -146, -27, -57, - 53, 275, 17, 170, - -5, -54, 132, -64, - 72, 160, -125, -168, - 72, 40, 170, 78, - 248, 116, 20, 84, - 31, -34, 190, 38, - 13, -106, 225, 27, - -168, 24, -157, -122, - 165, 11, -161, -213, - -12, -51, -101, 42, - 101, 27, 55, 111, - 75, 71, -96, -1, - 65, -277, 393, -26, - -44, -68, -84, -66, - -95, 235, 179, -25, - -41, 27, -91, -128, - -222, 146, -72, -30, - -24, 55, -126, -68, - -58, -127, 13, -97, - -106, 174, -100, 155, - 101, -146, -21, 261, - 22, 38, -66, 65, - 4, 70, 64, 144, - 59, 213, 71, -337, - 303, -52, 51, -56, - 1, 10, -15, -5, - 34, 52, 228, 131, - 161, -127, -214, 238, - 123, 64, -147, -50, - -34, -127, 204, 162, - 85, 41, 5, -140, - 73, -150, 56, -96, - -66, -20, 2, -235, - 59, -22, -107, 150, - -16, -47, -4, 81, - -67, 167, 149, 149, - -157, 288, -156, -27, - -8, 18, 83, -24, - -41, -167, 158, -100, - 93, 53, 201, 15, - 42, 266, 278, -12, - -6, -37, 85, 6, - 20, -188, -271, 107, - -13, -80, 51, 202, - 173, -69, 78, -188, - 46, 4, 153, 12, - -138, 169, 5, -58, - -123, -108, -243, 150, - 10, -191, 246, -15, - 38, 25, -10, 14, - 61, 50, -206, -215, - -220, 90, 5, -149, - -219, 56, 142, 24, - -376, 77, -80, 75, - 6, 42, -101, 16, - 56, 14, -57, 3, - -17, 80, 57, -36, - 88, -59, -97, -19, - -148, 46, -219, 226, - 114, -4, -72, -15, - 37, -49, -28, 247, - 44, 123, 47, -122, - -38, 17, 4, -113, - -32, -224, 154, -134, - 196, 71, -267, -85, - 28, -70, 89, -120, - 99, -2, 64, 76, - -166, -48, 189, -35, - -92, -169, -123, 339, - 38, -25, 38, -35, - 225, -139, -50, -63, - 246, 60, -185, -109, - -49, -53, -167, 51, - 149, 60, -101, -33, - 25, -76, 120, 32, - -30, -83, 102, 91, - -186, -261, 131, -197 -}; - -const SKP_Silk_NLSF_CBS SKP_Silk_NLSF_CB0_16_Stage_info[ NLSF_MSVQ_CB0_16_STAGES ] = -{ - { 128, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 0 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 0 ] }, - { 16, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 128 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 128 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 144 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 144 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 152 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 152 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 160 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 160 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 168 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 168 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 176 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 176 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 184 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 184 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 192 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 192 ] }, - { 16, &SKP_Silk_NLSF_MSVQ_CB0_16_Q15[ 16 * 200 ], &SKP_Silk_NLSF_MSVQ_CB0_16_rates_Q5[ 200 ] } -}; - -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, - SKP_Silk_NLSF_MSVQ_CB0_16_CDF_start_ptr, - SKP_Silk_NLSF_MSVQ_CB0_16_CDF_middle_idx -}; diff --git a/libs/silk/src/SKP_Silk_tables_NLSF_CB0_16.h b/libs/silk/src/SKP_Silk_tables_NLSF_CB0_16.h deleted file mode 100644 index a4114e0982..0000000000 --- a/libs/silk/src/SKP_Silk_tables_NLSF_CB0_16.h +++ /dev/null @@ -1,50 +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_CB0_16_H -#define SKP_SILK_TABLES_NLSF_CB0_16_H - -#include "SKP_Silk_define.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -#define NLSF_MSVQ_CB0_16_STAGES 10 -#define NLSF_MSVQ_CB0_16_VECTORS 216 - -/* NLSF codebook entropy coding tables */ -extern const SKP_uint16 SKP_Silk_NLSF_MSVQ_CB0_16_CDF[ NLSF_MSVQ_CB0_16_VECTORS + NLSF_MSVQ_CB0_16_STAGES ]; -extern const SKP_uint16 * const SKP_Silk_NLSF_MSVQ_CB0_16_CDF_start_ptr[ NLSF_MSVQ_CB0_16_STAGES ]; -extern const SKP_int SKP_Silk_NLSF_MSVQ_CB0_16_CDF_middle_idx[ NLSF_MSVQ_CB0_16_STAGES ]; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libs/silk/src/SKP_Silk_tables_NLSF_CB1_10.c b/libs/silk/src/SKP_Silk_tables_NLSF_CB1_10.c deleted file mode 100644 index dc84073eee..0000000000 --- a/libs/silk/src/SKP_Silk_tables_NLSF_CB1_10.c +++ /dev/null @@ -1,577 +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 + 1.61 kB */ -/**********************************************/ - -#include "SKP_Silk_structs.h" -#include "SKP_Silk_tables_NLSF_CB1_10.h" -#include "SKP_Silk_tables.h" - -const SKP_uint16 SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ NLSF_MSVQ_CB1_10_VECTORS + NLSF_MSVQ_CB1_10_STAGES ] = -{ - 0, - 17096, - 24130, - 28997, - 33179, - 36696, - 40213, - 42493, - 44252, - 45973, - 47551, - 49095, - 50542, - 51898, - 53196, - 54495, - 55685, - 56851, - 57749, - 58628, - 59435, - 60207, - 60741, - 61220, - 61700, - 62179, - 62659, - 63138, - 63617, - 64097, - 64576, - 65056, - 65535, - 0, - 20378, - 33032, - 40395, - 46721, - 51707, - 56585, - 61157, - 65535, - 0, - 15055, - 25472, - 35447, - 42501, - 48969, - 54773, - 60212, - 65535, - 0, - 12069, - 22440, - 32812, - 40145, - 46870, - 53595, - 59630, - 65535, - 0, - 10839, - 19954, - 27957, - 35961, - 43965, - 51465, - 58805, - 65535, - 0, - 8933, - 17674, - 26415, - 34785, - 42977, - 50820, - 58496, - 65535 -}; - -const SKP_uint16 * 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[ 33 ], - &SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ 42 ], - &SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ 51 ], - &SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ 60 ], - &SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ 69 ] -}; - -const SKP_int SKP_Silk_NLSF_MSVQ_CB1_10_CDF_middle_idx[ NLSF_MSVQ_CB1_10_STAGES ] = -{ - 5, - 3, - 4, - 4, - 5, - 5 -}; - -const SKP_int16 SKP_Silk_NLSF_MSVQ_CB1_10_rates_Q5[ NLSF_MSVQ_CB1_10_VECTORS ] = -{ - 62, 103, - 120, 127, - 135, 135, - 155, 167, - 168, 172, - 173, 176, - 179, 181, - 181, 185, - 186, 198, - 199, 203, - 205, 222, - 227, 227, - 227, 227, - 227, 227, - 227, 227, - 227, 227, - 54, 76, - 101, 108, - 119, 120, - 123, 125, - 68, 85, - 87, 103, - 107, 112, - 115, 116, - 78, 85, - 85, 101, - 105, 105, - 110, 111, - 83, 91, - 97, 97, - 97, 100, - 101, 105, - 92, 93, - 93, 95, - 96, 98, - 99, 103 -}; - -const SKP_int SKP_Silk_NLSF_MSVQ_CB1_10_ndelta_min_Q15[ 10 + 1 ] = -{ - 462, - 3, - 64, - 74, - 98, - 50, - 97, - 68, - 120, - 53, - 639 -}; - -const SKP_int16 SKP_Silk_NLSF_MSVQ_CB1_10_Q15[ 10 * NLSF_MSVQ_CB1_10_VECTORS ] = -{ - 1877, 4646, - 7712, 10745, - 13964, 17028, - 20239, 23182, - 26471, 29287, - 1612, 3278, - 7086, 9975, - 13228, 16264, - 19596, 22690, - 26037, 28965, - 2169, 3830, - 6460, 8958, - 11960, 14750, - 18408, 21659, - 25018, 28043, - 3680, 6024, - 8986, 12256, - 15201, 18188, - 21741, 24460, - 27484, 30059, - 2584, 5187, - 7799, 10902, - 13179, 15765, - 19017, 22431, - 25891, 28698, - 3731, 5751, - 8650, 11742, - 15090, 17407, - 20391, 23421, - 26228, 29247, - 2107, 6323, - 8915, 12226, - 14775, 17791, - 20664, 23679, - 26829, 29353, - 1677, 2870, - 5386, 8077, - 11817, 15176, - 18657, 22006, - 25513, 28689, - 2111, 3625, - 7027, 10588, - 14059, 17193, - 21137, 24260, - 27577, 30036, - 2428, 4010, - 5765, 9376, - 13805, 15821, - 19444, 22389, - 25295, 29310, - 2256, 4628, - 8377, 12441, - 15283, 19462, - 22257, 25551, - 28432, 30304, - 2352, 3675, - 6129, 11868, - 14551, 16655, - 19624, 21883, - 26526, 28849, - 5243, 7248, - 10558, 13269, - 15651, 17919, - 21141, 23827, - 27102, 29519, - 4422, 6725, - 10449, 13273, - 16124, 19921, - 22826, 26061, - 28763, 30583, - 4508, 6291, - 9504, 11809, - 13827, 15950, - 19077, 22084, - 25740, 28658, - 2540, 4297, - 8579, 13578, - 16634, 19101, - 21547, 23887, - 26777, 29146, - 3377, 6358, - 10224, 14518, - 17905, 21056, - 23637, 25784, - 28161, 30109, - 4177, 5942, - 8159, 10108, - 12130, 15470, - 20191, 23326, - 26782, 29359, - 2492, 3801, - 6144, 9825, - 16000, 18671, - 20893, 23663, - 25899, 28974, - 3011, 4727, - 6834, 10505, - 12465, 14496, - 17065, 20052, - 25265, 28057, - 4149, 7197, - 12338, 15076, - 18002, 20190, - 22187, 24723, - 27083, 29125, - 2975, 4578, - 6448, 8378, - 9671, 13225, - 19502, 22277, - 26058, 28850, - 4102, 5760, - 7744, 9484, - 10744, 12308, - 14677, 19607, - 24841, 28381, - 4931, 9287, - 12477, 13395, - 13712, 14351, - 16048, 19867, - 24188, 28994, - 4141, 7867, - 13140, 17720, - 20064, 21108, - 21692, 22722, - 23736, 27449, - 4011, 8720, - 13234, 16206, - 17601, 18289, - 18524, 19689, - 23234, 27882, - 3420, 5995, - 11230, 15117, - 15907, 16783, - 17762, 23347, - 26898, 29946, - 3080, 6786, - 10465, 13676, - 18059, 23615, - 27058, 29082, - 29563, 29905, - 3038, 5620, - 9266, 12870, - 18803, 19610, - 20010, 20802, - 23882, 29306, - 3314, 6420, - 9046, 13262, - 15869, 23117, - 23667, 24215, - 24487, 25915, - 3469, 6963, - 10103, 15282, - 20531, 23240, - 25024, 26021, - 26736, 27255, - 3041, 6459, - 9777, 12896, - 16315, 19410, - 24070, 29353, - 31795, 32075, - -200, -134, - -113, -204, - -347, -440, - -352, -211, - -418, -172, - -313, 59, - 495, 772, - 721, 614, - 334, 444, - 225, 242, - 161, 16, - 274, 564, - -73, -188, - -395, -171, - 777, 508, - 1340, 1145, - 699, 196, - 223, 173, - 90, 25, - -26, 18, - 133, -105, - -360, -277, - 859, 634, - 41, -557, - -768, -926, - -601, -1021, - -1189, -365, - 225, 107, - 374, -50, - 433, 417, - 156, 39, - -597, -1397, - -1594, -592, - -485, -292, - 253, 87, - -0, -6, - -25, -345, - -240, 120, - 1261, 946, - 166, -277, - 241, 167, - 170, 429, - 518, 714, - 602, 254, - 134, 92, - -152, -324, - -394, 49, - -151, -304, - -724, -657, - -162, -369, - -35, 3, - -2, -312, - -200, -92, - -227, 242, - 628, 565, - -124, 1056, - 770, 101, - -84, -33, - 4, -192, - -272, 5, - -627, -977, - 419, 472, - 53, -103, - 145, 322, - -95, -31, - -100, -303, - -560, -1067, - -413, 714, - 283, 2, - -223, -367, - 523, 360, - -38, -115, - 378, -591, - -718, 448, - -481, -274, - 180, -88, - -581, -157, - -696, -1265, - 394, -479, - -23, 124, - -43, 19, - -113, -236, - -412, -659, - -200, 2, - -69, -342, - 199, 55, - 58, -36, - -51, -62, - 507, 507, - 427, 442, - 36, 601, - -141, 68, - 274, 274, - 68, -12, - -4, 71, - -193, -464, - -425, -383, - 408, 203, - -337, 236, - 410, -59, - -25, -341, - -449, 28, - -9, 90, - 332, -14, - -905, 96, - -540, -242, - 679, -59, - 192, -24, - 60, -217, - 5, -37, - 179, -20, - 311, 519, - 274, 72, - -326, -1030, - -262, 213, - 380, 82, - 328, 411, - -540, 574, - -283, 151, - 181, -402, - -278, -240, - -110, -227, - -264, -89, - -250, -259, - -27, 106, - -239, -98, - -390, 118, - 61, 104, - 294, 532, - 92, -13, - 60, -233, - 335, 541, - 307, -26, - -110, -91, - -231, -460, - 170, 201, - 96, -372, - 132, 435, - -302, 216, - -279, -41, - 74, 190, - 368, 273, - -186, -608, - -157, 159, - 12, 278, - 245, 307, - 25, -187, - -16, 55, - 30, -163, - 548, -307, - 106, -5, - 27, 330, - -416, 475, - 438, -235, - 104, 137, - 21, -5, - -300, -468, - 521, -347, - 170, -200, - -219, 308, - -122, -133, - 219, -16, - 359, 412, - -89, -111, - 48, 322, - 142, 177, - -286, -127, - -39, -63, - -42, -451, - 160, 308, - -57, 193, - -48, 74, - -346, 59, - -27, 27, - -469, -277, - -344, 282, - 262, 122, - 171, -249, - 27, 258, - 188, -3, - 67, -206, - -284, 291, - -117, -88, - -477, 375, - 50, 106, - 99, -182, - 438, -376, - -401, -49, - 119, -23, - -10, -48, - -116, -200, - -310, 121, - 73, 7, - 237, -226, - 139, -456, - 397, 35, - 3, -108, - 323, -75, - 332, 198, - -99, -21 -}; - -const SKP_Silk_NLSF_CBS SKP_Silk_NLSF_CB1_10_Stage_info[ NLSF_MSVQ_CB1_10_STAGES ] = -{ - { 32, &SKP_Silk_NLSF_MSVQ_CB1_10_Q15[ 10 * 0 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates_Q5[ 0 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB1_10_Q15[ 10 * 32 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates_Q5[ 32 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB1_10_Q15[ 10 * 40 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates_Q5[ 40 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB1_10_Q15[ 10 * 48 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates_Q5[ 48 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB1_10_Q15[ 10 * 56 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates_Q5[ 56 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB1_10_Q15[ 10 * 64 ], &SKP_Silk_NLSF_MSVQ_CB1_10_rates_Q5[ 64 ] } -}; - -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, - SKP_Silk_NLSF_MSVQ_CB1_10_CDF_start_ptr, - SKP_Silk_NLSF_MSVQ_CB1_10_CDF_middle_idx -}; diff --git a/libs/silk/src/SKP_Silk_tables_NLSF_CB1_10.h b/libs/silk/src/SKP_Silk_tables_NLSF_CB1_10.h deleted file mode 100644 index c46968b491..0000000000 --- a/libs/silk/src/SKP_Silk_tables_NLSF_CB1_10.h +++ /dev/null @@ -1,50 +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_CB1_10_H -#define SKP_SILK_TABLES_NLSF_CB1_10_H - -#include "SKP_Silk_define.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -#define NLSF_MSVQ_CB1_10_STAGES 6 -#define NLSF_MSVQ_CB1_10_VECTORS 72 - -/* NLSF codebook entropy coding tables */ -extern const SKP_uint16 SKP_Silk_NLSF_MSVQ_CB1_10_CDF[ NLSF_MSVQ_CB1_10_VECTORS + NLSF_MSVQ_CB1_10_STAGES ]; -extern const SKP_uint16 * const SKP_Silk_NLSF_MSVQ_CB1_10_CDF_start_ptr[ NLSF_MSVQ_CB1_10_STAGES ]; -extern const SKP_int SKP_Silk_NLSF_MSVQ_CB1_10_CDF_middle_idx[ NLSF_MSVQ_CB1_10_STAGES ]; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libs/silk/src/SKP_Silk_tables_NLSF_CB1_16.c b/libs/silk/src/SKP_Silk_tables_NLSF_CB1_16.c deleted file mode 100644 index 413c1879b4..0000000000 --- a/libs/silk/src/SKP_Silk_tables_NLSF_CB1_16.c +++ /dev/null @@ -1,703 +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.29 + 3.57 kB */ -/**********************************************/ - -#include "SKP_Silk_structs.h" -#include "SKP_Silk_tables_NLSF_CB1_16.h" -#include "SKP_Silk_tables.h" - -const SKP_uint16 SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ NLSF_MSVQ_CB1_16_VECTORS + NLSF_MSVQ_CB1_16_STAGES ] = -{ - 0, - 19099, - 26957, - 30639, - 34242, - 37546, - 40447, - 43287, - 46005, - 48445, - 49865, - 51284, - 52673, - 53975, - 55221, - 56441, - 57267, - 58025, - 58648, - 59232, - 59768, - 60248, - 60729, - 61210, - 61690, - 62171, - 62651, - 63132, - 63613, - 64093, - 64574, - 65054, - 65535, - 0, - 28808, - 38775, - 46801, - 51785, - 55886, - 59410, - 62572, - 65535, - 0, - 27376, - 38639, - 45052, - 51465, - 55448, - 59021, - 62594, - 65535, - 0, - 33403, - 39569, - 45102, - 49961, - 54047, - 57959, - 61788, - 65535, - 0, - 25851, - 43356, - 47828, - 52204, - 55964, - 59413, - 62507, - 65535, - 0, - 34277, - 40337, - 45432, - 50311, - 54326, - 58171, - 61853, - 65535, - 0, - 33538, - 39865, - 45302, - 50076, - 54549, - 58478, - 62159, - 65535, - 0, - 27445, - 35258, - 40665, - 46072, - 51362, - 56540, - 61086, - 65535, - 0, - 22080, - 30779, - 37065, - 43085, - 48849, - 54613, - 60133, - 65535, - 0, - 13417, - 21748, - 30078, - 38231, - 46383, - 53091, - 59515, - 65535 -}; - -const SKP_uint16 * 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[ 33 ], - &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 42 ], - &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 51 ], - &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 60 ], - &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 69 ], - &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 78 ], - &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 87 ], - &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 96 ], - &SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ 105 ] -}; - -const SKP_int SKP_Silk_NLSF_MSVQ_CB1_16_CDF_middle_idx[ NLSF_MSVQ_CB1_16_STAGES ] = -{ - 5, - 2, - 2, - 2, - 2, - 2, - 2, - 3, - 3, - 4 -}; - -const SKP_int16 SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ NLSF_MSVQ_CB1_16_VECTORS ] = -{ - 57, 98, - 133, 134, - 138, 144, - 145, 147, - 152, 177, - 177, 178, - 181, 183, - 184, 202, - 206, 215, - 218, 222, - 227, 227, - 227, 227, - 227, 227, - 227, 227, - 227, 227, - 227, 227, - 38, 87, - 97, 119, - 128, 135, - 140, 143, - 40, 81, - 107, 107, - 129, 134, - 134, 143, - 31, 109, - 114, 120, - 128, 130, - 131, 132, - 43, 61, - 124, 125, - 132, 136, - 141, 142, - 30, 110, - 118, 120, - 129, 131, - 133, 133, - 31, 108, - 115, 121, - 124, 130, - 133, 137, - 40, 98, - 115, 115, - 116, 117, - 123, 124, - 50, 93, - 108, 110, - 112, 112, - 114, 115, - 73, 95, - 95, 96, - 96, 105, - 107, 110 -}; - -const SKP_int SKP_Silk_NLSF_MSVQ_CB1_16_ndelta_min_Q15[ 16 + 1 ] = -{ - 148, - 3, - 60, - 68, - 117, - 86, - 121, - 124, - 152, - 153, - 207, - 151, - 225, - 239, - 126, - 183, - 792 -}; - -const SKP_int16 SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * NLSF_MSVQ_CB1_16_VECTORS ] = -{ - 1309, 3060, 5071, 6996, - 9028, 10938, 12934, 14891, - 16933, 18854, 20792, 22764, - 24753, 26659, 28626, 30501, - 1264, 2745, 4610, 6408, - 8286, 10043, 12084, 14108, - 16118, 18163, 20095, 22164, - 24264, 26316, 28329, 30251, - 1044, 2080, 3672, 5179, - 7140, 9100, 11070, 13065, - 15423, 17790, 19931, 22101, - 24290, 26361, 28499, 30418, - 1131, 2476, 4478, 6149, - 7902, 9875, 11938, 13809, - 15869, 17730, 19948, 21707, - 23761, 25535, 27426, 28917, - 1040, 2004, 4026, 6100, - 8432, 10494, 12610, 14694, - 16797, 18775, 20799, 22782, - 24772, 26682, 28631, 30516, - 2310, 3812, 5913, 7933, - 10033, 11881, 13885, 15798, - 17751, 19576, 21482, 23276, - 25157, 27010, 28833, 30623, - 1254, 2847, 5013, 6781, - 8626, 10370, 12726, 14633, - 16281, 17852, 19870, 21472, - 23002, 24629, 26710, 27960, - 1468, 3059, 4987, 7026, - 8741, 10412, 12281, 14020, - 15970, 17723, 19640, 21522, - 23472, 25661, 27986, 30225, - 2171, 3566, 5605, 7384, - 9404, 11220, 13030, 14758, - 16687, 18417, 20346, 22091, - 24055, 26212, 28356, 30397, - 2409, 4676, 7543, 9786, - 11419, 12935, 14368, 15653, - 17366, 18943, 20762, 22477, - 24440, 26327, 28284, 30242, - 2354, 4222, 6820, 9107, - 11596, 13934, 15973, 17682, - 19158, 20517, 21991, 23420, - 25178, 26936, 28794, 30527, - 1323, 2414, 4184, 6039, - 7534, 9398, 11099, 13097, - 14799, 16451, 18434, 20887, - 23490, 25838, 28046, 30225, - 1361, 3243, 6048, 8511, - 11001, 13145, 15073, 16608, - 18126, 19381, 20912, 22607, - 24660, 26668, 28663, 30566, - 1216, 2648, 5901, 8422, - 10037, 11425, 12973, 14603, - 16686, 18600, 20555, 22415, - 24450, 26280, 28206, 30077, - 2417, 4048, 6316, 8433, - 10510, 12757, 15072, 17295, - 19573, 21503, 23329, 24782, - 26235, 27689, 29214, 30819, - 1012, 2345, 4991, 7377, - 9465, 11916, 14296, 16566, - 18672, 20544, 22292, 23838, - 25415, 27050, 28848, 30551, - 1937, 3693, 6267, 8019, - 10372, 12194, 14287, 15657, - 17431, 18864, 20769, 22206, - 24037, 25463, 27383, 28602, - 1969, 3305, 5017, 6726, - 8375, 9993, 11634, 13280, - 15078, 16751, 18464, 20119, - 21959, 23858, 26224, 29298, - 1198, 2647, 5428, 7423, - 9775, 12155, 14665, 16344, - 18121, 19790, 21557, 22847, - 24484, 25742, 27639, 28711, - 1636, 3353, 5447, 7597, - 9837, 11647, 13964, 16019, - 17862, 20116, 22319, 24037, - 25966, 28086, 29914, 31294, - 2676, 4105, 6378, 8223, - 10058, 11549, 13072, 14453, - 15956, 17355, 18931, 20402, - 22183, 23884, 25717, 27723, - 1373, 2593, 4449, 5633, - 7300, 8425, 9474, 10818, - 12769, 15722, 19002, 21429, - 23682, 25924, 28135, 30333, - 1596, 3183, 5378, 7164, - 8670, 10105, 11470, 12834, - 13991, 15042, 16642, 17903, - 20759, 25283, 27770, 30240, - 2037, 3987, 6237, 8117, - 9954, 12245, 14217, 15892, - 17775, 20114, 22314, 25942, - 26305, 26483, 26796, 28561, - 2181, 3858, 5760, 7924, - 10041, 11577, 13769, 15700, - 17429, 19879, 23583, 24538, - 25212, 25693, 28688, 30507, - 1992, 3882, 6474, 7883, - 9381, 12672, 14340, 15701, - 16658, 17832, 20850, 22885, - 24677, 26457, 28491, 30460, - 2391, 3988, 5448, 7432, - 11014, 12579, 13140, 14146, - 15898, 18592, 21104, 22993, - 24673, 27186, 28142, 29612, - 1713, 5102, 6989, 7798, - 8670, 10110, 12746, 14881, - 16709, 18407, 20126, 22107, - 24181, 26198, 28237, 30137, - 1612, 3617, 6148, 8359, - 9576, 11528, 14936, 17809, - 18287, 18729, 19001, 21111, - 24631, 26596, 28740, 30643, - 2266, 4168, 7862, 9546, - 9618, 9703, 10134, 13897, - 16265, 18432, 20587, 22605, - 24754, 26994, 29125, 30840, - 1840, 3917, 6272, 7809, - 9714, 11438, 13767, 15799, - 19244, 21972, 22980, 23180, - 23723, 25650, 29117, 31085, - 1458, 3612, 6008, 7488, - 9827, 11893, 14086, 15734, - 17440, 19535, 22424, 24767, - 29246, 29928, 30516, 30947, - -102, -121, -31, -6, - 5, -2, 8, -18, - -4, 6, 14, -2, - -12, -16, -12, -60, - -126, -353, -574, -677, - -657, -617, -498, -393, - -348, -277, -225, -164, - -102, -70, -31, 33, - 4, 379, 387, 551, - 605, 620, 532, 482, - 442, 454, 385, 347, - 322, 299, 266, 200, - 1168, 951, 672, 246, - 60, -161, -259, -234, - -253, -282, -203, -187, - -155, -176, -198, -178, - 10, 170, 393, 609, - 555, 208, -330, -571, - -769, -633, -319, -43, - 95, 105, 106, 116, - -152, -140, -125, 5, - 173, 274, 264, 331, - -37, -293, -609, -786, - -959, -814, -645, -238, - -91, 36, -11, -101, - -279, -227, -40, 90, - 530, 677, 890, 1104, - 999, 835, 564, 295, - -280, -364, -340, -331, - -284, 288, 761, 880, - 988, 627, 146, -226, - -203, -181, -142, 39, - 24, -26, -107, -92, - -161, -135, -131, -88, - -160, -156, -75, -43, - -36, -6, -33, 33, - -324, -415, -108, 124, - 157, 191, 203, 197, - 144, 109, 152, 176, - 190, 122, 101, 159, - 663, 668, 480, 400, - 379, 444, 446, 458, - 343, 351, 310, 228, - 133, 44, 75, 63, - -84, 39, -29, 35, - -94, -233, -261, -354, - 77, 262, -24, -145, - -333, -409, -404, -597, - -488, -300, 910, 592, - 412, 120, 130, -51, - -37, -77, -172, -181, - -159, -148, -72, -62, - 510, 516, 113, -585, - -1075, -957, -417, -195, - 9, 7, -88, -173, - -91, 54, 98, 95, - -28, 197, -527, -621, - 157, 122, -168, 147, - 309, 300, 336, 315, - 396, 408, 376, 106, - -162, -170, -315, 98, - 821, 908, 570, -33, - -312, -568, -572, -378, - -107, 23, 156, 93, - -129, -87, 20, -72, - -37, 40, 21, 27, - 48, 75, 77, 65, - 46, 71, 66, 47, - 136, 344, 236, 322, - 170, 283, 269, 291, - 162, -43, -204, -259, - -240, -305, -350, -312, - 447, 348, 345, 257, - 71, -131, -77, -190, - -202, -40, 35, 133, - 261, 365, 438, 303, - -8, 22, 140, 137, - -300, -641, -764, -268, - -23, -25, 73, -162, - -150, -212, -72, 6, - 39, 78, 104, -93, - -308, -136, 117, -71, - -513, -820, -700, -450, - -161, -23, 29, 78, - 337, 106, -406, -782, - -112, 233, 383, 62, - -126, 6, -77, -29, - -146, -123, -51, -27, - -27, -381, -641, 402, - 539, 8, -207, -366, - -36, -27, -204, -227, - -237, -189, -64, 51, - -92, -137, -281, 62, - 233, 92, 148, 294, - 363, 416, 564, 625, - 370, -36, -469, -462, - 102, 168, 32, 117, - -21, 97, 139, 89, - 104, 35, 4, 82, - 66, 58, 73, 93, - -76, -320, -236, -189, - -203, -142, -27, -73, - 9, -9, -25, 12, - -15, 4, 4, -50, - 314, 180, 162, -49, - 199, -108, -227, -66, - -447, -67, -264, -394, - 5, 55, -133, -176, - -116, -241, 272, 109, - 282, 262, 192, -64, - -392, -514, 156, 203, - 154, 72, -34, -160, - -73, 3, -33, -431, - 321, 18, -567, -590, - -108, 88, 66, 51, - -31, -193, -46, 65, - -29, -23, 215, -31, - 101, -113, 32, 304, - 88, 320, 448, 5, - -439, -562, -508, -135, - -13, -171, -8, 182, - -99, -181, -149, 376, - 476, 64, -396, -652, - -150, 176, 222, 65, - -590, 719, 271, 399, - 245, 72, -156, -152, - -176, 59, 94, 125, - -9, -7, 9, 1, - -61, -116, -82, 1, - 79, 22, -44, -15, - -48, -65, -62, -101, - -102, -54, -70, -78, - -80, -25, 398, 71, - 139, 38, 90, 194, - 222, 249, 165, 94, - 221, 262, 163, 91, - -206, 573, 200, -287, - -147, 5, -18, -85, - -74, -125, -87, 85, - 141, 4, -4, 28, - 234, 48, -150, -111, - -506, 237, -209, 345, - 94, -124, 77, 121, - 143, 12, -80, -48, - 191, 144, -93, -65, - -151, -643, 435, 106, - 87, 7, 65, 102, - 94, 68, 5, 99, - 222, 93, 94, 355, - -13, -89, -228, -503, - 287, 109, 108, 449, - 253, -29, -109, -116, - 15, -73, -20, 131, - -147, 72, 59, -150, - -594, 273, 316, 132, - 199, 106, 198, 212, - 220, 82, 45, -13, - 223, 137, 270, 38, - 252, 135, -177, -207, - -360, -102, 403, 406, - -14, 83, 64, 51, - -7, -99, -97, -88, - -124, -65, 42, 32, - 28, 29, 12, 20, - 119, -26, -212, -201, - 373, 251, 141, 103, - 36, -52, 66, 18, - -6, -95, -196, 5, - 98, -85, -108, 218, - -164, 20, 356, 172, - 37, 266, 23, 112, - -24, -99, -92, -178, - 29, -278, 388, -60, - -220, 300, -13, 154, - 191, 15, -37, -110, - -153, -150, -114, -7, - -94, -31, -62, -177, - 4, -70, 35, 453, - 147, -247, -328, 101, - 20, -114, 147, 108, - -119, -109, -102, -238, - 55, -102, 173, -89, - 129, 138, -330, -160, - 485, 154, -59, -170, - -20, -34, -261, -40, - -129, 77, -84, 69, - 83, 160, 169, 63, - -516, 30, 336, 52, - -0, -52, -124, 158, - 19, 197, -10, -375, - 405, 285, 114, -395, - -47, 196, 62, 87, - -106, -65, -75, -69, - -13, 34, 99, 59, - 83, 98, 44, 0, - 24, 18, 17, 70, - -22, 194, 208, 144, - -79, -15, 32, -104, - -28, -105, -186, -212, - -228, -79, -76, 51, - -71, 72, 118, -34, - -3, -171, 5, 2, - -108, -125, 62, -58, - 58, -121, 73, -466, - 92, 63, -94, -78, - -76, 212, 36, -225, - -71, -354, 152, 143, - -79, -246, -51, -31, - -6, -270, 240, 210, - 30, -157, -231, 74, - -146, 88, -273, 156, - 92, 56, 71, 2, - 318, 164, 32, -110, - -35, -41, -95, -106, - 11, 132, -68, 55, - 123, -83, -149, 212, - 132, 0, -194, 55, - 206, -108, -353, 289, - -195, 1, 233, -22, - -60, 20, 26, 68, - 166, 27, -58, 130, - 112, 107, 27, -165, - 115, -93, -37, 38, - 83, 483, 65, -229, - -13, 157, 85, 50, - 136, 10, 32, 83, - 82, 55, 5, -9, - -52, -78, -81, -51, - 40, 18, -127, -224, - -41, 53, -210, -113, - 24, -17, -187, -89, - 8, 121, 83, 77, - 91, -74, -35, -112, - -161, -173, 102, 132, - -125, -61, 103, -260, - 52, 166, -32, -156, - -87, -56, 60, -70, - -124, 242, 114, -251, - -166, 201, 127, 28, - -11, 23, -80, -115, - -20, -51, -348, 340, - -34, 133, 13, 92, - -124, -136, -120, -26, - -6, 17, 28, 21, - 120, -168, 160, -35, - 115, 28, 9, 7, - -56, 39, 156, 256, - -18, 1, 277, 82, - -70, -144, -88, -13, - -59, -157, 8, -134, - 21, -40, 58, -21, - 194, -276, 97, 279, - -56, -140, 125, 57, - -184, -204, -70, -2, - 128, -202, -78, 230, - -23, 161, -102, 1, - 1, 180, -31, -86, - -167, -57, -60, 27, - -13, 99, 108, 111, - 76, 69, 34, -21, - 53, 38, 34, 78, - 73, 219, 51, 15, - -72, -103, -207, 30, - 213, -14, 31, -94, - -40, -144, 67, 4, - 105, 59, -240, 25, - 244, 69, 58, 23, - -24, -5, -15, -133, - -71, -67, 181, 29, - -45, 121, 96, 51, - -72, -53, 56, -153, - -27, 85, 183, 211, - 105, -34, -46, 43, - -72, -93, 36, -128, - 29, 111, -95, -156, - -179, -235, 21, -39, - -71, -33, -61, -252, - 230, -131, 157, -21, - -85, -28, -123, 80, - -160, 63, 47, -6, - -49, -96, -19, 17, - -58, 17, -0, -13, - -170, 25, -35, 59, - 10, -31, -413, 81, - 62, 18, -164, 245, - 92, -165, 42, 26, - 126, -248, 193, -55, - 16, 39, 14, 50 -}; - -const SKP_Silk_NLSF_CBS SKP_Silk_NLSF_CB1_16_Stage_info[ NLSF_MSVQ_CB1_16_STAGES ] = -{ - { 32, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 0 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 0 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 32 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 32 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 40 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 40 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 48 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 48 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 56 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 56 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 64 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 64 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 72 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 72 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 80 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 80 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 88 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 88 ] }, - { 8, &SKP_Silk_NLSF_MSVQ_CB1_16_Q15[ 16 * 96 ], &SKP_Silk_NLSF_MSVQ_CB1_16_rates_Q5[ 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, - SKP_Silk_NLSF_MSVQ_CB1_16_CDF_start_ptr, - SKP_Silk_NLSF_MSVQ_CB1_16_CDF_middle_idx -}; diff --git a/libs/silk/src/SKP_Silk_tables_NLSF_CB1_16.h b/libs/silk/src/SKP_Silk_tables_NLSF_CB1_16.h deleted file mode 100644 index 31efe0b42a..0000000000 --- a/libs/silk/src/SKP_Silk_tables_NLSF_CB1_16.h +++ /dev/null @@ -1,50 +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_CB1_16_H -#define SKP_SILK_TABLES_NLSF_CB1_16_H - -#include "SKP_Silk_define.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -#define NLSF_MSVQ_CB1_16_STAGES 10 -#define NLSF_MSVQ_CB1_16_VECTORS 104 - -/* NLSF codebook entropy coding tables */ -extern const SKP_uint16 SKP_Silk_NLSF_MSVQ_CB1_16_CDF[ NLSF_MSVQ_CB1_16_VECTORS + NLSF_MSVQ_CB1_16_STAGES ]; -extern const SKP_uint16 * const SKP_Silk_NLSF_MSVQ_CB1_16_CDF_start_ptr[ NLSF_MSVQ_CB1_16_STAGES ]; -extern const SKP_int SKP_Silk_NLSF_MSVQ_CB1_16_CDF_middle_idx[ NLSF_MSVQ_CB1_16_STAGES ]; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libs/silk/src/SKP_Silk_tables_gain.c b/libs/silk/src/SKP_Silk_tables_gain.c deleted file mode 100644 index 37cbb348b4..0000000000 --- a/libs/silk/src/SKP_Silk_tables_gain.c +++ /dev/null @@ -1,77 +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_tables.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -const SKP_uint16 SKP_Silk_gain_CDF[ 2 ][ 65 ] = -{ -{ - 0, 18, 45, 94, 181, 320, 519, 777, - 1093, 1468, 1909, 2417, 2997, 3657, 4404, 5245, - 6185, 7228, 8384, 9664, 11069, 12596, 14244, 16022, - 17937, 19979, 22121, 24345, 26646, 29021, 31454, 33927, - 36438, 38982, 41538, 44068, 46532, 48904, 51160, 53265, - 55184, 56904, 58422, 59739, 60858, 61793, 62568, 63210, - 63738, 64165, 64504, 64769, 64976, 65133, 65249, 65330, - 65386, 65424, 65451, 65471, 65487, 65501, 65513, 65524, - 65535 -}, -{ - 0, 214, 581, 1261, 2376, 3920, 5742, 7632, - 9449, 11157, 12780, 14352, 15897, 17427, 18949, 20462, - 21957, 23430, 24889, 26342, 27780, 29191, 30575, 31952, - 33345, 34763, 36200, 37642, 39083, 40519, 41930, 43291, - 44602, 45885, 47154, 48402, 49619, 50805, 51959, 53069, - 54127, 55140, 56128, 57101, 58056, 58979, 59859, 60692, - 61468, 62177, 62812, 63368, 63845, 64242, 64563, 64818, - 65023, 65184, 65306, 65391, 65447, 65482, 65505, 65521, - 65535 -} -}; - -const SKP_int SKP_Silk_gain_CDF_offset = 32; - - -const SKP_uint16 SKP_Silk_delta_gain_CDF[ 46 ] = { - 0, 2358, 3856, 7023, 15376, 53058, 59135, 61555, - 62784, 63498, 63949, 64265, 64478, 64647, 64783, 64894, - 64986, 65052, 65113, 65169, 65213, 65252, 65284, 65314, - 65338, 65359, 65377, 65392, 65403, 65415, 65424, 65432, - 65440, 65448, 65455, 65462, 65470, 65477, 65484, 65491, - 65499, 65506, 65513, 65521, 65528, 65535 -}; - -const SKP_int SKP_Silk_delta_gain_CDF_offset = 5; - -#ifdef __cplusplus -} -#endif diff --git a/libs/silk/src/SKP_Silk_tables_other.c b/libs/silk/src/SKP_Silk_tables_other.c deleted file mode 100644 index a386416576..0000000000 --- a/libs/silk/src/SKP_Silk_tables_other.c +++ /dev/null @@ -1,147 +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_structs.h" -#include "SKP_Silk_define.h" -#include "SKP_Silk_tables.h" -#ifdef __cplusplus -extern "C" -{ -#endif - -/* Piece-wise linear mapping from bitrate in kbps to coding quality in dB SNR */ -const SKP_int32 TargetRate_table_NB[ TARGET_RATE_TAB_SZ ] = { - 0, 8000, 9000, 11000, 13000, 16000, 22000, MAX_TARGET_RATE_BPS -}; -const SKP_int32 TargetRate_table_MB[ TARGET_RATE_TAB_SZ ] = { - 0, 10000, 12000, 14000, 17000, 21000, 28000, MAX_TARGET_RATE_BPS -}; -const SKP_int32 TargetRate_table_WB[ TARGET_RATE_TAB_SZ ] = { - 0, 11000, 14000, 17000, 21000, 26000, 36000, MAX_TARGET_RATE_BPS -}; -const SKP_int32 TargetRate_table_SWB[ TARGET_RATE_TAB_SZ ] = { - 0, 13000, 16000, 19000, 25000, 32000, 46000, MAX_TARGET_RATE_BPS -}; -const SKP_int32 SNR_table_Q1[ TARGET_RATE_TAB_SZ ] = { - 19, 31, 35, 39, 43, 47, 54, 64 -}; - -const SKP_int32 SNR_table_one_bit_per_sample_Q7[ 4 ] = { - 1984, 2240, 2408, 2708 -}; - -/* Filter coeficicnts for HP filter: 4. Order filter implementad as two biquad filters */ -const SKP_int16 SKP_Silk_SWB_detect_B_HP_Q13[ NB_SOS ][ 3 ] = { - //{400, -550, 400}, {400, 130, 400}, {400, 390, 400} - {575, -948, 575}, {575, -221, 575}, {575, 104, 575} -}; -const SKP_int16 SKP_Silk_SWB_detect_A_HP_Q13[ NB_SOS ][ 2 ] = { - {14613, 6868}, {12883, 7337}, {11586, 7911} - //{14880, 6900}, {14400, 7300}, {13700, 7800} -}; - -/* Decoder high-pass filter coefficients for 24 kHz sampling, -6 dB @ 44 Hz */ -const SKP_int16 SKP_Silk_Dec_A_HP_24[ DEC_HP_ORDER ] = {-16220, 8030}; // second order AR coefs, Q13 -const SKP_int16 SKP_Silk_Dec_B_HP_24[ DEC_HP_ORDER + 1 ] = {8000, -16000, 8000}; // second order MA coefs, Q13 - -/* Decoder high-pass filter coefficients for 16 kHz sampling, - 6 dB @ 46 Hz */ -const SKP_int16 SKP_Silk_Dec_A_HP_16[ DEC_HP_ORDER ] = {-16127, 7940}; // second order AR coefs, Q13 -const SKP_int16 SKP_Silk_Dec_B_HP_16[ DEC_HP_ORDER + 1 ] = {8000, -16000, 8000}; // second order MA coefs, Q13 - -/* Decoder high-pass filter coefficients for 12 kHz sampling, -6 dB @ 44 Hz */ -const SKP_int16 SKP_Silk_Dec_A_HP_12[ DEC_HP_ORDER ] = {-16043, 7859}; // second order AR coefs, Q13 -const SKP_int16 SKP_Silk_Dec_B_HP_12[ DEC_HP_ORDER + 1 ] = {8000, -16000, 8000}; // second order MA coefs, Q13 - -/* Decoder high-pass filter coefficients for 8 kHz sampling, -6 dB @ 43 Hz */ -const SKP_int16 SKP_Silk_Dec_A_HP_8[ DEC_HP_ORDER ] = {-15885, 7710}; // second order AR coefs, Q13 -const SKP_int16 SKP_Silk_Dec_B_HP_8[ DEC_HP_ORDER + 1 ] = {8000, -16000, 8000}; // second order MA coefs, Q13 - -/* table for LSB coding */ -const SKP_uint16 SKP_Silk_lsb_CDF[ 3 ] = {0, 40000, 65535}; - -/* tables for LTPScale */ -const SKP_uint16 SKP_Silk_LTPscale_CDF[ 4 ] = {0, 32000, 48000, 65535}; -const SKP_int SKP_Silk_LTPscale_offset = 2; - -/* tables for VAD flag */ -const SKP_uint16 SKP_Silk_vadflag_CDF[ 3 ] = {0, 22000, 65535}; // 66% for speech, 33% for no speech -const SKP_int SKP_Silk_vadflag_offset = 1; - -/* tables for sampling rate */ -const SKP_int SKP_Silk_SamplingRates_table[ 4 ] = {8, 12, 16, 24}; -const SKP_uint16 SKP_Silk_SamplingRates_CDF[ 5 ] = {0, 16000, 32000, 48000, 65535}; -const SKP_int SKP_Silk_SamplingRates_offset = 2; - -/* tables for NLSF interpolation factor */ -const SKP_uint16 SKP_Silk_NLSF_interpolation_factor_CDF[ 6 ] = {0, 3706, 8703, 19226, 30926, 65535}; -const SKP_int SKP_Silk_NLSF_interpolation_factor_offset = 4; - -/* Table for frame termination indication */ -const SKP_uint16 SKP_Silk_FrameTermination_CDF[ 5 ] = {0, 20000, 45000, 56000, 65535}; -const SKP_int SKP_Silk_FrameTermination_offset = 2; - -/* Table for random seed */ -const SKP_uint16 SKP_Silk_Seed_CDF[ 5 ] = {0, 16384, 32768, 49152, 65535}; -const SKP_int SKP_Silk_Seed_offset = 2; - -/* Quantization offsets */ -const SKP_int16 SKP_Silk_Quantization_Offsets_Q10[ 2 ][ 2 ] = { - { OFFSET_VL_Q10, OFFSET_VH_Q10 }, { OFFSET_UVL_Q10, OFFSET_UVH_Q10 } -}; - -/* Table for LTPScale */ -const SKP_int16 SKP_Silk_LTPScales_table_Q14[ 3 ] = { 15565, 11469, 8192 }; - -#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. */ - -/* Interpolation points for filter coefficients used in the bandwidth transition smoother */ -const SKP_int32 SKP_Silk_Transition_LP_B_Q28[ TRANSITION_INT_NUM ][ TRANSITION_NB ] = -{ -{ 250767114, 501534038, 250767114 }, -{ 209867381, 419732057, 209867381 }, -{ 170987846, 341967853, 170987846 }, -{ 131531482, 263046905, 131531482 }, -{ 89306658, 178584282, 89306658 } -}; - -/* Interpolation points for filter coefficients used in the bandwidth transition smoother */ -const SKP_int32 SKP_Silk_Transition_LP_A_Q28[ TRANSITION_INT_NUM ][ TRANSITION_NA ] = -{ -{ 506393414, 239854379 }, -{ 411067935, 169683996 }, -{ 306733530, 116694253 }, -{ 185807084, 77959395 }, -{ 35497197, 57401098 } -}; -#endif - -#ifdef __cplusplus -} -#endif diff --git a/libs/silk/src/SKP_Silk_tables_pitch_lag.c b/libs/silk/src/SKP_Silk_tables_pitch_lag.c deleted file mode 100644 index b5dc298537..0000000000 --- a/libs/silk/src/SKP_Silk_tables_pitch_lag.c +++ /dev/null @@ -1,199 +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_tables.h" - -const SKP_uint16 SKP_Silk_pitch_lag_NB_CDF[ 8 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) + 2 ] = { - 0, 194, 395, 608, 841, 1099, 1391, 1724, - 2105, 2544, 3047, 3624, 4282, 5027, 5865, 6799, - 7833, 8965, 10193, 11510, 12910, 14379, 15905, 17473, - 19065, 20664, 22252, 23814, 25335, 26802, 28206, 29541, - 30803, 31992, 33110, 34163, 35156, 36098, 36997, 37861, - 38698, 39515, 40319, 41115, 41906, 42696, 43485, 44273, - 45061, 45847, 46630, 47406, 48175, 48933, 49679, 50411, - 51126, 51824, 52502, 53161, 53799, 54416, 55011, 55584, - 56136, 56666, 57174, 57661, 58126, 58570, 58993, 59394, - 59775, 60134, 60472, 60790, 61087, 61363, 61620, 61856, - 62075, 62275, 62458, 62625, 62778, 62918, 63045, 63162, - 63269, 63368, 63459, 63544, 63623, 63698, 63769, 63836, - 63901, 63963, 64023, 64081, 64138, 64194, 64248, 64301, - 64354, 64406, 64457, 64508, 64558, 64608, 64657, 64706, - 64754, 64803, 64851, 64899, 64946, 64994, 65041, 65088, - 65135, 65181, 65227, 65272, 65317, 65361, 65405, 65449, - 65492, 65535 -}; - -const SKP_int SKP_Silk_pitch_lag_NB_CDF_offset = 43; - -const SKP_uint16 SKP_Silk_pitch_contour_NB_CDF[ 12 ] = { - 0, 14445, 18587, 25628, 30013, 34859, 40597, 48426, - 54460, 59033, 62990, 65535 -}; - -const SKP_int SKP_Silk_pitch_contour_NB_CDF_offset = 5; - -const SKP_uint16 SKP_Silk_pitch_lag_MB_CDF[ 12 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) + 2 ] = { - 0, 132, 266, 402, 542, 686, 838, 997, - 1167, 1349, 1546, 1760, 1993, 2248, 2528, 2835, - 3173, 3544, 3951, 4397, 4882, 5411, 5984, 6604, - 7270, 7984, 8745, 9552, 10405, 11300, 12235, 13206, - 14209, 15239, 16289, 17355, 18430, 19507, 20579, 21642, - 22688, 23712, 24710, 25677, 26610, 27507, 28366, 29188, - 29971, 30717, 31427, 32104, 32751, 33370, 33964, 34537, - 35091, 35630, 36157, 36675, 37186, 37692, 38195, 38697, - 39199, 39701, 40206, 40713, 41222, 41733, 42247, 42761, - 43277, 43793, 44309, 44824, 45336, 45845, 46351, 46851, - 47347, 47836, 48319, 48795, 49264, 49724, 50177, 50621, - 51057, 51484, 51902, 52312, 52714, 53106, 53490, 53866, - 54233, 54592, 54942, 55284, 55618, 55944, 56261, 56571, - 56873, 57167, 57453, 57731, 58001, 58263, 58516, 58762, - 58998, 59226, 59446, 59656, 59857, 60050, 60233, 60408, - 60574, 60732, 60882, 61024, 61159, 61288, 61410, 61526, - 61636, 61742, 61843, 61940, 62033, 62123, 62210, 62293, - 62374, 62452, 62528, 62602, 62674, 62744, 62812, 62879, - 62945, 63009, 63072, 63135, 63196, 63256, 63316, 63375, - 63434, 63491, 63549, 63605, 63661, 63717, 63772, 63827, - 63881, 63935, 63988, 64041, 64094, 64147, 64199, 64252, - 64304, 64356, 64409, 64461, 64513, 64565, 64617, 64669, - 64721, 64773, 64824, 64875, 64925, 64975, 65024, 65072, - 65121, 65168, 65215, 65262, 65308, 65354, 65399, 65445, - 65490, 65535 -}; - -const SKP_int SKP_Silk_pitch_lag_MB_CDF_offset = 64; - -const SKP_uint16 SKP_Silk_pitch_lag_WB_CDF[ 16 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) + 2 ] = { - 0, 106, 213, 321, 429, 539, 651, 766, - 884, 1005, 1132, 1264, 1403, 1549, 1705, 1870, - 2047, 2236, 2439, 2658, 2893, 3147, 3420, 3714, - 4030, 4370, 4736, 5127, 5546, 5993, 6470, 6978, - 7516, 8086, 8687, 9320, 9985, 10680, 11405, 12158, - 12938, 13744, 14572, 15420, 16286, 17166, 18057, 18955, - 19857, 20759, 21657, 22547, 23427, 24293, 25141, 25969, - 26774, 27555, 28310, 29037, 29736, 30406, 31048, 31662, - 32248, 32808, 33343, 33855, 34345, 34815, 35268, 35704, - 36127, 36537, 36938, 37330, 37715, 38095, 38471, 38844, - 39216, 39588, 39959, 40332, 40707, 41084, 41463, 41844, - 42229, 42615, 43005, 43397, 43791, 44186, 44583, 44982, - 45381, 45780, 46179, 46578, 46975, 47371, 47765, 48156, - 48545, 48930, 49312, 49690, 50064, 50433, 50798, 51158, - 51513, 51862, 52206, 52544, 52877, 53204, 53526, 53842, - 54152, 54457, 54756, 55050, 55338, 55621, 55898, 56170, - 56436, 56697, 56953, 57204, 57449, 57689, 57924, 58154, - 58378, 58598, 58812, 59022, 59226, 59426, 59620, 59810, - 59994, 60173, 60348, 60517, 60681, 60840, 60993, 61141, - 61284, 61421, 61553, 61679, 61800, 61916, 62026, 62131, - 62231, 62326, 62417, 62503, 62585, 62663, 62737, 62807, - 62874, 62938, 62999, 63057, 63113, 63166, 63217, 63266, - 63314, 63359, 63404, 63446, 63488, 63528, 63567, 63605, - 63642, 63678, 63713, 63748, 63781, 63815, 63847, 63879, - 63911, 63942, 63973, 64003, 64033, 64063, 64092, 64121, - 64150, 64179, 64207, 64235, 64263, 64291, 64319, 64347, - 64374, 64401, 64428, 64455, 64481, 64508, 64534, 64560, - 64585, 64610, 64635, 64660, 64685, 64710, 64734, 64758, - 64782, 64807, 64831, 64855, 64878, 64902, 64926, 64950, - 64974, 64998, 65022, 65045, 65069, 65093, 65116, 65139, - 65163, 65186, 65209, 65231, 65254, 65276, 65299, 65321, - 65343, 65364, 65386, 65408, 65429, 65450, 65471, 65493, - 65514, 65535 -}; - -const SKP_int SKP_Silk_pitch_lag_WB_CDF_offset = 86; - - -const SKP_uint16 SKP_Silk_pitch_lag_SWB_CDF[ 24 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) + 2 ] = { - 0, 253, 505, 757, 1008, 1258, 1507, 1755, - 2003, 2249, 2494, 2738, 2982, 3225, 3469, 3713, - 3957, 4202, 4449, 4698, 4949, 5203, 5460, 5720, - 5983, 6251, 6522, 6798, 7077, 7361, 7650, 7942, - 8238, 8539, 8843, 9150, 9461, 9775, 10092, 10411, - 10733, 11057, 11383, 11710, 12039, 12370, 12701, 13034, - 13368, 13703, 14040, 14377, 14716, 15056, 15398, 15742, - 16087, 16435, 16785, 17137, 17492, 17850, 18212, 18577, - 18946, 19318, 19695, 20075, 20460, 20849, 21243, 21640, - 22041, 22447, 22856, 23269, 23684, 24103, 24524, 24947, - 25372, 25798, 26225, 26652, 27079, 27504, 27929, 28352, - 28773, 29191, 29606, 30018, 30427, 30831, 31231, 31627, - 32018, 32404, 32786, 33163, 33535, 33902, 34264, 34621, - 34973, 35320, 35663, 36000, 36333, 36662, 36985, 37304, - 37619, 37929, 38234, 38535, 38831, 39122, 39409, 39692, - 39970, 40244, 40513, 40778, 41039, 41295, 41548, 41796, - 42041, 42282, 42520, 42754, 42985, 43213, 43438, 43660, - 43880, 44097, 44312, 44525, 44736, 44945, 45153, 45359, - 45565, 45769, 45972, 46175, 46377, 46578, 46780, 46981, - 47182, 47383, 47585, 47787, 47989, 48192, 48395, 48599, - 48804, 49009, 49215, 49422, 49630, 49839, 50049, 50259, - 50470, 50682, 50894, 51107, 51320, 51533, 51747, 51961, - 52175, 52388, 52601, 52813, 53025, 53236, 53446, 53655, - 53863, 54069, 54274, 54477, 54679, 54879, 55078, 55274, - 55469, 55662, 55853, 56042, 56230, 56415, 56598, 56779, - 56959, 57136, 57311, 57484, 57654, 57823, 57989, 58152, - 58314, 58473, 58629, 58783, 58935, 59084, 59230, 59373, - 59514, 59652, 59787, 59919, 60048, 60174, 60297, 60417, - 60533, 60647, 60757, 60865, 60969, 61070, 61167, 61262, - 61353, 61442, 61527, 61609, 61689, 61765, 61839, 61910, - 61979, 62045, 62109, 62170, 62230, 62287, 62343, 62396, - 62448, 62498, 62547, 62594, 62640, 62685, 62728, 62770, - 62811, 62852, 62891, 62929, 62967, 63004, 63040, 63075, - 63110, 63145, 63178, 63212, 63244, 63277, 63308, 63340, - 63371, 63402, 63432, 63462, 63491, 63521, 63550, 63578, - 63607, 63635, 63663, 63690, 63718, 63744, 63771, 63798, - 63824, 63850, 63875, 63900, 63925, 63950, 63975, 63999, - 64023, 64046, 64069, 64092, 64115, 64138, 64160, 64182, - 64204, 64225, 64247, 64268, 64289, 64310, 64330, 64351, - 64371, 64391, 64411, 64431, 64450, 64470, 64489, 64508, - 64527, 64545, 64564, 64582, 64600, 64617, 64635, 64652, - 64669, 64686, 64702, 64719, 64735, 64750, 64766, 64782, - 64797, 64812, 64827, 64842, 64857, 64872, 64886, 64901, - 64915, 64930, 64944, 64959, 64974, 64988, 65003, 65018, - 65033, 65048, 65063, 65078, 65094, 65109, 65125, 65141, - 65157, 65172, 65188, 65204, 65220, 65236, 65252, 65268, - 65283, 65299, 65314, 65330, 65345, 65360, 65375, 65390, - 65405, 65419, 65434, 65449, 65463, 65477, 65492, 65506, - 65521, 65535 -}; - -const SKP_int SKP_Silk_pitch_lag_SWB_CDF_offset = 128; - - -const SKP_uint16 SKP_Silk_pitch_contour_CDF[ 35 ] = { - 0, 372, 843, 1315, 1836, 2644, 3576, 4719, - 6088, 7621, 9396, 11509, 14245, 17618, 20777, 24294, - 27992, 33116, 40100, 44329, 47558, 50679, 53130, 55557, - 57510, 59022, 60285, 61345, 62316, 63140, 63762, 64321, - 64729, 65099, 65535 -}; - -const SKP_int SKP_Silk_pitch_contour_CDF_offset = 17; - -const SKP_uint16 SKP_Silk_pitch_delta_CDF[23] = { - 0, 343, 740, 1249, 1889, 2733, 3861, 5396, - 7552, 10890, 16053, 24152, 30220, 34680, 37973, 40405, - 42243, 43708, 44823, 45773, 46462, 47055, 65535 -}; - -const SKP_int SKP_Silk_pitch_delta_CDF_offset = 11; diff --git a/libs/silk/src/SKP_Silk_tables_pulses_per_block.c b/libs/silk/src/SKP_Silk_tables_pulses_per_block.c deleted file mode 100644 index 6b150458c4..0000000000 --- a/libs/silk/src/SKP_Silk_tables_pulses_per_block.c +++ /dev/null @@ -1,234 +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_tables.h" - -const SKP_int SKP_Silk_max_pulses_table[ 4 ] = { - 6, 8, 12, 18 -}; - -const SKP_uint16 SKP_Silk_pulses_per_block_CDF[ 10 ][ 21 ] = -{ -{ - 0, 47113, 61501, 64590, 65125, 65277, 65352, 65407, - 65450, 65474, 65488, 65501, 65508, 65514, 65516, 65520, - 65521, 65523, 65524, 65526, 65535 -}, -{ - 0, 26368, 47760, 58803, 63085, 64567, 65113, 65333, - 65424, 65474, 65498, 65511, 65517, 65520, 65523, 65525, - 65526, 65528, 65529, 65530, 65535 -}, -{ - 0, 9601, 28014, 45877, 57210, 62560, 64611, 65260, - 65447, 65500, 65511, 65519, 65521, 65525, 65526, 65529, - 65530, 65531, 65532, 65534, 65535 -}, -{ - 0, 3351, 12462, 25972, 39782, 50686, 57644, 61525, - 63521, 64506, 65009, 65255, 65375, 65441, 65471, 65488, - 65497, 65505, 65509, 65512, 65535 -}, -{ - 0, 488, 2944, 9295, 19712, 32160, 43976, 53121, - 59144, 62518, 64213, 65016, 65346, 65470, 65511, 65515, - 65525, 65529, 65531, 65534, 65535 -}, -{ - 0, 17013, 30405, 40812, 48142, 53466, 57166, 59845, - 61650, 62873, 63684, 64223, 64575, 64811, 64959, 65051, - 65111, 65143, 65165, 65183, 65535 -}, -{ - 0, 2994, 8323, 15845, 24196, 32300, 39340, 45140, - 49813, 53474, 56349, 58518, 60167, 61397, 62313, 62969, - 63410, 63715, 63906, 64056, 65535 -}, -{ - 0, 88, 721, 2795, 7542, 14888, 24420, 34593, - 43912, 51484, 56962, 60558, 62760, 64037, 64716, 65069, - 65262, 65358, 65398, 65420, 65535 -}, -{ - 0, 287, 789, 2064, 4398, 8174, 13534, 20151, - 27347, 34533, 41295, 47242, 52070, 55772, 58458, 60381, - 61679, 62533, 63109, 63519, 65535 -}, -{ - 0, 1, 3, 91, 4521, 14708, 28329, 41955, - 52116, 58375, 61729, 63534, 64459, 64924, 65092, 65164, - 65182, 65198, 65203, 65211, 65535 -} -}; - -const SKP_int SKP_Silk_pulses_per_block_CDF_offset = 6; - - -const SKP_int16 SKP_Silk_pulses_per_block_BITS_Q6[ 9 ][ 20 ] = -{ -{ - 30, 140, 282, 444, 560, 625, 654, 677, - 731, 780, 787, 844, 859, 960, 896, 1024, - 960, 1024, 960, 821 -}, -{ - 84, 103, 164, 252, 350, 442, 526, 607, - 663, 731, 787, 859, 923, 923, 960, 1024, - 960, 1024, 1024, 875 -}, -{ - 177, 117, 120, 162, 231, 320, 426, 541, - 657, 803, 832, 960, 896, 1024, 923, 1024, - 1024, 1024, 960, 1024 -}, -{ - 275, 182, 146, 144, 166, 207, 261, 322, - 388, 450, 516, 582, 637, 710, 762, 821, - 832, 896, 923, 734 -}, -{ - 452, 303, 216, 170, 153, 158, 182, 220, - 274, 337, 406, 489, 579, 681, 896, 811, - 896, 960, 923, 1024 -}, -{ - 125, 147, 170, 202, 232, 265, 295, 332, - 368, 406, 443, 483, 520, 563, 606, 646, - 704, 739, 757, 483 -}, -{ - 285, 232, 200, 190, 193, 206, 224, 244, - 266, 289, 315, 340, 367, 394, 425, 462, - 496, 539, 561, 350 -}, -{ - 611, 428, 319, 242, 202, 178, 172, 180, - 199, 229, 268, 313, 364, 422, 482, 538, - 603, 683, 739, 586 -}, -{ - 501, 450, 364, 308, 264, 231, 212, 204, - 204, 210, 222, 241, 265, 295, 326, 362, - 401, 437, 469, 321 -} -}; - -const SKP_uint16 SKP_Silk_rate_levels_CDF[ 2 ][ 10 ] = -{ -{ - 0, 2005, 12717, 20281, 31328, 36234, 45816, 57753, - 63104, 65535 -}, -{ - 0, 8553, 23489, 36031, 46295, 53519, 56519, 59151, - 64185, 65535 -} -}; - -const SKP_int SKP_Silk_rate_levels_CDF_offset = 4; - - -const SKP_int16 SKP_Silk_rate_levels_BITS_Q6[ 2 ][ 9 ] = -{ -{ - 322, 167, 199, 164, 239, 178, 157, 231, - 304 -}, -{ - 188, 137, 153, 171, 204, 285, 297, 237, - 358 -} -}; - -const SKP_uint16 SKP_Silk_shell_code_table0[ 33 ] = { - 0, 32748, 65535, 0, 9505, 56230, 65535, 0, - 4093, 32204, 61720, 65535, 0, 2285, 16207, 48750, - 63424, 65535, 0, 1709, 9446, 32026, 55752, 63876, - 65535, 0, 1623, 6986, 21845, 45381, 59147, 64186, - 65535 -}; - -const SKP_uint16 SKP_Silk_shell_code_table1[ 52 ] = { - 0, 32691, 65535, 0, 12782, 52752, 65535, 0, - 4847, 32665, 60899, 65535, 0, 2500, 17305, 47989, - 63369, 65535, 0, 1843, 10329, 32419, 55433, 64277, - 65535, 0, 1485, 7062, 21465, 43414, 59079, 64623, - 65535, 0, 0, 4841, 14797, 31799, 49667, 61309, - 65535, 65535, 0, 0, 0, 8032, 21695, 41078, - 56317, 65535, 65535, 65535 -}; - -const SKP_uint16 SKP_Silk_shell_code_table2[ 102 ] = { - 0, 32615, 65535, 0, 14447, 50912, 65535, 0, - 6301, 32587, 59361, 65535, 0, 3038, 18640, 46809, - 62852, 65535, 0, 1746, 10524, 32509, 55273, 64278, - 65535, 0, 1234, 6360, 21259, 43712, 59651, 64805, - 65535, 0, 1020, 4461, 14030, 32286, 51249, 61904, - 65100, 65535, 0, 851, 3435, 10006, 23241, 40797, - 55444, 63009, 65252, 65535, 0, 0, 2075, 7137, - 17119, 31499, 46982, 58723, 63976, 65535, 65535, 0, - 0, 0, 3820, 11572, 23038, 37789, 51969, 61243, - 65535, 65535, 65535, 0, 0, 0, 0, 6882, - 16828, 30444, 44844, 57365, 65535, 65535, 65535, 65535, - 0, 0, 0, 0, 0, 10093, 22963, 38779, - 54426, 65535, 65535, 65535, 65535, 65535 -}; - -const SKP_uint16 SKP_Silk_shell_code_table3[ 207 ] = { - 0, 32324, 65535, 0, 15328, 49505, 65535, 0, - 7474, 32344, 57955, 65535, 0, 3944, 19450, 45364, - 61873, 65535, 0, 2338, 11698, 32435, 53915, 63734, - 65535, 0, 1506, 7074, 21778, 42972, 58861, 64590, - 65535, 0, 1027, 4490, 14383, 32264, 50980, 61712, - 65043, 65535, 0, 760, 3022, 9696, 23264, 41465, - 56181, 63253, 65251, 65535, 0, 579, 2256, 6873, - 16661, 31951, 48250, 59403, 64198, 65360, 65535, 0, - 464, 1783, 5181, 12269, 24247, 39877, 53490, 61502, - 64591, 65410, 65535, 0, 366, 1332, 3880, 9273, - 18585, 32014, 45928, 56659, 62616, 64899, 65483, 65535, - 0, 286, 1065, 3089, 6969, 14148, 24859, 38274, - 50715, 59078, 63448, 65091, 65481, 65535, 0, 0, - 482, 2010, 5302, 10408, 18988, 30698, 43634, 54233, - 60828, 64119, 65288, 65535, 65535, 0, 0, 0, - 1006, 3531, 7857, 14832, 24543, 36272, 47547, 56883, - 62327, 64746, 65535, 65535, 65535, 0, 0, 0, - 0, 1863, 4950, 10730, 19284, 29397, 41382, 52335, - 59755, 63834, 65535, 65535, 65535, 65535, 0, 0, - 0, 0, 0, 2513, 7290, 14487, 24275, 35312, - 46240, 55841, 62007, 65535, 65535, 65535, 65535, 65535, - 0, 0, 0, 0, 0, 0, 3606, 9573, - 18764, 28667, 40220, 51290, 59924, 65535, 65535, 65535, - 65535, 65535, 65535, 0, 0, 0, 0, 0, - 0, 0, 4879, 13091, 23376, 36061, 49395, 59315, - 65535, 65535, 65535, 65535, 65535, 65535, 65535 -}; - -const SKP_uint16 SKP_Silk_shell_code_table_offsets[ 19 ] = { - 0, 0, 3, 7, 12, 18, 25, 33, - 42, 52, 63, 75, 88, 102, 117, 133, - 150, 168, 187 -}; diff --git a/libs/silk/src/SKP_Silk_tables_sign.c b/libs/silk/src/SKP_Silk_tables_sign.c deleted file mode 100644 index d5dba17a0a..0000000000 --- a/libs/silk/src/SKP_Silk_tables_sign.c +++ /dev/null @@ -1,41 +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_tables.h" - -const SKP_uint16 SKP_Silk_sign_CDF[ 36 ] = -{ - 37840, 36944, 36251, 35304, - 34715, 35503, 34529, 34296, - 34016, 47659, 44945, 42503, - 40235, 38569, 40254, 37851, - 37243, 36595, 43410, 44121, - 43127, 40978, 38845, 40433, - 38252, 37795, 36637, 59159, - 55630, 51806, 48073, 45036, - 48416, 43857, 42678, 41146, -}; diff --git a/libs/silk/src/SKP_Silk_tables_type_offset.c b/libs/silk/src/SKP_Silk_tables_type_offset.c deleted file mode 100644 index 19990174e8..0000000000 --- a/libs/silk/src/SKP_Silk_tables_type_offset.c +++ /dev/null @@ -1,51 +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_tables.h" - -const SKP_uint16 SKP_Silk_type_offset_CDF[ 5 ] = { - 0, 37522, 41030, 44212, 65535 -}; - -const SKP_int SKP_Silk_type_offset_CDF_offset = 2; - - -const SKP_uint16 SKP_Silk_type_offset_joint_CDF[ 4 ][ 5 ] = -{ -{ - 0, 57686, 61230, 62358, 65535 -}, -{ - 0, 18346, 40067, 43659, 65535 -}, -{ - 0, 22694, 24279, 35507, 65535 -}, -{ - 0, 6067, 7215, 13010, 65535 -} -}; diff --git a/libs/silk/src/SKP_Silk_tuning_parameters.h b/libs/silk/src/SKP_Silk_tuning_parameters.h deleted file mode 100644 index 87def86f42..0000000000 --- a/libs/silk/src/SKP_Silk_tuning_parameters.h +++ /dev/null @@ -1,183 +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_TUNING_PARAMETERS_H -#define SKP_SILK_TUNING_PARAMETERS_H - -#ifdef __cplusplus -extern "C" -{ -#endif - -/*******************/ -/* Pitch estimator */ -/*******************/ - -/* Level of noise floor for whitening filter LPC analysis in pitch analysis */ -#define FIND_PITCH_WHITE_NOISE_FRACTION 1e-3f - -/* Bandwidth expansion for whitening filter in pitch analysis */ -#define FIND_PITCH_BANDWITH_EXPANSION 0.99f - -/* Threshold used by pitch estimator for early escape */ -#define FIND_PITCH_CORRELATION_THRESHOLD_HC_MODE 0.7f -#define FIND_PITCH_CORRELATION_THRESHOLD_MC_MODE 0.75f -#define FIND_PITCH_CORRELATION_THRESHOLD_LC_MODE 0.8f - -/*********************/ -/* Linear prediction */ -/*********************/ - -/* LPC analysis defines: regularization and bandwidth expansion */ -#define FIND_LPC_COND_FAC 2.5e-5f -#define FIND_LPC_CHIRP 0.99995f - -/* LTP analysis defines */ -#define FIND_LTP_COND_FAC 1e-5f -#define LTP_DAMPING 0.01f -#define LTP_SMOOTHING 0.1f - -/* LTP quantization settings */ -#define MU_LTP_QUANT_NB 0.03f -#define MU_LTP_QUANT_MB 0.025f -#define MU_LTP_QUANT_WB 0.02f -#define MU_LTP_QUANT_SWB 0.016f - -/***********************/ -/* High pass filtering */ -/***********************/ - -/* Smoothing parameters for low end of pitch frequency range estimation */ -#define VARIABLE_HP_SMTH_COEF1 0.1f -#define VARIABLE_HP_SMTH_COEF2 0.015f - -/* Min and max values for low end of pitch frequency range estimation */ -#define VARIABLE_HP_MIN_FREQ 80.0f -#define VARIABLE_HP_MAX_FREQ 150.0f - -/* Max absolute difference between log2 of pitch frequency and smoother state, to enter the smoother */ -#define VARIABLE_HP_MAX_DELTA_FREQ 0.4f - -/***********/ -/* Various */ -/***********/ - -/* Required speech activity for counting frame as active */ -#define WB_DETECT_ACTIVE_SPEECH_LEVEL_THRES 0.7f - -#define SPEECH_ACTIVITY_DTX_THRES 0.1f - -/* Speech Activity LBRR enable threshold (needs tuning) */ -#define LBRR_SPEECH_ACTIVITY_THRES 0.5f - -/*************************/ -/* Perceptual parameters */ -/*************************/ - -/* reduction in coding SNR during low speech activity */ -#define BG_SNR_DECR_dB 4.0f - -/* factor for reducing quantization noise during voiced speech */ -#define HARM_SNR_INCR_dB 2.0f - -/* factor for reducing quantization noise for unvoiced sparse signals */ -#define SPARSE_SNR_INCR_dB 2.0f - -/* threshold for sparseness measure above which to use lower quantization offset during unvoiced */ -#define SPARSENESS_THRESHOLD_QNT_OFFSET 0.75f - -/* warping control */ -#define WARPING_MULTIPLIER 0.015f - -/* fraction added to first autocorrelation value */ -#define SHAPE_WHITE_NOISE_FRACTION 1e-5f - -/* noise shaping filter chirp factor */ -#define BANDWIDTH_EXPANSION 0.95f - -/* difference between chirp factors for analysis and synthesis noise shaping filters at low bitrates */ -#define LOW_RATE_BANDWIDTH_EXPANSION_DELTA 0.01f - -/* gain reduction for fricatives */ -#define DE_ESSER_COEF_SWB_dB 2.0f -#define DE_ESSER_COEF_WB_dB 1.0f - -/* extra harmonic boosting (signal shaping) at low bitrates */ -#define LOW_RATE_HARMONIC_BOOST 0.1f - -/* extra harmonic boosting (signal shaping) for noisy input signals */ -#define LOW_INPUT_QUALITY_HARMONIC_BOOST 0.1f - -/* harmonic noise shaping */ -#define HARMONIC_SHAPING 0.3f - -/* extra harmonic noise shaping for high bitrates or noisy input */ -#define HIGH_RATE_OR_LOW_QUALITY_HARMONIC_SHAPING 0.2f - -/* parameter for shaping noise towards higher frequencies */ -#define HP_NOISE_COEF 0.3f - -/* parameter for shaping noise even more towards higher frequencies during voiced speech */ -#define HARM_HP_NOISE_COEF 0.35f - -/* parameter for applying a high-pass tilt to the input signal */ -#define INPUT_TILT 0.05f - -/* parameter for extra high-pass tilt to the input signal at high rates */ -#define HIGH_RATE_INPUT_TILT 0.1f - -/* parameter for reducing noise at the very low frequencies */ -#define LOW_FREQ_SHAPING 3.0f - -/* less reduction of noise at the very low frequencies for signals with low SNR at low frequencies */ -#define LOW_QUALITY_LOW_FREQ_SHAPING_DECR 0.5f - -/* noise floor to put a lower limit on the quantization step size */ -#define NOISE_FLOOR_dB 4.0f - -/* noise floor relative to active speech gain level */ -#define RELATIVE_MIN_GAIN_dB -50.0f - -/* subframe smoothing coefficient for determining active speech gain level (lower -> more smoothing) */ -#define GAIN_SMOOTHING_COEF 1e-3f - -/* subframe smoothing coefficient for HarmBoost, HarmShapeGain, Tilt (lower -> more smoothing) */ -#define SUBFR_SMTH_COEF 0.4f - -/* parameters defining the R/D tradeoff in the residual quantizer */ -#define LAMBDA_OFFSET 1.2f -#define LAMBDA_SPEECH_ACT -0.3f -#define LAMBDA_DELAYED_DECISIONS -0.05f -#define LAMBDA_INPUT_QUALITY -0.2f -#define LAMBDA_CODING_QUALITY -0.1f -#define LAMBDA_QUANT_OFFSET 1.5f - -#ifdef __cplusplus -} -#endif - -#endif // SKP_SILK_TUNING_PARAMETERS_H diff --git a/libs/silk/src/SKP_Silk_warped_autocorrelation_FIX.c b/libs/silk/src/SKP_Silk_warped_autocorrelation_FIX.c deleted file mode 100644 index 4d4f2243d0..0000000000 --- a/libs/silk/src/SKP_Silk_warped_autocorrelation_FIX.c +++ /dev/null @@ -1,85 +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_FIX.h" - -#define QC 10 -#define QS 14 - - -/* Autocorrelations for a warped frequency axis */ -void SKP_Silk_warped_autocorrelation_FIX( - SKP_int32 *corr, /* O Result [order + 1] */ - SKP_int *scale, /* O Scaling of the correlation vector */ - const SKP_int16 *input, /* I Input data to correlate */ - const SKP_int16 warping_Q16, /* I Warping coefficient */ - const SKP_int length, /* I Length of input */ - const SKP_int order /* I Correlation order (even) */ -) -{ - SKP_int n, i, lsh; - SKP_int32 tmp1_QS, tmp2_QS; - SKP_int32 state_QS[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 }; - SKP_int64 corr_QC[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 }; - - /* Order must be even */ - SKP_assert( ( order & 1 ) == 0 ); - SKP_assert( 2 * QS - QC >= 0 ); - - /* Loop over samples */ - for( n = 0; n < length; n++ ) { - tmp1_QS = SKP_LSHIFT32( ( SKP_int32 )input[ n ], QS ); - /* Loop over allpass sections */ - for( i = 0; i < order; i += 2 ) { - /* Output of allpass section */ - tmp2_QS = SKP_SMLAWB( state_QS[ i ], state_QS[ i + 1 ] - tmp1_QS, warping_Q16 ); - state_QS[ i ] = tmp1_QS; - corr_QC[ i ] += SKP_RSHIFT64( SKP_SMULL( tmp1_QS, state_QS[ 0 ] ), 2 * QS - QC ); - /* Output of allpass section */ - tmp1_QS = SKP_SMLAWB( state_QS[ i + 1 ], state_QS[ i + 2 ] - tmp2_QS, warping_Q16 ); - state_QS[ i + 1 ] = tmp2_QS; - corr_QC[ i + 1 ] += SKP_RSHIFT64( SKP_SMULL( tmp2_QS, state_QS[ 0 ] ), 2 * QS - QC ); - } - state_QS[ order ] = tmp1_QS; - corr_QC[ order ] += SKP_RSHIFT64( SKP_SMULL( tmp1_QS, state_QS[ 0 ] ), 2 * QS - QC ); - } - - lsh = SKP_Silk_CLZ64( corr_QC[ 0 ] ) - 35; - lsh = SKP_LIMIT( lsh, -12 - QC, 30 - QC ); - *scale = -( QC + lsh ); - SKP_assert( *scale >= -30 && *scale <= 12 ); - if( lsh >= 0 ) { - for( i = 0; i < order + 1; i++ ) { - corr[ i ] = ( SKP_int32 )SKP_CHECK_FIT32( SKP_LSHIFT64( corr_QC[ i ], lsh ) ); - } - } else { - for( i = 0; i < order + 1; i++ ) { - corr[ i ] = ( SKP_int32 )SKP_CHECK_FIT32( SKP_RSHIFT64( corr_QC[ i ], -lsh ) ); - } - } - SKP_assert( corr_QC[ 0 ] >= 0 ); // If breaking, decrease QC -} diff --git a/libs/silk/src/Silk_FIX.2008.vcproj b/libs/silk/src/Silk_FIX.2008.vcproj deleted file mode 100644 index 2593adf63a..0000000000 --- a/libs/silk/src/Silk_FIX.2008.vcproj +++ /dev/null @@ -1,826 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/silk/src/Silk_FIX.2010.vcxproj.filters b/libs/silk/src/Silk_FIX.2010.vcxproj.filters deleted file mode 100644 index 2e9c4ec510..0000000000 --- a/libs/silk/src/Silk_FIX.2010.vcxproj.filters +++ /dev/null @@ -1,413 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - \ No newline at end of file diff --git a/libs/silk/src/Silk_FIX.2015.vcxproj b/libs/silk/src/Silk_FIX.2015.vcxproj deleted file mode 100644 index a128379ec3..0000000000 --- a/libs/silk/src/Silk_FIX.2015.vcxproj +++ /dev/null @@ -1,273 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - Silk_FIX - {56B91D01-9150-4BBF-AFA1-5B68AB991B76} - Silk - Win32Proj - - - - StaticLibrary - Unicode - true - v140 - - - StaticLibrary - Unicode - v140 - - - StaticLibrary - Unicode - true - v140 - - - StaticLibrary - Unicode - v140 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - - - - Disabled - Neither - ../interface;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebugDLL - Fast - Level3 - - - - - MaxSpeed - Default - Neither - ../interface;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) - false - false - MultiThreadedDLL - Fast - Level3 - - - - - X64 - - - Disabled - Neither - ../interface;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebugDLL - Fast - Level3 - - - - - - - - - X64 - - - MaxSpeed - Default - Neither - ../interface;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) - false - false - MultiThreadedDLL - Fast - Level3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/libs/silk/src/Silk_FIX.vcproj b/libs/silk/src/Silk_FIX.vcproj deleted file mode 100644 index c60578a6ad..0000000000 --- a/libs/silk/src/Silk_FIX.vcproj +++ /dev/null @@ -1,692 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/silk/test/Dec_SDK.vcproj b/libs/silk/test/Dec_SDK.vcproj deleted file mode 100644 index 131586b52b..0000000000 --- a/libs/silk/test/Dec_SDK.vcproj +++ /dev/null @@ -1,217 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/silk/test/Decoder.c b/libs/silk/test/Decoder.c deleted file mode 100644 index c3c55f2609..0000000000 --- a/libs/silk/test/Decoder.c +++ /dev/null @@ -1,418 +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 -#include -#include -#include "SKP_Silk_SDK_API.h" -#include "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 FRAME_LENGTH_MS 20 -#define MAX_API_FS_KHZ 48 -#define MAX_LBRR_DELAY 2 - -#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 - -/* Seed for the random number generator, which is used for simulating packet loss */ -static SKP_int32 rand_seed = 1; - -static void print_usage(char* argv[]) { - printf( "\nusage: %s in.bit out.pcm [settings]\n", argv[ 0 ] ); - printf( "\nstream.bit : Bitstream input to decoder" ); - printf( "\nout.pcm : Speech output from decoder" ); - printf( "\n settings:" ); - printf( "\n-Fs_API : Sampling rate of output signal in Hz; default: 24000" ); - printf( "\n-loss : Simulated packet loss percentage (0-100); default: 0" ); - printf( "\n" ); -} - -int main( int argc, char* argv[] ) -{ - size_t counter; - SKP_int32 args, totPackets, i, k; - SKP_int16 ret, len, tot_len; - SKP_int16 nBytes; - SKP_uint8 payload[ MAX_BYTES_PER_FRAME * MAX_INPUT_FRAMES * ( MAX_LBRR_DELAY + 1 ) ]; - SKP_uint8 *payloadEnd = NULL, *payloadToDec = NULL; - SKP_uint8 FECpayload[ MAX_BYTES_PER_FRAME * MAX_INPUT_FRAMES ], *payloadPtr; - SKP_int16 nBytesFEC; - SKP_int16 nBytesPerPacket[ MAX_LBRR_DELAY + 1 ], totBytes; - SKP_int16 out[ ( ( 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; - SKP_int32 decSizeBytes; - void *psDec; - float loss_prob; - SKP_int32 frames, lost, quiet; - SKP_SILK_SDK_DecControlStruct DecControl; - - 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 ], "-quiet" ) == 0 ) { - quiet = 1; - args++; - } else { - printf( "Error: unrecognized setting: %s\n\n", argv[ args ] ); - print_usage( argv ); - exit( 0 ); - } - } - - if( !quiet ) { - printf("******************* Silk Decoder v %s ****************\n", SKP_Silk_SDK_get_version()); - 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 ); - } - - /* Check Silk header */ - { - char header_buf[ 50 ]; - counter = fread( header_buf, sizeof( char ), strlen( "#!SILK_V3" ), bitInFile ); - header_buf[ strlen( "#!SILK_V3" ) ] = ( char )0; /* Terminate with a null character */ - if( strcmp( header_buf, "#!SILK_V3" ) != 0 ) { - /* Non-equal strings */ - printf( "Error: Wrong Header %s\n", header_buf ); - 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; - } - - /* Initialize to one frame per packet, for proper concealment before first packet arrives */ - DecControl.framesPerPacket = 1; - - /* 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_int16 ), 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_int16 ), 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; - } - - /* Simulate losses */ - rand_seed = SKP_RAND( rand_seed ); - if( ( ( ( float )( ( rand_seed >> 16 ) + ( 1 << 15 ) ) ) / 65535.0f >= ( loss_prob / 100.0f ) ) && ( 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 ) { - SKP_Silk_SDK_search_for_LBRR( payloadPtr, nBytesPerPacket[ i + 1 ], i + 1, FECpayload, &nBytesFEC ); - if( nBytesFEC > 0 ) { - payloadToDec = FECpayload; - nBytes = nBytesFEC; - lost = 0; - break; - } - } - 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, payloadToDec, 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( DecControl.moreInternalDecoderFrames ); - } else { - /* Loss: Decode enough frames to cover one packet duration */ - for( i = 0; i < DecControl.framesPerPacket; i++ ) { - /* Generate 20 ms */ - ret = SKP_Silk_SDK_Decode( psDec, &DecControl, 1, payloadToDec, 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 ) { - 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 ) { - SKP_Silk_SDK_search_for_LBRR( payloadPtr, nBytesPerPacket[ i + 1 ], i + 1, FECpayload, &nBytesFEC ); - if( nBytesFEC > 0 ) { - payloadToDec = FECpayload; - nBytes = nBytesFEC; - lost = 0; - break; - } - } - 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, payloadToDec, 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( DecControl.moreInternalDecoderFrames ); - } else { - /* Loss: Decode enough frames to cover one packet duration */ - - /* Generate 20 ms */ - for( i = 0; i < DecControl.framesPerPacket; i++ ) { - ret = SKP_Silk_SDK_Decode( psDec, &DecControl, 1, payloadToDec, 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 ) { - fprintf( stderr, "\rPackets decoded: %d", totPackets ); - } - } - - if( !quiet ) { - printf( "\nDecoding Finished \n" ); - } - - /* Free decoder */ - free( psDec ); - - /* Close files */ - fclose( speechOutFile ); - fclose( bitInFile ); - - return 0; -} diff --git a/libs/silk/test/Enc_SDK.vcproj b/libs/silk/test/Enc_SDK.vcproj deleted file mode 100644 index 4415931c01..0000000000 --- a/libs/silk/test/Enc_SDK.vcproj +++ /dev/null @@ -1,217 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/silk/test/Encoder.c b/libs/silk/test/Encoder.c deleted file mode 100644 index 8a788dd1a7..0000000000 --- a/libs/silk/test/Encoder.c +++ /dev/null @@ -1,318 +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 -#include -#include -#include -#include "SKP_Silk_SDK_API.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 480 -#define FRAME_LENGTH_MS 20 -#define MAX_API_FS_KHZ 48 - -#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( "\nstream.bit : Bitstream output from encoder" ); - printf( "\n settings:" ); - printf( "\n-Fs_API : API sampling rate in Hz, default: 24000" ); - printf( "\n-Fs_maxInternal : Maximum internal sampling rate in Hz, default: 24000" ); - printf( "\n-packetlength : Packet interval in ms, default: 20" ); - printf( "\n-rate : Target bitrate; default: 25000" ); - printf( "\n-loss : Uplink loss estimate, in percent (0-100); default: 0" ); - printf( "\n-inbandFEC : Enable inband FEC usage (0/1); default: 0" ); - printf( "\n-complexity : Set complexity, 0: low, 1: medium, 2: high; default: 2" ); - printf( "\n-DTX : Enable DTX (0/1); default: 0" ); - printf( "\n-quiet : Print only some basic values" ); - printf( "\n"); -} - -int main( int argc, char* argv[] ) -{ - size_t counter; - SKP_int32 k, args, totPackets, totActPackets, ret; - SKP_int16 nBytes; - double sumBytes, sumActBytes, avg_rate, act_rate, nrg; - SKP_uint8 payload[ MAX_BYTES_PER_FRAME * MAX_INPUT_FRAMES ]; - SKP_int16 in[ FRAME_LENGTH_MS * MAX_API_FS_KHZ * MAX_INPUT_FRAMES ]; - char speechInFileName[ 150 ], bitOutFileName[ 150 ]; - FILE *bitOutFile, *speechInFile; - SKP_int32 encSizeBytes; - void *psEnc; -#ifdef _SYSTEM_IS_BIG_ENDIAN - SKP_int16 nBytes_LE; -#endif - - /* default settings */ - SKP_int32 API_fs_Hz = 24000; - SKP_int32 max_internal_fs_Hz = 0; - SKP_int32 targetRate_bps = 25000; - SKP_int32 packetSize_ms = 20; - SKP_int32 frameSizeReadFromFile_ms = 20; - 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 is specified, set to minimum of API fs and 24 kHz */ - if( max_internal_fs_Hz == 0 ) { - max_internal_fs_Hz = 24000; - if( API_fs_Hz < max_internal_fs_Hz ) { - max_internal_fs_Hz = API_fs_Hz; - } - } - - /* Print options */ - if( !quiet ) { - printf("******************* Silk Encoder v %s ****************\n", SKP_Silk_SDK_get_version()); - 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 ); - } - - /* Add Silk header to stream */ - { - static const char Silk_header[] = "#!SILK_V3"; - fwrite( Silk_header, sizeof( char ), strlen( Silk_header ), bitOutFile ); - } - - /* 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.packetSize = ( packetSize_ms * API_fs_Hz ) / 1000; - 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 ) { - /* 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, payload, &nBytes ); - if( ret ) { - printf( "\nSKP_Silk_Encode returned %d", ret ); - break; - } - - /* Get packet size */ - packetSize_ms = ( SKP_int )( ( 1000 * ( SKP_int32 )encControl.packetSize ) / encControl.API_sampleRate ); - - smplsSinceLastPacket += ( SKP_int )counter; - - if( ( ( 1000 * smplsSinceLastPacket ) / API_fs_Hz ) == packetSize_ms ) { - /* 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_int16 ), 1, bitOutFile ); -#endif - - /* Write payload */ - fwrite( payload, sizeof( SKP_uint8 ), nBytes, bitOutFile ); - - if( !quiet ) { - 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_int16 ), 1, bitOutFile ); - - /* Free Encoder */ - free( psEnc ); - - fclose( speechInFile ); - fclose( bitOutFile ); - - avg_rate = 8.0 / packetSize_ms * sumBytes / totPackets; - act_rate = 8.0 / packetSize_ms * sumActBytes / totActPackets; - if( !quiet ) { - printf( "\nAverage bitrate: %.3f kbps", avg_rate ); - printf( "\nActive bitrate: %.3f kbps", act_rate ); - printf( "\n\n" ); - } else { - /* print average and active bitrates */ - printf( "%.3f %.3f \n", avg_rate, act_rate ); - } - return 0; -} diff --git a/libs/silk/test/SignalCompare.vcproj b/libs/silk/test/SignalCompare.vcproj deleted file mode 100644 index 162769788b..0000000000 --- a/libs/silk/test/SignalCompare.vcproj +++ /dev/null @@ -1,197 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/silk/test/signalCompare.c b/libs/silk/test/signalCompare.c deleted file mode 100644 index 6c5486799f..0000000000 --- a/libs/silk/test/signalCompare.c +++ /dev/null @@ -1,376 +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 -#include -#include -#include - -#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 48 -#define LPC_ORDER 10 -#define SNR_THRESHOLD 15.0 - -#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 : Sampling rate in Hz, max: %d; default: 48000", MAX_FS_KHZ * 1000 ); - printf("\n"); -} - - -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 are bit-exact PASS\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 are bit-exact PASS\n"); - } else { - printf("Average weighted SNR: %4.1f dB ", SNR / nFrames); - if( SNR / nFrames < SNR_THRESHOLD ) { - printf("FAIL\n"); - } else { - printf("PASS\n"); - } - } - } - 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; -} diff --git a/libs/silk/test_vectors/How to use the test vectors.txt b/libs/silk/test_vectors/How to use the test vectors.txt deleted file mode 100644 index 43160c5b55..0000000000 --- a/libs/silk/test_vectors/How to use the test vectors.txt +++ /dev/null @@ -1,24 +0,0 @@ -Use the following scripts to verify the decoder implementation: - -o test_encoder.bat / test_encoder.sh - - Make sure the encoder executable to be tested exists in the parent directory, and run - test_encoder.bat (win) or test_encoder.sh (linux/mac). This will run the encoder - and compare the output bitstream with the reference bitstream files. The result is - written to test_encoder_report.txt. - For each file, the bitstreams are either bit-exact or they differ. The compatibility - test is passed if each file is reported as "PASS". - -o test_decoder.bat / test_decoder.sh - - Make sure the decoder executable to be tested exists in the parent directory, and run - test_decoder.bat (win) or test_decoder.sh (linux/mac). This will run the decoder - and compare the output audio file with the reference audio files. The result is - written to test_decoder_report.txt. - For each file, the bitstreams are either bit-exact or they match up to a certain - average weighted SNR. The compatibility test is passed if each file is reported as - "PASS". - - -NOTE: When using the shell script, make sure it is marked as executable. - This can be done by: chmod +x *.sh diff --git a/libs/silk/test_vectors/test_decoder.bat b/libs/silk/test_vectors/test_decoder.bat deleted file mode 100644 index ff10c9e33f..0000000000 --- a/libs/silk/test_vectors/test_decoder.bat +++ /dev/null @@ -1,143 +0,0 @@ -@echo off - -SET BITSTREAMPATH=./test_vectors/bitstream/ -SET OUTPUTPATH=./test_vectors/output/ -SET DEC=Decoder.exe -SET COMP=SignalCompare.exe - -cd .. - -:: 8 kHz - -:: 8 kHz, 60 ms, 8 kbps, complexity 0 -SET PARAMS=8_kHz_60_ms_8_kbps -%DEC% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.pcm -%COMP% %OUTPUTPATH%testvector_output_%PARAMS%.pcm tmp.pcm -fs 24000 > test_decoder_report.txt - -%DEC% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.pcm -Fs_API 8000 -%COMP% %OUTPUTPATH%testvector_output_%PARAMS%_8_kHz_out.pcm tmp.pcm -fs 8000 >> test_decoder_report.txt - -%DEC% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.pcm -Fs_API 12000 -%COMP% %OUTPUTPATH%testvector_output_%PARAMS%_12_kHz_out.pcm tmp.pcm -fs 12000 >> test_decoder_report.txt - -%DEC% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.pcm -Fs_API 16000 -%COMP% %OUTPUTPATH%testvector_output_%PARAMS%_16_kHz_out.pcm tmp.pcm -fs 16000 >> test_decoder_report.txt - -:: 8 kHz, 40 ms, 12 kbps, complexity 1 -SET PARAMS=8_kHz_40_ms_12_kbps -%DEC% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.pcm -%COMP% %OUTPUTPATH%testvector_output_%PARAMS%.pcm tmp.pcm >> test_decoder_report.txt - -:: 8 kHz, 20 ms, 20 kbps, 10% packet loss, FEC -SET PARAMS=8_kHz_20_ms_20_kbps_10_loss_FEC -%DEC% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.pcm -loss 10 -%COMP% %OUTPUTPATH%testvector_output_%PARAMS%.pcm tmp.pcm >> test_decoder_report.txt - - -:: 12 kHz - -:: 12 kHz, 60 ms, 10 kbps, complexity 0 -SET PARAMS=12_kHz_60_ms_10_kbps -%DEC% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.pcm -%COMP% %OUTPUTPATH%testvector_output_%PARAMS%.pcm tmp.pcm >> test_decoder_report.txt - -%DEC% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.pcm -Fs_API 12000 -%COMP% %OUTPUTPATH%testvector_output_%PARAMS%_12_kHz_out.pcm tmp.pcm -fs 12000 >> test_decoder_report.txt - -%DEC% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.pcm -Fs_API 16000 -%COMP% %OUTPUTPATH%testvector_output_%PARAMS%_16_kHz_out.pcm tmp.pcm -fs 16000 >> test_decoder_report.txt - -%DEC% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.pcm -Fs_API 32000 -%COMP% %OUTPUTPATH%testvector_output_%PARAMS%_32_kHz_out.pcm tmp.pcm -fs 32000 >> test_decoder_report.txt - -%DEC% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.pcm -Fs_API 44100 -%COMP% %OUTPUTPATH%testvector_output_%PARAMS%_44100_Hz_out.pcm tmp.pcm -fs 44100 >> test_decoder_report.txt - -%DEC% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.pcm -Fs_API 48000 -%COMP% %OUTPUTPATH%testvector_output_%PARAMS%_48_kHz_out.pcm tmp.pcm -fs 48000 >> test_decoder_report.txt - -:: 12 kHz, 40 ms, 16 kbps, complexity 1 -SET PARAMS=12_kHz_40_ms_16_kbps -%DEC% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.pcm -%COMP% %OUTPUTPATH%testvector_output_%PARAMS%.pcm tmp.pcm >> test_decoder_report.txt - -:: 12 kHz, 20 ms, 24 kbps, 10% packet loss, FEC -SET PARAMS=12_kHz_20_ms_24_kbps_10_loss_FEC -%DEC% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.pcm -loss 10 -%COMP% %OUTPUTPATH%testvector_output_%PARAMS%.pcm tmp.pcm >> test_decoder_report.txt - - -:: 16 kHz - -:: 16 kHz, 60 ms, 12 kbps, complexity 0 -SET PARAMS=16_kHz_60_ms_12_kbps -%DEC% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.pcm -%COMP% %OUTPUTPATH%testvector_output_%PARAMS%.pcm tmp.pcm >> test_decoder_report.txt - -%DEC% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.pcm -Fs_API 16000 -%COMP% %OUTPUTPATH%testvector_output_%PARAMS%_16_kHz_out.pcm tmp.pcm -fs 16000 >> test_decoder_report.txt - -:: 16 kHz, 40 ms, 20 kbps, complexity 1 -SET PARAMS=16_kHz_40_ms_20_kbps -%DEC% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.pcm -%COMP% %OUTPUTPATH%testvector_output_%PARAMS%.pcm tmp.pcm >> test_decoder_report.txt - -:: 16 kHz, 20 ms, 32 kbps, 10% packet loss, FEC -SET PARAMS=16_kHz_20_ms_32_kbps_10_loss_FEC -%DEC% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.pcm -loss 10 -%COMP% %OUTPUTPATH%testvector_output_%PARAMS%.pcm tmp.pcm >> test_decoder_report.txt - - -:: 24 kHz - -:: 24 kHz, 60 ms, 16 kbps, complexity 0 -SET PARAMS=24_kHz_60_ms_16_kbps -%DEC% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.pcm -%COMP% %OUTPUTPATH%testvector_output_%PARAMS%.pcm tmp.pcm >> test_decoder_report.txt - -:: 24 kHz, 40 ms, 24 kbps, complexity 1 -SET PARAMS=24_kHz_40_ms_24_kbps -%DEC% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.pcm -%COMP% %OUTPUTPATH%testvector_output_%PARAMS%.pcm tmp.pcm >> test_decoder_report.txt - -:: 24 kHz, 20 ms, 40 kbps, 10% packet loss, FEC -SET PARAMS=24_kHz_20_ms_40_kbps_10_loss_FEC -%DEC% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.pcm -loss 10 -%COMP% %OUTPUTPATH%testvector_output_%PARAMS%.pcm tmp.pcm >> test_decoder_report.txt - - -:: 32 kHz - -:: 32 kHz, 20 ms, 8 kbps, maxInternal 8kHz -SET PARAMS=32_kHz_max_8_kHz_20_ms_8_kbps - -%DEC% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.pcm -%COMP% %OUTPUTPATH%testvector_output_%PARAMS%.pcm tmp.pcm >> test_decoder_report.txt - -%DEC% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.pcm -Fs_API 32000 -%COMP% %OUTPUTPATH%testvector_output_%PARAMS%_32_kHz_out.pcm tmp.pcm -fs 32000 >> test_decoder_report.txt - -%DEC% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.pcm -Fs_API 44100 -%COMP% %OUTPUTPATH%testvector_output_%PARAMS%_44100_Hz_out.pcm tmp.pcm -fs 44100 >> test_decoder_report.txt - -%DEC% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.pcm -Fs_API 48000 -%COMP% %OUTPUTPATH%testvector_output_%PARAMS%_48_kHz_out.pcm tmp.pcm -fs 48000 >> test_decoder_report.txt - - -:: 44100 Hz - -:: 44100 Hz, 20 ms, 40 kbps -SET PARAMS=44100_Hz_20_ms_7_kbps - -%DEC% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.pcm -%COMP% %OUTPUTPATH%testvector_output_%PARAMS%.pcm tmp.pcm >> test_decoder_report.txt - - -del tmp.pcm -move test_decoder_report.txt ./test_vectors/test_decoder_report.txt - -echo. -echo The results have been saved as test_decoder_report.txt -echo. - -pause diff --git a/libs/silk/test_vectors/test_decoder.sh b/libs/silk/test_vectors/test_decoder.sh deleted file mode 100644 index 08e61fa15a..0000000000 --- a/libs/silk/test_vectors/test_decoder.sh +++ /dev/null @@ -1,142 +0,0 @@ -#!/bin/bash - -BITSTREAMPATH=./test_vectors/bitstream/ -OUTPUTPATH=./test_vectors/output/ -DEC=decoder -COMP=signalcompare - -cd .. - - -# 8 kHz - -# 8 kHz, 60 ms, 8 kbps, complexity 0 -PARAMS=8_kHz_60_ms_8_kbps -./${DEC} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.pcm -./${COMP} ${OUTPUTPATH}testvector_output_${PARAMS}.pcm tmp.pcm -fs 24000 > test_decoder_report.txt - -./${DEC} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.pcm -Fs_API 8000 -./${COMP} ${OUTPUTPATH}testvector_output_${PARAMS}_8_kHz_out.pcm tmp.pcm -fs 8000 >> test_decoder_report.txt - -./${DEC} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.pcm -Fs_API 12000 -./${COMP} ${OUTPUTPATH}testvector_output_${PARAMS}_12_kHz_out.pcm tmp.pcm -fs 12000 >> test_decoder_report.txt - -./${DEC} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.pcm -Fs_API 16000 -./${COMP} ${OUTPUTPATH}testvector_output_${PARAMS}_16_kHz_out.pcm tmp.pcm -fs 16000 >> test_decoder_report.txt - -# 8 kHz, 40 ms, 12 kbps, complexity 1 -PARAMS=8_kHz_40_ms_12_kbps -./${DEC} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.pcm -./${COMP} ${OUTPUTPATH}testvector_output_${PARAMS}.pcm tmp.pcm >> test_decoder_report.txt - -# 8 kHz, 20 ms, 20 kbps, 10% packet loss, FEC -PARAMS=8_kHz_20_ms_20_kbps_10_loss_FEC -./${DEC} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.pcm -loss 10 -./${COMP} ${OUTPUTPATH}testvector_output_${PARAMS}.pcm tmp.pcm >> test_decoder_report.txt - - -# 12 kHz - -# 12 kHz, 60 ms, 10 kbps, complexity 0 -PARAMS=12_kHz_60_ms_10_kbps -./${DEC} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.pcm -./${COMP} ${OUTPUTPATH}testvector_output_${PARAMS}.pcm tmp.pcm >> test_decoder_report.txt - -./${DEC} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.pcm -Fs_API 12000 -./${COMP} ${OUTPUTPATH}testvector_output_${PARAMS}_12_kHz_out.pcm tmp.pcm -fs 12000 >> test_decoder_report.txt - -./${DEC} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.pcm -Fs_API 16000 -./${COMP} ${OUTPUTPATH}testvector_output_${PARAMS}_16_kHz_out.pcm tmp.pcm -fs 16000 >> test_decoder_report.txt - -./${DEC} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.pcm -Fs_API 32000 -./${COMP} ${OUTPUTPATH}testvector_output_${PARAMS}_32_kHz_out.pcm tmp.pcm -fs 32000 >> test_decoder_report.txt - -./${DEC} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.pcm -Fs_API 44100 -./${COMP} ${OUTPUTPATH}testvector_output_${PARAMS}_44100_Hz_out.pcm tmp.pcm -fs 44100 >> test_decoder_report.txt - -./${DEC} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.pcm -Fs_API 48000 -./${COMP} ${OUTPUTPATH}testvector_output_${PARAMS}_48_kHz_out.pcm tmp.pcm -fs 48000 >> test_decoder_report.txt - -# 12 kHz, 40 ms, 16 kbps, complexity 1 -PARAMS=12_kHz_40_ms_16_kbps -./${DEC} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.pcm -./${COMP} ${OUTPUTPATH}testvector_output_${PARAMS}.pcm tmp.pcm >> test_decoder_report.txt - -# 12 kHz, 20 ms, 24 kbps, 10% packet loss, FEC -PARAMS=12_kHz_20_ms_24_kbps_10_loss_FEC -./${DEC} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.pcm -loss 10 -./${COMP} ${OUTPUTPATH}testvector_output_${PARAMS}.pcm tmp.pcm >> test_decoder_report.txt - - -# 16 kHz - -# 16 kHz, 60 ms, 12 kbps, complexity 0 -PARAMS=16_kHz_60_ms_12_kbps -./${DEC} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.pcm -./${COMP} ${OUTPUTPATH}testvector_output_${PARAMS}.pcm tmp.pcm >> test_decoder_report.txt - -./${DEC} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.pcm -Fs_API 16000 -./${COMP} ${OUTPUTPATH}testvector_output_${PARAMS}_16_kHz_out.pcm tmp.pcm -fs 16000 >> test_decoder_report.txt - -# 16 kHz, 40 ms, 20 kbps, complexity 1 -PARAMS=16_kHz_40_ms_20_kbps -./${DEC} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.pcm -./${COMP} ${OUTPUTPATH}testvector_output_${PARAMS}.pcm tmp.pcm >> test_decoder_report.txt - -# 16 kHz, 20 ms, 32 kbps, 10% packet loss, FEC -PARAMS=16_kHz_20_ms_32_kbps_10_loss_FEC -./${DEC} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.pcm -loss 10 -./${COMP} ${OUTPUTPATH}testvector_output_${PARAMS}.pcm tmp.pcm >> test_decoder_report.txt - - -# 24 kHz - -# 24 kHz, 60 ms, 16 kbps, complexity 0 -PARAMS=24_kHz_60_ms_16_kbps -./${DEC} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.pcm -./${COMP} ${OUTPUTPATH}testvector_output_${PARAMS}.pcm tmp.pcm >> test_decoder_report.txt - -# 24 kHz, 40 ms, 24 kbps, complexity 1 -PARAMS=24_kHz_40_ms_24_kbps -./${DEC} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.pcm -./${COMP} ${OUTPUTPATH}testvector_output_${PARAMS}.pcm tmp.pcm >> test_decoder_report.txt - -# 24 kHz, 20 ms, 40 kbps, 10% packet loss, FEC -PARAMS=24_kHz_20_ms_40_kbps_10_loss_FEC -./${DEC} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.pcm -loss 10 -./${COMP} ${OUTPUTPATH}testvector_output_${PARAMS}.pcm tmp.pcm >> test_decoder_report.txt - - -# 32 kHz - -# 32 kHz, 20 ms, 8 kbps, maxInternal 8kHz -PARAMS=32_kHz_max_8_kHz_20_ms_8_kbps - -./${DEC} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.pcm -./${COMP} ${OUTPUTPATH}testvector_output_${PARAMS}.pcm tmp.pcm >> test_decoder_report.txt - -./${DEC} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.pcm -Fs_API 32000 -./${COMP} ${OUTPUTPATH}testvector_output_${PARAMS}_32_kHz_out.pcm tmp.pcm -fs 32000 >> test_decoder_report.txt - -./${DEC} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.pcm -Fs_API 44100 -./${COMP} ${OUTPUTPATH}testvector_output_${PARAMS}_44100_Hz_out.pcm tmp.pcm -fs 44100 >> test_decoder_report.txt - -./${DEC} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.pcm -Fs_API 48000 -./${COMP} ${OUTPUTPATH}testvector_output_${PARAMS}_48_kHz_out.pcm tmp.pcm -fs 48000 >> test_decoder_report.txt - - -# 44100 Hz - -# 44100 Hz, 20 ms, 40 kbps -PARAMS=44100_Hz_20_ms_7_kbps - -./${DEC} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.pcm -./${COMP} ${OUTPUTPATH}testvector_output_${PARAMS}.pcm tmp.pcm >> test_decoder_report.txt - - -rm tmp.pcm -mv test_decoder_report.txt ./test_vectors/test_decoder_report.txt - -echo "" -echo "The results have been saved as test_decoder_report.txt" -echo "" \ No newline at end of file diff --git a/libs/silk/test_vectors/test_encoder.bat b/libs/silk/test_vectors/test_encoder.bat deleted file mode 100644 index 27996966ba..0000000000 --- a/libs/silk/test_vectors/test_encoder.bat +++ /dev/null @@ -1,111 +0,0 @@ -@echo off - -SET INPUTPATH=./test_vectors/input/ -SET BITSTREAMPATH=./test_vectors/bitstream/ -SET ENC=Encoder.exe -SET COMP=SignalCompare.exe - -cd .. - -:: 8 kHz -SET INPUTFILE=testvector_input_8_kHz.pcm - -:: 8 kHz, 60 ms, 8 kbps, complexity 0 -SET PARAMS=8_kHz_60_ms_8_kbps -%ENC% %INPUTPATH%%INPUTFILE% tmp.bit -Fs_API 8000 -packetlength 60 -rate 8000 -complexity 0 -%COMP% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.bit -diff > test_encoder_report.txt - -:: 8 kHz, 40 ms, 12 kbps, complexity 1 -SET PARAMS=8_kHz_40_ms_12_kbps -%ENC% %INPUTPATH%%INPUTFILE% tmp.bit -Fs_API 8000 -packetlength 40 -rate 12000 -complexity 1 -%COMP% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.bit -diff >> test_encoder_report.txt - -:: 8 kHz, 20 ms, 20 kbps, 10% packet loss, FEC -SET PARAMS=8_kHz_20_ms_20_kbps_10_loss_FEC -%ENC% %INPUTPATH%%INPUTFILE% tmp.bit -Fs_API 8000 -packetlength 20 -rate 20000 -loss 10 -inbandFEC 1 -%COMP% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.bit -diff >> test_encoder_report.txt - - -:: 12 kHz -SET INPUTFILE=testvector_input_12_kHz.pcm - -:: 12 kHz, 60 ms, 10 kbps, complexity 0 -SET PARAMS=12_kHz_60_ms_10_kbps -%ENC% %INPUTPATH%%INPUTFILE% tmp.bit -Fs_API 12000 -packetlength 60 -rate 10000 -complexity 0 -%COMP% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.bit -diff >> test_encoder_report.txt - -:: 12 kHz, 40 ms, 16 kbps, complexity 1 -SET PARAMS=12_kHz_40_ms_16_kbps -%ENC% %INPUTPATH%%INPUTFILE% tmp.bit -Fs_API 12000 -packetlength 40 -rate 16000 -complexity 1 -%COMP% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.bit -diff >> test_encoder_report.txt - -:: 12 kHz, 20 ms, 24 kbps, 10% packet loss, FEC -SET PARAMS=12_kHz_20_ms_24_kbps_10_loss_FEC -%ENC% %INPUTPATH%%INPUTFILE% tmp.bit -Fs_API 12000 -packetlength 20 -rate 24000 -loss 10 -inbandFEC 1 -%COMP% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.bit -diff >> test_encoder_report.txt - - -:: 16 kHz -SET INPUTFILE=testvector_input_16_kHz.pcm - -:: 16 kHz, 60 ms, 12 kbps, complexity 0 -SET PARAMS=16_kHz_60_ms_12_kbps -%ENC% %INPUTPATH%%INPUTFILE% tmp.bit -Fs_API 16000 -packetlength 60 -rate 12000 -complexity 0 -%COMP% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.bit -diff >> test_encoder_report.txt - -:: 16 kHz, 40 ms, 20 kbps, complexity 1 -SET PARAMS=16_kHz_40_ms_20_kbps -%ENC% %INPUTPATH%%INPUTFILE% tmp.bit -Fs_API 16000 -packetlength 40 -rate 20000 -complexity 1 -%COMP% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.bit -diff >> test_encoder_report.txt - -:: 16 kHz, 20 ms, 32 kbps, 10% packet loss, FEC -SET PARAMS=16_kHz_20_ms_32_kbps_10_loss_FEC -%ENC% %INPUTPATH%%INPUTFILE% tmp.bit -Fs_API 16000 -packetlength 20 -rate 32000 -loss 10 -inbandFEC 1 -%COMP% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.bit -diff >> test_encoder_report.txt - - -:: 24 kHz -SET INPUTFILE=testvector_input_24_kHz.pcm - -:: 24 kHz, 60 ms, 16 kbps, complexity 0 -SET PARAMS=24_kHz_60_ms_16_kbps -%ENC% %INPUTPATH%%INPUTFILE% tmp.bit -Fs_API 24000 -packetlength 60 -rate 16000 -complexity 0 -%COMP% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.bit -diff >> test_encoder_report.txt - -:: 24 kHz, 40 ms, 24 kbps, complexity 1 -SET PARAMS=24_kHz_40_ms_24_kbps -%ENC% %INPUTPATH%%INPUTFILE% tmp.bit -Fs_API 24000 -packetlength 40 -rate 24000 -complexity 1 -%COMP% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.bit -diff >> test_encoder_report.txt - -:: 24 kHz, 20 ms, 40 kbps, 10% packet loss, FEC -SET PARAMS=24_kHz_20_ms_40_kbps_10_loss_FEC -%ENC% %INPUTPATH%%INPUTFILE% tmp.bit -Fs_API 24000 -packetlength 20 -rate 40000 -loss 10 -inbandFEC 1 -%COMP% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.bit -diff >> test_encoder_report.txt - - -:: 32 kHz -SET INPUTFILE=testvector_input_32_kHz.pcm - -:: 32 kHz, 20 ms, 8 kbps, maxInternal 8kHz -SET PARAMS=32_kHz_max_8_kHz_20_ms_8_kbps -%ENC% %INPUTPATH%%INPUTFILE% tmp.bit -Fs_API 32000 -Fs_maxInternal 8000 -packetlength 20 -rate 8000 -%COMP% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.bit -diff >> test_encoder_report.txt - - -:: 44100 Hz -SET INPUTFILE=testvector_input_44100_Hz.pcm - -:: 44100 Hz, 20 ms, 40 kbps -SET PARAMS=44100_Hz_20_ms_7_kbps -%ENC% %INPUTPATH%%INPUTFILE% tmp.bit -Fs_API 44100 -packetlength 20 -rate 7000 -%COMP% %BITSTREAMPATH%payload_%PARAMS%.bit tmp.bit -diff >> test_encoder_report.txt - - -del tmp.bit -move test_encoder_report.txt ./test_vectors/test_encoder_report.txt - -echo. -echo The results have been saved as test_encoder_report.txt -echo. - -pause diff --git a/libs/silk/test_vectors/test_encoder.sh b/libs/silk/test_vectors/test_encoder.sh deleted file mode 100644 index b25e3a50c4..0000000000 --- a/libs/silk/test_vectors/test_encoder.sh +++ /dev/null @@ -1,109 +0,0 @@ -#!/bin/bash - -INPUTPATH=./test_vectors/input/ -BITSTREAMPATH=./test_vectors/bitstream/ -ENC=encoder -COMP=signalcompare - -cd .. - -# 8 kHz -INPUTFILE=testvector_input_8_kHz.pcm - -# 8 kHz, 60 ms, 8 kbps, complexity 0 -PARAMS=8_kHz_60_ms_8_kbps -./${ENC} ${INPUTPATH}${INPUTFILE} tmp.bit -Fs_API 8000 -packetlength 60 -rate 8000 -complexity 0 -./${COMP} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.bit -diff > test_encoder_report.txt - -# 8 kHz, 40 ms, 12 kbps, complexity 1 -PARAMS=8_kHz_40_ms_12_kbps -./${ENC} ${INPUTPATH}${INPUTFILE} tmp.bit -Fs_API 8000 -packetlength 40 -rate 12000 -complexity 1 -./${COMP} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.bit -diff >> test_encoder_report.txt - -# 8 kHz, 20 ms, 20 kbps, 10% packet loss, FEC -PARAMS=8_kHz_20_ms_20_kbps_10_loss_FEC -./${ENC} ${INPUTPATH}${INPUTFILE} tmp.bit -Fs_API 8000 -packetlength 20 -rate 20000 -loss 10 -inbandFEC 1 -./${COMP} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.bit -diff >> test_encoder_report.txt - - -# 12 kHz -INPUTFILE=testvector_input_12_kHz.pcm - -# 12 kHz, 60 ms, 10 kbps, complexity 0 -PARAMS=12_kHz_60_ms_10_kbps -./${ENC} ${INPUTPATH}${INPUTFILE} tmp.bit -Fs_API 12000 -packetlength 60 -rate 10000 -complexity 0 -./${COMP} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.bit -diff >> test_encoder_report.txt - -# 12 kHz, 40 ms, 16 kbps, complexity 1 -PARAMS=12_kHz_40_ms_16_kbps -./${ENC} ${INPUTPATH}${INPUTFILE} tmp.bit -Fs_API 12000 -packetlength 40 -rate 16000 -complexity 1 -./${COMP} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.bit -diff >> test_encoder_report.txt - -# 12 kHz, 20 ms, 24 kbps, 10% packet loss, FEC -PARAMS=12_kHz_20_ms_24_kbps_10_loss_FEC -./${ENC} ${INPUTPATH}${INPUTFILE} tmp.bit -Fs_API 12000 -packetlength 20 -rate 24000 -loss 10 -inbandFEC 1 -./${COMP} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.bit -diff >> test_encoder_report.txt - - -# 16 kHz -INPUTFILE=testvector_input_16_kHz.pcm - -# 16 kHz, 60 ms, 12 kbps, complexity 0 -PARAMS=16_kHz_60_ms_12_kbps -./${ENC} ${INPUTPATH}${INPUTFILE} tmp.bit -Fs_API 16000 -packetlength 60 -rate 12000 -complexity 0 -./${COMP} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.bit -diff >> test_encoder_report.txt - -# 16 kHz, 40 ms, 20 kbps, complexity 1 -PARAMS=16_kHz_40_ms_20_kbps -./${ENC} ${INPUTPATH}${INPUTFILE} tmp.bit -Fs_API 16000 -packetlength 40 -rate 20000 -complexity 1 -./${COMP} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.bit -diff >> test_encoder_report.txt - -# 16 kHz, 20 ms, 32 kbps, 10% packet loss, FEC -PARAMS=16_kHz_20_ms_32_kbps_10_loss_FEC -./${ENC} ${INPUTPATH}${INPUTFILE} tmp.bit -Fs_API 16000 -packetlength 20 -rate 32000 -loss 10 -inbandFEC 1 -./${COMP} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.bit -diff >> test_encoder_report.txt - - -# 24 kHz -INPUTFILE=testvector_input_24_kHz.pcm - -# 24 kHz, 60 ms, 16 kbps, complexity 0 -PARAMS=24_kHz_60_ms_16_kbps -./${ENC} ${INPUTPATH}${INPUTFILE} tmp.bit -Fs_API 24000 -packetlength 60 -rate 16000 -complexity 0 -./${COMP} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.bit -diff >> test_encoder_report.txt - -# 24 kHz, 40 ms, 24 kbps, complexity 1 -PARAMS=24_kHz_40_ms_24_kbps -./${ENC} ${INPUTPATH}${INPUTFILE} tmp.bit -Fs_API 24000 -packetlength 40 -rate 24000 -complexity 1 -./${COMP} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.bit -diff >> test_encoder_report.txt - -# 24 kHz, 20 ms, 40 kbps, 10% packet loss, FEC -PARAMS=24_kHz_20_ms_40_kbps_10_loss_FEC -./${ENC} ${INPUTPATH}${INPUTFILE} tmp.bit -Fs_API 24000 -packetlength 20 -rate 40000 -loss 10 -inbandFEC 1 -./${COMP} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.bit -diff >> test_encoder_report.txt - - -# 32 kHz -INPUTFILE=testvector_input_32_kHz.pcm - -# 32 kHz, 20 ms, 8 kbps, maxInternal 8kHz -PARAMS=32_kHz_max_8_kHz_20_ms_8_kbps -./${ENC} ${INPUTPATH}${INPUTFILE} tmp.bit -Fs_API 32000 -Fs_maxInternal 8000 -packetlength 20 -rate 8000 -./${COMP} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.bit -diff >> test_encoder_report.txt - - -# 44100 Hz -INPUTFILE=testvector_input_44100_Hz.pcm - -# 44100 Hz, 20 ms, 40 kbps -PARAMS=44100_Hz_20_ms_7_kbps -./${ENC} ${INPUTPATH}${INPUTFILE} tmp.bit -Fs_API 44100 -packetlength 20 -rate 7000 -./${COMP} ${BITSTREAMPATH}payload_${PARAMS}.bit tmp.bit -diff >> test_encoder_report.txt - - -rm tmp.bit -mv test_encoder_report.txt ./test_vectors/test_encoder_report.txt - -echo "" -echo "The results have been saved as test_encoder_report.txt" -echo "" \ No newline at end of file diff --git a/libs/win32/Download libsilk.2015.vcxproj b/libs/win32/Download libsilk.2015.vcxproj new file mode 100644 index 0000000000..8970ab86b4 --- /dev/null +++ b/libs/win32/Download libsilk.2015.vcxproj @@ -0,0 +1,82 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + Download libsilk + Download libsilk + Win32Proj + {08782D64-E775-4E96-B707-CC633A226F32} + + + + Utility + MultiByte + v140 + + + Utility + MultiByte + v140 + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(PlatformName)\libsilk\$(Configuration)\ + $(PlatformName)\libsilk\$(Configuration)\ + + + + $(IntDir)BuildLog $(ProjectName).htm + + + + + + + + + $(IntDir)BuildLog $(ProjectName).htm + + + + + + + + + Document + Downloading libsilk. + if not exist "$(libsilkLibDir)" cscript /nologo "$(ProjectDir)util.vbs" GetUnzip http://files.freeswitch.org/downloads/libs/libsilk-$(libsilk_Version).tar.gz "$(ProjectDir).." + + $(libsilkLibDir);%(Outputs) + Downloading libsilk. + if not exist "$(libsilkLibDir)" cscript /nologo "$(ProjectDir)util.vbs" GetUnzip http://files.freeswitch.org/downloads/libs/libsilk-$(libsilk_Version).tar.gz "$(ProjectDir).." + + $(libsilkLibDir);%(Outputs) + + + + + + \ No newline at end of file diff --git a/libs/win32/libsilk/Silk_FIX.2015.vcxproj b/libs/win32/libsilk/Silk_FIX.2015.vcxproj new file mode 100644 index 0000000000..37d625b549 --- /dev/null +++ b/libs/win32/libsilk/Silk_FIX.2015.vcxproj @@ -0,0 +1,275 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + Silk_FIX + {56B91D01-9150-4BBF-AFA1-5B68AB991B76} + Silk + Win32Proj + + + + StaticLibrary + Unicode + true + v140 + + + StaticLibrary + Unicode + v140 + + + StaticLibrary + Unicode + true + v140 + + + StaticLibrary + Unicode + v140 + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + + + + Disabled + Neither + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Fast + Level3 + + + + + MaxSpeed + Default + Neither + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + false + false + MultiThreadedDLL + Fast + Level3 + + + + + X64 + + + Disabled + Neither + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Fast + Level3 + + + + + + + + + X64 + + + MaxSpeed + Default + Neither + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + false + false + MultiThreadedDLL + Fast + Level3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {08782d64-e775-4e96-b707-cc633a226f32} + + + + + + \ No newline at end of file diff --git a/src/mod/codecs/mod_silk/mod_silk.2015.vcxproj b/src/mod/codecs/mod_silk/mod_silk.2015.vcxproj index de73ca5ec9..3bacaf09a3 100644 --- a/src/mod/codecs/mod_silk/mod_silk.2015.vcxproj +++ b/src/mod/codecs/mod_silk/mod_silk.2015.vcxproj @@ -46,6 +46,7 @@ v140 + @@ -70,7 +71,6 @@ - %(RootDir)%(Directory)..\..\..\..\libs\silk\interface;%(AdditionalIncludeDirectories) /analyze:stacksize65535 @@ -86,7 +86,6 @@ X64 - %(RootDir)%(Directory)..\..\..\..\libs\silk\interface;%(AdditionalIncludeDirectories) @@ -99,7 +98,6 @@ - %(RootDir)%(Directory)..\..\..\..\libs\silk\interface;%(AdditionalIncludeDirectories) @@ -114,7 +112,6 @@ X64 - %(RootDir)%(Directory)..\..\..\..\libs\silk\interface;%(AdditionalIncludeDirectories) @@ -129,7 +126,7 @@ - + {56b91d01-9150-4bbf-afa1-5b68ab991b76} false diff --git a/w32/libsilk-version.props b/w32/libsilk-version.props new file mode 100644 index 0000000000..67515cff76 --- /dev/null +++ b/w32/libsilk-version.props @@ -0,0 +1,17 @@ + + + + + 1.0.8 + + + true + + + + + + $(libsilk_Version) + + + \ No newline at end of file diff --git a/w32/libsilk.props b/w32/libsilk.props new file mode 100644 index 0000000000..cafe473a2b --- /dev/null +++ b/w32/libsilk.props @@ -0,0 +1,14 @@ + + + + + + + $(SolutionDir)libs\libsilk-$(libsilk_Version)\src + + + + $(libsilkLibDir)\..\interface;%(AdditionalIncludeDirectories) + + + \ No newline at end of file -- 2.47.2