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 HcmV?d00001 literal 351666 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 nc?F=d{XGYO0OGc)6@K5u$nA5H7d(db?2 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 Kgv2pp?f(H{I^yU6 diff --git a/libs/silk/doc/SILK_SDK_API.pdf b/libs/silk/doc/SILK_SDK_API.pdf deleted file mode 100644 index 2c9e69e175f05d9e938b40b6e37f0616358dc8ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143182 zcmd41bzIcX*C;Ms0!t|@wX_IIEZwnmtCSMb4bmXewIBV=N?=F;(ZEn7IkdPn33vn^G zCzOyN?QLf0%tl$P2Xo4?q9Meqljg2v7+5g+(AxC=?U)5JQ06b_Me~SI&_up$Y91TO4KWn|}N4L@P`O`=Ecg&T106c%^UGe*eZ**Ibm-kAB{35?=G<~%E zuf_qoK;!*84lp?0-yeSvUIEanKx4o9K&uZ;8jS+o{)a{MOf)F~hDLWa_@7y52>Jsp z81yXkNC53WMsURdn%O@E&FtSf!cc&`@b7Ol^JqM1n4lm(p#Ykyfanzr4M!J2;oo@B zoc)DCg#@qgi9iJaCH^kJDhU57{y)~gm- zf3q-j`yYG&1AiC%A8WLx|04|j{U7Q7wSxbwMhoUYg#&odZ~z~n@ju=T0DkX9|KGXy zl?DWVOCHVqmH7ffaa3y)P@&3^Ydh#Dr z{9_*fJ^%j81iBUwy3*V~{(YrIw3+@jZ8XilZNM7%fr91%U8DDxKYjmL#+6B<`~S`Z z+UWJ5=lm^Dz@+(w0Oteh|HZ%2V*z?-JXdD@m-s&bv{e52_+R`Rn2u%*J>aVR=l%^a zgYNym_HTgMzfAqN{2TCpv_Ssh>VM0t}u=MxbjIs)O&?{Vl@ z!`%ajf}99_#x~OGo#zawBj|rIE4=%WgsCB}N)v6=tj$}m|BY-YI#1^1XIM3%02Tj0 zO$O%=HDwH|mp61QIn5PzVmroyzDO?}mi0#UzPZ1ysXf+))Y)LrEFM=a0l6k`GkqVhNBKpSc)8XZF9uZ6O~6r-BF zurbeJ{2s*^#l|)muMjy{B~8$LR>1t(Cq5*>YvtMoSP02$#8M$cfP!opl%s81*+F*0uiy#; zD21XN*f1;eQ@j_LFy%OKHN>XSO+pe#}Cw)DF~5X^ikN9kcW8Wykx3${o?UK zQFVO+ZhW7Z$TAdROEQ@3rEkglMFDXB2iWQdvgfMrd?3F5LkLuu>Vn$20J+BpShQDv z$m6JV%z6R-_vD-=KO`>mk`yIw$D8NPE447meF)cf5dquDTdEx*^UO0=Bg<%as};e= z9ev7Vq=wAjH^7Qjw6_;k7!f}nFozSSEGaY2yY6Y}Ga~Bx1n<2q_SHy-ZIKasGR+M} zy}^+hIBfA{?{{*x9u1*7cD{CHD`SA9b$V1yOo#CM8 z(-?QhKS)|@ypFqO1oF1}uWF%X2GogaLo@e!W4X~htNn-POb zh=FPGmZUYYa;ptlFqII=g|(`d5+=E?nLRc+^J`Y`d!y{g_hj0kmKw^Us-%J#iQi=*oLZ~Avm~e^>|uYxHers9fg&E-=uWom4N~=Yw3$jq@d`6$SaNkGjcMX0K9S~ zeU}HW%oOZo+qh9$)gPP3a^%37mCi$H_RJbAb7basoG_Jf$g-ay`qbDwHOTG2c8PW@ zw-MNitdCEXvmemv_}pNOLA@?ON{6w;wkBB~!z3!>;1|;L#nE=UQP>~IQdAZ`0mE!r zd6}gV1OApemCLtt$@+httE#pu&>(MCDq_qMsheN?Xu!4tXu+ zZA7k9R!*fD#v+NY@gx5jUY?hSjEz?eQ7UJQ`|1emen%XGdcZB|c=+hkgn1lT;SMwQFWKndcpHYO+GSmdxGYA7yvxO%NYMY&9CUZUTSYsDf3nZ579l4pYvUxf*$N6v0Y>zX zJ_H-iH~i!n7&c*fLktyVA>a;RCcI4xA}i#%7;4xyD}#Q0nW0>k1>W`%40*H?fZWII z1yM^*3WkjGT3FXNEd_q3&dIBedo0{#S^t8|2CVkiwu z2~2?bvQ^O+e2geJYpcVMwtvtys=SZH(ZcB*x75`gMGYz^{5Vu@#Pks-W9Ap8ENi(?t09m_%5?3&Pd1p;Z40`x#4^I z$}BfSN%T`%$XS>rj-?^b~?&S#cAt?+L$%FiXcPcd@)QeA6i^5Q`#Z zCErEi6$X5KOowDtURWe^Zyw^=SBRRhUt>u<9|+%iKXw9lRe>gn@}dWy!Av4UWy`f~ zdFgJ9pgNSf`?;*}$jK0AH|ZPC<|7}EJU3&_iUY3%hh-?2zsVop2q3of3nn#w4QMD5$PLqS~!R)YwZ`VdL~Fh7-Sycm{JECNNA@h6tX zmiCF7tvGFDi(s0~D$zZ1mssQsv#Zs-Y~cbaYj#Tm19D`>@yQn!x(?6WOHqD!`ElNI z*HP93mQMezBlt06X6#bqVaVlpxI?S>!?u-c{FW%1{+6E@@9s+J`zS2;t)Ac70jFvR`8BQog@s&`WgBTA*Ibi7p_s<FGBJ!`Q|Q6 zQRD1j#MchWQtt&G4^ z8wmfbytB6lV-7JC9!^zdA@}nwG{7iB&MA=rT0DW`)V!=>{>m_Pwj3-siiYSz_ZDaUd`CnhW9fs zn361r4qjVKv7Qvu(mS!?6w966H=-bL-S9PB zPY4)G!fiC&V$t?#kcTC|u@x3pC0GCJ=!JdAMAy`j#gN?``%sLeCZ^NdaigjFV#9af z=9lcGOk38MKlLKuMXwOBkIb%>9gF@_X7TNk!(u!(G|aC}z;^ZTy(k!S%_U+RLyK9Z zFSdUM-cF1;L|@APM8ZJpD*47I@ZSjE1^$Nbe7vGS`%m~TAj1Fu5WWjQ(Ww5*@O@Gv zcA=8$+T(BKnb&B7Mtv<{)xkWx`2JyzrRiJ?*Kj|@&ROwd%(1))A_eh0yLP93p;;#E z%kwvztA*r&Q!Jc1bJcUJtG<@dK}|Fin+iEi8imW^MMFb__?*4k>1)=0@KU&n9 zT`Ui4{P@$jyMO+2L9!Su-5~ywa4$$5gQW+=m0GGbg|{!AL8ztfqm?6vT(iT*^^pQOK!$*vH?r9!Noh7 z6QAIyw3?MUII1fIx=xf-#xx&IUPok!s*9NH2kC%ooIt2>_0deO=Ww6z2FOI_l$w+n zI4hH^eleTM0I1MUh z`SHF|M53~p;%<)_Gb60!ky>(}iK=lkd|^!InejahB$A_pj`l(-@Zx0LD(QfmcJ;K$ z-M5u(;v<5^^@M4aCr`x4l3Jdn62K+M2QInyAvH4*?7jQ9m zL?jyvLyGNiU`m~LTQw6R&R8(FwGK2Sg4I2=ks-y;P+=T>JeTE=rr4mZA7TED&#E3l z2F>D+&l};#bZfOc82ynlHHlTkN9$jUpH&6Qd}jh3fLBM1WT3XsV0c;cJ^ZM}MPsa| zK|LFD&hf_()LO7;J)s~^5>b@meM+R=@p{m(cs&e{9Fc>~+`b5+cxc`BorworM3yo| z0adIv-l1KQ^4JU>&%HyNX5$%1PZSJof?+hHIC9sW7Kbz^em57Ssw{AUS)>a*E6?#h zy02q)P{U-iVp0jrh-D1a;;RWz@2TKnFf&OaewnP|bR4qyTlpMvZPQGe2p61YCeP>u z2t8{}G6mE6AzZ|?02byieo3Mt_t|~w8uQGe-q*l{nsd{37wAXe#GjHY18t^@1l665 zHWDGLcE7ccvPn&T=}2R6$yJ1y>cqv^Vlq4P-JF^=xyun)r!{x_7Q3E)nQM~JvY9^4 zXqRb6aZ8KE#U=i*%JnR4V!ZoseNHRzwN{Z|Hf=a|*%8Bn7x&k5n$E;*=^oj2i@lpj z=bJ|)G_=9bq|9+9#j5eD->2NTFmw*Q+`cdlE<&K5^e+(Xc`PqwH|ii{Cg59JoFt?> zrIpNe4;F5~L~U3}H|5{hlQXvr@sNh_#1b5a%n{j=8yflrpZ%a*P&G|@bY_IFC11WP z3?U7OwC%2DM1G3r8sHc;^J2m@weV)*SO2zE+DNy(0#YR^g!hyXE~qZ8-Z{Dpn**uH z3k>*j|6*qzxXwB;G%K%8g6&VH6nl>8dzxd2-=1#&kW}`BAfIW1WK;z9cpO2GA3##H z<-VuG7v*dfaM#vlT8Id#0!IboQ--+2`9_C(`YJlhr>qI}D_?k4`>ZE8};8B35dV{<6h zebBFTLQz-k`IO*2-g}_gY0a>XB{><;;p8`$O*Plz*W9$h*9F2(3*3X_LS$+8L zp38m~uU~mL$F5uqwv!~bxdv=}xYp!5dtL|`4-xndBtTWp$Ci=VoJ^F0AI36A0(nnN zhI*Gv2$=|9o+;KNCCVW{v4v3+&h2euCha{4F_7#GdZP%b%2g?3z|O$Y+f0Mvnz4pO zD&6Q&b0IzXfD5To%4mE0T#gB|R=1BDhDVX30(Zo5`vM7)XBEmu$UTs1m2ex9;eGny zny+t|+s;ynAnrE1zK_T+Oo4@VY)e}lw`y6)o6&YJH{MVL$$d~%5tG5;(IKTB0e|GL zdrS+`Cb!1}6E?jNL-C2UiHl1^kRq~@3{MSbl2KPmC_+vW!ju=nDJ^NZ0=|J_9Ur{FEwUYOm`Q>3iD8dt z@@(5aw0U)Cea=IwBuK@c7u@$@5I8Q@k?|~AD2Blyz~A94ll?0!rFlSs?S1O`M6))uE2K|5od` zy<;82$mq*HOzh|ID7lGfMY)&W_z0QL()S6c;`3$$D0n-;`JX5wEI6ddN6O9z1;uYKoJ^;n>A_1K+^B3yv0Rt zJ2$V{&FHEd-o^dd|LH;k%;BZipy<(im9Z1fqm;|{r}JFz~XCro0M6ZsvC zqVA6`;CXi!R=<06H%~vGzuPL_JC*~ncYyUoT(^W3v-t*!@2KK)1ny9i&sg+*0wFQX zL||VbM<%tnOgD-6`Csokpd{d^kZUYO;zW=d_SOZNYvVhE+(4fET@p*yk=gTlY8p^%p_rP4 zK4VozKhyAWJOL?Vskj2fKO|NLN2O4zZd;az1L-i-J4VEm|wieFdZ| z#;BNvH%JhDIKD?7?ge$x6Q&#*6qRpDo1PZ+z{D%O*&naAr524v$_Z(Zr4)C!eYl({ zTTi-czrQvPtS*pRkdrY0Ndzw%i2#ohbhZ2!jv0PZZ^b+AL()i-Fta2@_S`ii=M}wA z^*;x`$n1<8X1zs|=MJeSO*&6?n<}Ww&dj6lp;o2dGd-BMd=>gOF`u})bl;Rrd2<9L z^S%AL*&>KWrcEqf?OOjhQ_VGVOwjA*wMi@d*GrBCle&#y+>Dqvq62ky!Y0%w%Ibz=z8}?X9 zhz3+^TbI2$L5O-m-1tHPJG=|E7>JP5hnGjteTZ3l&*C0J;$=lD6&* zOZdVR=Wram`KpY`1n2yC<&o(dBNUer?6!0bA6Dp*-SO=CAv>e_#hwS8$HH5pI)2lf zzY(%)#RVw|qLlyX6wlK&1!^39vYu5PpUZrdG|HGYEGM?RmiY4;JO@|tb{`o_MjE7# z&@u-S6SNfyvA(nL0j}NnjO+u=b_;XXqu{Qi&uTa$M16ki=Mccw;d!2yL*&+M}>%qF`IbbC*zOcP#_F+4638Rei-ayK_2B2{osglv=C&AGZ%@S)QC(@ z!w9B|??lE6uD$)K4L{DIQV!52iF}) z*dLeY^`aD6L`v(mvN_FUr_S-!>j8e!@IgmQ4Y;{gXxt>^>7mgiesJmbN&tvU1!fE% z6W6bj+neGnrNZ>fMd_hfR4kp~V^z_PkzJ>iNgMGag4^EvOuL>VL5`6Vr3(X?uwO!y zoMG!{IG1=(4ot@XEYlE>L$&c-C5fET2+p=Sm%Rvt|RiW7p0|(|V`v-TsyXpu1GDa``db}(AtW+Fc zaUS;6{o3{O3Cn+Fy*c3)a2T*8Zqvhi9UABJG$h>w!Sjxfa;opR_)@(nvx#Sgz|DgH zdJ8Z5caRymLd;nnCGgEwLK0&?Wh8y>rxkUC8TvQp3*mfdB{rp(Fj*p5?KZApX0`eG zBPRjq8AG@pM<{K^)u;%wH#pHT`w!TD+{jKkD@q<}KXSc74Pb`~BMF|KMaXem@McnX zat&Ki?xbD3X=c>xnzZ7+u3&1w2hzXJMzvNNO{@@p7PG&bpygD@E)DrjKf=r!MB@;l z)>op4l}2`C#`lM3sDjOjdZ%eCcf|eZix1{^ch6ITrysy2qgLSZ9c$Z3L5y_27uVuZ zfkKs0FUN=@+MaedW{>^hOZ{*qW~5wJ7_NDAf4*G9^i8ZY8Ja)q z7l*OGN(NS~jwcC&)!xQqDcT_tKXJk#J$$z9G zrfNBiOL;(IP46U-E}cFX3FzYr1$`FOM!)=J4gX3KH+0R|f^Vrno}vhOXqA^Xuhjcz zP}*DQq`kl}cP5!;;U9$5-mB`rEbk=knVHPkzbPyQ^4}{Ak4IBO#IgRc_PN9ADf`Qw zK3jG~+n{@hAI@L6yiLC7&X{SwF28tIn`|6<-NMHGDTEr>tpD`lFHqUSo)&l;&@x&^YT5s>sy03``Rt^|{$ibLe@V;PM36@#%jH({mwC#V zDs1NbPsAs}|5{-hFy1h=->2@`y}y*5_>*VL%~`YG7Ialr?P}lq!XfzAo^PbB5ck=F ztpw832{v{9LdDXMp3sq-lmjJ6>HIE5d{k@vgv(|wL8nxIP?pQtJXpF5)|f}M%}ai* zfBr}2$<6{>i6wQ-wBNP0Zj=$`ZhGAD8ian?f&Q^jyBa{+$#w$i!Ia+rz@mHhunT%x z_%U@|WmuXg zaMF!te6{JdWry%_*h@5FF*IQTa75Da8Aun-V-O2krOqyim0dG+ogzll`uwzyd-Nck}wPxi`aND0;8gCn!GFO&nd9NtJv0Vm!?%It6Z6UiWFxjk$#3{L?#!n#cR^ zM;a{7>o%c}cj*K6&=Q)LN&^HuZYv=r_0f#(iBP;DZ-Bh3o=r_JurE*$y1cB#zM?2= zgPAYvV7g%_$0usLFoh~Vb$o14VbDd0SEUeAGl(W|^*yl5LxJv}3@0{7YQ9KMDUQ)@6i~Rm+Tl>mV zB4cdS!HB__HfXCL{~LD3ql@@v@cTjA8@2+`6}i>o=nYoA7QrrHb-~@8WsIV}xBBSm z_01%8Xxz!$T&1;Ak9LAG|kUb}D! z)3^NsUu-2z3a!x6;dMeL&nyg$>RMcPSSa%ADohJ!pxxQ+De^?>u$^M@c8d%YRG&T7 zqV43ejFnEaGE>TXu&R3KS-Wp*vv9W^jiG>cq0iPvg@Sp-p9CZw)9Oi1fJb z-9kNdN>FSOn4@lwWgU8VPhTim*I@sBW%@PCZIq#hzpUB*y}sd=rK_DqK6}MHd)6(W zt2u5ny+ikxod5|hxOdETGXbrb!IykmzbrSxpr@tL-nN0h1Gd<8E?VTzc5QLbyqHN9 zn-z*V45d1qX~*Z;`Y3J#=TmQp7Nc^gz7rx??TqQMXsr9XVw(d0jUi}kbvFO5L?MUx z^-j72GmXPN6K8k9{BGvO&9G;t4J|fBSM;6$CfR5EMpNvApSnYDX1~Y}!2j1RQD`|K zXfJ2P*2*;tB*9L6!f}dC(;I4-jXKvBAJTJQAQ)Bko4jMKn>s6DU)~2`8B{oFE>nn8 z>pux6vMv<9#ePRI#^6M)&pb6K)uLb%V_+!>>VV#eb6kO4IJ2KOEfdgk6%E2>1N-xa zcC|Fn)%5CVtmE}h zp9fTaxZGYQ)2yVeb+P|U3q`L8ky8d7S)CZ9&_SjNsHk|T;=Eh-7lO!BC>np4ANP0K z;=*^D)R)VuWv`^Z;(2j2eKf);cME-B@43}ED7w{WMq#k;vatjHC`OUJVn%9XeX@Z+ zJ`q?u0=k*s^Rc(yUnjgkn8@1^y>X+3m)tn6zC7!peW7oL=-yM^+i`TjZH}(MP%zcz z6HSphPp{Bnh}#_jHfuaE!n5+2ZJZVzGj&biDtt0gs8#n{B5`mq7|1*7q<4KxnfKN> z<^6-aP}9_J!FhPFluD<0XiQda?lJ9UL>z2PaB?(2NwkoJ6{P|1&k zPnr)@5*=pd{SqFB^I(r@`&nOllQEfj{+Z`##qx>bo!__q{p5& zemhORXJ;Wye>`^Jy~wlrD|Ka#Lqsnvz3Wz0C6jSZXgrJNC*cAX1^-BWuD^n{)~A*? z+czZq+-#d~BW%*WYO!kUBOXW+YqRk=L~-zy;{0~{0?yTzVa>oo+)BA22$ocB%$mMt zD*Xm`=p@O0QudLZ>8IG|d2AHzg0eyzu1>~NB@ zQzd9|T!na<{T|go?4rfBAk`=s`QAOo+HDGPyT5uvyV5=OzOR>J_R7=j?IWxp{k!PZ zxu*8#6NGT&#|2ST-+nTtcY9=Y26}pLhQASGtdC9RQ_PJ+*0~ApfILkVefJLgm=M9D zX=H`^!I;pf%c9`;66(>AL$YR)|J%Ivz1*K+*{{kog_YOohU@WFuQsth+X*Lu-85CG zylH76AJ{k9ecY@{swgQ{7zVhWIv@DS_^ber8QNd6+tdzBY6}|gt?4ZDcZ++o2PIVL zX6Rs((vyS=eNXRL_Lr*ITYA>|@asKjs-D5!w`;XVrWx5>!9>n=TqNrfbw>ski30tc_0 zhts_ffK{T-X}X;vp>^@-W5c)r`dROrZmBT~n{ln@C}1AA?!itM^nG$r7WLDa@rw>3j2Pq~z{lM?#{{Hh1S*RCTXy4r0e{2kZ3 z&|6Yo|6b*|t%p`nt|L4sEsFffg`(eS54OQ5?ZeUWu^}NV^}_ZV==GpQ3d%%7Q|;o~ zUwhvKXz*fxQtr^_X@xX%DlLvRy^I|_TSw)emNncrTciK-91Mtl@cljcY}d?wWn@&l zO=@k1R<>bzzYlJ9Y#$An*zf}or$+kfSfHaLO`Dz`A*aOt<*|aBj#0t3C4{Ms{SE%N zhzr++W!3yd#`T+CiY2Jj>g0Fc%E_1Q2%bJB))~+E{?1S`V|?PeM*TI{y9YMxyT*Pa z4{h|msL=w{(VK9eZOy1{{*vIG#u2A;Pk<;ue^Y&H6&-<#^oV;Xu~WCx)c-uKzT6*e zFwrhbIiT$}#@LG9aE0U1 z$kbcnbC<7|+=M1%m!R^oz{rxZ}4dMMtVb22sN z{FMcBI`HXOU_!lbZ};BI3QXbGRJ74Ts^IgAE=c7Fcr-BAO7Wo4oRMjb>#e_F+iTkH zHLup-M^fL!F@3k-NM73(v6Od$UKRzmALEGpu?5$fYb|_fQEDd5?e|dgHu8VDG9*gt+qRsxzSLKEO7IS=|J2^}f!WY) zytL{VZa};9)ZzWT=Ir_mRg!pUJuBOQ5xIvREgk@;4}mL6=+; zSd*s4eavH+cgSs2GKiVvZUyIjjyk|eTH<1PJ^IG{mPVf9o7rDtGbd`7^th@Lu-@Inz{?hS@!@tfz-{x2|w3x14=x4^W*uktrAFuR=dhbF=C37}? zo?MquXZkBv0q}qdYWuEk_D)*5ue7QjmfEr8J+f~Fs>z57>pado4sT)^U!|4wE>#p^ zY?PHW?WZ|8h>fqUa*RmZFaC%zyKxRvl;+xwr1ToGt?oAn>|b3Qn6VK~7sPPTz3I2a z2PQ`AKRd}@AR1XsLRrv{gNP{a0Al)ix;BqiWp%ym6m0`tzDm#K^@02QN>quj$=7(&66_dFJSSjm||Np-5wzhB|3_-c#!rr$*3~ zUgB}65lgXssc3^4a}q$TjwZ^{JFH6eJ_^Nmn~$n;AbG?%*5cmyd2F-s-zW{{PJMOb%vRZ0cO}!Q4zn2lXI7^4<6xZ86S7f6%hW5> zRLX~vSjWrr!C!Knc`wAJ%k+Nij1mv7`(c*WsD8kTQM|rb$uerF39d}yN8cn65!_?8 z)(OcSLrwryPQ?~qViK_TF+1gfD37t7!0^#-T;vz0)9eYpHwqIs;%UyGKHxb`=?Z=& zIS3vSclXG2Xv(Kz^^Da0C|Q;S*BH%t_<~N!ZDQ2Vc!y9Ku;KXXJ%uX$x81CQtIjHc z>P-62oP`JOTAHS(z~m4|UeYpZ7gnd6Yr5 zu?t=hmn5=d@8H$buu!5!=*HPMcFJDu(8?4sZM*GJoIupf6e|E$)$mg^a*#jtqycwx zD_Z<|?*$y?-V8qjND9+uUgo}b!>;z96!zuezv-qbEuYe8AbDs1I9OloN(w)pIt}gq zSn3#i`a#tnzlzGWx#70H?-Z7cCyhF)rp*43jHbTRK%tFwIGNJ;e#-5`_(kK+8wQEG zKg6{=0yp-mh1?=#8QF9_HU?G`v@(l0Ew>7BCwoz}2i2SscQjz`hd# zHw%GgTlS2x&wkYgTGL_8$6zQyLs$>Ja<#sTcB*7vz0?Y^M1KW1%Uby(&*|~`!S{MK?a37lXV)+DE*-SqhPFKn z?x4D}Ptyc0v7szIPc!QM1+RZF9moJ&0H2TAvoCT?9^8_BD)nPnG;Ip$_f#RPo}=>I zRO6VK_)${7)zxJLeH{!_l(!Xl++D&>S>7pu?|YkRUieX9KTY4IuAXs8Y$Ace)uydLw;Ax~o#P`FghC_#3Bhy{J!wh1DE!cYGC-gHaBz zqf7f!o56@($KvG^fl-%sLc+X9A?q!NWy}VC=_ns3RBmI#Tk7uH`8}kS3?l&g=()y9Kfh4R|e{UEF95*60LsoBT)PgPKXu#cSCm4ZF1#K!&kC!9V7GjpOi8EI#@m!DliK{VvzK!$*0;PDWY4L;IKCAocbs2$+x16(U6!E#hy2DoeW71kqbrOi4 zX7E~SO?sQl^C|xDD@Qt@+H9sUP$ti_*wZz?oOX++9<14dH1eu8JHz>*5Kkj{&aZ8y zawfjwn;mNeD^Jzg#$}CS{2urr>s^6E+bjDpi9N0yYuGe#m1oN7Ln^sH{m5R)VebD$?wq{#d&7n0uT}{&H;9+ z$m}2q*o1t^FHU)Zl<;R)k6B=Gs+5maUCGT_D2I?gp<{=FX@M;A@>8Y5IOTPZL8;k<~{N@ zVk5Q^^(0U4WmlHDTeFhMq1Ba$IPY@*>|M^D{noB*e@Vj1x|FM;BEkapWlGgqNlF&j zs(hwCF{TWDQd}CADe>-DzCJ?XZ5v?v`8bIM5%GHoa@k2!fnCy7!CZ)(Q}jl9|FBWt zBe-9{{$RA(Q*j^q@}kRwMh@6%L2@YOn77%A#ZObM^ID{TmEKHn@cyP8H*}ijw0SUP zSmu3xPbuuoGIyBn+c2o8r03d~$`v3o{Y$4>8c29!H#tQPRB}Qi$-U;HOQf><^xIh zLDcxj+n49C8g-A*@iDHx`~ot^kN+|`%L~P9^!W^M-(@aPfCTT4;LQ;hW~!i5nsR_i z(v%t2+wcF-ZE!(6^tJiCw$|6`Y&l*0&=PnzH1kDl>K3LIDro&nKY-i?lG&-dM^Czb zf)V+@TF&GDEbpg@1M7_zzvhKAPut0AdP}0~ZB#YRWrkvd6z~3eC*TM`HUxO1xX4jP zB!9BVsBV$`J0G73u@BB8FWNT7%qO`HaCaqfe5SDSR$GZcks;Iy^q$@D$Go#Yo{rDd zDr&+~VN+ux7g~$)kCTOg<`@7m$IT|7hzmWhKD_JyBc_`KJ1f8=% z;@c&ykBi#9p`SmUu>x*BUwA%Ba9RL0)vZcfT+axh=&_ru(>Gv@yr8tM-`t{RdQMaI zq1-zNo2sH>?2d<*SOz|h{s@bz9SG)0?Tz3CG=x9mOqXB~U&oPfjei+by z=5e6ps$+Vhkb%K4laZt*I6S0uQNS>(b&)>fk8E^KGms;!$^gR09@qijDMR7(%A$YU zV!~Y7(hwI~jMco~Q8^`c%aV)%o{`#L*c^1i@w|s7pqHEF#_1$!fY@CjFyedqzIxCx+A*%| z5^X-eL$E$uctQ*=4m9`vEtJ<*Jq?3zuswXUJFl~YSG1q0rCsBhzJaxq5XXoJ z!aJaS{LL0IGF%-V?>*W#!Nq|JB0doPJ~AS2IjI!u*tVO(s>fPcgh&C*6vGL9u+A2@Wo3n>K~Ib3)c zQ=?v&oP7t^+WV{n8e^W?ev3hY8d5z-dL(o!y;hWPVeqC&t?_n;e}`6&lru7Wh4CP_ z$#jYyk7o?**T3Kr&lSF&;5Piqe_u9~-C&V4nA2NfLQrqTiQoN_tJ`OBca!|Begbl= ztm3zB|4r3sC-bQ3pE2!-7Mc^32uSf_h|k^9-=m$0nB|QxnNS0?+kU|MMVe71R2<8< zSkeR+Z!lWOw6N|4(_Ao3)Z7GKq~rKN^uci_FD*jdAOcs zQrWb>?ve28v!!$AHX61GvT=zC87Fzy)MiWYuG90$g_HRWhZ)jfiKCfKR-a~DY-QpW ziMGPwH67)}7N`*HOCo7bQ>709tEwk&qLylan_510gQp0wNgXHQ0-^Y#L{r(^ORd?7 zx*a@{H!}(;*)yhbmcgmdiO~aSUMyo5`Q<;bC&t&SAr$ABb`@sMUcvG19j3Wv(nF+OblLebtllMGn#has_$)V?^R;(Uc>pn|sEGoKaSWhySpO#9+r8r(~oimAp1<2Puz-naZ4Sgis z-gG+yV_EP(%S=TJq>NZQjI)ycY=E_YlJt~CDqK4g_hR1`Ea7ZS&AmZxEoia&*=oDpG5dhcS8``eF8p>p%ci&z|4hO7{0tcjd;ID*P9R7<vkT;%)Sl<81@s*ww0 zy=d0ImeS?N4XhE;t7ScZ7ReJTgG^}W?-a?fN=vGg$XtZZ#4Bg;=JSX)c(YIBk+~u?x=jmmxX#uF2KnN zg9d>>USToLgf&Zhh#u7sRPw5So$R z6|6*>G7~b@hf`lx)3sLF*7VbW3?(%YqorL~kn66yRejD`{Hgbvu_QS~Vt<;VNvS9y z@J~K{q-uv6SNPfnh4A7 z^xx;WdG_MAto7mAHh?^sKWpc7aUK9jPS@Y1Dw}8&y_Zd{SRaajYJ;@Wu&4oN5O-ECKo5tbn2mt^_h!Hq78d`PtR(2MPBCx z(U?>h3ch-{ndlM~>>FoumSbLe+fDE4>Fys_`7RuK}NV64X^QxQsNwtT;s1vkld1~!F+gZm%}Bv)kxvXd%SR7SN2_;%6}-JC+F6W zjKX!7ja-P=al@p_;|!OJ)dD`yT|HSYQ>}LfICFx-$pyqULLFm?zb2BdJ)&TPWP>># z;NAJj@G$=Y);)*Y_1W)Vdqxdd{tvpoIxNb4`<|JhLyj~<3L;7iL$^vu3sQoB(miy; z42VdB3P`I6NO#waq|^}7HHy;R&F{r?@Auqu@A*BCe;_>YyzeLWUVE*z_e}OpckrgH z;;XajDth6Qn0?g3TXrR@^^#4-Fy%_bNvjlVwMZopl#Em0jh%9N_zoO9S+NeU)*7<;p8Ge=qKGJ4yRgt?PV&FhW{Kkqph+~&#<#G8=p_ER=0R??S87BtgRP<-=2Hux7#?tNL7sU$G%X>{ay`iAhy z?dIOxqwWu|xKoDpbE=nL6t-mNeFkRrwF}13LFxTS-PwVB9}l7d>zDQfYVavEl~`I4 zW4~Vgx*ePFtkFEj)(7c_@G@Ck;}(%^Fs1_Otn38D8lzxj};}pZ?aCwkD^&ES> z^;WH?);6Fm3(&qfuK_Z0nW+1AK)>oqSG^ApX>cf1>~hl-lW zowL3@5VpC}wtTNyb785Co||c$hA@}NJcE&5oVs6Arlu)jN8h79^JOD9DZLApvIj@> z7vHZi?9B>m#d3!U$#HS@jQA$gRMb8o*2RiOVwofr!s_an%gNM;O56G>gVoMlh5O z{&QlZ^*Ql>3VL+VXw_(|n?>&jdp$JxFlqO%#u+B zYX4HK0+hI8sZD0)R1Oi;pu^cZrO}TG#|i0A{5E?z41%q8) zdq>8_S_Sv<;2rBEBBH#K6dYR{Pl@1V{J0XO*VH%3laB6T0~%h-Db6^VQVxHm$LOLl zn!ixHB8tc+27k8=5_z{^&B;ITD(IshC-n(L&Ml~r(+jc)vSfXIY=;f;dxJXZJ2{l{ z9>8s3!az=;9OW@*d-~%zS@Fq&+8&DkorwYO1Ppq}5WO z9O=o|RdzErQ@kA^Z9fr4zF@5nG%58gA}E_RlVKLfs1U$_{ZHBWVX$`C=G$&cb7`=m z`RUt|B@!ftMH%^KqWkN{YT)u&SL2v7b3Z~U<^@{nYHRVw#6R<1cHN+yzTP``z1Qv1 zSZ&r<6I{4NRJ>GpfkO+}7)qGBaX8%_JOit5s$gHrQ>tkoMs#U>*L;U<=)9xB*yUqi!@TPWRZ`K|^ukw)JfmD@hstAiz?!sfW7y`2>o+O?aon9d z@JwTWC)s2?a(bA2*dD<^RvSZ@nt&M%z5$DHO;<$g6`~qdHrga7hYFxJZ|%tG{rp+| zMD3&(?ES+4S8Y@v^N{!lT~b}~98TtBCOFrP8l^dG8!t{${`@Fg1_Hwt&N^fbR-Cr@ zvyv%hWe?^F|18rcYqa*FFdlS9TuP@y4l?7Z7c*<_5TAXgu(=RQ0rc7b&Iql5A;At7 zjQQqXHaO1J*X)0rY)R0m_e7aU%KSbR&oUX`a(YuBLUH(g)`I*w{?W*?6qb4X^V+K< z6fXlCD*wgus|+0H+3N(Ig23bX@QJ77;n0(O6)|2QL-I2#BOS7@)h0j_Kox`;0yI8f z#7kTZ@KTC)woc?J&$hg2N=<8a*{h6LCf?xEo<>E|E(`PCP0?Ia4c=txLp-j#w$^fK zq*NiNw_jC~#Va{)@Cmn=K@k0+q%rm{ z8k%wlotUE$hOt!8zK{AD0SL|Qb#}wJf^Rs7O^ON|pBtV07~Pf0t(!Unx6PnGyQ_?o z{d&@#Q{~G^pu3M2Cm6C=wLXKLG8cTJb&(=dlR4|I^Z^@JiRjFVjojiwSXQ{^!3jf< zgEO&O@h2XSo!#lq6bIOIj?CF4aLG6op3x5uv&(atEF75@S-kFjU!NV89+_kE(_!rM z7SIV>d-D}n4Q$5$96yWE-By*%AF2ey2)^Nm$AjBES9FRHBR?!fp|)2+2IBuq3;(8y zFzURB{&?+z%3ze?$tZ)X3%T`qcXsPy$t_nz=9+)>LQ?~UT)$P&yDkU~y|5&JblfhqrX{LRd1pf`RJVZ1&VZRd4+5Y){hZeJt(#v8men8T&a% zV z_O~;oXbeia*Ku!JurDTRquC2a!YpMbD*s#MKxpD)@Vvs3&JXK8LH zZN>}<)9~d_U5|FHQ$Nb}lhB!KY&;3_B5JX zgVXwTHFswR{as;3pdo3G`<0b9R9GCg)9;S3obCd>lPI+@pdHUf!;iG{LWEN>auDf(dOxlVFPL9%dz5XHTTobOJD!9v*9_ z&Q&GhJynbwCq3GvxO+}1j?$>ujh>b^VBoCGg{JblN{Lht&)1DqO^U6eSE4&wx}kkt}mvz8w@OEqOFWm9-ps z+d&^7TuZM1M|1^}B>Uh3_hnG4=OL7 z7mC0R0kL()27f-{;eR6<06YWPAX{-b9b=Q|M|~-j0Vxbx%6LH{yw$-(gf*np8n9Ww z3TiS$BEG|~!};w}V^TWe z!4WU@Ql0`C^s+{j=o3Y_QS+25>r;IGSw_5yjNPii>GB)IR;SW6PO->chQ9s#w~qQA zY={aK1)Q}*?!fcraGq~#nzDe5o+}9K&#IF7f1ibw9^%H?qdOkZj|W}AbHFAQy!bTU zPZ=I^*B{aUXEF!uM!)KW1(@&5}pr+u1K>v$g$M3Bf;2 zg~#cZ@Mh+&O1x0(tOfm=N+RmLAuh0X1eXPM+@FEd4Q_Zt%x(&?mZ*OkJa!ww5Y}qe zJxLjS5ZM`}2(W>+Q$G_YEa#IMvdl)C9*En5oEGH;sK|^gm6EKRqbtU=cGz>>j=`T-Ld&y-mtFPG0klZu;acbO7dBU5n~~ z{mC1YjlM>tjjjbhFd`37#HKdwYD^9p^*6vKRlN8n&BDY#7fS%dayB*!qi(fTaQ@Sk z^6%93XAVoz5C9ZxXhe(%RD5?$Ll-f1xT{7#shzaw6<~G!%wLM2*;foAOY26$gG;oS|f_WDX?_o(ebl`gU`vj zUhO^BxFP%~SGeps+1vbmZBY-pM8}BxX$$hwinUnAb#I~IXDg^wfacEdjzeh&VieBFQ948PG=m8wf<;!fw$ zUVs(f_+>&y$gQmSF^A~j5@wZ8D`^O z%i%V=tqqoyO(!swO#@|4CxL_9G{Id><8 z2Cgb64<*Jki8ul$S(4*kHt(ZSBIDuK7N4jEs!7AYL8U9p=v7n$u5EJj2dO5-PH6OO ztL4JCbwO?Z&F6`AF1pn31?VvPNTb*EhWE&N0j*-t*U>4KS(v_23knk#HYv)gWU_uVb+b}mdYR(I}xTC%Lq zc&a?)X}yL%$M>F^abcbDzG7dD@^{7oRjLZpYoAJUel}R_i61 z)~ky?jIl(SzwGNwWAdmekQtSj;@0z}c5dLjCeo>jil%;D&UThWo{R3zz;~RzdE!PkDza$1)Rz1c|4CPKBtk#q%3y@eMJt^w&b_Ow*H!h``C) zOx$`%hR$)p!^((?N>#jbDCG30MBSHaE>MtQdVJAP59R;8gAg9L?he`_GFa*t5Bgj+$@28&3Sz`KmYN zkO2={e8@d=+CuUZ>8@Zim`TG(oLiTS;^Tnk91OqA$LyWO}n-<|nZmW(c>r8L@7 zTAtQ@$C)bNS?I;dnNj$ESBif^8P?L6+D7nb@TYoyywLeTT#?A#4|Kqa1iOz+-dqwZ_tKd%Kf zp0P%p`mmMM%x028v9s>SCWr27Gf6xl`hcNYp=foivI0#}@*_Jni`6(kbVh5ej6)BX z;bTOd?d6Ug5o4D)a~+5V>Luk2H!)b@Wox zTf6K+F*q$!=@6&nTt@y;6z4%UVjdW2oS_?lfApp44))Bc$#wJB0i`&=D#&xzsbw1C zU<_FBRdwrZyRMH>8L{jGBBu9cF|I(Q?r@)pP<%=7m~$j3uQTIWWnOH2s?rzK(|xOv zCrn+*2OsX=f}@$nPQ^{b$LQo5J8pkNkTjMTAAQYZgijZ~uyTjQ`3jvgFV=?tE$;qb zH0iKa6gpJ@RQ*zFVmayp=cMt*ZcB537=*aW7fr^V$j_(-@!?vZ zKAqZa(fEZ5Ay8*sb@YfI9M33~4Q#_rea%!F}U{k@eo4At(x^iw%>{f+w3i7G)0}<@>ouf^B4`ji=s#m8TamG2OUNut z5%{gKztYJtY{nTUPXqJTo?f(9tCrIcKbD0kBxWCKXqaO4}XE4Y8Gd zoAvr%z+!;IX zKYFkxBbezc^v~I387J$J_Ao2es8US}(tsp?aA0TW z*^G)q07D6qk*UYjrhZ2WA20(f$ zQ^OOxZ2APqXy2tDnmu(%8;$-%bZC)Lb(eU$ydG^+iOaVg#<$(D?wvVexz|g(JhCQ? z3KqTg&q1Pc%!a1IMQZlFSp4cKq;}M%*^dXpcZe?^ww5_s$A;rXCjeN}1hD|*hc@hg za{5{1#fcb^b*qjK0@g!@vuDMlMIxPm>EqpclkFI}iyGAqyc39Qp!w6s6WD#N#@!u~mTOg@K2Pd>0yNJYK_ zn#6XdnfQ@_KLm_fL0Egd-|eUFX}qze@70NRzU3;HZ$neve(h5aR*AD5dz|_ab@4W6 zRDZ}vF{{N5K>N*ZJS00KzRfEq3NXv{o}Ah!M@A3bOwi<%t$*|K-H0nzVp3{$pmV?V zWvkiKPlRbLfvaILPIe z^Ed3*kEIhqk9yOKUGB4VzeNM00fK!axzc~{XzLlJGOh38+|0>r8IQp-IcTh~S7yc% zXt_F1S6umDgVpcls02FJ8^ZgG?AbkmzQ<#9*&6w@IjjyqOY2(rg)3x5D`Xy6V<{u& zMS^_>YlVP{&<&Uey)P7H060Z0tJ&->gx z=d2i+f%P>6W}M7djf-z0?W%I4+%A3ea#p%sE6M8K z5<&`g|C~E=junSLt+NN*hd!iTSVl6Lcq!rl#G8u8Wt`Z#C_#yI^eT2l;^z+p% zp3UtW5Pa{^69Mnl8J8{e%)_l5pzCSAhWqp$>WQq=v#jZU0cc--#ve!HO?TpozEx0< z>8Cub?ob8l=et-#25p%6WsQgIMI@6894O5*JmeE1AALrWuc;t7W(Qs$6qQyt>Ti!7 zwjpxJN>h0Mxq|3u#`2>L4j}jcK*9h4N4%!*b>cY`#v! zw530Z7BQtcsF`+x`R=)fi{i?ZN)p}L(H)@Ys{oXwk|`Pj-j(|WhuJ;n5hIGvswzrM zDGbRU`#$H{4o$4gmPN>rJQcMGzVbbAI^UfEpY=9)-a?hn4wQeTU)m5(*<|j+Sx#N= zj_GqVsoOv81kOgLYLy8=OJ)}`H#QV~Vn8HzvNSLwRp?uhfgQ?lDiW<&_bbP5TRg}` zzFB3~Nq`<5&EBl-qOI>*d`!Mh!u_ekL7;evtlEM5Z#D40Wqzo-d2~)YgNh@isHf{_ z=7MYHk9Dt3`Ep~`dbjdQsg@04VyuTz7B)qmvT%n1mGabbQ-AuQ^#{dcRRVf|DtlH6 z;J!v{eTt|>uKBv|RMLqnrQKMKNxP`pC%H8)kvbTiBHc`LqDU6%@k zfkir1Qq!fa-i$0cP5gnEF(My&(KcfPqccM;0>;E^?#Z^NQssH4<5?J529)9-O@B>&pNSOAo`x@uC*(uuxZw#@u7dRKCUoQL~1m*HF zMErBKq;ZC=Pip1MqO|UP7p30teZHjI=&DKzQ2p51_>6C=uad}=BCu|UIVfK9XIqFs zi1AN-p54&Igx zhkS@l(g&;z0bd2-7oL)U8{(?m7h#;QKY1i^qf@o2wgOWYMEVm=*1A9j>|Xtl&0f3N z08jAhOSOUT^O^yVW$ear%ZG}M`fam)nF@&((B91w8*BO45wuioAPR?(bNsN0AxwQM zDAx`3H4|%4NmxuTSYmrBF3*!An_s%pw-+H`lC}Q-t2b!OVEq$XClA%Nzkj*#8zWC; zH7LZ3OfO%0uaToopsjS5f)}~T)PwL^j|vGRPc^F(#RbetdO>5m7<4YsfM9*;EJZL2 zus2=xZ-Bnz{8J<0->?XiyPB8#D9C2c28`j;#3D%0<+r35OM}0h`nQ^r=w^d-y8AkylYnf zpe0{nOEMU=(}_EFOlv%ot?p;|_g@fvx@a17a*PIG!z&*hLaO1BDyd>+H7wAaha6}U zQAL#H#UD1$oh_j1lu=ejjkwo7ale0KypS;U+-%5_Q9xvP3@~I`BHUpfu67>nEWthl zL)%53$gpdvSp8gA)K{Zrn`&ZhX9io0OriWC#b3WF|Zm=RFDZL8s> zJ%hg00RR}Fy$&qIm)<{=w)82PxK8jRxBraMGGLw7Ap*QwY{sqRGO9*@Hzlt1(C42a zqf5zPTD(R-JAEk0*u)vSj1;~zJKp#<-{X%vqll<5%c>Gnf*mZNeqo(AA0l#N6cL47 zmgy4`Rs5ACl8{$ro*goGD!S%M*{>DK;PmIE4Q5RzImUoo_!gZptpL0P7}Y109Q()L zlNml@H-KdB)}!1sfzez*B|th74h_SHLKQ0{b@5}~T~6&39ILOgy%#mWfyFCYiW%e9 zL@D5$ieRi@m}xpZC82~YjVfD1rHgeSH9YRFa_<%SLw~7crhM@qRAYdS>T?I$O2EbO z(4e*ozJe`$VU5g@s&56}JqL6Gk-`-fClDSPz&e%It&2YJCYrv^gV;>(3Xa`S4K}K2 zLyer{|3O>ouhbvtw8umXRkyzRq!1aqrXFm06^b8a5BD=9olwb2C*$?c<%heHH9j*U zH8850=**G{HmQ=n=9(Y@Ur3Bsi4xs>6+&MfRS>1PwieXkhAj`AFTW^WA~KWZ;@@V# z8iffV7Kapn^#Ebe&06lp*x^W92MZ_aK5)Sqx*=h+4aFm9eexVM%mC*+%&UclEV<$sgZ3T~}WA3Ys#(h0d!+RgIh z*Jg9^sXg3wkeLaV_h^i$M-8%dnRrQv7&{kh zjaJ%JM~(rjpE??ftUCW?SRHjc4NjdiSSdgm%H=(manoRf3@8MiYVl?rjx0Jy1gCHB z^w(ycLX^oD(eUfW(q_T8Mt6#IrR>^puY_A`CrZQcor5>xfT_|z*qrQTLDVhd!r&{D zptkx9U`N?}*93PXr3-~(Cla2mDY~70<*BtA0A8p6q}Od}@}H_UfNADU064;Dn^Oy2 z^r5OS{z)pl&WeP2!_f@kyPW0JSF=olq~78O)v;d#oE2aT&&9``fcZ%Rb~=^ITct z2_?auF)!p9^ak7>j3nn<2X>zjjx+LtGM>_RIKgBklg|x}qB`tvx8d!L3}>gtUn!k` z9X4Q`NJo>R(6aD#@|Sriw29jX%^NfP+*LxaFTX3_ zSNE}KjVw4wCIzH1JA5UJCmxdy&?^qJ@C8SnL`9y|kJ#)rB-*zDt(Q0%`t%+0ibC(S z_G+Eu)vu)Qf2$3EY!A@r4S6TuiT31^LkJO`);38ZM!;%tE31x!N# zjD(Ogi6BREE6Y6ZXW8lm11Gv~lxd@tmh=2vi$Ca4asnuF+%xSCFMEq_|jOcqD(wXrUUiJeAf| z&)w>tKIjhI$g7D^z@q*iG90`a7vLyeJHtdhh{Uc0LZ&f>UpN%m^*@_x{*>1TI)NpMJ5)Dk6L6)H1f$+W zDHN*B(jF*Zo19|?mHlW=12-RbMW|qo;t2+CeF)|{C=NuPdO z1^(i!evh1}+&bPL%3$^GnQ?)O>42p8($e5%_<_>!V(t3&JBAV>}vjIfCOcS1-54Egx0;J!6Oi9pk3-B5Xni!J zVBWiNTvuD1pVkQonZ(cm7CBS;Oc)fO{W}|cp~1wS2F1}lz~RQY3*2p)8rgkuXy2#7 zMsNGI_NxhGQH4BbWq>U=UKV!}p7`!LtWYBB%IfzYkOsKnzy!OlecxKv1fB-LZDl&y4cFY)PirnqnMQ5yyXaeG%yv7E!mD~x?BeQ^TLQB2DrZec^!Z? z`aL^EJ)}|5dlYbvu*VTdX-~ga2c(JhQMyvD0jpGcr7RZ%3%z;3Aczh*A;s1P_WQ=x zS7LB3OJ(uw_I>*%3LGznKfp@s(<7JpzbsrV+u%R8w?+(?1N<~#S;O0RsveM5kMF${If0n3IA?5u`)5KdSFFK@#a-kJJ>{TJkjz4ZvFnXF-e4bLBN6}|`3Bwa^_V;M!QEsQjA z??vKX<>vUOtMC4&c5$SvyDPY zRSs8l$1y!D61xp3rSc|ON=LLO_p$dI-pGv#yDf+mj!|z;qyt7uB1CA@8~`MLkE1zY zt^ueILk2dp*_oTh&tYF($^3trL3s{C6Nhc|2r^nY@VzrE>cts8a%|N*x|pR?PWoB> ze)Ru&$S1a<^+Fj@Rn4Ba$zHN^2xJt*NII{JFJyQVH9EMFdIPgCfqEtPG0+^6)*H-y zj&C#N&`B>5b{nw3fB<*0n2+kkk~jX@!xqp&8JXi^JxfL}$l9~u;v$^KV3ZPfw>hPu z%|-$RX76AO2uKxxnZ=P{=t_Ri z-O-inv~|9slJyF&A@rSMAx@Nwi)J~bCUqRdj4s#4N}gq7Z~$%ytRYhzatuA%U3U@4 zz38Z}m;fXJ)CWLeTn``%i^L|D5gM3n66(|Ut!RPVs|J@E==JyLu?%5Dh{cZfMeAHw zY%*Zley#p!h{nWjzT*ZZ&weQCJW4#>^TlLz&hN2Rz#aQ5m;4TkIgZ*wf9&olP|Zx} zx~9zV>~irf3!wmGGNSOc2pwOrTp9ilwL+a9|JXQQ{c?QS1c`_OTD7JfR1)}qo=13+fsKAv*mL=>xtro%$ZE^wl3$t!Bd(RAWTFg#+p1E>E5$E6rXxu>9st=@XMrr|6l2k zJ@EhK^18|}|1M)*D7IR|n5;yrXMMGW;J*+=%t9Z%5BtU9c6Y12>D#)6S(zjY_JwpK zH0Ig%8Rh_k$mVnc&h#y(aK`Jh;_-MuQ>Ff1jh}JuWxf0G`AD7=d?z4$4k%>ffsTXB zb*qNw7j{zQKR>%@d~An$ulD1<(_wn5MAx@%Og$~;FzeltX_os@wxqL|B&6yC7;9Me zOcAKf1{v7aJDZd~Tf!1wZU4)|_4hP6U^973I52Bf0>ZQQ@W-TE;Z`V07jmoi*=l?Yey-8}s&iL(fIcBw8?+DT9>0^FNd2(V z9-c`%ffonRgNN5Y?c@h^vXmD+g3InM?VtKCy(jX#*^RQ@Y^UWyq$;tSA*DgaHZb%( zvPL_=mtwMbvW@W{Ty2tZyHB;I@zzVy8RKr=9C#CAG3A=3NYgH7JShHuV?O>PpT_YC zLzfV%+4!4ZtnEngWasKqW1_m(a^}f^$$O;md1X2&+W=g^Hbi%{f~GQ{><%%X=)P-> zQSp2tm;inCHvhfOoH@|`bLn~$lF@XBxC4+B={Gl&0UKPiIC0`0ep01N(cN>e?3C46 zcRVq-NJ~KMX>NKbuq;+9c4Qz@zEA1SCUS0j&&P-X)Gk#m_d5c=HJfu+ZEKWHYFDdz+guLu=ONG=Sr>rRMX)d?0{9@v9J zqXO67UDiu|$6A}rG81ZL;ymd$_E3O&Xt4^4k_ zp>-W_L+sQl9N@x%nQi3j@ygew-UCpw;z(p#R7-&;>6C11o!u5y5s+2RuZv$YNdb9U zsT6M|kf!Y&!c^Lr!y$Zi`2KzS|2&AmNJa2ALVd9qaW5#~{5?@d#U0`c zJHVy3A_tugy9fK8|}joN(U1>beE!(eQ9lLa0FG zgsvhx5mo+GoL>3}y>b5VVL+bf<1JUmz77T7m;T`kI-2D-Ieke z=(*akD{J|DTitQ>3X>@CDkr2}jZfAk$=3kF2jB~*yf_er_4}uC%xfxd<(suJ`eL-h zE)yBIk(YC`J_vo+5o^;1d*^4-47Fwg?IL1tvE#6yt!ES}_gp~F1-@r-m?*M?P!n7zn^$$%vY_lDQ^c**J>%A5ZW;bUxrFU6ul}1$xTzh(_4+8>YS)_MV zfS*mf^*b;0UN$<};}&k=>-CmzX86y+r}Q0&Als~7jA4V`*MZ9+VDrVvWuZ)$Teii6 zjclzh)AoZgUZ%`jT%DNL+b2mr!dr=s*Z=6(M+BJE8Qc17ycGC6(b$7jWIx}UTaQ3e zGl2#usJ)_vF7o4V$5mCW9osW3SLs!r>X!=Q7~<@F3isiC1o?B{|9-?7?O;wPHlMx5 z==H>0vJ;~cIvg&aJL4D+=Bbx=)8gci5bo$`u;>(SSmg=9J@j$9WL^SRMcfuBCb%_^ z;(w$;mBlgj2Nw9}gLlFxka zwHAdeQ}f|5ANCp3?6*L5AK;WWUyP(fPE6nRtx3nbTk%aqTiN%&KD@9D0yjDtkxnKvNDOfejFPAK!<8BGx zzU(Aq-GSGM!jFHd^xy}YIBg8e>kE*t`S^>xB*BjE-!N;+aI;OqKMBDztEunXoMR#= z2monSbdz6$LBB3L&`%4})msYubj`Z!o1eS4g7q>t#FjEQ7TezKKQi)clVdfyCidZ$+z6|FaWLgFMc3PWdd_bn@w&eXq>&>TIAa-o zS(C5tve(xe5d>Ar5IRl$0hr4Ry$_4&ju=7~9SK8Z>4}jHCn4A&4KlUyX!FJBCYR92 z6_Kk_?>`drZ@){*C=8l3lO--`*lM^^H{l@CJY7(0eG_~V;=_6vN=s>2wtEU3QFC*` zcUe(JUUIuquRA?$vEOy*wLU*4DWua{^{!&9^Sv?G>Ago~l+tH(R)vmM^`P*`+l%WE~5v zJ6MwvdI+2Y(%{W>u*!&??Zq4BWoJvJDDusikb-&-?7I}qj{8GRweKEA%T|A) zfWI%nu(sm-DA7CL+?hwAObb&TV2f7*AFz0i^F`i~1!U^2{;l8!ay6!{x}m(HeHatQ$Fn#86=b>{_hENLR{a8fV4daEEXn5@bp}D*LXgq|K^Z_$eYL zuc4gX1Q)|h2u`XjP^eU_<2zr5JY>y!cplSeFoeNa$Un6Mjnq21sePv>;LAY#qc%Ur z5PjwaM7`HzNaOAth-PWb-8~>%^IZ07cm!sN{qw41Mv@LS%7>(&D zN8I`WO!DvD<~zVcDIIdkl|A9D&u(kYcyL`gV87lkdOP)(#LGgq(y76?1gXn;OmGWB zG-x?*ZENy*JF)k2TZqW0jO0>dvOZNtkJ@C9=+SmdPHv=%cGr92T^$Ox#ACV36g>(w|g- zEl_%cYGii8_{_^`e;?wq*7m;52KIH{?h6pEpfEG41;&xeLMN7Tz{F;Z;w-B)U7yk zjBXz^TO$fuGo(CKt0o092o<-rWBF|>*dy?m=j!{I`P#@R#hr6Xdic|%Ym6ezbeZVL zrU*?YWgMU8S;J1#mFS>tGm65EZ-~lSZV52<@PZLOD*4){r$+M=vS@L{<6Wy%g)CuU zpacm;yUIuUbaNn2ZbG9$sevB}hKNh%+Ex4iH_l)2n;q2Jls2pCx1pwG6I*$U*Fq7G z*(+N?cl7eH1e`+HdMC2l0sE*~?Dye`FkoQ5Fw|}Av9Rlm2o*SMn+@I>|2AOY;@kjg z{F4MB!HlVz$7UO`nK^&NUGs!lIEH@{xIS<1WbtbXh`;FWYruzkEMzD*gJs-q6Y*^l z;t=%8X4l;9Z)d1cK!0_o7u!CHwN%AwioQe%#s(#)yrA3cUn010F$H%;s8~1gA3qK} z(4sJ&`0#Y%yJAUMWh?EqmnfDqarh|y%nxV~&GbM4WLE>p6k}kmJov1%zc2Lv`_hW@ z&a2^fpoXmz1`o@pbCHK@5g_`KbvFZx^RI`RIcUoID$d#-`{KPjfM5YidBq-W^}L3s zw2cxcs7VMPdTeab^yao6ddgD~S?H11L+7}spzpN|ESVsJ*XO{dPO#Qm44mjAthJf& z)kzQjMA5mm935>Gfz&yT~&>{cf@@L>`4D}C};y3XQR$C&8h zD&PyFBbD5dez{A%6`f@Z_o%_Q&@GxTkWiIoEcsEz{-{*uF^=a7H8;>ZWR6mFQ>Zg~ zR=GY(|KVzv|Kd6RmD%Ubvf>YCsr6t3Hhk;fP)XOa5mF`AHSFvO#LZr8WNIaMH`FBq z`1AE0!x872Mm_S?6=C-WdoHH(u$!|qsIa0r%(oRR_Gnyaa?LEzM zVbz>0m&UyPZU9nl|5jh(;F33JFm)j5rHIaE0-0si4M<$xEMbm8%xwQ~;w-U`rsc-6 z9CVxw0n-Z(6%crc$jCm88Cdl7%M}%owqSo)rn+fY!_vwDJ4%Bx3<7|FbOza&G z$dCEBgjpTr(^oC_avdM6zsJx0`P7vD2^jy38WW;M#UQcbH9pR?)Z0ukqVPqTD~ER5bOaU4CVz~%)= zeC{a|?s&iGOo~h|V>9#1$S}UD)?s*w-VoJB5VY@yPzE)s1yr&05P5<5jV49E26G*{sE&xN{!Idr&|SIFo2GL`kP459 zVJ99MH=i(klSXmUKz|9ynkny@*SsOz&>9B@Ob$}g8f1EORH?_1|Ia&Ykwx#k8hr<< z!-9Gao0CYy*Dzcj%v%J&Pbe^8%`BTAi;%4A;9O-35p{@0WGz!*N&7eyg|gY|e`LfH zie>Pzcv*#xB(ojv@h=a^MaPzwyA>h3>;3+RG1 z#QV#28rM!IEPyss?kJZcVI}TAx&Pm2^)HnM_ymo{z|iSzyH|t86WO4NygozCd1loF zlpkO^ov*LzRF}Ci)g|++U%Eq36KA?X7##B{0^ueE7^y0$ZJeO-eJ&FQ9$PU_T}u7a zgO2N;1dT?O?a!`1`VDKz1%v}WNO`-5;X}XmR7DLMxN+%#S!NgrFi=utr@JkxF#K71 zkOr`hUrzXWTjW=Er5sraH|D4z46Qz9VNJ&N3FlwgypMCXdKPVdbZpmo2;lmL_+WEJ zIjAX^W#U0WWgK89C?UA+OXD{N1BoiWHmS*Rwe`Nqm0s$Eh#m>yt)I=Te?%Vt_;3@x zK|MCB#VqB#fQG`%CB^C$Tj_Ad@2Ay@8#>&55vV(zdY)n)deqO2=%TYZjAycu zrqPy2MoljZ{YFBdmltg3pB6oMFcEU2R9G9QlI~%S0iLN?8dyk1S3N7w)ut3#;#YwdzSfo)-S?rRx_&peYCm+9+Y@XmeWgoas$+Z+K7*qX6 zq0d(`$Uo)9==;%%(wc9zzBR}oT#A!UshsDo<9*e}6RW|H0@gpj&SC5&X();#9a=k1 z`~TQ`3!u8Ttz8h89XvpAPw?OtG!QlrG&lrzcXtU8+=4p<2=4Aq(BMvRcY<3l$jLeP zzIXfoyI)mzRad`?u-JRaoMX*7`mh({eHAvhyD1a&`psvP2H|$BO~qu^DF3FF)c74oqEt^2I>*Plhp=uJG;2 zK5sSJC#d^RL<5wG8QImbITxKE|3cmddqxDGE0C2)8Y56f>u1<{Yk)(KxBTgI-;X9* z2hto1G8;a}aw`lrX%}Vcc#rUchZ_xYnBjW?8lN}EqQ%H-K;p=AfNnTnF}4HFDFj$G z1K&Kzz4{(g02o@&)6EBKGr=Ne#tp>tycm#qvM&|#tz<6GoB&q=jG_x(gDpX*!6dEm zXa}WukW~f-d+fox5QbMRQrKAK;91E6=}p!So&>o5xx4-s^{9JM_8v!lkyM<~^xlf5 z#>@qg_v{}EA)Xc$(3wn3WlTIB z*6{5~f!tX56S}Y5WQW3hs{yi4t%EEH#C_q<0i3)>YJPgNY3D|YD zJ8DNJwF&_6h)#e2(T_HY7N;W2>I}1$%OPpWgSR{4QGO&s`UsuJVXrthlz<{>eO|@R z_~}ykjc=>kgi4mmFUh;NrKDeeqV?6BSdmm|JQ#aIv1TZY8O6iuduAeNRJ?>52x@zl zoK2;8$$E5rhbWV$NUJbuZNY%tj zxxPK<%@llu;pT&fGyz4h!qNdWt>c4!%)+r9E`exl>%lv8Brr%|K9{l(?c+=w-98J^ zCX8XZJ_!pl2UohD_*V#vt+BR#Fd0ME$av}N<7<+wk<(VfqL=E0KBxzhUc!SPa|X5b zE@~JErF?9vR4pdB28as)XIIQEK?ZWq%m1-R#T;qjPLAt^Q^o4Jg2f6lPl)ujfO2~1ZrHV z^3+(|`s?pv0`XOFHfQN<{4xB5{XYGT-u;P6-pSyO0p1iBl=91 z64$5`BbIWh`&EGPF|kpZlobH=kp^i1n*XE2J^HNxG%wkdwR}e+Od(|#S~UE)jn_JY zMo~_f&w0vb8?@2N0_T&yf1$f{U_R1d%vyC{sD6O#<;fKfbD&&R%a;t#aRK{wP!Wu4 zc$7~>81n8Jc@alk7#2;d+KAHF^)xG94$+8>{?TL#lS~EMx3TNt>{N(aTMAHEPM?=Z zb4&%38bl4UpMbjRg4&ie%_Ypgg#$dQUW`)gc&TB}L?v&W=B_I)U&N&xm5gYTp*0!q=<>Zwjrl^y|EW;RB2#iip6V2`9cn3GqaR zxAdMg#0-70JztDa22Vu(2^)7lFh-O-MJ!FeL?|Uklk_n9$ws(>%efKG2wprVY*l(c z8!R_HOQ^!5OC_gU$!{quV^|C5!VPJZ>+L|VmwybrCtx&$KGfe(PYOJSuXM>OoDvGo zU*z?qf~kJ@>?5Z~9dCjxmfNGHF_EXv#)UCrgjWu=ubHAm;LZ7sT5Pe5|g2}jA{Q4q;8{yb86ZoG8Yu-aO8GY1CJ7f^37(z^>JLr$HeGc)#L_qi^`+iY40;r!fYa z!DaBtsd}SmrqMY5KdTi$G4YU`qLd4x4F)#%zh5&Lc z+se{}2_%ygt!AW0j5p5CDBXCX%TUcb7Dlxg%BgvNh54n`lobr?pgxR>vB7xGlJoDP zFTjTT8;b=t0#Y!Cum8Z)k0r;RLTB*O}j1c~89UKJ8^7 z4)c;PgW7u_YO!a9E#98=rUy?ud-TORKbE(FE#J(OQ=KZaLu_<*#T;Mn#cz2uK|BtJ zA#2Y0%LHNP8+hRo)t~TdtBWy_@uLJTKAxq z8Fc6d9RP&fwHf&3+z)X7`MQ@-dSA@S`!AsY1}qI!r}}4!Kg|c&l|`@F2-|E~ZMr88 z;DP8PDAPNxM{OGu-xdA@anhKJgd3}GVf5KAM6ht@3kwi*Ldonyiie#hRQ#%$?bHt4 zid=QR(D6FCSOkrN*IoFnXeGq`unYn)myaHst|F@f!*Sj>d_{cp@TpaNFlJ>oqu$`G zb=oC>4XRZRp*A~EAeU#G#412xA29Dczi3T`QC>iYsJ2Zo=Is{V_c&S!)&7yO?j7RK zlXNcKtOjdyx1+M_oBo}4urV={wve&8!}i_3aF^d^C{6$#vb0QSHXMsA6JA=ekro4K z@97jOkpvXI=Hy8sj#dLj5MbBqQd^maqYN+^y>|Cuimn3y^RFoRDL?ZHsenu^1m$uE z0?q;boWfGsM_?l@75?1PxaG{SjmA<-L467ur{xOw?k!^?71V{h0lzaNVyr84e^PCE zI~Lg1yaZ)-^0LjI7w>XCfsT=5NpB2B3+VAU$tN^ninx)oPxJ7c(c-a2&X$f^MYct5-g z<7`Vulp8m&09aw@ENHBY=5q5+Oy)vCwmhn{;BwyyrFNTzw!lS$4Fi_lqyzAd?7G-% zRg39Xy4aMUc(BF75|D3Wg5SA#6epmlMhs zDz@QyqKGcoCwv@oU6hTxV-0nMPpN+_p!ttz`0M3S;v-8dx@UuTdfCcTPn{2TXe_p# z`8bAmzYR}49GOvKWd-B|fC55mR5HORUP5VoIF-;fI5SKlCy^_LYG~Tck31xn2GI1g z0s^HP=ku9{HvWBaFRf;%J%?Kk5zrE>Z^nyn3#z+~*j>p9RD6w;kb+n5sScwi$W3om ztmHh=rj0z69dSY{308Lj39=NYJEJ*jYA|$or*hAfxv1AUXO?X<#{&T)HgRzQn@ruy$5Vn+Ab+s>@ zOoMgch8husZM3t6QCmCKTs!72w>T|KD=gqI?{8J ze7IqRUb|Xx>&RDx zpf81zpQ{BJG&YFbKs}<1OWXi#6U87hO|+A+Yy}Bq{6mQjJ_I*;2U8ZO&t^4UVYwp; z8=@T*vdRCSq$75Z$okf)S*mF#H4Ao!eVl}E3%GdYRah92-_E1|ELjY%A<nOt= z(Q5Y^jqz}F(xEBHnw{bNvW>RpotOJ0Um%(1g%e)k-Veq6#LQx4OZJXJ*-25eK zLxFjeAL#P?Hfyab1=PUxz`?f?=1n}h6OWSZ$yWC{UBC*cSbA4)=Tk6(9Vb%^wbpkI zq%e6saAU%4I5iolX>*t!AknT#K~5$8M;spyxdNhO8+_a5tQMcD0-6J(>F90IHMhHhThbr>NNV=OiFrbqo$*rwMwcJ&8I z2uJ)-do$+QQE?8xHqX={uVXXBT6W*UPUNJQxKYFWgE9@Zd+K~5~AgL8K1NER+o>a~6U zpFlyt#m|!=$)0$ATz&9a@E~rcqUW-MQ+Wf?OUXP8VkYCz@t)w(DI`;jq#dCi#UV353ETCby8a_O!4B6m?d@0s5fG`huehZqsCwAOt%;1F_ z@dqpIjp7_&TDcv&THnyaubD(~7YA0Eavg==L@jN*zlpc1$F3!-j6XXCYhGk#pk1zc zQ(XG;!|PG*DmoD4rSTKcdufK~w*hXJwqOqbwk$VDEnfd~zHKm@m-iPRN5ehxe>dR% zvVRQj!9p>mV=0MV&Qpct-%4%6wVhMdXCDCXY#THH4fFuG0;3uPV6c)*xGY#Ft_2#< zE5Xg_3YUWWz2Q+`w(SGB&-g05+HxZybQM@tz7T=}ZLKuJ?V5G3G0Npa@f6e*S3KlhGzHLj|HVxFOJ_-}!$m%8%aQf99e<(Z#0DKO zznNn2CVY3YRlNfpFrvkd3d-oF3243UzGHAEQ2Q#ELD{U+d{Z1|zgf1og_m$vcr<-W zswuy~|Ky5ogZewS~Ch#jkW;Af%Z@&QS3S8UWF* zM=)#il;8=1iwu_mO!{(unIdBH<-R$Sh(_wcm*ZXT9+ssXKEi2>b*~Zr`38DWST5iU zOR4yU1QZv6o%&_e>c9r6I%Z^0yHVYa4^$KfWCnjS%xFMAr4*nZso5I?&3TnDPeL95 zUDkmDv;^SJM|pQ*B&QOlXTGr>J1rizSpDeDfWzNSPny8(^c|iZ?5UPxIl`KRFbL~M z@1%{lsiMEL-zgSjEPc4-fGj&W7|3p~5SW~8(l&+R0aiy2?6hYw^NTgy&}PhZ&S};E zf;FE`B*}2r^u*sgGc`AVm4mK9f@w1qAzO-u$5`SA{79bRhHrtY2j_r00#LO9Sc^ng zh9oyaoqSc;Z(!X(Fx4*(H|rMetw-+d{m46Xr!$_*bth~foC~Va*c5ZVo)1CM-bm}3 z+eUd<%ehL)-WagvbOjWRM2S6UKEj>cYL$O0B@(+*b#W@o$ifwNEQR26WJFBm#)Kk> zG`vXE=ku#9mL?GO0sz?F`d3`lqZUOynnRxn9$4y_0gsMP39%TY%7b$m1B97L z8|CM{P`P&f%xQI=N=SvjV7(;g9BAG(Z~(=HG)Io%9%xpB;TDMa!Zye2SoSSE2b{Vu6&NLH`uPHlrSPZoB|*{{$zPLV>l zta1P-vZGwE-iivK@jnkkeK{`V>&G5j zO@Lb|g;A}AG#VNrH9F}ci0-n{cV8!&-!8@#;=&Vi$KS@!-kcSZ6Ls^(wvA`oxoe_L z+cn{a8Vr#~{&GFZi%iuluKphMgFB!@AeHRlC>7?iJ%ge&jQOO>jh(-g8%2Yg0J4Oo zR#yl?G@Qmg>sQ&yi}jK*&Aob$#nw@&ub$P_u?i_5V-^k|n2GIUyMVz9W^w03BLcSr znG@T9*NptmTUtL`1|GOmxu&YGGtPFBaX_J95!+CvMXX2GKM;cxcVFw>t$Y>~;)~c!WZZ-LH65 zJx#ig{q9#rRf2v^PpSk}2H}1T)0dCYSh%iuVI*8M8LKD#+}7~90$Z@dl3w1wPwBBA zRxCT7i+4q~LEp@pt=m}qf`5+ZIadzdfF0-SIYSEj>tl|^uCW_mtrULvy?N*Wkp5A9 zBtpCm@2AH#nQ-{IbpeIXAy-->f?iukJxSjI22GM?3n zn%Mbe4?&ZD;*4A0ydl`dPbv-_T3(GI;{@j0I^=J7QFijX1I+u zwlMK$^7}v~3AB}WdQzqdGd9&f1%c&2`qa-17}4j35dYKL$&cPSRcEg-`6Szc%QGd(2Wt6Z|dwNISoS zJL=rUT_p{_6;b9yyf?ZHK@;2?Q01?67eYW10kvABnB=IzKDe+VzXEGKdgRb#<*wyG zS&A%_ryU`UXCTP|jRps#*dk6rTUJLbOy4x5|6B~?= zE*S(;Hlfrg0BLkt@p|sG!Sinud>-O2=V(yP&8Cj-$79?zj6&LJuse9~u^Bh$rKCugkVEFPH%(BN5T^>nI&|x@imR1rU53OTXc;< zys9|xcK>Px_t?{NlqzfaS5jWwlpP#0-F|3VTkL^z$T>+WcNJ7%etge|yspU@`ZF3u zJENuTySGP^`%Fg(&|*hd9YMoHE)=Ll@@~haD=kt6ULyV8k;>>>S0F%9QZz4OHWa#I zc6vzVv^r``1PkE>hM*h3XF{?$RKgFWG}rmpO-vG~Iy!Nv!Wu3}+%-LJKCbYQ}~FOu1Shc z8YK)F@uyXor+i`SD)=i-A%+it)4kPIL|04qD+HO}`_5wfnB5m;rP2fvKH0ms;)J|e zIU^Bo!pOVLwBIVNW^cq?Rj37QgvI`dlb28xYdtMtJ^KT|1l$yNs}z z$I?e?M~pcA4EAae=%**2EB&yTzgWvj9uqFKW>Z2z;K?7-FCym2mWKbymkM{UhFfVf zRm1TC2I%kt8J6~8%t-XEJF>Y}$9nkvx0qsPqVH8~L#)a6>XrO?j3tpfUeSi#Ilu#4fGf64PgwC@;2={Dgy@cUzhHI6pACH;iKPQg?U&r3DlaFGwXx3OhA~p52DE*oviLc#toaMS7Oh)+f)k*w1X6sqxwgi9q2!*4b+x{ zDkQQ1& zM$R&xm+%GaDrGHewbja)yFs4L2pI3Hqr`vd?Xd6`(G{mU_b21g631ow6wk-<)+R zmh@y&%uUj*yl&}^TmvT{vDhjJW#zSuOrPukxwe08RRUvHsT9i}M%X5-1W-5zd`cf~ z%?T6R?Fd$J9h_t5PmmB?iB4aaPH4L5g8HRAZFu%Qy62$H7tsAw7<@Ezp+gjZ?VXYS zARf4=c-7kJQt^mVD-{8{Ld0pIGJ9%HT&jveHFG(Rt@?{Wj!MK3Ymsi5x7~`4nkq4l zl;kB>-Jx}zm3^pt54btljzE{}XRLUXDW;DM=V^dIF)uY&>KHJ~pwaX`i$rKcVjyT! z&O}%>jn=Vd`*U5dy4LO`*-wrKNm1<(&M@Bo#2KL1?^;Oacl)HfM^-FD&k6i>2=y! z7n(xHmg`R0OAN#>&gNv!+F9Ice-fiQc2t*+~v!31Br#aLStl`d`fL7PQm zCM4Y&sqR{=MOp9|jbZHHT>DX|(r;L)OaSF5p7$_@ZR^ca^3}=G57xgKpJf@C9#&p3 z98pVu!3>T*ov&a|mHxslQ{4Q5CD&9(oz#y&dPoS*g7pIMk!0nKjwrGv8kHd}mh*yQ zU7*D$BAL=hrb%3*g{>sR0Uzk5b!@^$hg|XD73DIfj`r#oE>-7ltTB<(1e3-jN+Xnt z&k4nQ2`$donvs?!bkzfl7WF|k4&?@kwjte4gN+Lej{n%uaw1vF0&*NP$7x9c<6}mz z9zY$8^yHk7SBIU^c-?n1+ZX0V-AtSzX%(Bdy8Cb1F#?8o@xhnP^v#sLtBm`3HJ zXzJ8ug5|br1X7#HgNz$a0J3T3+eo%1Y+LU)zj1tl58t2kmK+}Xh4t?2GG(&v*v_-8 zSj1%i=H4MC`f~G9(_cG&rv3}!LaB#3Y8KN0r&UruYzq0`3z=@n=vD3yqz*=;4%T7b z4v^`fnCvDYdm0N4lu!ngQPue*5OtD!4)3i}Fk_=RQDk`QuR(ZgK=*9V&7p6C=JK$N zuC`Gey1F2jo}F|!P<&r=R|9&IZMcFTm2Z7Eab3lu0;6PvxUcy0omf{T?@ulV;7N=j z`%eMBzio?67Q6|u^KLHLr*EJeyK|G2$o1VgcI#z?OomOuiFts)JJnooLW$VcXYBrM zpZW)6ihAt})i&W#3B{ne)3N|x+G9LX_znVu>t)V|JEslxXT(>ab++Jeq;)KOB!8PA z>X^bI-UnutxR7DRr{`2;|6w(I=B&2+gCPwx;f#2oXOEPq44UeVF7;J`y;v!PH|=hN zzQG`o%Lih1zUgi=JFT8mF{ZIv;>Iyub#PvKa_a)2-B7Nnc`_ML2eTNE1`6gkg{(Q8$6qD>kM$2Yf5AkHhQB}k zJZlFt2R9njTnk{+CanGLT9!~>#V0BoCQ}n$SCGTKQcSG++OJGwrw-U3(tro7A*IBu z4vMdg0rD}1^3^$9RhLv^`Hop8Hty4q2ipH87vQjc{HRvIoUy0$Act395+UJcmW55X zu?%QJVMhbq7eixZ)&GqKoGE;?u|L9*Rsj8@{WVJwStq>^X(_oP%sH1me!KHg$URB? zbaoe<;h?HmszMy@<9zap{>%s9w7~D$I4`~puFVVWSWgaW_X8On)Nx19c>^uLpz!NLfII=5l7JNY zrwQ4|{fSV_OB$(kW_753n$@_v`RrXzfA1Ssm4rzwMY}D~kg?%eVlFaFTL}=HUnvua zZAQ=jT?ZC$GXsz;#!{aYvZ%R9>e!4DzQ$snwx+_(^4f30K19YSq|@(4cET3# zjkW^7uYd{3W}m{3`RA&6G#J?+97)VJLllbEGu}7KJI4%Xm*zDF-_IKg`RawB5Aj2N z$+yXDKYRY0d`m{)*ygdd%Z*Z(ZzIpu;UkLD#Fq6oB^HQA&t;AO8xvUt&ee{-DmGyX* z^%PfC=?~@y2q!(g`?9*Fe-zcHcOOs?s>HGnzSReHtFl=W%$N@EaOa#2z``d+)}cu9 zmbk0L!KDJ39gfH%UYtV$RH(Og7*vV{t>eog^?m6XcX`%I zFnd6oEj!h{6C;ep7OGD{0~^p_4Pu~)d9dZ6bwb}}ala*O!~|ET9LP~*v6=H{ybNAO zaQbP4blZOqQ<|#Db!a1HNhtd{^u1}qY>=57(UZ&ZiLBj4K4XND52JtK=})Ur;#poq zB8f3brDo&u&2a2Y9!^i9wcqiXFpy;URVWGel%rR==$N)}L#O5r`$dI^v5OyXZf(&S zT|XCdv&I23MBc3#Z?4T^ZnE6&Oy$E3)^24on}gcZrec%>n8(;C*w&%EohY;$5!~@Q z_-P;;ZnA)lFHNnQ399r|R83#Bu@uxEhbgV}wzj3uv{fQiEt(|Ul-GE;4uPWVWf>X@ zdb;e%z$_X0W+3nw?s~d`t#)1;Qa)w=lEi3{sHCNCDvvJ9Rw%U|EMB;>t*L3h zh1~wC7a`^osesTgpwqGm>t4#!rqSNeV@(y9(~@et`uZ`l%I`(}MoB6-?o3LmWP4xq z7G#Z^#SGE#>S@Ep1Cc|aIcy;t?eyMYUDPb?+|H-RvsmV}@x;=G%?I!t{=|Z`HAhUf zuIP)k-R0trOpVu>jPd?G`p2j3>$m$~xypjX_Sv|G&l!&; zki+#BipFZAemqxlg5C@MJyz`3fCX}aH+YNuXcPaYrgi$b(<_=go7C+vXB#Cnx>Bb2 z23|bcA5J{GZv%?AK-3$a#G$`W1uA2G9;v*l^n0Y@2XM!Iz|-eB?6Tz2RHu1Xxrd`v zrrmDADU?8qqa>OHgmh9^n*SS3gBv1M-Q-0$1vm5n>G+3w>ubqBsCKi76s zuXy#gByayc3s)2oa%sn3Ck6i&35nPE$PIYE$>@R`S{M*n#gy###*{uC#;tciHI$lOnRRy!W-6gnQWjx0O&$YdDV7Uwbw^=HmMoM*m56Af1xKl2V@z6}3WC7%7O{d#* zYjbE%rPRV@m3TyzCgW5>MPq{}VjD*R15egv4Yj~$P2|EycE$KTc!T$$Q$HsO6|KTd zIP@qb8T2Z+vc2Zq+N#?MeF~lz(Lw;ZL96kl(7&GtK!0<1p(aGEi3y?pP4K@(hWb~q zB1gihVg5TgrqsBEX+rQ|n)!&Jp1qEzAZf+5A~yrzZI_nNmY>jSX?vQCF833XYXFG7 zL0~dHT2DhP%Np#}>`!0voc0Rv~uEAdF zcMYGX5p_d80o?2SzDgqh;NmD0l z@Cxin47FcZwmUV4xI_KfMzy0x@}>YpQ7ZI%IM(@7K$5(HBWqZ9ZOD(K6jswQt$M+n zkuAkLmRa zNYTESScjUAa962+V%RPHRfD2uw-A5i-$e7*-rHi!Cn_oP%&f}~!h#4{C7B2eJuHpkkGnXHb@P8wpVYx~{M zfm5%E2dD=wzMW3~#T7ehMNCu&jGVfE?{A!LKaJHhTK^M}O5DrWOP!l{>u0D2SkE;& zUdFiRt zyoyK_Lg?V+^B0Z%>%7LDZg*N7m=i0yQ!{wj{!E2V#uh1q(eft`)at=^H@oi33!BZZ zTjch-7z3WAKPQa~o9`I2@-+VWoweO`_6}tIJTIH)=WIWA!}77-pXWTiWRCR*=xtRz zYmmN$o~@mYzP9<}k)@6a2*kur!btLX#KQw(kkGd#u?!6o$(`@+MA5r8G=lhAlq@=Kr zH|E0Yt8;fS$K7=F^!wU&oPM-)+BQ#PT&_&Z>Ts($GVOYAo!R||k*rvKr0-GT6GZzW z3mo~eO)sB+**ZuI;luH(;S!1)SZ^s>jR+9K{cyNzpZo>oV-(i&+KJV;;nM40xcKzX z&zHB4H+|AstV2kTk@m3qcjoLaOXcO} z`<@(hc0xVaylXze6$$F0#`d zZWk3vRZM0?JTo^-dX^WeS8P&ZC&c3(jP+vv2t^~FLmNYiRB@y>`=wlpAhL{igK3Fx zqiaIb#8shLLDQr-_|3BdJN}jI%&fdM^N5(@bpl3HibPWCmozhQbEC@4uhUDhwb>z-Qe@54!k&g6=!o)kS$CRtBp|MYm$7z?(FC@#p^Bl*Z6^A1eHAg}LaN5UXx4h%@}ub)EdB#$={ z0-gg5&z9tgyFK0bZ+^!G-0qRzeFQx|^uPG?Uw+Td2uzca5%ky3$K(H%fB*aX|24Y( zq4oc!-~Z3)r~bDh!_55G#{L&YhKZGp^S{?*LY3w$R>4T_7fMIgNE8*LTRPPAAhU86 zvqW?B!qDbU;dEtPS3DJ2kvJG{h5&6)0y_An*z5&|9FlK=rb`K58jn7>UXdpd={IKm!1!U$DV9v))7<(n22@~ z?QA40OXRgKR(isdm^-Be$BZ~S?Hk)=X?w6Nts+$ z*O;hRnaJ;@Reph&_o4wSGq+>BZf>=%!y^%N^(cmXj&8dy-h6zq z`Zh*I=VZvt}b`ZQ7_HYmS-vJ77ZshfpIGO<-5UxHH zv-lSYV7?pbw~f-(k@)oH^+gwjrkfWDpy;jm;0wiHEun>`E}9c!3-Z&3PDX||&PBls zKkTb%eVJS-zd!TAMeTH6LpDTqo+gxLTa;{M$gLGx@2Dm;>zR+NYqIP+n$q0qP?o9vSHU7`z$P{Qn36Z8S^aF#U}=(u?%w_R7X6IbT0HEVa_MyG%K!@Us? znCPPLedLjY`+_E@Z%KIpru%CiPc36qDObE44uHsqaa_B@FgnKu$wY+b4_q$>x&wyFBP;bm7|!vC78G*C}Pa*2&Ls zq^YuC!)uG;DPOPHiOTL-C(~1z{K(?{Qu@NaUn!2^%l94ON!v5%=e&xrePbQG{ThNv z>uJcxrt+gQ3U336i#Sk-Nq@RF)3DMQtE}ar|Im?Mw~A@2bh~|a%wPjik`+u11mnxF z>8lte4vK{ux7hQ%8t!sLOvv9thZW-EG5B>3;jGU4rSP@D333a`wa$iaBMSAlfDb;Q za5e4+Q6WaRs}Z6(N51jIw4FD@h_(1cd-aA2X(KkZdZRl`CUwG@)`bv>tG}YYM07}C zaMng9<$tlM%HAK>-`B{Bb`yf{h=={6NE!B8sQb7l%)`!T*Tt(BB!UrE@zV8m!TJ|y z<4@b#s*TJIcRn+LClvjqcji^{8thfPqQ`>%xu==_N(z?fb9{MvtX~$F_{2(%+K-L! zU2aW3D4@!gSoL=y-`LeWBlVZ;m2vwxVPeSMQBBTlCo*4oU+-6z(eMD3H#%w|Db8Ms zkKXWZash8xlSu2VP90z4d5R!MuHELdIun`%+5T=K<}8mzV%b2mRrV12MtTiYt2$G~ zk5u*_YVN_zpJ02LMMr;8)LC%uvQLH0E4-~)=2vJ*$r(p(lyarZ;%Fk3-N9rC<=qRTeO7a9nQB4m7(Z}=8z4HlWU{1{$vv`aTTu4Qf6KXzmNSw=7$<3 zu|LqraX1)O9H&&W=t}BTI#7ba5vUA>^iW@e=$_~Z%T`)+sJ??u5 zeAp&)ob>&tb!nx;SS9N{fAj(O12Ebp&=!{Qbe;r)zU1Uijw48#r-?oL-HZ2#7;ge& zIEex@Kfw+0uzRm-zF<0Hw93-rbUWlZ`cYwM$fG^9a%w@oY*?ijIzabD+z;l%R(F=u zP>K@}P&Go>0kw_L3==3KAhPW)fqx?vBh)zT(Co6tyu38La8OxvZmzIF6RoeCnEvi~ zM@k95=ty@>EAH0;POnU4PZ=UzH};1!)S>+jn8lctya={NABl-`^I+a?JOwUS41GA~ z>>5EslB#0XuQ8L%=JE>dz8(HT{%~M(VbOl1-L8sHQ?@)Vhy=zgyb|;7ey6LTvZ)W4 z4RnlHuleSA^UE`QEMh$yx%yd`g9Lx3JaA}TauxM~W6UQee;9q3G*y^lAVGIJ#F@hB z&VXoY)%RGL$*jNl)T0a7^u3jRUvplu*VDY3x78ZiVmDs`Pv$A&lR2!gz|%U9^gKUy z|4A7hW{YP0Ou@}V;)bGmwK(j|fkxR2^F#}Cz&Sp7ogmVW$?>k&K)skkkFb80#H6aT zd05x*)0%J#*G9LR5XHy){b6FF7aYVyktJa?{iDt$0DE0!r1FYs-Oy2SR=}K4j2TwU zQjRw54v&lXC|(-Ud6O$ zZ^RVVRqq%2m=`iumqhZCN+?DRNWK^)b1Tf5&BB?SsRgzBb>*7`Bc)P&hBMnKdv7eu z@#-_pU|HNuB37z=Hx`beVRHy7Ro1hXKtX*U2g(;nAeA{)%G>BKV#xC}8IQg7i94#4d!in3mqMA8f)Zz#(S7%HVru z9UkZdU5B}nP(Pfq|2~^`x|kveoGH%EtWXzK#RmU!FF{mT%%C6@FXO!)>D0vaOV!3R ztp)7R#01^miQ;eX3_3;xT%zK4@&;}5m_$VmmuxFh)Zg}oT@<;F8lt}j!NcU8;1OQl zFU*BIYj}!7^DK90=o!_0uqW@6*NGgA-BBYS=Y^?9F59RcfXUf;Fl`oaVRXpU_FN;Q zg$gG*K6sOG#VB-_0B>1vh8LG$aZAJ~rUY7m!Hnm+TQ64-9=VylM}=`Gw*$9lr@($~ zo!l@tj*F4US(F5 z6BqI)^a5`I36rnxX?<0Xs(|v##8<{Pr2WH~#y$_w$<|i6% z&B|KW7n@y6egmSBH+RezgsQ)0s9Kw#BQm#B5!GM|8yY;Qc1%nP?dv{X27kXtxhGzj z?WwKVFR$>J9v)I!f-lR^{U#X0QCp^VlrfVh0*_X4#eOgK@WRRA9oc`7cg!sRA|d`? zm3RM(GVV7}1YGd zl2gU)UdoLN)voAEO8!pvV#-lT3rTA4m2?UZj&9NUUaGBP--M3c@x*bPw=jEj|7x}>v`x~Py6h+7BN=^%#B zlyTa}wNv5Whm;>EVShTjb#%gX88TeRI6a@c=4QzL&#^*Dj|RAPaYnQ z4~%hFV;#5G2g|Ay`ZQ9L?dm1OG_(=Bnet>Q0wKe&Tgc7gqJ%Ew5tHV0&r}MRxfJnA zwOmXc(pIp0c@Lt)3VDiIUrT**L#Hm5O#K8mFB-_{ClT}U^Rs#NX9}HMJd-M~Fu7M2 zj^p>iQofb$-GaWY8RzJ;CH9dShz=13<9FJ=>!k{D7d5(OymJJ$mx~6) zg9*boMvAM^>aV7YgMV?TFq{&UqcmXDE5fq9qf($DX?{gP_0wgcS5L^j;;n(qm;E56 zuV73u6*=g#7UQDNQE=6gbR;&J+G#MIKgsg81KVC=>JXYzz-g>BVk6VTKst`TERX7= zn9PLk)bb|SEN6C0!b>7RUsqN&Kwn7_23mDjVIEPD2)R*JR11vd~h z3t<~gOi1Z2gd$(lDy<%(-mRoMb9}zCDd(XCwQV-~nH3dkD(a?llD%a`$QXTxS$!GF zZi>Vjs@0b;2T_Zykh#Xf^pM??{FCtlzI@~3`yHlDY-|CI;#tgJJS}$)7wk$OEQyb~ zi zy{VI5rXtg)dCo?)-{`^v@9Kh6BFc|sXZulfVJ9a=_!aiJ3rR|xY|cUn``yl`%b9H- zFNs-elQ7wyT?!Gic(r(V)MrI~Zp8{IM$-Y46Do*0uoc?*rzf_&aWmSqEpyK>mIl*x zH}N)3tbUe4H$L<_A{ehN4l62MzMWuhEdEiMPlBbQws|d(^#gBniPBB$RlM;0vU6~K z;bNbTjVkv1DiZCocB!SD$g;6GH!Nwaqk68lTMoj=p4YtqUqS3lhpyN{0sM6CDlg!+(ZFDqm!=GP&? zvzV5IEF$NoY(n?1w$MI6rLsFv{wHqz2x0%x=l{RJtsi;wzgr}a#?GG^{NdK@OpO1% zMG~X*QF;}O=`maqFH+&7GJHAoKIVM}*22Pp$#;BtqtBF`U1eFvIEnYysVuAgFr{Ol zK$tz-o1v?rb)CA)OWI%r^8PcjER{XO&VaN7(~W2f38VO^bqDKRby50WRF(H5q9<-P z-9q6X(oUlJzn@%mP1r={um*`?Sm8x8A{Zw|v4A@wsOpqarHzxDPk*)7Vhq<}7*HXm zI)y}+2%;abJba>iNDTEBAr0;La5>qqie6D}$aC71lzS%?#n4s#gSjSSfD5A=U6Rm! z(eao{><~-|hmwil_6fH`fbbMOUJ|-QBigQ%eV7HvZV=vpbZQHhO+qP}nwr$(Cy_fGkb-Jpnx=zxSn{+xi z^TR)LewdkjpFCsyo-tq>ieCQa`?&{--pP%?vwM@KC6GC_mzLYZ`$x0tqW&(CeHFY= zQHGw!6j!NM(2E_jP(D?N7qQS*ik&`(^LW^R^NY+MRTl%Ysq(*zM(MC7*@r9uj~t56 zH)qM_C0ad_9zC1J_i5XM)#s_hUHch>E(8Ds5k@QxXbl9 z_X}SZ7C9^3RZd*5u&h!9*8&2Rc%<->HrF#YkEE$$60>?EnZ&H%W7d+e|EKZSykO20 zCe<~N*^rCs#7PIo_1-NutTy}ORCs4cIsz1EJ<5^7gT{m4_Jw5ra8uS{38kv`RkKx3 za|hyYSm0Y3o@eD*^EfP$Q?CXI^^}A#VYTg+Lbp}i-tBC>dhgo`Q}ByCAlTi?#xc{9 zu`DBO`V9!b{!T;##chgkrnMzwo;pY4tBnCSB?*4r>O*qTc1%JD|6bB*{^ z0o#&J{yi|JFl}T*W~tUdqGAZwV87vl>BtNxn%U4ax+ZtCE3vS^F>BOA-0PQLcp!tp z;VrCEJuT6oMftQWogEYOAL(G}a7LRc9e$}{(>>?qTMR%;bh%dfwhL%He z*nW}VgLBr?TE@>7&H_$Qy%R#mreO+!Dy(C0hWh`w)?2q0VJzJHQ9w-jzY7z*tM4H% z@2&rOAu+goZ%>@t05wGRr6@&L+~{5>Q}w- zXNqa+VcEgWg7`gfL@hh^Ti)QJv}TFF9^sd?fO!1tB10dxN!3JiMeE{{@zj+c|Jd|L zUKjffykw)QK*`?bvjzp))?7_-1)jU-f=UNj_#7~*B=;hJ9=cI|8N2M;r?*u#z!m9;^L9~!Yc zn*r>26H?XTjyP`3-CHVc)!+s_n)z%J{SY=mxE&)gqoZ$dr49FyQA!nuj# z!fM!MQl;Y#^pD4IW`)j1?Z%=AT5}p$L0!g|_$c)X;g99m#HQoLpb^?NkHBt}8A-v{ zfF#|3ToTXN29p-(e~ZX#Fz&yTCG2Fz<=}i zg}T4!#b8>I%@$BOd~Qorb&E(O#12Aw=VUHsiQY6bx+_lIQ4UwZSm?RrW+CMDD$xo9 zk)|p%UzpC-un5=Y<;6eQU+8x_sK+KbCfck{o>!duu|ArA=8_^(VHEoHqvkUOu)DZR z)d7z5L+Wm-Gbi3s71n&U5<<)XyOKA$_@r&-b#|B?IeNN7lcF*C`{8UUgrc6=D(vb? zH0o^~I$he%?_DbcyFP_#)!bD>mDYlY&fuvU`IsB_m=hevn2k{TnRsfCrfK11376ej zwEsc%lkcPbSF-y5ThZ@-(**sqV)&m-5aU1E&;L(ZWn%gtn4oIaUE9C(jnAxZzbJc{ zdicA3InYa7@o$Wk?kn@-I90|x8FA#rL8L47Z_-?0ayP=UL!$`-+B_cP#NP3P z)=1aLNTy-@+(P%1j%ew51!%r$MZ#<&2PVI-dW+lkC7CiTAQ0e|w- zi!p(xP@hqP@EP*_ZWzg`gP~FN&IXYel|)>;@UQuAz|i{A;&i%`@Q}1-yy#CF@VwF6 z$IVz=G5m)PxD2KcO#UK*it3wvRxZb0W;5kP?5uToeyV(ZfrO<|27IDB)=;!nGs)5P zVJ-yANDd=+Zkm5{p%n`HdtGK+5F>5$WaDhun}Geq<| zI6~N*=_r>}Z;TIc0p2~>*JCAvFj~E&_M#Kqn;r@9s9Z;NpAU}Sx4UN*amT{|nr*mh0q*sC!|kGSF+Re$ID$2@TYb#De}O}BD)vj18Ij66h$9oK^Lq= zU(H(FT;MEjF%$ZmRO#NiipC2DzY)-dQyn6Q0&Qrv&lh~M&$mR^PIWBY+|uHx=-=y; z-;8n(kbP3+DIyRTgvz`C_dqAoS}I4^$;9W^KE+Hu_KJ}7z|?*^bL^&z|g&+ z_?GDE9xr#Z2ErvPYqVD%c@J5cJn>rU?nnI%#Xk?~(HEr;yEi9^Q-3`G@CF)+oy7tS z91o?VLYGSJrqJAN)5q;IcaI(hV7eW4Tl@;ywS5S)l^s~Wzu9miyt=EkNIrv@7_{WN zeAWCWan$V(^)(u44hsd)(t{(hYAzEDy9m7b(N`$x?UinT9^nkG@4(YZHVmG!@@H2K4y?xd&DBDr5X-_7@8*#-4 z%nycxHjp#Sp!GViHn=~S?}ONOZ1D$}aFL?jjCqEzu-$^CnMHNw+AhI(n`pBsBaB7tQINm;a)fLqiHSA7^r4Gazkk~R{@BzAqXnU|mnwRyt;wdbg9c(xs z$mU2js_3QpuN_CAYtc&=AX<8DMGLJ16*e{I=r0Qhx$#AV`eJi$|O+SUI+nxSu`yhV*U<-}t@!EFw zE!>Z-j%Ml-`zF&J5-WF575zhm*><>KPDsF2^(Lo1D)#M?G{<0m_nwpk_yWlA3XYO5 zpGcu~kZU3m%$`lu)w>6LJoJaL$(0_S`mtAUArPAwElK6EuHCPRcZlJ^T;pYx((T$d zl)7-1J6N1+8FHJ5u)1xz1A#uu_g?lumbQPTSpNM*RMDFaoKw6&leGw zEjXbJ`b+n9^)@H-?dW|5sz1=3M_e4EoxJUjsjVXF0UilI;N$jDfBSwyKdX-2ik(~5 zjM<*s5V6xc?9@+|SDI`>P!RkO4>3Hj4_^YX2@V8c*&7jW7qPs<$#rxIf_5H45oEX& zR_uUo73hV>4bsVvPLqGgukZkz&pj%$GxV#dk{ZXKFZbE~#x;m>M#BkW0)C_fBfQzS z2^K6443rRHWMEqU3vxlQ3qz&MKYu$?4s$FsINs?BcZLS@A=e)jQ^F&X<$-u=_Fv64 zFU@_q@qzLcxw6pb=;e7G5dECPK0U{A_s+@p7#rRrM7De|Im`*;E$nNkxe|}@M|@ZV zH_Qf0_&wr&zfK@?S`4~_O*ET@K`CLZ2N~m%=Q#>{An{5deR8C;s3{u*25YE`)()k0 z8nHvUHGNMT@Bv=6>TOq=*CgeW{bG0wklTPM3JQgdy4yfxWIEwqfIPA#`)5t=QYFQT1EdO1R7 z?;>^jIw&yR2OuVEO_w7SNZtd1tLqAc-6x4K;jy}8=q8>E5c`j(8BOL!7sPl>Ea=~- z`^O3_jv6K&Lni5^Z24|6j#qX98a=35aTF=yPE7gt`!s5-hLf-~PSqdug`y~7*#7`N!uSP_%D3O| zhgPj)m_pBVS5Y&nNXQk$iDGerf$0#zyIFvmqj;St+fv06vF+1KI;*F> zcU)&)cJ7p_NpF<@ot0d8$D|4IiT~EO5M0Q4fMmBs2Z-yaXBP(K%*RCHrLGz203`Co z=N||-X+oMI^8CW@)Jdf0Hj9%^wgwprWD_q?FKltPvZUORd)Ez!ua-5AMtj z3moatqOjqvZMacY*>NJW(_h0a7|A7Ss$YKfKAr-W{j(9KPmywm(nb08N8`9?+UPm0 z$7(0p$3a9@2N@0Fc*$qZM0tF-Kf5eGBw)SlP^#LcTgMvA0Rup|-L@EKKJ{VgRa=uP zb>#5RgU}-IYmQDt6$_U6${o=W3ZkhOrMOnJ^Ya*gA-e7|fv$BS_gOqLwW{&{y7bU% zSUOXSe_FS2T6FmdNa6u}_C_;_Q>+KQnJ5LD6u|)`6#pnXr9QuT5rJ&>0+JBTyil-K zV?o=M-s+{u?717~CYV8m${o)0UYUpCvk2u-*H7#!GB^ZhjIzm?OE?07U%ZHF6vdsvb}pEoDsa-l`IK}B z-U=47L;obS$7_JTPtYiXN6{(`$YHPmp)#0g%lQo3X-$cIIH2R8lTj^9&$zU>;#l%oOC_hXe@ z;)c#Pmt5|ub<-d#ZNwmgVa|D_-}_InO1H6t$?{vAJ zu(^37UH?My82>>={JX>XKSA;Sp>O|1@&5B05VUpv3oz6D162O^KGuJ4#0ly<>08;F z{)3S={mVW7Ux>7#7hveKI`#{H{?zI9**;;o)&4vm-4o=w zHD;3R`pxxuNy7*mG9M>Gex!UGujMek=bxIzjJ5K`4+o#?!F2Wm^rqW=*_B$tB%_B0 z%H&TLWtK6}S1J!2@p{tP$s`WD)!n3!fT&O~g(nYj5Aij@uNM(k^WF&lLTBvXRFeq7}!S|+(q2lB^Jj=$tdHZ7^ybu z{SlpZB*Xms+zi4e<%W>Ni0OO~nf3x*bqy*LyYV31 zQmtNEy>Z>VMqgrZ$l&-`KYr~l_e6TYMq=zuEooNv zZFRO6ZwH?)?ue2>x7T7AathCkg}Pl_+(JQNNx`r*I?277qC}Y5U;0udQ0F0=WAm0D zG|(@E{-_bB{XjZ@Xd=s1gNxC&r~6F|r_CnW%8#96&5&UUy<&iX#QT%sw|JqlCY~RV z#h>)oFlzgY_N|2b>957J8y6>6=xih|Ad7iPJ7qT&ng&)6*F{EF*V2JjMahyKT*yw& z(~!Xo-kuJ34ZE+VlZyTWQlo{RFEhrdDYhMwn;(x5AMp0N7<&Ba;`^aG&PO>wrzbq? zqO(!`S4C2M=T7Q^`pjA|p3{iQ0KpkdXtp(|;R?m~X^9OJa#n`8F2xl-#a75%;}T?@ zARP>E9QftGa{*a4N6P89S3|6i*D|y-vn@^qOuTVoZEOLa|BkU4P<&JPDTq~`i z6ST9x_G@C(kn>|})N5tSishkW4@}o&-*m!})j>P_4UC)K8SNav9wB&fdr0C9`KG`$ z!ySnk^k+aa3fq5DXmAvUw530s^*I08 za_fAWbCOVWU~g9iY4&b_CC@TRv07-{7id``(l{YG6L$-mMAbzW4PDH9leoy98Xs_V zEQ4IW_11iApv*#WmWjs(NHHJGqIHwIQ#C8ii?q*yw(aO7kC+#$p#B*^F`ULrA7roB zHrPtnS3-@|G#ivQTf#B7#o5rN16Qgln+3DPQ_$G)%)x=h~9FMo0YtUH30Qpc?R zgfLON8A60 z*^mFs)cx<3*BJjBWAL93*8f|393g2X&5a!KG$H@l=K42wPyzDakcz*Tf5uH1{+Ui; z_=jOrfc!TV`+NDvC!zrPH`ek`Az=G2LhzrPeE)2b(c>|)Gtn{qN3M>Zo%MeL@m+Ph zdm#<4@Oo8rbeQTgq;qdlrH?~GjKhHoEm*+|;Z-3pA-qTvJ5XLarHNti=n7?Y4J%hIf}h1uy`ylS1e8EIB=G3grc`TLCERkSfb@ zD||nDk@91*qV=J_57{JfBhAf#fOA8`o8>Y8JhNwa-D<+oJ8N|7Ef9AbU>HRhe#fsW zmF=)UsdiTA*YMM~0B}8lUL1)bNuO~CSbV6@@jN`!tb~451NIYM)%TQrj=Epo?ml$; zf&qAB!W%GsLWa9vw;U3$`@koBS+13H@HQ$pFQ<6Ve=# zB@7hHufQx%^%p9fS0hXk`90ou48(zMskV^%Yq9t+F`>R-pwe+n>jA($j!R_V2q1g` z@*T!I)`uF7AC4(NH;r%!QZi^XsF#5obF9X&a81yP*fWT`A7c&Xg_x712mhNaC*esU zA&JB}K17_fNbI7!+}BMCCzEvf@DZ5%n)@wBKo(Utyfm{k)ilGj=2U!EWVTUfKJ%>E z(|aecwcEAq)#KLTmIU`%oF{Sipz&?1hedJWq(2OIf^|e>V4lF00fvEy z0gAB^qS>OISw*CrS%s%urx7#BS(h#~AMHA)Em@onG#d;h%}vj#Vv*L32XRbi8%0`Tv5^N4aPEz?ICR8Q zDvA=znaiDVx=H5`@7&}#*2%H~W$m>%6y-Q%^PE_8iL&u`EW0IVB}so3A3hY16e}KM zmWqu&(iSQD=x|5^Ir~qa7B^xRH^LS#9(Os7fR$nqM>vg%yToKkvZs32FiME>tUhY3 zx695pH)-u|Ko=_x79)P)AX~XFNw_X%3+Oxn3@ank=bLbg+2AXVN2PF7$)0qej)xnG zHW0K;?7_5Qn+!tJLDYoU08o2s?AV&yycHc6wyg}jCIjqZhb3p;3RC^OY@E1H`+9Yj zzoArhN2x`WS@%3{s{eg4UDfU%ukF*XxLZzk!>p7&?w^^%0J~OuU0~R|Qa>h0D-XT# zz2u)HUwrHSJ75wpNVsGia&CA(d@H|p{fmHBfQ){2UvPJQoqqPecI|7vY;S$7e=0xj z$v<{CewMybUtV{14Sip~&Of|Ax<3@RrEeNgGLLn1G7=Nqk^^Jj;zLEZu$oXhm1uMh!V5P3Ya)kt|_nY{Ep;ja_h zm_vM@;c<`QE)SZW?|8q%7>CzSCmFx3C*e_FrMy%+G&j8N=k_4dz+NF&2Oi}3aRZkb*xlz*gMiw1W&_|IEUZKK3D(_1;)0nS=)7a$0yEU3q6)UJ z!yFmpyu6J!HK+%xF4&^X5fxO-BSXy-lJJRJ2rJhyum*RRrj*9Ri^2rE3yagqn7 zb*UWu*@V-vM>E|4BdBsxXgkoC1dWC?D`MJ&)UnB;c(ky1E5gn2@HBD2dOk)kNrdp^ zE4*4b%=$!PBU1O|E|H8engqkiZxCa_3K%q^^@0K0 zm;3|yGRS%d;w9}vLOQ-X@A@g=LtHv${=msD_>E^O4#O_0Ax0SQ0o)QI^#e z1VsLKQHa>0xgV%G=yZ`fQ|8HBuv5Gl3gVgflg~SVwnXYY*ty`7en(bKUvIJ#vbOZ< zT(c9lcMy-n>SAv2-{nI=p1~jk1p7SuzxMI<+v_ykfVp=R2Nnky2OI~W22l2e^)u@f z*ND4_yGXsnWFc{(JcDV2YlCfr2M6f)gYFvdT;E;ap}vxH3VP=kpIkjeuBcEVwa;*$ zsJKNn%_yVi$ljp|SNuK+4!)iU{FON%@3Xr z(Ch=)guBGE@MlmMhBk-U4Wivz*<`b5X^dd4-yYZ z?$w{THHTA&t`A`DnV%MJ!)_yS!*QXmhh&FohrSN@?>+Ma-GsPkzNx+`zG-q03ls3l ziL#9n5Q>Dx@v&016d>QJVLfPalW0JSrN}iWk~bvZ1VqdEAjPxi4_yUoR|GGJ%Zhgt z(w&NzL@y|{iJuc|Qr;zjiu@JYnZz)tpyNXftmw2lL@@A`#R%^wnynk)n*wC!MvVxy zLvb9kn8Y)ta*Sl_q5u9ChjL6Z*BP(WU$8uuQPt9{^`Ftat&C|KQr9NWOk3-((IUGB zTpCo@Evv$>4Qd-%*D|lDUsyatyC-)HJJ&z1fL`!FC_lok^>G_z*GjJ#TT;DediZF+ zh(98(O~KYyuP|NWm>X@^U9UV{!mv$v>j4s6#!p@0Jg`48yjYoQVSMht;k z1t$!`ACUVKjg>EL1v64vxeu(-S-Qus00|p+W5l8!(({Dx0L7HRIR^2-%91^;=USf` z45?paN9_?T!4f-d&|2sDceQ=)_6SN{uoZlzapXFJ3#Dh;_UMf%te#MVRJiy`gELwy zcf|ZAMN7u^_(~(k3z`UptQcdl`T{lDx|bmAg2_AeSB#G=?EK&pm9C0SRUK9Lud<4HI+Lrm zdqfhM3@+mfXx1I3YLEA*Ow*YR@5$=c?eA31n=HoGlbX)kbl2NY5Gd4T8Xbq-FIXz= zmpwsPTHShwDC>e)9qK6-k<(Z-!C&*ug~$)-0QE;NN-)A=AXXRU97Gwa;+I88dJzr z#^A~Hfn%wChY~w>#kT)=*aY&xMNFj*K0zJs&?pSYLeR+J39fg9{0rXOTjKYJvu%N5^Y!!NagaP^#q9I5g<$yL z$Y=Sv!#u}vBr9NDXVkaB%0t9m(Z$DSrG!GVl)*U%mVb(R=&-)dsO2JYJXq`F9PD%5 z7~WIQ;N$S%8R}&d_tDP9-WN;Lcs8itk+q;U_q4HSe=H4F8=?=I;}^~d=U4kdX$xz; zg0B#uhCVcJBY04}ah}$4VaVct{mG(7!@LrZ{c-&hJQF<=%tHs9`-$Sg3j1Cq^}zlf z!R{1uN8U6#uVP?p+V25=7-bcTU59Agi0gf-|CA+uM8N>Mx=MTIJu)8~)I6ZF<6z zE8_lv@5hi4PI*sEobx9v%%_f8ys#NF5t>$(7vz_>E8H(& zH5xU0!}*L9h_KB0wv`J>wqp|9kP2H+CsJx_$LH26RU~-MHrh;E(2bPGz zlrO19xADB4llD{2nf1K+9nV9~Fxw+l`5^Lq7#49FaaUyJkz@nf>VEQF@4L_lKjNoY z78)Yzo(CKLj7V=2dSQj?Fl;dl*|mEe3iCVXk_mN;9@PmpuR&1lNV`2hO;BBLcKt2k z9;gQXRZvbEvdUq`v=HYGAx}c)J&kMO)5^ZbPPpYE(MI^?p7L5KdkByy6H0FF$j6f) zd+fjprXA>QKUF^GLrFn4N6aBh!i*CMkL(C%HDBd&kT-{4`?C0ykXx_AJk1lq;Jr@o zATu3It{m{O5!6hdq+C==bL!o%3C`@ae6SN>Spr?;8acuuzWP7h`Ei)&aMx0#P@MCl zLib+S9<@Ym0aBwnX?9rEdW1mvhDLNR`-%YVA9C$Yo5;l4ok*@XOY}-=bNIZq-kn=n zS5;F{dU)Hnj~)vOiV2BZG^K+!jU*ZfQzV7_wTl)@6yipJ#BrOOx+=#IV3h+@XSa)` z*tH*`hvD<6S!Ix(cS`HS)&n^d#p$O9DGV)HcH)xkD+)Zj32EHKatk!8i<`F)zH5`W z=0t>G(R~lz-Ji%gcM!!}y5zLV6QER{-D7*_*I7%Gh$PB6JNpgmi58x!&jXu(zd_G; z&zRMg$zW;?Y!qiTNY2k?&9FjDdB~;t&PfzV3m_MYtC!acY?n9Bdz_$PzT5f3f#X1t zr<>%XXO*T&=)@euFT;VoTX>dZGU>e1hqSsS#wrDz!}KXpph#{_hfIr9rVM>4tJtk)Ystd(cnp54+y#c{>_!@@1tK|PfROH+y*dwVSkD? z$d%ccZ#L+D_e^Wvx=d~sOz+)Xmt%7b+(M_4yitn0O6(W}Z}hh^w;9D=9#CF8w5A~% z1Z*2H4MTYh1_$4t){+w!v(r9fdg(L-y^igoA`@JpU-suj-5sWJJP!Vuk>hM(WEqqN z;jg)4%ZeY@m!7TAa76XVc?=!)TfZ&;f^NK__zBOY;bG+P5rIte1=2b4aL`%4^U!3^ zN<^HQIiV=H2zQL|zA9PbY?;j77K{8`Hi1Pz!c8i)5><5?7rgiE_6k5{ouC7y+|S@A zG;oHE60ZPbr!6Irs{E5&(n8sy|0yB8nf!RA?6Y)KJ@MT}T?Lc#W6H3J=qY=FK=R`2 z=6DSgM_f%6IG1;;^7im#{nLVo;nK}^8EebBqq*EXs;DDU`(D4}UZXCoj z1^7o+A<08ajjvcq22NIeO>3FdrE1Qj`zN7PzPQJ)oZchBk^D%u#f^4Q+kvLWwY$tm z{`RRE@Ff+*yf>fF(y|#U+c5iEvv@bGx&`S^%?f z6O}Z0GDT?*k0hR^tP07)>OL_zuw~3>KQ5lICH)r{RA@|DY0yj6g?v3Rc5U=pNPbvV zR`KcVLq_Oo9xlIdZK=hv!U79=o=E#d5~75+72&Vrtd46e|N3Yqmzk=pL0Qh{|V?8=Gh1%g$@;F!>^IQr8Kd9)Wa82Y>_ihM00 zk_^_j0zzTlc7SaK0APWE!cb!8mIxlHnPDvtYz<08KDG zJj)yaLBnwYdaJEi_$=2x*LjJk6Kc=L-7P774^1Fem&&Bc@|l;n4@J!qBoE;hVNZt( zXG4-Vt5d^pV)t4)Z?Ek?W}rxS6%_I^oPoa`qlFYTxtksxjxqasGBlW91Mei}tRbqO zi|ekZ^D{Ofo(o+|Wc5gkB#T&sewxxh^8AYVJAPK>x%NPV`!?EGLUtz;u{xCIM#_LS z-!Kd^*d=nhqCnslzq^A-R_$qHBAWZ18xvjW=OR6@@mnN^#9dcNVb<%@@kr?i>vmkw z%`K%(?)$tU+69yvIs*@yD=rqnsXn|ho1N@r;=5XI<3}j;Qy}S9kZV2yi+{w-@(KJp z;t(#cF)QHUQWAu6H<8dyL^4LPl?-dNlgla4A@!RSG)?w(lqWSQg$i!-bj#eQQLrZh z3Bh0Li>YCX_}gh^VmA*u7Dr#C9^w!XmW$}MQ@K;FGu}$Ydc}&Vr^;Qm5GO}Yzt#>` zHZzTGoM)VyURql!vY0?RKA-lQ@_8i*oyB6O^j6%~Vu#5~{8cj7oQIJpEgOf_nMEY? z$Zr_O!A1^qLCT%PBB9=71HfRS$3LyQ-FwBGBlUH0_2=r=X=fjieUZH_Ex#cFiR}u) zB>Cu-KcHPPevq`h2)J=uM@??2oU9+~_d-B-D^J~1N_Vd4%t3wKRt^G&8XBR&Vnubl ze0)W!ir!k6KiB(0gyDAR4qE>#O_YO8A6oRyMa<&^8%;Rg1Rv0#@wC!AYDb!_GfP5M zh&%y2=J_*iB{RXVZcxS>crr!-O5;Fqs%Uq$H2RYT8&XVqmuP8Sao-*tr2gCrF8M8d zT#D`;VDaU8vTntExF{_3$9w6Z6I_Gu;_kxp+v(E``7rfB9M3obiDP+M4qXRZ$&Kk9 z`C=giWAy1yWbsmBsbN<;7|l*OJbK?EvnvkjCH{ zXYtE~)nY4|oveZuz6kc=#07j~mx->VV)ES5GQ~e#Yt=1skj$6TU0m&x#D$Ym9JQM8CP zozB5G$Rr*~6o`ihooc!feyXbXGZ*gW!E@q61V$SPNi?-Pp3Wc}c@SSn2DFYXKsXl~ zlAVbfLm(BSqUdEsSPT*&FSZ(`UHW)1mrnkPfKObCFQh5(`Iux>eW8uY>RFH(8fy;? zH~C3funf`W^_kF3h`sr~f2)T!?8v2n9oc0uOliliE=_UT1+6&aQC}=)BQieVA090j zzd}ne;?lFu)w-GPvveB^uu7pev3PvS&QDaU$OTk9bJGuC6X%xqRHD-+hPS~2sTLVj z!U*{5g;Gl-7U)jki7Uw@EUK?$&P$GC=h_toHUN-;!_6_qDI4S!kHGnk;qSC`DnOgN>%La3Q=mMl|m-s`PFN1Zzy-peP>XI6f7kG{VD zaz?$@G8g|rB)jFx8paw9qH24b2D#48Dw`rEhT8FBWD(b7#*fAaX7|#04|W!O4_2Jt zwgJM&DE~W>`o#>Gc)3B?Ae(d4l$>Q$r`FGRD3c8Qz%pLdQbV`nZ*lNiBBIf?SNdHP zW9XW?d1-ND>T4M?=@Tus2T z1haX)%15^^q3lHs2-r+Pq*;kjzFgO21j?h}G@@occy5F?zWeR^_~rPzaznMX*1WgL zTidg_)Z52%W9Q=0kCdJ_o`hv#82Xyyx4Gs{b=g7kqU>p2^8iSVn@~*9LD$52M8akP z^E3G{OU;puj71BPLw8M|2r%&k@>^Gx6j>#;2J8e#wRS-(Ub2IBvtzVyGIDpD6C?++ zz4Z+EdoZwV7s69*o+|gxR6zWq$h5A;+uBtnK`0?;!rQy!x~lHtZN*kBE25;fOf3F` zb?5Lk`D!%|^Zj~OlM$Az1yrtx^M|i33t%V=Y$S?zta$$3$<+j zRuM|bX;rtE)s|}(gT7y*+#8-16W*S&v)`jA$lLYBT2Y6u$NN_aMZezgu+z-`eBs62@PgG*%$ZU8K*Y7=z-f!1FlGi@m*F2%8;w0-|6VT+`m)ibVZ#}Uv)ob-*wR)f2xU5cHVqfdXopj zS8ANJE;)8uOJ|yB4imHkLaWzUf0d9IT9bhX3)P@}`w1K?R1yLgP^CmN8#I!Ygew~~ zyD1nk6T}(=%PHegSg%eA8!lLm07OR1Ac|HgT#3MF7OAu$qMc-?7_U$e2Xs}|a8lN& z2GvefnFF`LZV{Oc!UoEgsa7y_uK7 zfk|?mq8vuBjie-l)Y?FF-5kE#qNzQ9aW5_eiVGX+*E!_1lzva0hFZ0H;Wm{O>JDO4 zXArkQq)MB>reGf9Tw#3Hc`|ZDio|>&G>Ufl5*jxJX@*lV)vn%X;Eu)w7l$PIi;-;L zIC7zgXp{j|umNH4$mTL8q9pzal{gg@L9$l~-DJOSMbI))A`Izk>rJ6?d?x|xL4j4a zFluYhvI8pg56XEo;~TiehvLCw+LJbZ=cKZhB-)0#9OHbn`($uKDu-34Ts)zc;Ct&x zauDybr6+LiDix1!&F$^hfjy@kX!8)TxLqVx+>rH(wamUmyc7~IYB@2!9vue$_>^h_ z#L|mzo&8Hw(q~dd(nV4R68*4MM;+}rYG(VR3QbSZcazf^Ez_aB>G^9X*~Wcat(MFS z;^7{9=4cfb-Ep^eY%g8s>9aS-O8DmWPOYxm92AZx6_@&%tv+xLmVY+xRizPypNaeT%4FgJg z4bwEkj>)%DWv8-ZrKQV+z_h^XCz80~-=mY{5blubkn3=8gfyyP-f&J68nj#7mXYns zU#KxzN&T{F$pR!cH4+NM6sS2q)D>Ni?vUY)io8$;Qc`*WC&~a-=_7nJ_qNoh_FAC) zjYf-mi&bgl5YhPl(>%)Uw?bE*w@fj->TmI|QNlA^dLI#g6tagQxS{wnpwdgtFFr1?8W#GXQzxII=uNtKRe{aKp#c6+ypkbZ67zKJz_UpKj~wxMNjFF zwwE0GeD7g6s@j#P?ZKTC??4|Qhml$hqCEzh0)`Wk>9(f~zX`0+gx0dy4~Os58H+Wc z85w(*d~a4&%|g*b-zYv4pAe}KyAv5nPj(U*c#VTqZSNnIGcr&PlyGhxLP6g^-(25Z z-qxLVoqn`?IzM;cd!8lPH>?CZXt#B(z~4U1KhQniJl;#uMm}sAw{A3z%AT#~Y?!Pb zhzsNy#dyYV7dn2s&Awihp=6Ck5uS+l*Y5vjfqHV_jCH zBE2T6HL9Sfu4s~>uAr=Lx^Li%c`k|@2MQDipoBtA8N|;e8U+Q#Q=M8^ae|dfXf}Dq z@L_Fb*l4#;KhR`N8%NW%tuoZf_a{?5LMTN8?fner?L}tlW_l2BMl%s)t*}p&mrRe0 zPRm^je}0d6%8PdB?u*wmCZf-}bsA4gVJ#cdSf<_K%&;Sj6!E8}XBsBJW{Hs*qmge8 zN$zpvafZc|cZ!7)0=&5&gc67abcuu&&Fr-}r#fXhon}D07qUJxKV8bAg@$0Nf{6CT zis@k^gV_*DL}P*5tIE`sB%LA$QmZ&|M7$8Rms}6D)F=U4d$9HPg)+iLvni!gp8f^?-^L0Gmo+E{%-1X?AK0l z4{?UItAxoMeB*Trt=73Wr@*IzrZjuLk|Ifv3^~V~vPdEB$45a5wOK|Zfs5D=EDPzh49Por z)5k3swd6><`LK22koP7Ydxf%jy|Yg2EX--8m)a;z*Aa>t?X$+dzUuO2LixzC8Fv zbd#JD{4gA2e4}KeOrd*r$TBxODB*cFvb^%+*xoW#E@7f1q;l7Cb!n~?7`1EFS!oz6 zr^RvS$fO3z)^Rx29_-}AOibQd9Mx0hd+Ed&jQwUY(&JAOH5uq-VOwPoDxHIq&WZ`2 zJi@%3$j%Ygh;TQ&Rw|sc%^b+iM2Cg!xn55ahP?RXaBuRaDiGc|RbCFKcg?Up&dzU5 zK7!-V!n`G}81t7GJHaN{Uo~GDp_C}ySms&|x69+%S{Drs@4!v_pr@~L|hXlES=j$oqilgVHT^i6iFT229({&NKlOE(C2#O6FnK!sJ7zcOasqa6#M8VD}sO^c}AuzeqM}`sT6%w9y z*rLBV9BCarzjuaLE+?#BzRW|NN@KO^Z8swm0da@Kx8anWq+Cp^?mjIg((<<8jBa9& zX8Ly+1RFgJvCxUmjv03tLSYUW_0mP8V)e9(c_3rjO5fV1*9Es z98Mymbym7)T6!+0T0T;q1XTnF!D$6&M?JnHovR;LDa|sccAh9F;mSjIaPTbtQ@o%u ze6L=IxHd4r85m7v?>KDkt*OYw96_sy20*J8;a+-)ofU-1v|%IB+}X+$I=YD*+J;=N zgkzf|FCp?RN9fxnFQQLQ?;hMhA990wSS~;u4=4rH7U4PfW{(ZlU)eS^lm_NB*Epo^ zbQL^y?@5YySxOovY>^z?Df)_*j=#n6*^z)C0D4;Oel={YTS#*xv=e^S;>#pJ)9Ce|lajnOPF zDso9w$KUA?O_X7LoxoB}j*Z@*s{+jbyZt_<~f!tgJ=}IM^6+ zs3gstEzXu`c5Xq|N7g~lFP{LK&GUCpg&`DxqhqiO_%KSqNJ}H$zvDZIe#ZU#3eGze7bE*`{UeJp3;MtQLllmiXaR#pSgjVFc1@K9=N0# za@g9@arq_I6oN;#T%bp!9J+k=nyi{N>P4f=qrRak2=>IsIUD|B!6wcPFI`b4eR~iW zrzZms!7m)Al<*Z^>vij*P7Y$nKhoKN;UVnOxx4HkajQEO_!TzGoH${h589L5%80kR zZ04Wbe^b5IGPaKwhruqb;#Oa zgA<#>f|xb6keSRqx_m#AL!A@1mhv%|T#;P91deo2K6P+QApu1BMA=eE1&;Dkc2DGX zvOl|U1y(u&=LV*|;JlBOz&&3)kxqgF{gJoV1^a_Nd0N&q;3=hPEFQ ztN8r&W4z_D=ldCT%@axXBCFOBFG&v_p%`i!cpv!4a?z3T)TC$8Bos^)fTb)elkObj z*-X-1#4##chxV9B0w)hEFZZ1gBlWzJF~l;DwS?8g8lzE!lR|7NwN_#6l9P{rMs7KC z#csh8IOt52^lW9_om+(3sEKP;#5QirAg7a6LR4`BRso%eMPRXNklK9@xS>~ClVQxw zxg10t+TLj{9xNvHMvl0`Zn{9b$?wvty&2XsQ#K3)Wuh{AGqUNRiwcjrCnYAH80$)i zBktKGwzcDsF%`Qs@5=G+qPVr*@X|G54WoE-cSOsTs@E=JF;urkdJ5+oVZHhr`8}D@ zUH!#^@%$TA0Z|_VRYOOVpPKC5YHZ;AnjxwTLC%|C8lyT9GlGDk7714$afouE>G&S> zi|WgZ^TQRd;La+-jEbs^ss{}@No*DDdw?Y1bU?$aA>(&+{I67%SajV9&NNb!vC9K_ z%4MtMsDkkcQNwQKK#9MZN4Aa47IFhiZD233aqX-3Hzc4xo zGmw&)wvbH7A4X2pSCl!(q?NG;U?D}aH)c7hnvx~z7e{w;e?Oj;$d_89q0wDTPUjBJ zL>$&ZnwWIlbc55EZwv+3(U8nE4LIaed%z*0vCXI>>N&qTGv&#Nu;L;$l3$UyAQn@U zifWg$MCa%aoXElBv|gQ6Sb5M~(i9NmS??~I*+WH?oLG*Xq|Iz;Zvs8C#%ytAH*-}7 zaH&MZ4knyRST2u3OsBM^wx^z?X(Xd8q~tMTk#xz11y6d7H!u-eV~Yphl<^%%^cp!A=59@#GFd1MJ58NN z-<1?R7~Qo~kd@ZTM|LpL)yKX5!IS2mhQor)MC!Kl0@SINVA1+07vC4p?QrLDi5Qzr zg;t9NGXB-xD6BPU>`L^@7*?Cl(I9WcA`((0>`+90k*=Vg(DtCNgdd4TsMNsB5pAi8 zA4$2xN9!*Tk)b=3wVH)=8PPDci<;pq62b{{X3!~9QiVAcA=qtzBxOvDljj#QDSN_S zA)A4i5J;Quh_^S$`C#Zfl+T>GVV3Mt!!$^s~+r`_SVX zd32lC=V}DBgXP4CNOwe|sH|8w4fe99^y>2UBrz;DzFr(u+YkQZqG+F_tTsgwEMiO| zSp>5P!5oudhs65z{zj}MUKu(3S+R#kWj=YihnRab4yj_n545tPDUcYAq}uXj`WUYo zldh21hRLQ*{WT*4G$xRUyy)C{EJZO22hwC);<0)H=U32E@Amm6KD5vR68VlOXv2au zxR3r=!jFF3Uu-p?+0@BbCW9o1(Bj1)iX$xTM~k{Ds4LnYA}f6!G_8)7wXr=-SKS=9 zZa7A~r@t{r(q!~fGmAjRYNzc<*xxH@DyyiOQp~KBml>&>&gre0y7zg``Ha{vk{VzJ zVD@1rT&QWWeKzhZE`2$=)a(oFwCw{-0$jSUa-3yK_3g@~-F_M5l}~OAl-?GbfpDF0 zdA{gsjX3`*LPciQEhQAXx_f!AaL�`u(YTX4AZ;@w)+i{jW)FJ?+fa>BcGBVmvsG zR95Bh+-bNYNw`{_$5$a&4i4I6Q*v;I1AwyE1TZ{^IlpU3@K4+Bd}6NI)0CscckRSf zDMzKQ7gIyJ!A3sYbR#>PrecPkLA|>UM_Zc%B0B-A%JZ#3+VES}tc_h{gl+nB3Pd7A zF38u&PLr+tqJD;0Y1b?=&Aq(Ii-);M;h-GTb}@$jaYmOz+dVodWrJz|FZbv5(D4%q zZ?8KaJO?jqqs3C|uaY}YCm~JGs!K;|7Y;~hCD@`-wZB>>?yFBFS4_DF4=1qEZG?CW zLWFUb*f$ay3`+;vStxUU=L*$mjl6p2*D0Lej;u&48 zqsjq2pA^g&9)rbji5=ETmdz5&LhJ8o7h!5-TIwUutiuRXX;&!V-D z^5z3bwTH~F9dZM05sSG(=k#ZY*I@WV8hHKFk|{N=O4w=0QM-W`WR3tKReF2n~T`~4aYd=^&ZHChu6lxa^Ebe~%9#k+Vbw|oP zK?#JLpw}vQ>3RUIlsBoar)#>b&uNU*XVKzW_NM;b{- z$RCG?iy_V_9XCWaXjZY%t?Z<%dllE+ye-_6q__+|AI1iVLnnOAbV8c&n?BAp2buoC zVAO)V1Z_n~T8U$^H&UGMcfg&5J|~yCjjHq(LlFGBbuVnuT#YbfJ@ePLFeKK)%Qe4@ zY(>PY9yvb)x|4*nJm$tF)E+@sy#YGvO#yx0#PpaFo1ToeMUd3nm+A6v8$p;87>jW?jI_R8`^=`| z^?s^<3UPN41IJIQe35pS7bxo#t$azbpsQbn3kSvB*T zULBXvs(i^9q;V@WMHoj%1&Yt^iC0tauETpfm)(R3vd4$tSy?AcubFbV{iD^405Z&E zsdFCE?Kuin%wHeTt=?2`Ayci|9XpQIW~QrnJQ25iZ6fr@hi|4gwXrzAV$$lr4S;pr z>)5447E{2g>^0*ao}nLw?T8{ZOi$g}jcD&mvFo?C{T#?WzM2ExtKH+>0jRb2Ufo{5h~V}F z=<)7oDsW|qvU>M7g#Q+<#qNqj`&8$O=NPq9j|5P)t2aV>;_fa7HfB!Jms$<|P*VdR zV(8#}b~3&y%LhoN(7WW;8SBw=Irb(@p}NDBKNNyW8!|11*|%6{FqUw8#`qd%rKS;Y zafX?@7ansW zOM}ty#_$e#1+Dd>sEC%BzdcaSdYT z8*R+Ho}s{O=6k2*c7excC0l0~Cj!r_&PD%ODZuZS=DwLx>4$GZ^&)ej=sSsw_th=@ zQXANE;lprqzLuiORA#fP8bn~z!&-EThWUeM%Kp)s#QgJaBw`Q0Ts1PcV93EbRCL#; z%#Hvl>UTzb})$Yix zCHGf&BW8+$2dZxEjt%PgOW1&lI}iEv!If zK@YR|0|YVfwLvD5Cund&^T5$lbR2fF!#?|T9OPT={Yh@nMB`gXFYk>5u8?>5s*}Jr z-H;FZuIVu;3f0}nh&8`+F}@&tvQ%)K6gSRCHZY4FeykO^pz(fQ5LQ8EeQxods(Q%7 zPvMBb%z!!`30|eV_2p zVCEQHFt)8qC$!+u0fGX;Wt~YJPinHEw2}p{<;;Rvh0e*E}7F@ygaHq0fd5kzowJ<#D6C zRL0!8ggte|DD{=xTg23%r#NOGzAlTlX}8wgJdCagXQk-TFaLSQ8WZ_c7Fkh1-!RXl znO=y~huv~&ZG?HaXNS?(>-(__j6tv!dM|*p&B`6NZ{Rf-df3bFf^5924JW*{lsc<| zQ_*D%#d`+y2s3U7;4T<-0X)=q38Umj;2{TelJg23Q5^c^r3Nw&)i{hh>^6NpzJGz; zJKbQW`5)pBbo4b!de@vg#fO^WDW*7xhN_!1(|U+{U-~g1$c{%I;83 zT{q9{)|G6Vw(p2i7C!BFX~C@rzEQ#1Ch8XQ>6FmuImT}FQGEwqHy`w2@QKM`ug$&c z<1Bh=IXNQr%Xkfr6lj)j#o zZY7(JuQE)3a4U~iVdKydwXbulAvk|K?8-I@M$prT|C>rT zT!>5SrF@QiPsbWrYk&{9RQ(m%Zpf+!D+ri<=BTL==1if?(TYpI;^C|QBlV=IhWb{p zGcAcYRT^#Av_}Cx)lqkx&i>J0LLJfrT^wy7`4BCA;0!80_yxx1)DhlFrAkc}`{*kQ=jsBvtQJDglsLI1RGb3;{e2sREbu#DIc+>@6b)udM$MXI`tiVR zrB~?)wjabNEPI}TK3sf%4abrCRUl|oK~CJ_It|0W`^&AlAnX$C^_20YSC4Y*;N>M@i(q{ zDQ@t2)!3syd?3&YXisW*;pD{e@Kz84+fyTt5rPzRqtb%Zk%AnjaS8{co?4YS`0%!h zGeIL?r)qmfa)z5)(AuG~8A`MLZwBJ**{1e;OoKh$e)@#^d#jtZ#ZzYa`}SiFebFE^ z%}Q99iShZOjB9}2vh}g6!tV!Dq-2L5mc@;dv-XQS&`3mHw7Fu5k`s{ohZgX|#^>o%AyH7lk8U9=gG~S2#u+B%m;I8Wj}g z2(0J0rkHmX_Y*!BsoL*>3wg#qgLvBOawD|a@c;t%LA60w?EFMAB;U(ywn7j5K2>%P z!g<*7BlMXe5Q@{RcH>DKx}MTH9~7Z0_4@Anu`8Sbt2qY=v2pogyhzW$-9W-sVtX1S z^%}GF6aMR6EClagNS}2%~~p4*Az!Ipmi&IF8+R4iUiioBAZ*Y;n*>T|iPRX9qn{ zeNBAV@89QN1a$T73V1k!8Sdom^(1G`-2Uil7u^LJzWR1g+l=i>t-rUCeQIO3s(vo< ze0_mvb9EqI5o~?-yy7f6{Vc15VA7X}}KeL0dQrXP~-y zi<5&LdPp$eL!9Mq%cyuSdX!PG9kasw{SquQlCZbpu5mW#a*J+p5qkFxz~DRLikh2l zE5P__0}XFd|D^uebp8ih9AESmyBVHX4|JZx{nECGuqu^!yzY}>xr2}*rGp@rur8Mt zW4Q5v@T)Lq!6zC)Ja`y`r(7DI_Lr33SDgXHAY{s_Cu-bI%rx5S=T zB-CL&Q=Fd1`Q*M@(OEM074iAZls(JL-7nv!mjq~Q>Zy<$2rnG-r#$lJ7mzonMC+f( zYbYPEMia$2e_AMg&rv_MjOU&bGG_mFi|R&vhTaQRmF58!zWwc4H(udcAMt(Gzm{J8 z&WOLzd0q5zk^ll5FOUw}o;(0J{E_1B=bj-qmAp_y?Lp9 z|1ae)xu-X~v(#Z+^u-qY_slcNkNMW3YG2CF-B-R-U78$+eNU?a(zDAR(3%B2Yt8$K z=7;s=FsYTBmxtvP;>i%*@GTpZ3o)|w1e(D__pQSb#@F8Ci$6W(T6z2*I4JrbB8N{G zvwsPy!(Y0Oks45qPPTt-KX#y>Q9b6*y9(o=eo5p4mbCD4sc#6!rBB`zzq0`1!;T~C z2$~6Ox%pN+-nC>C+(7R;xo1$}MEnN4J|1fg`}{;0W-|Nkc&ak%Y$JQ<+jo0@*aWAYk+4Bv%XWS+xhZmqWi9){T+IT=!=K-ht-E} zaryVEzj&JT(t$vN;!A-Q-2_v=g?7HMQ8d(7^X6_oX{*>apj@Gzps4B$E3vE( z#hETp8so!uh%wjm7*J>~YS2UX=)(%s=j-A?mZ`-wTFde5f@jWXNrG@|Wl$A+LmQ>V zt6Pd$E)eh(Gk8X?0%y)tYv~S(`t)hcPiqj{cbDqy`6S zlR1Q*ddA?19EDGTGOoYioTDU$D2pIbMuPNjF4W2Pk`w{ucbwqS;l5ICP8_9v0iaM{ zeY1QqO8sKy%#k-2{N)m`Psp=a-Q-HbUgXT@Y7KZ&C^iMQ{k@H!BUx{CX8|Xy6e8{L zXZ!KCLYm>uUR_U{jiT$T{vdDN&0G3MLB)29M+ZaD76I;k2`B*dbI?uTdzW_T#2Yj{ z0vWOPDAoY@6D#p-@yugscl48}Mq+1?b{5&~qFVdx62L-g9@BiNC-IeFtM1Sk^aB$4 z%!*KzYEJ6oH*cF4*w*@0+h;b$jEx0kVL_Vf+BcY2#B8~=NTc2A#K;(gBP8ZjAHP&T zKW@csk4;1KE0Wv>`+GzF__VAezb&~P!Y%O2#Vs2|j(=%(X_8q`X-E1NJP{N;I*m^B zi0n>&84mmnHj3r7dTDaSwR&~(kGQ{gYI0P?ik<)%VfoGxoI!12 z*gZOZ_fFg!^g-Nku3t<{h`$k9@?OeBV=WKU8pW|Efc1Oixy$}9L$bVX{3BtfRxJP#t*uO;p4&Kon<)6e46xydH3`FCY9?(<& z6XGyTj!CF6jr3d%i0Qd#oT<@&0wu=e$V~iCsQ4URrcQ!jbji}2*+_6|4&e2ISY9^s97ihzo`;NXHY=fu*JYRPm*FcP zCOdAfjLlySOwRJxunolS5!R5O(d>bIq@;bh@mhg=WDeg|4LF?#i{70O7wlrpgpvZR%oAzj|hz1@CF{lNZQZun}; zr4+@7j`Tn&L35NVVk7W@^pAolqD+vgR|w~Vx;w}47F{dbdJy!$ES=eNCYGIW@C3-l zu(~F`4oa8ClLUn-DQ)9tA87d-GqXZ6Eo?Srv$bOLj8{5u77FM9ZvnCUBkiCOKwLP399^LE!#6h5=7lI~tEZ^gM-T_SB48O~tr5@T@+bj`Gn=0ydtY$OiRt*bQ6Y1-BzqP&-eA;J`i&!te?7jN69@}cn^ef zP4(+tsZSp)AoFS+mJZ_I4@l~vjB+J>scgP-jZf%JDkc#zqAVWS|1vVax`lP$J z)2`mb;LEI$ ziQCp1eWWK;iZ?B|$`7qi?mZUr?`uF+Gkp|_jhCzDb(l9V2Vz)oC2avuOAy6&Te{6O zNT*#XP{r-!9m8_Q86-{*&NE1-`CV(iZ)bm^Exu;$)`-*AE?OKPk6JHGV_fR=S(S_~ z#8WixbWCv9EE?ZxOljh6pfRKWy2dA9AdMa{E69W0Nnn}S$8zhSLVJnJbqOL9r-^OobC+u~Ja&;gCSmk)T|j z35#S!>Oam}MQEl*cO^zgsMFpzg?fGG_`}M~5YC!^-Kk4kH8N^zuMcKR9}%sI^k#h= zHc1h_{S7Q&ml}FSE1hc#iAs$>LccIHW-tPXFh(+Ut_^lYT<(ew6K1YyEUYb}GhNp4 zX2ndJRY{(QNgSRq;GTdXF_6umu4%?4woROLip*@duom!Z(=Xb?2m>3V3 znbOhAzH11&g~Z^3(TWjIwV#aCr;>)GZ51_Ss!6`zi}fI)y8Tk+T*{V&ptRe^5Tj@` zd$b0yH{EXAr|1D{422dcDd^Oz@n5d2HqM^AE>9~O%6jHm2s1h4Ijc^VL!$YHUE%g< zB8Z6B_&c35@&6aN-Twq}i`v;b3!69@Ia=5|+c`o31e}aazG0sn^xtj_LI(EYCKhJq z&ID}i--hD<{`RkrmXU$+8+>hTVCF=?^sn|ELQv4ooj{BJfA$ zS{Mn~npvBC14IEz&L%dh|0@5+h+0^iFcL8R7kTb~x5ygUm=FNulq58Tm8b*Gv4yP} z0YJ^dR>0QD;y(@lu-=YN&O+t}j{h!J+Tg$Ij4b~=D!v2$|1(DLU#PtA2*%FlP6Yqc z>*616?>{8i|M2lx7}(jqC+@!;r5M@RnArZE(%RX?k>KCNI-3Zad|#T$zuR_lb~G`t zfpT9z_xA8cUV44vFq@tdE)=&Eu;}!tC#4V!Bh# z!yETeI#DzNV}UnGUPj*l7iwB8x^xh+mjNb=?`v!NwxyC6K`<^vTWM@Ao0!hV=YR)< zhb2PdE%{WZ!K)WE6`m-CJop>iru}}PL~iu^!w*3N)cgp5Y!16^|8xexPN?h=;ZN?Pd(qa2zp<+`uOju|A*OYwHVB%!f2Kq9Bz8#v5E_U;T?oh)=%#*4gP?0(mbpG>7+k5VQuz6iV(Bu`O-ViF284eWclrb;Q6{O`r^b%iN4=p{VMh;^ll!fAQ* za=FTxasbGXzUD0IB$Q|%ZV++c3Mf8=?Ie+gVhYPd&f(;(iHYfB24O)- z3Jg&LB-W5$-~1xT(y-qH9=iqh63@f-GVT)YBJM8FpVy(+(7PAAJiA@HAG>Y?-~+iK zJrT*mjiaau6{F9iMWc-idloY%cxI#N)8AYyo6B|W`9Htg)SPnv+DvV;jsUc`71wX2 z&IR9pmKH@WJDpaIXx#vL{rsAwkR?&I!6?Xm@Q`i@+-Q22`znOI5ANEX*Sly(1a z^xwy+%>YhKr>nmWe+Q<}>9kkok;{|@%8WM0pU~?T`CA&}FrsulxIo77J>r5noTu z3w#VIY2dv*E+RXH zKNvX>I}|$zJ9LTIlH8Wy8R`%wi8k{L^*K(2_aLv=Zummv$X!RT>Ad$8uv)+aMq1|Q z6Au4`nDJHC26RJgv^TFr0eTg4)jwO}p4qhqAI7@G=KS6fkHYUXH-3NCs-@_yGu?om zz**cC3kk{PlbV;?<7!5A3rx&znxlHc*a*rIgD(9%xfFgXWIEP6rn@K540y~hJT|*$ zUyuF<#^n7zmbm}v3EdUYoOd?o-Uuecf0Y+;EOXE5iQg5qB?La(Vvh9s16Md~HtHDc z9=RR;o4h6*Ch)ggh%fJ#IaNkrN&X2z2wVPxIaq}#(;N*m_LPVdKdYT+>6~}`Jm|4% zBf`N0X(JG=U`ruZBgQw%Qn=$r^PPZ9y%!~_3{$5Ue%IyM;2pwJfPuyU^GqIxFA{$s zZlAo@*1Ffzx>wY?Uv95-mgAnw7mF__cW7oe#vOSpI(G!HL;EaJ2XJx6-ime0=qU*-!_4$p|?uou*ZG~;F z1~nIOo)7W9b8f|b=$|p!|M&v#3HTH~no~Qr%8F3I8Ps@|c}Mfb?g`o+x(e{|!Vj}& zh1-YV4Ts-_zYcq*|Ae^c<7ma59=e#5aE9`W<`o#3Gdp&22Ei4|EdX54Ji~mVKga4_ z*FMwmhWU;7?eN`r;0#SY|FrF6$O88TMTGH{CP)q!CSv>s1TyTv4T?(-O4AHVq8Jjp zCW_*;5<4KFUk2YrWV(l^K8NQPCBYyOqzjW)O2ixQPPh68+Y^qF86XjI6yc7MUPvT= z;|N7W8WTE3HxKX{LjOoz55uJ?=93b9Octmr{<`D2fM}=^O6!$wC z6x*lT$JzH>``5|3!*Fjg^^@&-7(~^ntdgChxI))L)IxqCY@xx$GxdY_kMx`MqxYxw zQ|@x*OFU~lqrafPguF{mCvJ~&+;Y7LoztO3@r>pka9fa}i$g~wus_4nAY9`nzf*)8 zaxuttO4A^EMPg}tg{+FvAlIVQB7sK?3@YrI6DoDecIsx4$fDXInMK?Mfl=KC?MgKO^XeiG@%s*xy(<6h8la&hd0eZ58v@@J8*t&)n=xQC{?25$_wkI!E5M(HKQVYk{7CZ^yyAZ3eDeDh$=s8_GVus~iTLIB%>TY;duQR5n3>x?!M~UD%wa9GG3P2D z5-}%V578YdorP15do1LdwK8v`7ssIa#^yl?g(UP->|%XW^ys4bdv@(4h`VsFPdOJs zmM<}#@##dKc68nGy3xH)KAue%{p|*1p2;<3%;tuio8<|k(P}_zi$9P_9xXmv!?7GCb{?&&<)y1)^}x^R-X1@S@uJhJDtgdKCX$MXuTEWr9J=Oq3W zcPh>VTEih88H2nfeTnpzkxf)Oz`mswKRP6c85ly`6DL%X56O!MW#rJ!B9H~)z@>ph z3=2$-MXelkAZP;~tQ-m;uzDNv3%B#{>>|fQ*alzAhQ%|c6Tg9RC{d?9fVc?O&gT)o ztKPHO6O2FjMKCiVkfRph4L~Xo#1nt$5(LjLoR#=y=Rtq7^W;GkJyqXjxWSR$3Rg)! zK^!ami`Lhe1Z08dmE)Hz=41Nd`=9FGAspABNq)15ze3(f-B8DGX~*y4#P61=lO0NB z3zQ5H%;54z0+J+)CPL^0)ppf(X`byMN&T6;=?&oC0I_hgP|C^1*<1R|>9ndtrgBc~ zI<|2uM{+X|#ua^4@~-TO3v?|$%(X%zvM<@tP*Ls97t39(BPOJ&Pc%!OI&&Rz+YP>I zk3E*XOTgf;c#O`g*NDVoI!d|>uj>rIR${8L!fNpO4EBn!$>h>GFNROprqVQctRA!4 z?rd{Bf?98#+;*J%2zY(7=BJ$1i*J@&4H<7+-$6UXsBJ|my8 zalb4s%y7T`8J5Y+Mb}-u-CJ(A*>GFD`tzVTaLEI>@;SV!W$kXhdieNq{|`V9uG8-t z;dN(V0N>}Ep!fBDen%|U!|wXtlhE%+9P%X!^%aBiiB0*=rub}EbiFOU`~P+L#h?uG zj6z4rdBb^FfOsH8`aw@vG{?w9rFg^RRTH)mG$PvcDfO~-MLzB_g|F>y5&+o| zvYiIuf!f`&HR4E^GvjDPg!ZWg@B0mGx$~TY_=@@;{?PVV2X?g&U|% zAz~UA?3zWmR(IR2+;^J8aL(F_Xa`DchnyN@xw(Dbym{M`3j(=7+lp)pUlk=dj#e$D2?4S1eUuE-y@XKJ=wn;9lBu?=#RrpxIiz^5CKjIKbg zQIb2^r}I0^Z2|Wp{;*Qq)<}$Cm5D=DG7w0fA{|vI6VvQ=UmX5V{Cli)!i>S6b&)ND ze1dR`m@&ayyx=|WU|+JfVOK=Eu$pK+KQ;X6o)|3){ru(b17=WXBJE;iCu|ofntSciTwq1f#uGCX4tW}1Ni#%lD3R# z+#_p)djddT)td~pZMCFvT2q=V_2G|1C- z3fB5x*>h%YLEd&ra^h0QUBvkyyz%HF=!J#`a?^xv@%=b1!84ipn zX2j<~+J@TRxY6;)$1p4lE5+&8+r8@D{tV6Rt0lTF_5F*yi%s-Y3LQ$m;CZCJC)7l)nbpk$bdcV2f6&aTtwvmug)B;KkzWOI$B7^Z z2Y`_LvL2)!71Wk%7{Dp8RAE==zRezI!Wo!T5Y~SuW7Mf1AwE#eT#kQH zU{~S3Kt2Y&AiD@47;3s{8NV;!&a@hW*!ts(a4>-%EC9s?xf|@AJLVnPdu+--2Y(Rx z7}mcI`o_jTDi^eR6xHtM+tHw15@lmb(XOZPF&Tyq0|B3aa~^4{qPzNQx;L2nGXYDU zQ9tzTThM`s0Ray&+(425Fxt=Wyl;Rg^q}J_VK)%Y69q~Md2jnB8OkhyHF|&wCNQfF zy7?1c9dK80fc+qFq7%#Lka!&e{J;}o9Wn}uIn?npi~i7-*uy-;yuU31Ek+gGAlKD! zX#U)d*~YDnPZ{uP(BaL-PAv8ur8E3`c^c4G^_fv3EON1?En>0zc}Xu_-ESMzz01vZ6jU_l z>8r(hA>BqF+m0-8cCKVpWhP+E6W`pGeOC@#3)f7;rZgGRAYF1PB2)-b4<8{D6-%9> zida!WHQlvZWDt`ht|aL^u!2 z?RZVMJUMZj-omgHp|={|e5j_Hh!*hMN31PYAufzy{4yV&q_;AcR>=!3HC8)Eo9zl- z`wkmXp)2{Th)_5W^UOX78REv%Kl$k!bsgk?VfQXKjIaebnVc)8(N7mzrm;^4JmtxQ z-(oZ6*^JFSws}AG>k5Q)aW8pzoqcejbQH{DZl&byKGQhM-Lfa~3uO%o1u7S9JYt$E zu~D3TR2G>DnGOD=-EtaegL;M1Ld{$#9d#cT9qrNm`LosG?XmIOH@~^oEOOk{$||+e zUjqQY`wXRb0J95}S{nz^B|pc4)dB35BdVyzr;BLnkbB34mS z;qp3*nm^X0RO!#sz0S#OEnwd5@ylGlbhE3+QF+8~J)Hwt&s|Fg-q>R#t6Z{Y$I94N?_#oB zg|g2g{7U1nmRd^(s4*kj%U=<}d8ipdm%%wRR1F4Sr&~)vT!*2+o2#$LZ3z{1qhVM3 z#TJz?2A}jBQ9bIa+#Cd^k8$8yu)p%=W(Bcy{W}?d=WQRGes9FN+z2Dajv&HF@)RS$ zh}l7Ue`GamEp3ZK4J0>4ga!=IG8xoPiwi6U~oET)k?K zC2gl1$*aJzrUCL7>+WDSa*NJf!uI6nhFyK`4qeMoXd=}Oz2fX)2H{9#f?=vl~0xI94)YB0KWT=iczTaJ~Yte}o>`W$~LwL|b~WV_3SD#h5f3l#>w z-_A!s;S-&1ypsn-WMO^2*A4#a?ZOf5R2Y@zO82`Y4O5Bk?R!KU zJvX8L>T)4@@EJ{>-$SIJsNjB_XXP(8+2zcs&YMD07K~BxO40>E8o+9jPjvqg;6oak zP)k7;q&tL;9}UVv0|sTLo%<+d$V&{K8v{F1ZU^x6Z6eI|I`B7T#xL>%X+Z#B21Ios z;1(e4yuvsq<9S;u+bWSv`XK{m`K&a^_Uk7J`Jh$1Df5xjVefBJ8Pf5wM5M(Nn!0D} zqxU-6RZ?^6M$l{l?7n(S?-^5XxvF-^?Un=^wqe`ABkNe)0XIQm3;rNiEPmzORIFMo964XC+pGi-uArc}p~B&m>7rsDJ#bVKl%$^h#9lebrTr!6F=gL0Rl3=qFh}a=&T- z#GN}L@hF?N8G2G`Th|Lr1c-5_Ei94(qq>keLSb`yALo3&+hZOWH4M4dr zDefRXO!>{#4yEq=o57)Kaa^k2*# z84lj-G1C@XR9`2axN4d1!$9JlFY}|3Y2)_=x51v|GTv~Ub!Jr;F2UQno(uGHvunR-mdUj3xu}qI#8C2nfi`j*+{+y? ztY2y2zDM$XV+Fo~F|RCvn(UV?j2h)J&W`Qoug8-hLcAwp zMSPD9c-rb64yOOj27812Cz5~PYibxXV;a+P7Y3BdN_V&hMULIin@j;Xldgm!0br=I zC`{xT<7E%28;Mk*fD76#jEui((2Vyhr9G-XX6->z851_tI+4T;h?a(A>Y)oR&i%Sl z*6FyK$8N&Aew)i^ZB>###RNm^M^Ab(X_pLx*Zh1@f+?9KE4JNx(FrQ3CQulLKGCTu zI>^s+Yl6+6W%RBNbM`KS%a@WZFDN!|>GcMuHuBCI zw;+G=%h)v~EIP@Wi+W*UV%pakoo{XIE=#LKi!#nnRneF3ecdyY&76CjTf7@+u1pM0 z6r~QS6{jAux!9FXe8`}dAf{N9K&EJ&w-i-3UNz<3X5Z%Cr0cSDCyTyIwkPI;pqyOY zFo}chuJozG|G5Q)iIh#;l6c~nU+`&n##e{V2I$a(CxhMI$9}I&TJ`2+TZ4or4Mawa z(Qo)*lua4q_DG`zC7R%87 zBDZlJ)=;NyagNsPT_mBQm9*e@Q;wiEQ&A4i?h|L*abKy?iR8a;Lj>#k;RF+_m{{(e zkL?ha>-l^Xb7tGMuh7YL5eE;K+i~0GBNq#4y*6KI?7e^SCMT2O`c>Fu0nYd4EA{fX zORg4U1(U=?`5pW8r$oeFB*}iXZrt$km4sMYgykX#7dx9Vy_U?fe_#9=Owj_rZF`y( zT)GS%pjAV~puct;aahFFqX_voFF0pCpaDHKB@o%-=O;^7ey0II^-&CZwf}iVmbqin zXKG@yvGxLMgS&@*(xs4biJ^~WrL(twQu|E(#BbOdK_y@UmKq_SG4#lA7!B-PcbF#K zVp!)?hK&5-oKTJ!kY07j4-h#nS>yGp;uIpS2$N{gB%X=2-$3c3C=iCYe?FHwmo}CG zmjk}+-t@w_>f7u~V745NTBfQ6+HRpWsbfb^pW?)>mR_w+Ns?yolVkKHTZOEEf&sA^ zT0*th)SfhT7#`cy%%sF)BpbJm5!6Ufcu0qr)@pnh3kgxB8 z1*7mkhvCl(UtZF+&9L@dZ5+FAmgv-MU4LhzS``>hkU%n?(?>Bj{%PVTmIo)07l?_N zls?`+abQveywjn}L?F3~bRQeQ8ZQBeC=i$!rC}_h$tT=RbKfVw%!h$(%`{DEs*+F8 zMm{I1tw$o075!ZZ0R*KM!M_@}W|!ySi2eq5-)M&=5`x-4#Z09;0d{>L~2ZimfqNt{ng@=`O*Ph6b&H69t-?xG;FL;Aa}piaA`8 zDGloq3?-{Yf}xTsr!^Ofla&^bem68-BPyp5YhUQtdJ5@5{oA&CA@4G1oR8?L%Wj34 zAvS+GzIi%W;E1=Myf>Qld0Ft^b5V?8GgILH6EvaT6X_NvC4)vqEO9n1`b3@`06WnR zY>mle3B&&aNkF#0En#v5Le#P!G=nKduASRnD_;-rEy$?NSey1-+UurIOh^1WeVWJ8 z-Y4ku#eCx)uww#fhmvM++SAhBu~;3JG>64%1{KlLSVuI=dH}Q*tLDVXPQ7HM_%Kr+ zuxgshx@Q}!%up67_b5~WCGl`2@nGapJj9by63-gdz87~vR{Q`6Rrl?do&S@vWL~N) z7uBVbAxh8@KF~@VEMOK+F4uL8ioiw04Ij68xEj#bC29k@k_MPp0DVDDhYUy{GV&GY zx*PAP-?I9e)$KOjO+IURY4DPJ8?kQAU1#5F!8JVNQ%AI3?g# z7zf?l=D9h7b0^`}fsYO-|44DNvPs!r$vD|zniuzxHD@1hA9b{SggQ-_AWzUuwNFsz z=;o#`)h$c^ME8-)Caa9ZISHMRMuxb-W33=RA+r-XYDf*T6E@b%A!Y*o^y9;086&~y z=~I0MJlkEfqn+W|3TGt5LJDXpjN;5o43Q{n@(he~0bH!PO5J1KGu(^Z)a_#D+%EPw zcLT}Z5lw(J(8Q)zCMGQ&w{$SZB*&QgFl$$VWr&IxG?Qdz-0aLjg|d)M>BdYQcC=xs z(7eNw*MHimUL&t3z4qQv-*WSzC11u)KDP4omM>bm4ZeHOtf!y6^_Ih{M+QxkszNp+>(eU^~TekuM#(}+aiO(T3nyFd#n=yqyqN94S zWlRh638s3Jc{T*vj3k4(ix!B_s++C<0SyM;k0nAWY-Zp^03N-Tq!hC_th!|2*``6t zIflkqWWc<4v8_1aszF#;1S26ql0#kX_HN^ZovUL_1G-vw3wQjwlAhnP`hl1|*4%Jp z3;rIz`6$aC3p`-EOwARmi^Mn&6$&r^y2tZ4})jnPRS0W7N$Yn zy0~zztG}y%`Jz4_FGLIRZFG*V+BnNJ*L;h66{^Ln=`!77;}X*{^Ih)uY;UC5 zvp`d}r>j1;QPoat(?N|e^$FyvCKT`>6Le#JN8EP$Anv!FyRC`trMC=RW%^cJAKmmra|zbmgQQ zR`lqP;W-G*Ng^Y`?`=U#wNA5*cN*_EK4m;(6p;}}4BZT6hEaxzhMk75 z46@N+k=Zll5=jy*)cCxCWiLWv3FX~bjF2eFCDhQ}*hB0@ODRz)rW>rOE|r`;2}psZ zEf`v8X=zdtISk%Oq`b`(7R{cK@_l{1P_CsyE5WQa1^Sf~7I z`qliaMNduCOf7=Zpcg3xoU4;$*#vE!WRfvLEOTh(F{Ub;9B_&V0z2kp#{`v{9PlfB zKooTWNst=IOihn;rtdUX1GWbnf%QhsZc@=iSr|5i9;C;qum%X%fU#yAVrrC+n}jtc zY-0P0RX!+_MRJWyJO+h4j)h#7&^MVo>~Q+yaz%s6#s+iLj|5yU73h{L%0x! zgrJZX6e2m2ERezvNck7fw>+}pGyJc0Wm)Nk;-2$mcyFu^8I9NOzWJ_I%&x8lAMhP; z%EozZdiKHH8roTj@^$hU)=qw0cCeQ9y@}kUl-{;y2pqIR>!u8dn$HMyzbe;oV_(S zY^&-l470f=4eUQ7w|Tv6>OQS(*n-Y1A2BKZtvF9S3|u+9b3B=vL2$xt@$sG3#1}({0gB}*27oIWi7V6D!nh&9q8NX)OEcOgrMuyN{YG-Sou4eW#k8)h& z9Oa!XPRqE}zRLcvu+H*u`bPXT*=YONl7<|}r#KWJWhubz?TUFc+o4^tVnvwx(*h>J zAE0_AV!aAQRE)7N(;ZQDSZ89r(Rl;o$0V}tl>?dYhjkMB*xZQ(dnLzWXac^BhI&Dh8 zigeIrJiMpd`@-a)qrNc=lxUuX@@!KatW;EKkzx z3y%xY3m*$h#64SLr7y(HTbLGso2E-)40?2z7Ug5ON5-wgfFV4p64gkE&-fqoTQepy z&`BkX{ag19myK!D{WkqSnE=2H{{OY_8-*_}oFa8CLs-9iY-yPUeRvuqIEz#MpDaFa z)O=~qA}R#*hV_O+24WBiG3r2KR9Ti-?toiZ@UATQfff(5BnH|%+|puhX)9|WMk7Ww znT>7K3~{TCWJk+D=;N!vz{NlX0ll}A@rtlC@Q&`6^K|fz z!lJ~sLw;i0E;q3ag%jJ1Kw|6hCDO<3%}S9ft`WD2f}jF8xCgCAb%=I?0DK5Kj?N&_ zuEN1JNDvb_7e)n7k~%-8sPj{bI_EScfh;(6o}`~tv{ClnW6HPJ0DP#dsGe2QQkfzN zOU5wP7usIk$6PUt5xlQBjBy&rw1AM+tyrh;kz?p0bv5)eTq7(KJ{9D7hR=l0z!)&Y z#7$H?aW$q?y$Sq z@nhQMUU+6We7R2V^;g^d>VIzZ6N!mgjUERcR zGy|z6Osq;u*aEu602Rvz!`8#IT(V9n(Ukyv@&J7D1AJoW=AYdw5}_H}IkUrLWAr+s zxuGE`7F&@{u_#4))-os{Gbr)g3hux7hh@ZU`YfPZp0}8?CCgt7LUU}F3!1KCiILT4 zFVgd{8UL?I_r89g272DcnKi`mA(J}3<|L^gTSjufgq(*X~{*q}x7JQdBHY$e>HL^@{ zG@9TRN=*x9%3Mz+z83hJ^0mm_t|-5={ca7I2L^@R4lb>~6flZ}Ku3h3r79QJOjFMWht@`E3yk<)ddifvj_LS&|q` zW<|{0QhsZi%t-MyZQFu<4?8IuZv+b(^Eq9vW^NWMD{5^B(}PGF`-G|oHZX8=StOxRpSt2m2sxA#wZ$ffNHq2 zH^amJGk8P)-QTyun>J1^S{daYzWVGX9^TGUHW0&7&Y_f{72+pe0{f~{VTHIcW$+bv zP_NU&P%MLWWg*BeFEk4hO?EVts7)}2ie-xfmNd41c2^oSGZM`V zXgXQ*k8Q2y7PnCyU|}I^-M#O}J|*wq>G-jIv1g7RkFDSN79Rcg*zd7}xCr}q zVB`IQ2gH`32$3BmW=$XD-*GQD;Q5;QHb$*02P4nlLUh{Xt%~rB=^37 zH{MtAQ|#^73ViF{$1AVyyd<_#++(p%+%^5>SWC+b0$#mn%$-g%lbj8p;}G5h4YKeB zEoe7du)S;g=*&sF>6s8VbI-xoGGAwduye-q0t41Cr5eUm!`=}8YKPrd1luz^vT}-S zY(FEXNJ(z3$t|4!=Z=g>;yhfhB)9Cm)*l*S%T?)Dsl$z9(x<1-($BXnur4*Mus&$s zWNomXwtQ<tM-A{r(mqD_#ngr3K*Sp+4Z@|q=2``~>yHPNU^V8$8 zS}nRj#PX<=D&CP&tl~jP77s@xp6IDmvu9@4WDD6@p8u4`(*J6YLJS!GCEQ9XfcK=Q zDOu;2++JQvrfY@54)aHYd_+2yTG;6U{>0z_?U}ghXbB|#G>*Mnl+rU2A zVX_~hm#pq?lw0Nsh20kPo6Ku*#>Bs+ zKZu7>K5=R}Ug*+zXnszJGEFqSFW%SNY zHNvSzB-O}CHA0*fiHj4BaH{54+4A0y$wE7F{B<9f{0wpo2aTa0%SzMQ!%tN?4Mc zN?u*isVVXGYaPPb7PC`;>nb>JB=?qwCM z;vu*S&%|r6gd1?3mezqil06!Fe3d?ea&ay*;T8)SnajFnX1~kz6~LHq#LnC|J7rG^ zxxF<(Z6CpO!P|NKwaF^RlPoo;%6|pL))CX*S zTDJfxEJ$X7vUB)!2``;U=GvSNw~M;DkV@bWB4b`Mk9}+5jLpM`jJYg!Q{9H*?)bCvnp>7NKlWzq*LC<)<)*u?xng#ozBh#2t*x7H|*ha0V_4LNCH4`#9t=SH;~yo)I>)8B}v7k z6PqZ)cqdNgC{AleZXR?=+we;&Z22l>Brc?kLM#EG*&TJe*0qgbfSiC%PF8-S@cPU| z-i?(l@Pg2^SO%?)`9<@VE$4q_z1;xbpXFX0=rhd_v6j z7uu32pbJ2u#4MSOR_&V*YyRl{*!h|J`fXYG$u4ovg>7HNE5&JS^&F4?mHIWNM$;LSQ8f)Q5lW0YlAJizV-o~YaLdwCJ~INpHt6-LPITyWA_5U1 zqJt1o50CmzH9%xCQHLiI9Z%l0D;}c5HM%uA*vD8i6RlnGSc2~%PY^=b5t}Lw5lKEo zBWuJ)@r)=!M6zOsv1(%?BB^FIg>3OCiMm#wx5<;JZB0(tu=$!q)Zu{0Vmq<|C;qiv zZ^vu{ff<0i#DpaaK-$4&U3mb4_)7sCl(DJ*ATCVA6NQ-cYI*BJys%?tRtLQLjh20Y zNXr$6dv>u>MpDM#1X%I(*9 zl!tT=S(Aj+3Ki`0Mx8}sk*SZ^$27n>LL6bb);U3(V4CKfBhE41>a>bZ7P;DWplXEk zv9y$P&CRVRBYr@j5Fbi15Z?fjs5e`zR+A&mZfE~@$m48?m+TOcM`c@+-Nv@sXeWdp zNF)Se5C_J{BkFVkr^n%Rdh8~>KH#)N({3|at*T;kD2mOlH|ac1(P~pbub@k!;8Cnr zyVAPfiFUzC7kz-oabJ4~9Wbx#PztV$4ww1hyU*QduvRnX@m`OLqrrdD{L$g=KPt$bT6SYI#NCz!X zZ`QZ>ntkna&F$M4o4Y!@`FphQ-@ejZ*?y{dO8ct(TJy5phh2~OHkqC6Qd3nqyo#H( zp7m~Sx6Au-yZzpS?LKsV(N5RLg#*k-+L#%$+b>T4c45|XBx_~5Gd|CIIlmw zGH;ZwB05PoB|6Wv-1N5TPxGHqTel($rb?&mB6mU1;TfAdBbVf+ce0dP?y)>!iCe@c zEL$xw&Y-a6~VCu(&wa=!^LT9t`4puLc%`iM0J2Z|mPX;aipzM_2%5EUn zYL*<0)m5sI{K(dbSj=Jqh7tf|eX@%;Iv4W*J`gI(FK#R*>x*%*oAs?1yQ4eo$?BB- zs&r5ynNq1lBnt=NyhugzaOBO4S0o-PNfwU6d5N{uxqF+UX@D3}2nYz9@0kBe~n~1|`UWJCL!wgbzz|oC=yA)w8|uk14I^BZts-xZ4%WYl?XI<#`d<{^sSowYaJef|C!V+y8E znfzoV;<0(UVMn zo=e4nXSfU*Q?D}^Sy3C~A3LITV*E7D!L~v~6WJRMg9?Q(A&nT2>Uvy<&tRH~OYvYV zUrek^;_e7OD=00DAx;g|J&ep{yJM0O`eQoes~{&)RnV)@m*G z%PV`Qk)o0J&U@jRx$|BS_q6Faqq7z zU<(5;{q!cBnch3Cw|jWnaCcQ&mHQF$i14uaY2|63NoV#NrjjYbRB^6prn$!atZAoy zmtm*L!Kd>msXQ#b9Ez1^Im5sS3Ka2CYXY&=~+#R;v+R>|;7~J=>z= z_9@E`xVzt$9+s0 z@a%Y^`UH>Eo;DC_4x5Y2eavDPN0;<#$OywQ$MEzU$OLhse!Qb9y)pA6@#C~Fyr7j;dOXd7+44_}ZxMQ1R&wf=tC?A*OGG#0pEDLggiyXJpav&j!oNe4K z$=v(M-ayfiwzJ~Z1DjgfDjk2_tmGsI_-whTXDn|W?80m@7~=%P*fdky61naZ_b>W* z?$nR&tXkV?M~nKx+_A{Oh04o{* zJ#zxjhHLIjlw z-5P|k>EL8JcS%ciNwN+wS!%>*1XC)ONYFauAdk;*kXH#y!gYJ{e%k$A>}Tva`Z2cP z3#Sd+myTcE@;Mo5>ON}aZJY2Y_fz#a6O6qHw~HN%{i_e{nQEbBe_S+F8$z``2w zFmhwF7I5gX)!WIN@726By^ok4HE%NOeCBrMI&Y(wdKo?1`7(<#bY{V1O*ddCi8|7# zAR)sO4(y1hY1AF2NFeuNKFP47bN3=X*$_?7ELwxGS7U18)y$wK$iXA|c07{LVv2+E zk}>=*$wZ$cndtkTyB$95$6pA8*q2veqo+LHy?74_qI1}QJkjX6HhH^BHV1JQ06oNO zO_eOnFX8VC6|+~sdN0r%icQkXk`54(qPP2zO|trN6i3@HUW}ulC$kD|p)Q48in_5R z379oz)tv0DhV4&0k>8HuiN$`V4PIo-yLc3l$r?I<7L7IY!Cl#>vL>hToi)j-kAq zo}r#OSLdwBTc0O)4R*~f%_}pO1^ecX2#&~|B99M_&#lU<$@@I#bnvIp&p9@?OL8`l zZT0Qa(`4>R6cy!jKT?Al(IEt|l`PZ>#PoElp>I~Y$>4Gph6@d0kLQpZD{jqQ<*sql zJRmt4na9nVo0~Ovt66h%v&Kr=`O)taW{q9NO5BrX&CNi;RlMqbjunSdR%Z6A)`QmL z*0_~sT1%~i!O?MzvHBQqty#Rxn&&_guV+}fZL@l#d2@oyyhR7KF>hy^l)qTGmXqh$ zn-C|HFGHM6q%x|(DY;qU69wt8mE|4`ICep_&U*|2R1Rd7=FW zjjz7<`WvsaSbRA`0;`O2;BmW=3k2WkF5+)nad;i3U4*{E9y8^KdbqtsZk^3!a|j|v z)^t&J7!9VdUMuWc6xZWMJ$7*)ee60t%eiuv=pBqD zdgfsGOAoA!jqjh^#V4)@@uZczsB2N3>x_%cbgg&Qx#BMBB93rkQc!_DoMG<(s~|Zi z5alx|$%OoQ&CRuxriy^tObwn-;6X&VS`rR92RZuZ!i9(^oD_^#djk8g5+LqVf-Z<~Y0rhjI4Y{iX zAmK0fRX+V_%UH5u`K`n6UfA+7=;R7uR0*#hlFVVuO-F3QNOOqtbyaCV)}di(AKMD=b{D=n_?t7M)^^ z=oEt=>n*Y$B_x8q_+IG5iT43n=90bDw5&chIjd`Cx32Yty&mjOzx&{WKW|-U>3<&` z)4YEFzzIxWK^BBRSd|qSr}?D>wvt9kqxFK-{Hu6Q67;EZ<;0|$A=S{Q8hnPHPuh(X zZZ;6Rq^9w@sxv$6IYoLFq`}rM@&iGBKwAPwBuYgpb<_6)R!AKT<%XMuxrWb$uO<0e z35TSJ9M%;}-SwsB!R88DA(hJ&`h|3XxK96u^dbF3Iw^f8|1SNhbJ`6Ck^MVPR-dKU z!H!<13n!|w1WLn+N-YBjEM*B({;$D7W08S2V5_DVDbKEC>DXRS<c_*y8aee)Im&gqiFInu?JyE(?)FrXa@0{2s z{u@f876x}?6*I*r#N#3z468GukSWd-Ys9!n!I~S0kTCGhf9XD@iXV&TRN~gDA-%`1>IESbNSB-p zQpi{e`MiqZP#ClS9Ztev$1LGBHf*CjV)O85ji>2&#O7dwwDGt1*+6ZC$8Fq<*?5A^ zmZ~VQr7E**4Y*P>dBSV_*w1h0Z@rzL-_Fmf+idK1e(ojxJn;52UE~I5~zvHhK zIFX-eIoT#<(st z7~TB6Ebgv3j&AF?HxxWOb>4%Sx4-lF<{hCiJ!k%{zI?*fi+j+>1B1q1U%qGSu9h6~ z*o|X*Jn(eOgJk>s`9mJQx8<`G=K2QY#f2AYX`&#dk&Q}&^0n}7+8NiYFV7hdndw>Ysq-{?s7D}$P8ZkB zbM-b`vJ~@w1YCx{04`e_z(tdq*r?h63g8C0`TquqUQFPYoaG?wlA~;LnNNn6Fdy8C z!d#L~Z_pWJgCHppn`H50tHGXRGJDOSnpt7ao5Ewjn8o2K`=@4XiOZbqN@X_^CEG$Svbw#&)?!$2CFE#NT$Q_0z^<>e>r zvcYTWCtax~K-OjFGI!sw~KzkAsb1$NRHX0<$ySf^$lBwDMeKo3fSGN-vi0VQx!5TpX^y zUc6pUnQvm3r16)DQS#N|wn0&!r&s>t2zK52!>Z%4rrq0@FWbIj>GJI)4d>iFFZN~2 zfgkR`0c?Kn-S(Qojsp04?QWCOLAhKRpwLpaP9>RYt|^pJ;4H|v zB4ehyM%DFj_wZlkzRF*ryVf+uJ;py(H_bFfneLwEZ&VLEzVLkEI~+LaI2kyh##L8{ zMwO_u3+Uy88O9Zvk0zqmO7VQ=@uihc(V@~uwu{*RfZY^RXGb)Ejdm8 zjb`LC=bqHGc?!_A*5W48=msWhAwGpZ2d5R1LVFmY|2boxN|Y;Y66MMziSl!QO_cMA zEHIHgQJ&ean+IQ#DgQt1eF=P2MY``-bxxl?=k#(;cW3KPC*4UposdR?SqK3n9SpK$ zH0+WX1X)xT2Q@4@A~a7BP;eJP9YJ6OMK2*?37`WG3W|d;3V6q5WJdJ5jHAvEovWDi z{i@FC5CZeix%d5k@4a6L|N3e_b*jGl>Z>|c)rp1j&dcO{o!nL4ah2SY5UMH3N$fVC zaGp!((0WTY^m*vUrAMdD{_u{v`+K;anRDCbjk6lIwoSFXbkFeN%j2uox1G877kygK z2pbN+^2YHu4!y&A;o!EZ!bxmH9sHzM^gbJn(1NtSw3^;-mnxDgyw%lhP+-#xjpd$K9VupV>c8)4S1ZdnCD>mfDBVE9`Z2D*dDVy|j-~ zKJ$K({v*|h=t%PUZC0n0k#6Yf){27SqH`z7UbgTTkN)5nB5~gvJ*l zG`!KKG6*ZJ$KA>Nbu8ibXvL0D4^#n)J`%g8);_2B|* ztF5Q|o!>BU3vrq2;JwV{hI3X`yB9n*`lYt7X1+cD)mzrJW<7sf!!ujv%wFF%mCAju zB0Y$8ZQEVX-1o!f!V8BF?>~6##6dQ~EykuffUV+!*Q0$4Jwz8tj#wgIE{+th7iWo* z;*u3vad=#c0|c4ac$WZG$$vm5a(2)|JT%+&&u8}Sy54_AT^$A*i3_50Gzw#KFLhAz zuW}E1<-E!LDSh1OTiMAbRyE~`3r0YHeTkEA${u$sJDFy%ud$+L#erh+y8cruuDQ1V zfB}84P0AF*Pv0`Q&&Iq#6%%f4J;rLGBL1nc6>FiVkQ%*1%udSgqYPE5LSwS0WY1IX zQx=7u@oet?JHer(`qEN+R(C&uaq}%=FM+-;+dkRZYkk|=Ykm#pq z`JCT%P~hW_%E~J!nNYN^h*lKEif9pAw+}&@q3?2*3mUbIqMcb-0fPKS23Ck*NaF%n z3t$TDq%60_PLCLqK6U!xNWG10A z%bAl7**Olo+)Yg<`FV;eMZ|On=ow7UVi)Q4GYr0Gy&$r1;X>#jj@bIoxb{n4^1^vN zXlY5Wvhz0f;UC-0%vV4wnzUti%)6~L_u&JpYbtveJUH^sm+D-N_J*nRrlq75rZ3w2 z*qEsY?mY5Ga+!bnty8Kl%Sp>E8nW=JLAU1zB7^U^A#Ftch_W1ihDQw*SI(=iTXXgE zte=MBf2ReO)sV{0D5~t>UATl_!dZ!yn3n*tJ5(Y-impU76^CxYrs>&`O&soAJBeH6 zfy%%M)|;&{>jPF1P;**qZM5#Q9<@q*W4yUT{xs(zE8F_VKi3-bG1Fr1ng4-v2h+*e z*w2=BOx4WLDy_TeG)N=8wqD<9lFF}aZ0)C?ViNvKwl9!Lcvo>TzwrR|tK3xM(;53R z;40&H9Pzz!RQLU&-^3Z+7cFYuzTFea&wP4~-hawEI%zqv&S+b)y!GKLyZiY39%b1{ z_PY$EW*7L_Hz%CA)1W7XZOi^TTI^0LiFimz_N3T}C&h-s+=bNy#VNUIscbso<8zf% zK1)e;^JV$=%_gZ_e5bb0Pg0Z21$uKeIF(O0Q`!8)!RjNPO7^9a)T?}aJ%CM3d|&(M z&Azq1Mqk_~`s}$%`@q3&Aq*-7g~3kb6LqIUbFh78>_{|DL_~W!IAoWx1Xxh85XWCkYkt+t z3-e{bRNf)@lAusA@A$RrYjoQ-o9mauhu_zC+mqV{-&9lDKp$#tUUBK5;Un)~O3Tl@ zi>>2htN7SDD*4>pFOX`HL6s#UwQph!@$)u?k&b&A`BuiAr4|C&u5y*hcZaK7!D(iR z%nXW>t{EvYsmhizl+3IW$VY?gol16Y38bKbu6LvJ^Lvy)5Dm@V4f2(+S`MY^U>Ky1 zA!BH*JXX1$Tu-OUQUYL`8BLk9#o%)b?Qs7)4ElC z9bQ%6h2!d9;Uo17oL0Nz>!@jvqUHm;IHU%ms$z+{Q%WqzDkX{A4%rS)i76C}r8K^! z6u1m!b;10&I?HN>`%;U=ZetsQK8Rr5APz?kN1(8Mt7n;NmE~MTO;QvU1WI#_J%AQf z1=ZNlCs|cR0AeY$6MMECjYf@od`bHDs3m5h7PLi`AdQl2+vjgFZu-*aZ5`J-&X@M( zsd47@DedcuuJUsag|Qvc=6<9OoBR2WOTNL*Q%uOewaxhLsoX$XJx!8q1hxHSO^<(^yqq!@Szg^;N zQ#$s*BvK%DQ|VCGHLm+yf-7iTCud%aB_=E`CU%rSR*CMO%6H4Fgvaa~$tJqV z_KbZy?2vXlUlUJAe^fpdKh^%jeOmfK@!R-`5j!_^$=IgHhjebbO}0%}oto$dmu!`D zty->=P2-$a!9nb~j+Xd|Xc?1I4&=T9K38*)B#)%pTwyih8YPZU>s>Qk^IZ41RF^6u zFS6z^8m99G*uu!^LSx&#ev17Wqd)#nk0uFxW31JpsH%)}6jgV*P`+0;TfmJv%aG{x zs^$#tcUk42)#Y|aEY>88#p=X%&UHAG91f?9)18PaCt-57Th{C;K#A2Y%9_jWbnxQ2 zQI4}a7+BYFYwSdon)IFSAnf>k%po{h$i}D|tWn8Kb%9FN7CJhr)VRn@*8&&Yq&_-o z(=B8IUndr@b8XyCzVm!{Jy(gmSDqd>E)De>{LebsxU>uJlr?*ui<>`Tqpa1b_hVpo zhU&(^$g$fTL3@zC7(aMpic# z^NmV!{Nz?^(C~Ge=RVodoTEEX6~w$zS{-e&_GCFWL2tU-cv5@j?dei^I#>K;vlWx-4X1wf`={j*PdP7=I4a?nNTKBxIFQs^6k1poI&q=;VEK97@)R zO%kahQOSWEsd0^5D~xca$H{PN_n;Oac!SvpR~{VhNfuI zlyaZoQIZ`#y_EE^EhP8Z$G zKf`{OpZO)#Cby0=FH$Vmv?Vg_+T#5SI5Bk^gMN|Hb2nU?vR5tXKv9Ciy9?{66w$*=L-^1TMxA~p62g$u3 zyxXVkGn!A@z8}g#e6Osw;lkgLM||WTCXZyONt$32{9es1*(6WY ztp#mSd(h++Z(+pufiLZ_&#N=SC+U3HNN?8sL}M>;lfOJaX^gf-6{3zPHb^kPXNk@X zt6g!YIMUpCwmf^DqnEvxqtvlV!MWQ z5lw2LqoTG7chpVCyZ5@OyM+wcp^>;~y_GEj^wU4aDdNX`bETdsfpizaRv z2jr#sWj6*(pSGNzn0 zrIzz)mzq*elMud?vx23#lt?-35F4@fD$YvIryCl^w$%ueTVI}e`!w>!LxL zZ6WxCIOo2A_J0c(E+pefhqLqS z*0R)WkzH3N78ixwr6n}vNo_y$(0OAt{qDD9+M$DOt6zDgZS`w!kZHeN)Asgr8%g)| z>q+-#o^5+;)E$}o?`?d4@~*jy8-sH*XV)}5y5i=#rIxq%w>|pm{ zzjJ-tA2zISJHBxviLBp13fH&lp*tTvb!gH4Negbu7+SMo_3B^Wi2XYLBRM3_#GWBQ zW>h1k?7R;@VJaHceD>EQ*qI+uY#@goe9-)5c}xSJe7gJd@mjxc<#d_BW9e&O{@92d)(x zAQ>^lngMeyV_+;<0(JB`n8zSwKvaAlZpFCIp}P|4Zk86~k4Aim=!Y1C@R@#BBCbP> zWNwVRi>1XpZf5y#+5mNO0A^ao#9Q%sD=i1%dc;#`UnhP9o1}8M3Edko-Chx(jK#q; zE2ZaP75YDk;gitsDWqf3{WRL^F5sluRv5|91qd~h$ZA8EF}ly>o6QC+=b6y!u%0cCLN6VEXME(Ocz4;U1;}V zIV7YSA`6jEp9hp4@FLPeeE+MB_eLCq8`(RzzY~_uwc7GA2n@)1te*aaxJ;Z3SD~9=IY(Ny!Q;%0 zxRRqG-YPx`YlYL$8^eAjt;F}3jP-pf;yWm$e}zk=Tv&koRfYL4L_CFge#-e_GK|9K z_dr@Ke$093Zp3nY)>nyoVs(S=h1jkm@L4~y9)amcA_if*#1J!BdGPs#tj<}xlQC`O z821#$sb@g{R1SQ1#*-`!OOJWwntZtKEQNI#X9d>lNu(konUx^{&Sxet>;UHDMM#JY zL=VKrh;@kRh(3s&hOW6mL(X&pd7B#h#NT zJrC1OWU)M1e_=d}W!aj@oAoKiGYQK1dphHL@(p`W##8MS`=0m(3}R*AeGqvoL0P}U zGPC}$l8%O@NFPT&zKiiJD_?@LdSSfA>je9RN&9tp*PgtOAVu+(WAgf437V*jc6uXh zz&s~N6H%tDg~8%17%V&p6UDEgO6UeXEIrW=-v{G1(l20yybp@8Eo;!dx)WW+U_DNz zS@z+3ZpQjN4!_1ay+u4uv&G}YV%Z%3%mU!A3g`*T zW|Wzm z!nN0XmlyasFVv6K2>DXCJ$Wy)?hBdMmB2f`S@}A=e<;_}2c(G(GGZ*;BL^}hzGiF0 zpL`G82SyZOh{D;cH4UR3Gq zR?5>oJ3D|Zz3$iIZ4c1W^?ikZg?p+}cG3gQt+e(Ii|i^^nsH!M`F8|AE9mK4MD`7h zM8dS<{0uKV4=^Vy9+|b_EJ^AK#B<@8T=J()to`YNq(!vy^5Eb)Fit`p*;TsLh)RT` z8P@uDP6UI?tykMP53H`EP8opi@kA3faOag#8WFf&84KUZ;O@B~ise_=-utWA7_09w zf>A%(giSlz=fuJaE@wC$R=;N@*y96YKHAiz&zYZJ7XY)Y|E>9_-hz4@Z|6e~6F_P` z{M-hA$RiYPfNvAZCJlFP&*S$@GaFYYt^SRi6U4NSe5#lzC?J7X6D zen`gutoxu9{MkbJv}uyYuRm_nYsM(-m(m<~$|57K|2c#M9*ef`33S84#0Q?s=nWwc zD{Mf0=TQ7XwKQPZ3N`{8*qIv9x&Y)h%~`hr^gItQRS$-Lb?`NGgW)4rOT1mr?3~() zRPx6tPofoVQ6E#A{Bi3Qv`(j%(3<8>w@<8)23s0WW4AJ+ZMbyP>&2&b8j?mNF&EwXV zef1!s(p!AFT-@Q@Hl)Wpr9qS1O}NoWVeBICIOA+kNg;waGsAW{TWOxB(o3Xvbq@vz zM=;Mj9yX-Qmzanrfs8xU8(&Bq;{`n2ogS^>Tv+RE@NkEp2ka1I5QqVZS>Zjg&T!no z?M%2HNC8*UGnbMJW(CbL5gwjDi2(wrGfh-_> zdv^~AScARq41u--uQ&yKooEm&&SlHGmAWA#(KjORWNXDv@A|I=dznmN7FZVCbMX>k z6z05snRk15IfS-1ULBcZ39-CG-0PH6Ptl~-m2LJp-vHqEDdIuF!GQ1iX%hd=KQqX4 z?`2`ic?2GKkBL?**vYC%hKCN|(;DC@@5m>u+3(f> zF7$bWs&X~YS-Y@wRgQaHiz2{1PA_69vR2fCS&p!b@H=NX@9Y=wTxxuE|4Xh>yQqYp zS#V2?_%q&M=)3SanU9+K``!ojj{gQsK@=xw}a>I>xg`DS%XZ!Bg9Gu z=A1|NF%lr1V(p%!@m`yB_6xHRe+iC9v5>%i>H%}%9fxoAwf5#N%Jkk_m%(Y{gi347 z!W|}`bWWBBf8SgFe$Q@ir6^zK6T@W^9?sj^XdegU^$Q9SfV};0kBBeo3a)6IVz@Eb znooXM*I4E~*Y$gY`A!e(cce_zb+F%2u7Dk?Fcwej5C9Vsx8wV;?jtv97JuaQyPB7I ziqf9B>){vQ4#`#I;j`0b_G3)$DfjZJ`J z=+tLxR}cA5MyvhR1~3)m-6XR!{&-|gI2>4v;%(TBUH1nm+8Cn%a(fG@{f6~B%Be9% zs587q-%`seqfOH%qx1Qm0fAd(#2DuO@s#(!2d8R6!)yoc7a&>y8p#{UMtD_tCW_7E zQQXS~Knc%f^_N;@q#tc}#7PmTZc<7=eK_V!RlXK001I6k$SxZ(AygpS|A{kzCnPSS z*Ar!_e%lGW_JhC-kO^cQRl|>XL8;N_02CHX3H;CpboC7H?n&C+!IZ#UqYNi6ygAr` z+Z$#Rr~5Ng2asm7KB0s&ot0N1jHL~buSNgln0^m9N` zPGyh5s1fNmzWzcikP!hS);b6i1FrrDI?ys7IMeCXHz%{n)OYbq3xjh$tj>uLX8TOY z|E_t%=wF*CYOdUiR|^7;53{=b^DnXf-pBczs)|KRBBTb%As7gl4HlU_{5Jd@*$N58 zykuHt5M)qyaQPP*O%Vs5GM= znYw_yq05=MD$x?r6G;qFw~)jG*_ThapI?C=NVG3dNI1+-a2(E0=hdKSKY?VkyQgu& zGADEc@*aHHT;2$}m%Pk>IOWDJ>FuF{u1#fC-Nr~Ql8_SeI4e!1dD%$b;IYd*B&9kf#Q9~ePd>ihQ``p?IX&@=hzBIT znIvp~Dcn%dlG*q(30US0Aw64!Hqcus%+1I}RDlL0#eg!wDDjQhxD(xsO*ZbGVVS31 zVr(W;RPW(a)>^sHlSTnHZ|*zwIP6{i)O`48_C9t49QYdTXgSm1YcD992`EO*7!K25 zzb2%g_H znc+R?T2!@}G6M#tc9u{D0g;&IoF-{#cB1Dodbx?>5gUnwC{b=vm%6 zv22MYTp>LcbiTF%FcEIcV3~JrOM1P?sHy+0~U@a!*`+Rg9zm8HtH{SjH01 zwOFKt2@Qu&h`ow{+h3XUDidrGH7I&JdcuPE?515zdJ1Unq&oCW5fsNuyh5w;7CG7^ z{!Hw=)@s<6{GeO&!KO%B3n~g{U1;xTW~XQ2yW^9v%wUtdC{N*Qq}sxgkmh*SpGFur zKebnM6-*|IG}AEDe-_6ptT<|_v3Tn*+F~|F$PI(6mVa>x39u^(J0d@_z4>Y_F<(RD z*XlZgzYeZJ#hLu_{ZwphTwt*W_66g-gKp!Dx_566WT5KZk&;-W-D7cY9hv!tVVMJO z(ZC%&I<-Z2Z$o9a)l`w(#aY5 z5e!|AP^J44guL`l7rsQqieo!*NabUjXm}-=d`N3wfr5gM_FXHh#)a*cQu{f zVyC+H@vvDIXAPoN)I6KRnl~GuFPN&Vt27o^D_=)M>1k!Eu=dfdaoRCP!73qcr#1x? zK9RA>ggXZzSH<$hxdV8}V9!)(H4wx3S_Q!2u3&XlR~TRjxES?~o(=!mbuntutUBQh z=u$Gu4bGk9s3q^7zPSj<@kuKsY7{s2{Y=X(NJE~s`(C9uY~dL^$uUKlBx}gaS2drg zBoI|Zi>erKtE$26z+EKg_{Fxc2g?x$Wg&6U7ips_1a#qpn#R7~nEuH0uSkqWW-hKQ z=E<)zWv2&d4`=}8f1|`Pv;0qH*?%OpAC&BWLC^kgF>xI1|L08He;hTX|E90~PfVQh ze`DhQS0Rp>>3`e*{}Uqa|J~mI9Ubn!zRI6&|92janfbpy#SiOdVr%>#6%K~=f9CA| zhY!cb%EI;o?)?uRj*W@)=hgqO57+6Tk2ZwCsj0HrAkV_b_rBFY(LkPPT#qs;0Hh%z zunGd!UqJ+gtZfg9DF6cVrwr<64VPAj&kOtmOA-iUo9B;-o=W8z|Cb`&qtugvc;~VE zz3Y0~&1`N_WpQ(U(d;w(_o5&cagh-7V4eqP%_!r9p&@AAvB^rPY#P7qQTQ_eHw0;k z)cAyX_ieTR?Q!2%aFh##cojdnmc$CT!X|l6@wIsHoF>Eed-7Cg+qDS(6Qs z`19;^-!`kfRn&)6D0X$%+u*1v(X_kMwH$Ws26tQ*ssZwbg)G1eKtdg;$TR01x}38Uk|m}h~%5#dy+ltkG(u008Lh;xoVf#LQJ+PP%T50B~?5}3Cup1iLdxZ zWCEtC@Ee^(b*wMjR7g0~v|#;4yAy3YmT)Bc1xqd-=Z<4lyj!1XfC*;!-^MT-lXTih z`m+W*Zyf$)j7e$(VqI+g`3n67!xQTh?-;@uZo)OWS+Qlg>{)`U1Y@c$eKtc?>Qu@W zg$|LA`dg86(1Yly*Bt5G?>Ru$eYPJIP9G5$cq|f%8E_cgd zl@snJfm?6(F~J_ezV5E?u<$RX*x>;$ID)?;htQt=Is7>eIg+}2hn=>7JJg=F>DNc! zhV858SJJQ6o;koIVA?PB+x8pf+wpt<>-Zz{llPPH{rT=|$8V=o=c%50>hSI*5nL7gOOw*Azc;)!LPbH&kbsf0VzUzpuNO zqb|3;lsq~?CqX!Y75h&|F|-A~g7;BR@eB6xuVYO?`V+83qHr`uv~galZUm~Y3vjfa ze!lUp%Ah^Xyw;)p35CunR>h*$8%{LB1;JaBucj|EUaBt!g^%BP?xK)Gl;9;f!z4rS zrLfaGtQXj_un>R3G{^n-B2vy$w&({mOPV(p=4Kr2q^{P=k(F|K2$d!>Xz}=cqqPBzc%WMQ6ZoO zs5(}js9&hxq#dVSrhQ@Yzs=7Q#^mt7JQ@1H7jHm1yK_ zp*g50ibEOjiUXx)%v7G<4BrW{Gp8p$zA&J0WTxRH_e9MZgD)UQ_&Tp;=HC2QhJQ+a z#EA|YbXW9K{`0Kw0|AeJH#q&vf8lqqCsIH79U{IMVL|MS$_eiSs3w>u3%E{nNuk9F zP9w&oz~hcewP?ePOP=6zA?}RDOmXH6o-=DZ`evZ6P;6n_2?rbEW=yv@paB0x@B@h= zt&c7x4`bmE;V|tjsXMx*uq53O3!ON1C(eHWJgZ(){up%i2o?3{+}`sa{*Lj3OgA>S zUw+^02I7NmD?E2#dLOg5nPX4ZopmeFS6tj4R5z++&&HkC7n*aIE-Tt?CtE#;yK?9k zPk@{u{?fkAi^-3s*9q1Ws5jJcOYni?i=SDG-4%{g2d;IC>(1D0!0W0{>5JME^5caS z)XV^CVPRLI`Ce>35Vpd$hu&|!^w+mXbT0;c@p>U|i9dk9ko1HK0hHUhOAaOL)(UMxhI zh=YmgdO@k@5{YHS8V!m}3<^~aiv85QW(|sh z)d#mmKw|C)?G1?zihqy^I7%=;Cm=y5c8rloHj4=Rn%bIO86UC2ri)JSO(>aiHw0>o z{el_Q=W7U99sM=kIcja#%*>mnmbRS6neH=^p$&)x4m?A@1T+-=%zl#!mBt~bhf zpmrzknDQYu74H|njZM8zBPk?s@Xle{^3WuRxIXSS{XTyIxzS7+C7 zUHiV`w)%PDbpib3^F-to{^|c2_ZiMNL0|wd1pwE)VZU>GCGidW_W6zxn90{tuGXyh z)t0W*tlF*EtJ`$P)2>Bc3Do3=oN#{7uMTX%j5?EBLhxzFUX7@jQ(qzYp78gA{=0=Q zgWe9zyp_L@Y0k+W(fzkIHU;tSjOm5Xo7;tKy&?2u>x!)2K6C-^Kaf)UT>D%v4NO?6 zuLdHdK2!~1{6w_V5VoqdGP1&cq50%+N6sxL7ngWIdxz-wBe-=FZ?hl_kD;-WPXN*z z^lOT#;8AvipwSLUU_l|VRY{V^(4~@jXtf3`JpMa^mbtm>4E-Mi4e{UrLU>n#jS--# zppM4KKuu3ubE34`q@_~e6?>M`<*7GUYS;6XiqLAklh>E3$83C3yGv>*7K5Y1Yihm8 z#pc^TD4AH(X*s^|w^X*rba>*;%51Xx>J8U6%V~bHWy5oQ!=q)};aKM$ldjWCabS=9 zd85O5)#sVfPk$%~k+1VEUga;LkM-o*NUr+x!CPsLujxPoZu)VK-|o;4f!1QZ+5A~t zg3s&L^)ddpyo40`6jhtT9TN#o!6@hMpMDh+~ge0nOJ0YK0e-2dW24iaNgwoU9$C8Yl3H)#xx@ zneLHxYv4*cT3mid>W=vxM7_cE!a(tEYGH4oV!<*gdWt2cnNtb8{M3F?K^c;RqNIZ`Y`Si`jtVj=#CN^MkbAc0XWMVmXpqCK?b zdgeyvStd?yMu2DjzZoJn#2B7l6lY4(^!Pm5+{RB*50b;+Z2}OEJF(hm>Aojhu+MKe zeDGbh1Y%>V`(O3>)#haCNALcovB2cd`TOcI`>i09Hy|H)Z8;`uPl1s7@xW9o;zeIR z=IArdd@Ge*`V9d8?GJGCasN-4{d{+}ZuIGq=RL??OMXb#JIGqXT#&m?{D*_EgAr2y*$2^pE5tdG!l1$bO7 zv}e%MzkuMw6sLi=8(_Wv0l#!3cAx4AkV8~*A~quRa_Gj?^e#s{y_s!@MfLWuutZx^ zgrze%`QuM@&or}JNZ87K!AaN}RWLt_o$;~37^?mMo5Qc68VzdOa4h}f(@Fbaa(oH7#m-_j$I_bFiUhN&FX>xFY>W7G+>+`t0 zX$3Mu3vga8dHplad(~{gWPK6o9_3fyQUIavdj{@c)dOm~*hrF#`N8an#7AuZfO*2}Kv#HN5xf$? zB(cgBzjXhWyLhg@G>floNgR=TQPjvW$aSZDaJ{NXC9h?_;YcdN4XcBGxnsC5wiPVv zf!^KHMctCQUl95q_khr2-K3~u)kz;{u}66UMR{{o_a*Lnq3>*;3z%{S=KkCixxV*0 z`9O6ao82%#BtUL65lOxTo-3KD-VmowE^{Zit8G6FwX<=!I8k-^S#C? z?`cWG`etz5SlM$zvW8=eR7hgldv*wnmy&i_qYv`g7Kmq6#(Y6&NES@kbM%%0yTAoL zN!0r<!q>=j3O>u9Lw?_eV&?*?A+LNc`oEJ9_Heh{c%)r60(5!skdx)0dd0rbTbl z2G+u{FDpaX2;Jg;ye_W(QoQV+!CXrK9T(@KPZ}C%+MW(1A&Z@W#ABrji*ch=MBcNj zHOj^Y4w&!`TTZ+(C(0O{AnCdd8rxpEl0jCmrc_U~v}nVVq#;M(K*0OPZ~?XGL?J#^ zxo{Z6Z=CWT%#vL!+8C=#xHw?$_0I*qj@cW^llGZ8_HP*8>9hXxVD`J*z?{@0o-c(3 zxZ0@@Q7O-0%%&CPT?wRGzWhc%?uK~|-iEgCeiG8o9rmRJqc#I}=JN#krdS;4lBe%0 zY2YO+Z&u%{#6LDXU+CwF$uj&S(BB2j7|bNwZMo4r8AHR8ug(Lpd_A&+VUkphVNM(nUXsOCrmE~Z6`1X z!a;QiSK2Vzj(slDN`!rzfuj&h00d1K$J{sKM~AcY=Aaud`M#Cw)F%Oe#9w47XTpTC zv!$kbX;BXi3y03KTB4L(%;;d@zKyJ(Sgyxb@YH#O77cpS#M!*%TTQvd>|#}FbjNh% zeipDo2}ZkXo_uD7A=+36Cw z=_g#MPD12Ac?H3`y7{*P@-;KT;s^x5k6xahR>8xjb^HRAjHu@t3T_>{Ao;1U6*)qr z)u^8APu*V?p}H=7yT=^mNsC)&lH=xJHcAzF6@i+CW4unN94-TfA!(i})+7=+;6av+ zo?cIujqYA^$ZRZMy89Fy2spnA)Z{bQbx@<(_RgTUZlg!n3l&i@^SWB<`ceZ))Ue^@kVVuk)RE|)a?+^3`Oh<riIwF>6iyzU~$g|?bY3%z!|O@rGV)jtHMCp1#sH#*2h^h6EzZ20j2J@^~h zL;2h^=h%AW(}FBI4*C|s)?b{GC19&c_~?^6?yE^vD?{-!u=*zyoY1J7cHF<#TNw^~ zmzfV`yLa4LbkKc{yYc46sHL)~uD_cpek+=}RLh)kQ7jG4TU31?;wKF`i)?ihAw~Ct z0gJKp!%i!UMM|2K83E`cphF6|-P6BjS zSQ+L?ADw!LHH#hRh%N0qySA_pI75Y$MT{4Fe`6VO*6H9yYj2B`xSKhGT=;vNBh9#K z%Zl>HZC{qa>24$m?B~yN+1-RYYYFVzWGa#XwC5$xPU874#o>fc<2^3Lc^GQ$1Ig^r zoyJ4OJo5JC2e4g!Mn%mBhrjLJmEPRHX*)k5WATU|EX)4QG=ImzYM$4 zwpju0C7oevP}AWR&s5^YT*vWZEDs24g;DcwL|HIO#N6g{{|&P3Gc=0K%M~2l5f-%q z7gy3=Ej~#>h=*Gz43tUxln|r4hGGu;I6`!q3Cuhv+>8$$d=w$BQ73FIZ{9C)k=XKV zz?L6T^v+d>$ge0shbBD}!U&g;zm-{3Pf@uA(}nVLEhlg8ilS9#*0s@cahqnN|xeER5Uv&NrY3Na<*#lfpP#UqknR9GlXU_`seLAy#{P! zM%!k3g|<;!q4X~`)kqU<(4Ic#-rGV_k=UIGyH|@(-Y0(Hd<;4csJzOXLp*y@%Xm2o z+bMdY-|X+_G}%o}15;nBmx^hX(x+|x>Dc2~iH~LRQo-GhuVkfySEKM?#IaUqC292QVNFp!s+Cl5r{%qv=M3P zmp!hr0Gy~TWL9K6MY#zS?i{%vlx#23aAe zT84?yBOXh6N2&?0AKe~gg4U(o7au#6IKtIOeNj{3n6mAUC1bk_wgF-s-O+xE)sD)r zUk_{B)RM z0@iGM{8A?^+YI5~w~|4A;Gk3F9}&43o%qa9yYlcp7c`e*}NN)#+5M> z;Ib_g3+9Lt6~XE&(75F^xqID$ub?N0*c(HY)sGe|&%?L|GLTAo%vc3YbjI>jx2A1> zK9x{StAeycyFGr1DCucM@X`&kAN#@tGihudS+ifvlfEZ&fv5pi2H{t__xMh3iJ^3t|?A%yNdgIHVm5SFk zkY0hf4YIBjYDlyeuZZy@FgaNeM_OG) ztCwRpykTedtUE&$p1;QOqF=>33EwgrP12$|XKN}o#zMzcrE0d$rfEq0ny8y!M|Ftt z^qewF5og9)!&+Bopsd<(0FyT;mN!U=0u5tikeH;5h<%$Ni=I;J2}Z+fnW=LmT|zCueLQ4qGuJ zYS9VBH8qwK_fx2Mhl4V1>aVPRqI7QWPa&y2)>r@Tx}E$yE`J%pa+sCW=8y#_2+slS zrP!Z+;2Lq7L{n>Vv9}^6?1ZNH*9Ff;g5i_pH{xnc+wLQcNag&a#u94YVZJvN{e{Od zc{c=y-xNA-|2P4Ytv^5V#!}nA?EjJ|7@iK&rg3S8Co{5tJ#j6bb1Lc82~dGWZL?It z$yl5%izpfx)HU}nFE3B)>A2D-Ot~;pY4tHM`qo@|QcX@w=lo5B)OY>d$ zw2(TqI(1opAkfchhUPL4lTxTw3~_3b;fEWHBGcuq=L*>n7zC-@CV}!Ug5GW*pJ{@k zd*fSwsaCREPN2w2R={azarNRhsv6yfrmIa{*Hh9Mk0hI`By`*Jun^0uppm&8DgT}7 zunlwxY2S+`(l+Y~lQF5E`RZu1R{h&aC&yH}bLDvXR3id#C99u37}wjqCjfG;L7)&j zn!3IV+EKsu#-gkm8*KqfaAIFA8baQiDv&`cN>NAdSgs>JCu8W`VE0yKv3B|^I%5Cf zZ%)tmq{F&ZwrXUt{O6sxEw-;;@O(w%(XJDL#{HIiJ#)9shwyexjKeRpr3p_9({B?s z1)YBQ!eP3J|x=I_KzAn^X5C?(twk&!`_1UlJ`9AS z4&%DZ;_ao$A<`o6(pZJDfxD7&WJ-flS~g(&d~e}!BM!#-cb`oYzQ&;Fj7|k3UTj4H z1eQl0)tA9Q0JxYj;GmV>k{k|aeZq;Uj?>2&~=d~rTcA& z+>PH&l=|hut`F6ZHlJG`K+_A0%J*8zcU_P>BX7Ah&I7l5a&tpQqG-}!s@1%;q3;U> zAn_Av`ei2T?&1upo7xb4p?al!4M(WZjk`42cfMI9KnVV?WA(~~qquto@BZjg#wP%- ze7nW+u&s@M4RieQLgq94qx_ol*nML`=6-i0cw?O%D~YH5jOQT$l`vM+Df z4nJ&kdQ9^H+^+789cJfUX!*arhgM4WhYo{AIPre1F!?GBxy`Fq*ub{+qXW5rkdS>_~ zHUldm;QjfJM6XGx-6H1r;y-47Wz2^A#~5UjQ79?~NO27dAX!2?SeDZzq$RMSBS1To zE7mN7dK~r&)M!ECMjm%op!#-#YZhhK8`3pD61NxX{v?> zsI-3SM$J{k93_=t9CAg&a2*N}Xe^=Fo1p4CR^NYgw%yAJ`v?s0k}9ntHc#m7WlxJD zH?+J8he{V~V}*z3IEpBtd1HK*D_{lUY&Ijr zfo#uHX2L+4gT)j>8r6-QR^?WvR@Cho;xCy|X2d{0awoSngYASFXpO zlsP!5GId~TX?DlzQt#Ujkj7SbND5*e?oW)~$^TA>t8a zI4ma+$I<}}1$FZz)WVJPHP0jRW>5edSQT9hmUx{FBZ<X*1aHZx!%pn+2EM6Wx+|YT8cNR|AhYzf%sma%dH&N7#m?s`V z?0h4nnEWS~P?$_DA@r|p)ETuO^z%vP`E{qo%$tLawE4R%9v*M4)ik87gl!)##P&+n zQQgoOVp!2?*JX+L@KFr`tMRS-xTDfulRP~>SI^>#nWe|xu&qFFTlxM)@x^@^9KQSp z*5bamatH*8m?0ZhSUSZiB~IzVz*ZsjdDQmk2bjv} zwcsgtA=zn6dDvV`c~#K~J%5z=WqtlUkF$F4hl7s~sRKRQDeKJk%yPPuy}0n^VbyM; zRd6W*Y*}$+T^pG9zpcvNA!Y4iCs=?O#K9~cV0EB29L2Zd_S$}xv~o=eBi>UN7fP10 zBahXtB1Yk+Ks}7s8QGpUMh7)QY+-eO^d>19y+vs#bA7LegsH1xjwf7et2Wq3JZIF> zdakZ)k*4%yeHcur2Ps;O6Y88dJ+8WM-$b|Qn=-Flj|@KgJd;AE@woK+)HueU+4{!Y z#`{JXlv|b0>~vF>61TDysUGg(5t~EyI+En8r#DQ>Rvc15Hnq@LA!$@0959VR+h9ru z8ctlqS>3ZSl+K>mXB-%m3JGR8?!lV(f?I*X&#K>($U%Jvtb=J3bl7vJ{pf`9QhdKiUN1E;_H{vUc z`2O1WE#Nm{=pk+=^o<2!7h@@MxSsh_H`sl<7$a7o!`DQ6ywq2-2a)&)5{dxnrLe1Lcqi@=l1Hv+o;>kg#fZTH4Wj#%1@9svM&$_zq&w)3s=w7soz(X| zlzSxwTU%G+Q&Ec@5TQdrfyL24Vl5)1X#0SZmoaNG3jMbu;>M+v9pwd#MgZ%-T@A0N zz~Vp@1Mq>>B~INg^6mWyEK0*#;Hpab%nQFk6NDW2kEsnk32>0baCq4b=$5uXw01uy2Bnb;2V7c z_n6lmZW;$7#byzA5u#UZbj~=Vw+gTK&~nSg0dM*8oVzZ%&2rUR-9*m3saptda()YF z8oki*fANJyT)8-vB(lT|bYrx16Vpy;w1?Gr3>5=%iP#&z8_5nF?W5LJv8l!olVlhe zOkHgKI6!agq=aV9UC0j1(5J>cJQOL1N7v{n^Wr-WL~Kvn?T1BeMY9U_28{#Fr>WL{ z0tdU2%#J_?v*y7~t2u0r=ip(Mc|CHjqy__~s2n_u91V4Vhq#?i%24r# ztfmbYGXjrM0G4th#+9rsIsp+Y>!mBfMt+!k%JZk#ff)pmA-c#{I)(Dw*xZjmX|4z> z1-czQeLC5+MRde;R|g&eA+{qzgVTihMF7kNUCEYMKPS*qLDQB6D^M1jF)FL|16~x= zLdUvGp3D{kJwl;f4Nemwwow~M!O@h_rfKx%1&Z|LfgFkSVc%qJO1lX@Q0CESC(JxK z!zz;?g-t8umtD1>B61_Di0tTUK-V=jO~Orj(#n$lzHHVMA-CgD(E^PbgNo`w;-0NL? z>%qJ7E~di;>3;zGhj1X7y<&JfM7^~R=Y=H%kFJkAY8m;J4SIrPSkuhsYb~FmPa2|d zNsltxH=r89nqW2UWvngkr5c}8c>1N+_%D&J^X`g9Zxe0peo#jXbI&ai-cKc<8H2>4 zhLSSaHgoecD(x-Dk%{aLdL{-r58sxJUJ*i}B29?;tc-ZD0XT^#Lr`uAjXU0dT&yon zEC5~grcDmt?zS>_-lDvZvuQ_o9=h^A=Z^6U)x6ln>Koy25p+Oo+%E@+k{JFA-s^DX zmv)`STNAmzL&XCYwF3W3l$ecx!F}A zW{+X>e^Mizg5oze><4$%>i4MYNyI3Ou*2pmFxUMFWGVRK`i_fiVmn56U3u{la-;PL zc<1l0S3;e4{kN~-UcB?>IBi-^K?PWOl~JWCm1ycV4BQOueW7uM;)8qCQL(YGanq4C zaJUKL#VS359qu?h+hYj-X69>E@D>`e^Hes7&{kjBXFQ@wI-XJy!99FY*!a`3LbN7W zAwsP^iU%F$(W=)p3HPlI(pf~O@w@^!mYV#SHw$(;y8LM0L|+Wa^~V~U(JiRA<^OFJ zBoUI%t15Qyp{%tBvp2bRQ33Ag?~gpz~I15{QCe7U&F7M_n1@-ZdyAgoXLyzkK7C=o+HH}n8!rpAmgAt$;Xa4x5GQ$ zF_baBI}b~!J2=ER6%>#1MrGZiGG#S;QSbP=emcbXTAtkddtamOHrV*C%GF7mBhGUU zT%72RNnZN9V|GUS^H)meb2xb%JvM+r{D(f7o6hubev06oszJZ+|Ct@S4@Abx9_ zOul-EoeS6MCcJ5^h6As+EAc(XC-(#FxuCuYoNkP&mP{8-)C|RRX?)FC?qF`!J#|~v z`rKq4SvB+}t7JhQ`ikdVM>T;IaV%9!t#x!rVrQGQG7w>e0Qoi0*$=VrM1~vw z=9?nQLQUUcd?R%U-QfeI`R(CeoRRthP-duphgeyyv;4ivn;?D@ac}|4{?;WL zbbXVm;UZk!TDKlNLbX{VWwH8Kp!8k=d@B{JgQ=5f3CWMDljTe1>UTcn{lUjVAhoDS z`arM^_uG$TDe!5yczc%6efUXh=|lQC;Am;2h6W#v$cV4P-)?B=ZrGQ6+dhYBc)n*P ztrua#xQ1s(x2brm`cjofS;7Erv8|gQHRjXk>FN~F84hD5tDa4YC>C@$)TWaE$6VAy zZ<~DA%RAEP3T`{uP0du}e^gVvB%da1CqpD?6{_M6p}!MFNg8pcb~!UG(a z@egynKP2hFgXe=TkY%Evc;5};dSwQkRevN3&#)a0ERkqFz#N7}SM=!s%Cf&H)1g6N zGpLPgTYf;B7$veYT7rZV?Hx3QA#Ya}f8IIoaHFmHH=A|Ec&Q@lvTFr?!KjiK2W_i+ z>rv9773;%%)NB8R)^kn^)TI^aU{nkjXzIyjRik;u9R<&8g*^kB$AVB2SAO_>fr#CH z#a<(oL%#>P=Wh{6rVZV|NzJYHj-mkZ9X>vz z$z3>mr1vN$)$2i~$ERB26;x;SPija~8M<`%%;uVlu^}LSXCFlJA&zHJ@MHp;(RD0w z)RncI1023O(%IHy;xIkHDL7WTY43kzf0Pe*<({c4m2$n3E=Ex)IL z23-@#e~#Q(*_hf$--r;DoR~VE%vzYWcm}78LqmTq$*_&cWXuJj zg!rxIUR^uXL!q9J*XxXw1uavKsdi7aFuiT!FCcB5x z{U+;rtHX_~)Z9&+P7Lpz;<@h65PnSFr*Hc>i?*&qSut5GUpw><8@q=iv^85uiVQ}o zUn2}}CM?pI30^0RraiR}S=8Hno<=&3Rj~JI!P+WN+aBA(V#V_43!x-qR#k+Q`b6ld z3OOaRdeuQMV|s_VL23f9HPSC4PjQP}y5$5|iR|yZy|P|&vt}1cPd=U+odN_ibZZG3 zhELZY^>T>lAItc)(gsb!#_sb;H}w>Q{g5{AL^dCxHSU^H?-94##}mfouNcRbu5?oG zBzy%6u-9X?NzaIczMWV9yxwRkl~gbU(~G28F3iQl%(AT}M?mGI}x76BYvOP18 zSviQKcBj5pU0uX0o#H0S^gc6(it6h))Uc zOa+Mw9!TzJ)D7<{P1P{e5{vlA8NL1W=;%jvHFYIB14B`II(7SxmOvPNT7^d)Y zXZ@w}S&1t$mH4mmKas2dRN-An{5`3j`$&-yPq~J);-Z1y{ zzrGlwrsp1p4ANXb!?rjOrKs#RVeme>KyL((eb}V4PiqXJ@dyvvH2euSKmED~<0tfy zzyYrOfm^gh54qV|DM|ICLbj@5E||VWcpVDYfn&y|J}VtZjabf`&jLpG8`*+YO;`Ws z*hDk99#5~2f;g13cIIefV?bGt^z^}nnkKzOg`BNAVg2}&vN@8i#M){8X=TYobQiBf z3{&kL+$qYyMSXoV=cQT#@6@gJw?xK=<>*#1I^B6H2*%vg+@ACsA?4IM6*lP7g_oBb z&25;euoE@9;~r@?ga;4!Qswe1f#t?ZDs#{3UGcJFQ6WLl-NfdorT3_oU-}l zy~BO2^ZCju+r;u&ehVKWzl@XJ6Pc&-IlQsgMKc&!DeEqx5uSXXPAS_ls{yT~d+WQt zR(6_{X~2zLRasJ}Y!?TEm~EjcloS z`GlLrnzcN&hotBV@^tonxZn}YpZBV7m?NCQ8+?fLd~E=uzaox1xV#0L>R*5qJ+C-) zSe0!!7klTF*<1nP1~uQuY&Um3u0H$Y&CZ#{UwLx4U^sSDHP7ICe$tjKZ{euni{J_$ zIcmMzoj62Q5KBz`;!fN4xik^$aw;z*oA*+(clG1`C{Bl@ygj+eUEplMoOQNj@BS#g z+pW*x(6DWz>r(|3@C!)J?ZQ*+voqa<;UrVt(iwH(7+G^}TF-Ne+LccF6g|(`i=Qk{ zp`hm>HS5IOL%r=X8eBs(XepKZ99e4#ChSx7WAS!X>XG0vt5il+Qjo<~Dl+cf^)j{*| z+d@svGi4MmVy+>0x3KVd7jp^53L{cN<0uS&q#wjf=4NsWFl##}YZbn&cJdn29rS%P zxJ!LW-0^Cf8$jO>l2lV+#V(hQuj2X;bUivF9gx{ijYNw+fPwUOJsHv}? zujBn~{IJh=`EF8ca9wvjgXenA(;>}^oeAV&ES;fU{UeUfG5pFQLOPa^S$$K|2T!;U znaD`Rtu`Ec@3i}Y$AQlf@AsU{IYj*nN|+l2u>j@b+nABGA8D3pTYAO{I2MKm$+CLi za7-JQ_&N78Rfy{}IRaP*z&twYzH0UIn(G?q*r_Azdwy(HHJV)RxkW*5p^ECBSk-is zFI?)DI+aUZ(N%H9@EFy^(A`_wCZ@L%Ifs`guY}W2FV;iX2Ti_Mll2C-K{0E!Jch`W zsdNZAFB##Pe`H5V;{_NX)DlPYHyqb<`!fCw6I)Ck%eU6}K0^7>AQBhF*I`H25z!(-3OjL%z$*Sxd=9>uF9~ z!8kGNH}G#fbc0qgcv{kAX`$COkA#Ehq`AUjR8regAE`)r2X>7?JtA5QyymYs-r1WHn~Se)W7xnMcnlKGwL)+nT;|6-pFn?bWWA^9_@wA}aV$vLw~ zJv(5+A~zj2vpvI()i;YPj=9!rK2`VzT#fdZDm4D)vr}79>X2%u696X?7G7O(E@g!9C-)yaGbdjx4@)zXJ}OhlJH}D1FJuYR_XInhVO-osJ0Us zq*`zo>%%2)9lLJaGfP8)hYoX4H`$34>q!c4usI;Th|)}2GHAvp<3TTf$wR_`UiPPt z?B?)(KJ{yH{Xm_jMlx1unt}~`nvnmfUi-}kVBX}%P1nHhb`A#<0c+Z(eLtZxzw!km zESRnIG~Sg|)K%UiliQ_E!FI<3#VCEwivBcD)6eRP?T#&W1XnpQE6iW_Db3Sy8OVQ1nD8*`KPD#riDaU&DWfW1vBxAqUlQ zjPs7SjI_)xADFm#A$ZEUkGpGBlHp^!eXR~^0d#7!sAc7o*ZuHu(SH;b%TGW( z7pkApFqX+$#f|?6|K?Mp6m5>rNE|b%Bd;UE{jKli`YpJ@TS?o10S)D!T+(U6m$5wWoAr43zZrv=@m6&4|%( zdwZZQ!-zE7iHY5^z_;!9*K8CuFl1gR` zP?jltQNET_VTk38pLck~PUTlwqLW^A{Gs*u%pZ#{BgA69Zv0Am(SY?iYqfR0f3e6? zy9!N*Yb-W-AZts8w|-U&d1L-&8xGB0`?_!`mJ69A;H3v*!6;Q53i64Y9qCFPnht7s zHyJ8W$d~nDL|4 z$X$%`F}LXb8%_HdUiLP`Db%H7ta>bU5nPo)%k`;*9YU>M71z+r93RK96FHCX>3pTN57ak5 zqtM_@Z|w7W^;;skiNEbIP^F}B2T9v)Ng62VR2LsbO0#XUZucnPVJ$6_JtDUAElyCm zKcR>hgHC#06&cHjQ=6ch&(Kd$@|q`N&600z!_~mLVRyd%5SO3%#9{HNSE6;XN~rWU z6-j_35R9%LZpYOL*6gQqJ;c`WxSt)w+Z_0cTOQa$lI9oJiRX!AK{B)QF2c^TR%Y6x(YuE zsj#OH39h=jaW6z2nl_Q%v^FWteW2bPiq`QoEvz;Y)b+y8VG#G*W_UL`u7vrvR3|1? zUUeYL;982+LA?V$ie8YORQw{y)*nQs7%{ce-4q`SlQFBR_H+vKq+9ghsBc5Zp}qXr zn=v#a7a9co3Jv${mb39ZW@!>bwu6cC8%dQbikkPY>}X@aNiWidW|rUxRhYwy2gd1a zp&ljhet|(Xy|V8`mDzJXtu5B7y~Xj;JxM2}^fW^mD{T$xc^? z6B=!v_h+-aQ*k!S#ViRS$ikj7md_Gp>uS6!NSUd&nIYSRyVC+gApwagn?Yf~Tn{9U z)oRUZvU7v%((J=&o{KzKX@nV+Ip#*Hi*wS0qZM@SGzKRXCG`G`(xE6ftWig>^dFgS z>M>zWBSJbbXA5)`*byT;pAOWN84up9gp zsEjSyk=J9Zl*68_6B^}=vBGhX_T*t_L0+tgVNguh=wv4DDUj{QU=M8%1rMPPu}Vai z0y~xr!BJ+SSGt;58)oN}CO#{r%$#XgA$nmj3#AswWvvb!*4!3ml~i_a`__>Sm$+od z6kC?yprsHMM>>b4XQOMTZ%kWcs!;QyI+CF>YnmSpkHHIgGq;6@1ju9FYAUhw(m8u_ zWlbh7Wo+c-D}$;hO#3rptC892vCSNk8Kk#akIOrcT`QAk=&fhGKwW$3^*85H%vbPA zvcGI)?_ia!%DhJnr_JL(Up;&)mBTG+G78NsxtqH0_!jm9w4jg&qJHZ@pC@s~RHmmB z<#1M`=5jR8>RQ=O;+~Q}!Kd(nXTQeZ?zSXVbUPCwc zNDGF7t@Wl(GMD=uvsR=r=sl}u%o7~}#hU9?YLkhmlp5xpqpcM16>QFAtq5XDEqhDc zLr$hS1FDluU-Ud3udAjeMcBM|olmbhMOWMup^mdmTyX?w6jwE$J~!#cJ{c-S-}@Kb z-}sEzCQrVA%aFX6OX zeG(D^Z6VFTkTCQh3H#Fe{maZS385}(z^&y^Bte?+ZZJ(7t6enETFEcnw?UdnUZw8m zbvc%F3v2bz^J;CP@y}VDEkuO1E93ibZZ$RQX`BEj)4h?GJ@%OE49=ojC1qq=RkZ-X zcd;zD3=jLMPun(kezpAOems{scu%x8Q^!7JY*XW(PgU;>^>L%fd%-XAw2=&jx*jt9 z{Z}#tC>Ku>`)Q7D$X#Qnty%YWf~gYC%c}hy3|Hub&(p*r-dc4hTS8)|Q;eWwVJ(O8 z_5;GYBD*jMWX~H`r9{{7>8L)8s7hvsb#av2pjKN|ft|I}97aYBg%Au~5bR{k?HMhU-I9{}}ySO{>EH>d6{Unr?=1EfJ3Bq=r zAL9uvt0~^$D{sN=TiOxhZi#bpz%D*yBe6z`YS+#r+|uwq^u;zQtimr@b2NYMA}u8c zuyWa|Z7vE-`z(~{U0NgrDX~vaX$OIsLdX5llPKCYfMSl$Z#iGW06%lS3>N(2y}EWZ zg!oe8W(6R)ME`Dh<;E6?5QFv9+1}h#v(Dj=KO1WqPfU(w(M6HMSK~CblZ|q0=Y8zu zH7n0X>5|ZYIuyF2773dq3SCVbeY3I3PWyQ2|7H5*?gZqq5Zxn0wY&sJPy2*M2lY|4 zG&PSWJe!l2bo_AEd@SfQn@KYu$t*G?avaCcgvV%R)xfv2b@7GddU&uX0c9Gt3l-Xe|np8{pyBxg9?tB3|u z_WjbT%QV`{Of>qdoe${7@G*(W!L~-2nkZj2ya7oZ`BGlxH+6XVOP00V)2W#!vOv0R zK(93Lt#=c9#5Uc^UaO-Zf91*5tc4nNaIm6ON0H&|l?6izx6GV#!a2imM}u1_E@i}! z{C-%U&t=N?9^8Fe50vVgowr+(A}#LjnUF#>Kt6i(h-V0bLY9df*O3a0-W7*dGX7%` zDvqLJJS<4W-4Ye2llMuTQoEiu0#g56sq zB0ZVA$IvNl!`5_V^SVdaqMI^|;W#igdT}x0B?a8Lh)Z5-?0q~BosTmdEm7E<)T!m? z)uQ4pBt!}+#}ZW@gV_f&Qo2^b(dqymsS4j4%!-hgmMnZv z?;HL`11grGb1ZUMs|#c@AeXINppmUirIM?JB&8~&i&H7EvNGO&P9Cs^u94%OoWLTz z;>?r{`E^(Yz%q(3NSmutfWt{Z4lppISVxy}rQ9^sO0vn3sdKru+1dDBOl7&BcUN$i zm3l_85Oc+cOt5%iHLPuDar|rCw0F$;cv(sTjfy@Qxz?)EcduuiQ+bPeUeP+l^f5qB z>jSoLLB!OX{dkOByfmrfyC+V{o?{%3&KDBHSNC+wcrOuAm+09&=u4Lbuq`d7;z7;b z$ph2MQ7g3*wE9CfGNs6ywy&JtEj}fF7WT5IFfabMaL+hz^8uA9JbF*w<-G!jwPd-v zGBeWQZjUUN^i+4d(>?8pj3IOe%3n#W5uSgwS9z&7l4hd72SdyTTKzKFoU-S@#yA~f zpdPBUoJ(?boD|eMRZ>y?X`DtS()!}7CKVp7P21C&U44*zgi5pm_WrS}=<1X?^S$K7 zRNB?Snz3|vtQdg3+9w#c*@MucvF;YA(Hg-!?ba#HZ&9fsR3;tjEjd{MdyI82emDnk z(5Os3EWDv1ZTnvMEUTdHeq2Wr*x=e9*wD_Qj{trBk?EKJV@C9d#O{1gN50@OBoQN9 zqn!Ro=yDl8QNb>fqS4p(mM4*RmO{sYWZUXQ`16xjVTh3he3m9;tOW39!t_9>_|br- zNqdI}^^de{-)PFGg8S4pv`&Aj{hY8IuCZ33tzEkMOk+J^nT3^1jh?=qdRj_bCqUz1 zYOJa$8ly|xY@d3Usu9sN2U4n3*3pW|+Jzh`a1C>szRV`VK2BEAL7`jN7S@sMu3;#@ zIC#IuNoQ*}PGK0iI5$1(q|O$V?S$XZ8`pn-$CI-CARDcn^F?u7 ztZf)o3l(qCNhrf1L)#P9!;VpcfJup?pRHV_pb^$wC4*^t*6=ub8zy&9FlfRw4NK!4SbG!4x-sw9B=h&%E$9hBj)LM$SvhPc@EMs zgUT!Y za?}~@d|3fiW_(<`rA`O$15;BCz^6#0|9f1I_Q$elGHHccHTH0IR?wDsat`znzvB-b z;WfoK!_mjBTPLy}7dS@gqnApEH*d^${k^@j(-_N%(2w2E#8fo&zIkvsI1JIcRQF%m zsK+Z2lTnuD*(4t?GD_WKo2=@|u9}D>eJ`@I$Ff+|QbTlK2lYJHpN`41mJz!PIB1f# z^$trFW zZiupi#_2u3%1%dE7wJu&FLqHh`S0c3`@kl=yA6m%Ebjbg#qRvuZn?jVxsG%Rk80@sDNRcdxVp_wiwen^NXY^!*vbp!b_ z*L9D|D+OS5EEV{XaY(XOCi1`(_;aw5m~}9*kg!nN660)I+3j=K!j`4jXP@4L*oYPj z5{9IvCv=dOqrXA!l2<_%%mqGw65+v7AOTg94+k9x5~0bK z_f9%QG@C;AOgKB@9d=z9{eH2;5h%+qsKG0lk!US>v?x_S!FuE4=t}1;YW~=g{JO+% zVz5Hoky>EDaKs&>Oa&${ljSZ2Hr^0GH{gcM>B-+K&>9N=OK!8bHTBM)O$4h~nqF5* zQ?mT@7xKgz@(&SCf;QL|f$`DY1M%k}r!032|EurnX~0{?3M*;12f*4QxO~J5?I3z( zzMGgQb@ReM1hf;^;y1|&HX08p!{)~Pvd%R>SIe!otXdLmvzw%-E}$0(w;NVnikw2U zx$!Dq))HiAAV#>36JitH@S+(NF0Z>ZNFRe@3AW2;d{Ef_Shxuo$%D z&n+zQMZ7THz%}Vd;m=~vcylcsUa79AeckaNX~*O4ZfAnbzpWRZPqW!03k(X_1kjt) zuZALfVAL9bg7HMfr;74T<>BiFc;eJK5O|AHFPr1M$MNrvPqwFA5WPkE^?M9?Cu(vp z$*}HTKHERy`Hj5$W6I^C){~UGG1|HZ$X?mBB6IRcipTatnm-E4=SJ~?*AaZ>5|sPu z$I~gacd;)o{y^n>u4r+eWP#CNub?P` zi$NRZ(i0K0gyRv$a)qzSI{fOiq3zL|2X00WB*D7)r@-q4Qi4SY;@&)9?NW4vu4=G9 z_p_$Y9SttAxXd!8>i%0u~d$qt1F;Dps+j;(`Xl#R%5g$mKvaM8=i(UQy*P5ub35R zRp>O~)f=LFVZF@NCrf!4pL`WsYaP{M&HDkv&Ly}Ru4yS)+eWyeo=9y!7ht#weP3?B z4t$yNDUGcZSAOeOS7sWnhmWAy1C_2*uu-+kM;4hx1r(LCyCk~DsEjKV5gqv`u9wK7 zQ7lOM)Xz{zw5dGROFb)E=uw}lOzEQ4z_c~yoFz4j9vm6FK%;e=#4iz!hFS9Nc4vOE zGKf~|m%PR~Qny%xymwBGf;0xoriR=TAv6G6Rl z92>&5Qvx4Es?7$<{q_F)u=PQCCzU`Fkw$sIkDwo_rNDb&97Hxz$W)?)R0LIiBwb)d zRej47pAGfygA@{tRs3XvCOCqmEC)>bPSl3|^-O8loDva?9MtIp-WFEmGdPJ}KwP)J z3*;^#ea96dr@@n9p_&B=!snQ&xy?(l(uBkS7NpdVv>)fFAh?}frRz{OMHUS8K^bw( z!CXH)fB2|k!8d7KAXTDBL5VW+N#1SqtHgJa^k3rUrmFR(g^kj*vote8s7geqAC!%o z5H;v~zV%hMegT~tEHdh(+TayHb?1X7Aqa|#ff(t3ePmY7hjoKL08>U(;M?lpiIiPC z1q*-fCDw-7Q2bH~x}x-@3e4UIfoqsM@Lfco#GZB!Ben-Owg*c<8)T;*(=(}7BiCzI zAcRM>sXRbj5cst_hhbmW8NALYU1K`8kX z5ujO%J>|VJa@mAF=}f}QjZ)Fsk%>TApDtc@0Dk~wa#8M$p22l z6Yv5q&$CZ(vwqBbeExX@{@mwH_G6@-l^TGBgcjHD2=7Sm0I#fR$3iUn-5k^~*P=D! z1~(jjuH#2edCZacQN)e#4cL>nkNo*8H=Jw0tUlX!%t-J6qRCi&d01ma?!9kBL`u7# zYoSS)1P`F5Y*hj)%!$>YaZoLDT|<_NS!98m#NGCFi9>efYXnu7ESqd|lMY7NrmGhT zt8BTX9RmWZ>yZ~lgIXZ=asv67`O^4{J)mMK={D=LQU+I(8pmqRqHQJGa+>?aD-N@f zsZ&j3k%b?q-NMA@3hp0Mr6)=CaYjcK`J-WnuRBW9&oHIonZ^zLYa9h7uT3X=cgO~Z zqqeppgEE(+)<=reiAc9DI#NxH=^4$D$BE%jgWao*6%~()99La!6%jApv6}-F-ErsP z_V@+bfx~FQ=wl?mJm_H>{AxSeZ9CQp5CEFNSUw)9K`9{`l)q>rgB0o*-+T>j&J*;4 zFOS#XH8ICs0teeHQ+*4Xa>;MleOE-`ygmI+)1Sb)o;bUnz&bPU>bcPi8Y(mPuU!=A za?o|#U0LnMS|1|9`D%89-IB1u{T!{%a-M=j*8e$^-y%==O+)0m&M^ze|DrmY21;Y&lAHkicY zDY~Tw)mUbwY}{)G#)|sI9@_@d;J4Z2!scWZT9W~TusE3rL>U1VQf91(paZ`THq=%J|4mYV=Knq^zKDsFk)wsZvz_C= zllpT20MHD=2KEvr7G~zogupCW&H5lE3Bj zSD_KMb8)mVag;T2lUMp9wLi!Ib87$pQ2YNU!~b9N3N+$h8U8u{%<#|h_lf^khJRKj z4&YS$&jkMf0Dv7h3l`SSCXPU=1#1Im6A=?5J7W`QAW?vmv!jWD4Yd2xE{Bz~@@&)k z+H>m_aROpDDTq^_Fmi(Az{fzI!a>qBsMxQFsb2saM&t04aHz2HLrtr+QXJ~n4Q!2gEXl|g{|=~r1cT*i5OsgDBh z)jY_=aKmk|ziP-VNGug1}M+*8ErKnHZEZ9j`H1rj3D z-M1~=8%oT6YyPslw35%LP-N92qFC)S$v3tqVEbUV{zQC;c0^8zs8>^+fvT-g)V;m2 zF^mDcupS@!NB@h#F>X@;T z?CgDl&)2i4(xOB`lAUB6d4X#c=jYWUF3~0^<5uK z*+Y5#XSoA)`aSXc-=rS^nSH+KV_oZ)BVmnw#)|%Jpk8ix1k_GlF^czg+r2q_NLTP5&JZqGtR2;{bc_EBVOLO zMilS_dx|n^kn1X(1xr`J^2lAaI4~)9{~`))pV&er81)SFX*XWCEDc_n*C8({T=-u!h(X`?!K?;6b-D9a<9v{5|;)*?eLw&g816l2M@yHo8KIiy^+Kw_7pKzr(VjIaD!nT~3 zjT>s#S(BdwJ^<_ag%*FA^N!*!_43nT-uZ_}lStMnQyvGJ$bcJ6Z^-AZ9B8{=Oi$=# zoeg3G-j00TX6N+Y(`A9fEO0p#4DI4inQ(BodQLO5bIRi#zGs;~hQhBFO$zSfw~oW1 zVN5ONmu6n9OveU>M}NwWXD73=0)EBwkV?Nd3sHT&fqXv~of>P{f zL8+XIThYNAPeWwq<`y<7LCIfbH`=4Sb51N6a)M@HXZk5??IZiHyNlLu)rwgxA+@r2 zwdB03w&?;jSYj#ZE{m|=Dz=Beu3FYQlfDRyfM$VsS*FaPwN4h*rH6z2ZQKKC7){VkblBGqs*~F)OxUZt z_lL$9!OD+P4?p_m=gXU#NUL;b6KcuJDO&lycqQP>8F+NqP_oZ+TDQVA*|M%|PFs5l zXYV02n~KyBwzj_8M=On{l~K_|X)^c0;AF*T6Dm$ukT+8}lbfVF4b^z(R|lGXr|U+^ zDyati~vKIf%AiP2d%yK%b|rL zCsq8qYqUYiPk~|vcdKT;YCA72^?($Y;ULG<@0rliUgj(v$!6(;j)s(su=KND(9ec5 zdEImyr2V~CD%`CtF6bICoTUpV@fdm4Jv$(Nhu=a zst?L&>_O2b@54LkwY*!eF_>Hd6_I6xEfg&-!RsK~^7|x}srH60`BOJtT%oR2&d9vX z7DYh{wrOgWyaX>^Y4_$%sf#=Bt_sSdNy6s2Mb)5OJ0|y5r z&tewa9QeEZE|AV2DxhBH2eqc~2xx#;^kG~;z~~ikyPIF0%VCMN;``Al#mX?98m!1k zhHbZLYhdv^d(>BZ2ssttq3HJGe6q_ifW+S;%tVS2KxDWB6T+ZPfbRw^0Y|USl8OBSCqH{JmGgvLDGy#-llynh%0nAY5n{aq)@?RVakMWpEl#Gk;8Z0 zx&p4(oxy52tAgj@?EuHftf%7dte8be;~P&RQJf=NKQC@F(PSsE!6JDZT~(GMyxQ@G zs@T|v&*SmbOW9EFgb**0;W_kJyS)ROKh1=TOE3#TAGHlMNDTwoVaGzKZ?d9(ay={x z=z#562ob;chP}u{dL$d^;8Z?Hm&^O}xh6xcm3|=KAYLn{-(t@S8w9y&LU}#5AmdwH zK2+NNFiJb^9%?d`(Z^&iv2JB}Lk4ki43T@ZUiSQ+b9?Ew4A~waa!n`F1-iQ-a@0D| zF_h$)mDap39ZWt{+`m+mn_)%gwWa#?Z$oX!rL3IsN z!U$|H7D-W#UR+XQ5(_^vNq-ir;|_-7P8F^Ojd=6U0G#7@(ddx`lA7I6ooLj7I1R_- z_!9L*DybjwWt8FHA)!?S2E(!JxKF(=HR6LvBsae4PoWQqbLrwpp+cAE%9-FFU9ug{ zy2^cKOFq6n#n-XbJB>hQJ`gXFJ&!>;xabY-5^cG9pmW58WO6+nl-BRaaleT}bmvle zjaQ3^Gk)1bts~Dj^X#0SG!8nUgPRK;d5TO&pI3wZ+GGBnuW_ozF6Z?Q6DxPN^A1ax zfiV1tFsOYbYSEJ@*2rQgRSvjq!>^R%=a{ZkbLdVzqzJ)@;cB?@vJh}`Bl&c*s^wYs zBvAB2EK3{(W3F4ktT<#_zrk1e*!56$v_K4}!8gd0MvdLFg3{W>?IB+)YqcUz%}X-KQb ztuj5+XA#sBJN?74VF=TS#w$MrvPahwZ4OJ>@5{$b+bGV>Kx54a!OnwA9e$gfoAyM^3^dhGP3>y+x|vj|Hih=%)jC3U)YxIzfkGF zp)K$uLMA3A0O4;9|5xDlFW3jfg-XsIKmg3cL&zX+U~A_DEHWA~0vK6=PbNlY;4eEP z8}KhHBRd}<5bpg6hE-{lJZuc@tp5pvS$^}#{kB*Onh7{EEfzLL9cZ2ZMJo4qlq_W6 zWbzwf6EestNotDxO(BD@q==G-6A+k7+M3$^HAXo{V-rUUTQfpRNn;@1w{Z5LB4kiB zF|z=|P!B>%K_F?J2~eWsVsCG4V)Hv9!1(V`|F2L2;a?v4ZM=)2^I!adz@C1O;kR>` z|L!9oZYKQ87{%XM_g|!VEPp2;{1*!z6R_d`2_x&scUk^ogl&7KakiF|^|C-93aN($ zJ!VUO`(iYlW)K&(g?n{h*H#t;P3u18b(OHw)K@fKaS(iQ@*<{%Gf)pVj#xS0qBB>< zsDj$N7)g+Ps>WFhw7Y#{b$xvaC)0mwARHXkB`N>w6P+kY?1;3V%B|`<<=DwDrk^&m z1khgPW;$zon?mCwgZdgxn1krJo7>b~A!XF(@K$l=ga6HPXa1M-|GC`%Hrv0a8Mu`H zH=Y-@1;!VC`?a`!!~9nc3|M=@A`l{2NV0BwlQ+Dv;AosD_zxL7`)_i~zmE^t zmWA~{WSp#=f6falJ166RtOF(hSEKIB{f7k((F|+@n59kjLmOs|Z@3u^T z*anob{|=G<%Qk0617O(H@vr}KN*12L0}&X2RkX8nCIlMsn;Z47UHtdf`MWHl#lvXG z&dz2G^dGZv#^hKY?6nv6_T HPV9dGPzgW$ diff --git a/libs/silk/interface/SKP_Silk_SDK_API.h b/libs/silk/interface/SKP_Silk_SDK_API.h deleted file mode 100644 index 6800a8dfae..0000000000 --- a/libs/silk/interface/SKP_Silk_SDK_API.h +++ /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. -***********************************************************************/ - -#ifndef SKP_SILK_SDK_API_H -#define SKP_SILK_SDK_API_H - -#include "SKP_Silk_control.h" -#include "SKP_Silk_typedef.h" -#include "SKP_Silk_errors.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -#define SILK_MAX_FRAMES_PER_PACKET 5 - -/* Struct for TOC (Table of Contents) */ -typedef struct { - SKP_int framesInPacket; /* Number of 20 ms frames in packet */ - SKP_int fs_kHz; /* Sampling frequency in packet */ - SKP_int inbandLBRR; /* Does packet contain LBRR information */ - SKP_int corrupt; /* Packet is corrupt */ - SKP_int vadFlags[ SILK_MAX_FRAMES_PER_PACKET ]; /* VAD flag for each frame in packet */ - SKP_int sigtypeFlags[ SILK_MAX_FRAMES_PER_PACKET ]; /* Signal type for each frame in packet */ -} SKP_Silk_TOC_struct; - -/****************************************/ -/* Encoder functions */ -/****************************************/ - -/***********************************************/ -/* Get size in bytes of the Silk encoder state */ -/***********************************************/ -SKP_int SKP_Silk_SDK_Get_Encoder_Size( - SKP_int32 *encSizeBytes /* O: Number of bytes in SILK encoder state */ -); - -/*************************/ -/* Init or reset encoder */ -/*************************/ -SKP_int SKP_Silk_SDK_InitEncoder( - void *encState, /* I/O: State */ - SKP_SILK_SDK_EncControlStruct *encStatus /* O: Encoder Status */ -); - -/***************************************/ -/* Read control structure from encoder */ -/***************************************/ -SKP_int SKP_Silk_SDK_QueryEncoder( - const void *encState, /* I: State */ - SKP_SILK_SDK_EncControlStruct *encStatus /* O: Encoder Status */ -); - -/**************************/ -/* Encode frame with Silk */ -/**************************/ -SKP_int SKP_Silk_SDK_Encode( - void *encState, /* I/O: State */ - const SKP_SILK_SDK_EncControlStruct *encControl, /* I: Control status */ - 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) */ -); - -/****************************************/ -/* Decoder functions */ -/****************************************/ - -/***********************************************/ -/* Get size in bytes of the Silk decoder state */ -/***********************************************/ -SKP_int SKP_Silk_SDK_Get_Decoder_Size( - SKP_int32 *decSizeBytes /* O: Number of bytes in SILK decoder state */ -); - -/*************************/ -/* Init or Reset decoder */ -/*************************/ -SKP_int SKP_Silk_SDK_InitDecoder( - void *decState /* I/O: State */ -); - -/******************/ -/* 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) */ -); - -/***************************************************************/ -/* Find Low Bit Rate Redundancy (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 */ -); - -/**************************************/ -/* Get table of contents 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: Table of contents */ -); - -/**************************/ -/* Get the version number */ -/**************************/ -/* Return a pointer to string specifying the version */ -const char *SKP_Silk_SDK_get_version(); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libs/silk/interface/SKP_Silk_control.h b/libs/silk/interface/SKP_Silk_control.h deleted file mode 100644 index 3cbf2dee1c..0000000000 --- a/libs/silk/interface/SKP_Silk_control.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. -***********************************************************************/ - -#ifndef SKP_SILK_CONTROL_H -#define SKP_SILK_CONTROL_H - -#include "SKP_Silk_typedef.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -/***********************************************/ -/* Structure for controlling encoder operation */ -/***********************************************/ -typedef struct { - /* I: Input signal sampling rate in Hertz; 8000/12000/16000/24000 */ - SKP_int32 API_sampleRate; - - /* I: Maximum internal sampling rate in Hertz; 8000/12000/16000/24000 */ - SKP_int32 maxInternalSampleRate; - - /* I: Number of samples per packet; must be equivalent of 20, 40, 60, 80 or 100 ms */ - SKP_int packetSize; - - /* I: Bitrate during active speech in bits/second; internally limited */ - SKP_int32 bitRate; - - /* I: Uplink packet loss in percent (0-100) */ - SKP_int packetLossPercentage; - - /* I: Complexity mode; 0 is lowest; 1 is medium and 2 is highest complexity */ - SKP_int complexity; - - /* I: Flag to enable in-band Forward Error Correction (FEC); 0/1 */ - SKP_int useInBandFEC; - - /* I: Flag to enable discontinuous transmission (DTX); 0/1 */ - SKP_int useDTX; -} SKP_SILK_SDK_EncControlStruct; - -/**************************************************************************/ -/* Structure for controlling decoder operation and reading decoder status */ -/**************************************************************************/ -typedef struct { - /* I: Output signal sampling rate in Hertz; 8000/12000/16000/24000 */ - SKP_int32 API_sampleRate; - - /* O: Number of samples per frame */ - SKP_int frameSize; - - /* O: Frames per packet 1, 2, 3, 4, 5 */ - SKP_int framesPerPacket; - - /* O: Flag to indicate that the decoder has remaining payloads internally */ - SKP_int moreInternalDecoderFrames; - - /* O: Distance between main payload and redundant payload in packets */ - SKP_int inBandFECOffset; -} SKP_SILK_SDK_DecControlStruct; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libs/silk/interface/SKP_Silk_errors.h b/libs/silk/interface/SKP_Silk_errors.h deleted file mode 100644 index e6943146b6..0000000000 --- a/libs/silk/interface/SKP_Silk_errors.h +++ /dev/null @@ -1,89 +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_ERRORS_H -#define SKP_SILK_ERRORS_H - -#ifdef __cplusplus -extern "C" -{ -#endif - -/******************/ -/* Error messages */ -/******************/ -#define SKP_SILK_NO_ERROR 0 - -/**************************/ -/* Encoder error messages */ -/**************************/ - -/* Input length is not a multiplum of 10 ms, or length is longer than the packet length */ -#define SKP_SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES -1 - -/* Sampling frequency not 8000, 12000, 16000 or 24000 Hertz */ -#define SKP_SILK_ENC_FS_NOT_SUPPORTED -2 - -/* Packet size not 20, 40, 60, 80 or 100 ms */ -#define SKP_SILK_ENC_PACKET_SIZE_NOT_SUPPORTED -3 - -/* Allocated payload buffer too short */ -#define SKP_SILK_ENC_PAYLOAD_BUF_TOO_SHORT -4 - -/* Loss rate not between 0 and 100 percent */ -#define SKP_SILK_ENC_INVALID_LOSS_RATE -5 - -/* Complexity setting not valid, use 0, 1 or 2 */ -#define SKP_SILK_ENC_INVALID_COMPLEXITY_SETTING -6 - -/* Inband FEC setting not valid, use 0 or 1 */ -#define SKP_SILK_ENC_INVALID_INBAND_FEC_SETTING -7 - -/* DTX setting not valid, use 0 or 1 */ -#define SKP_SILK_ENC_INVALID_DTX_SETTING -8 - -/* Internal encoder error */ -#define SKP_SILK_ENC_INTERNAL_ERROR -9 - -/**************************/ -/* Decoder error messages */ -/**************************/ - -/* Output sampling frequency lower than internal decoded sampling frequency */ -#define SKP_SILK_DEC_INVALID_SAMPLING_FREQUENCY -10 - -/* Payload size exceeded the maximum allowed 1024 bytes */ -#define SKP_SILK_DEC_PAYLOAD_TOO_LARGE -11 - -/* Payload has bit errors */ -#define SKP_SILK_DEC_PAYLOAD_ERROR -12 - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libs/silk/interface/SKP_Silk_typedef.h b/libs/silk/interface/SKP_Silk_typedef.h deleted file mode 100644 index b0a8cf6217..0000000000 --- a/libs/silk/interface/SKP_Silk_typedef.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. -***********************************************************************/ - -#ifndef _SKP_SILK_API_TYPDEF_H_ -#define _SKP_SILK_API_TYPDEF_H_ - -#ifndef SKP_USE_DOUBLE_PRECISION_FLOATS -#define SKP_USE_DOUBLE_PRECISION_FLOATS 0 -#endif - -#include -#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