1 /*********************************************************************** 2 Copyright (c) 2006-2011, Skype Limited. All rights reserved. 3 Redistribution and use in source and binary forms, with or without 4 modification, are permitted provided that the following conditions 5 are met: 6 - Redistributions of source code must retain the above copyright notice, 7 this list of conditions and the following disclaimer. 8 - Redistributions in binary form must reproduce the above copyright 9 notice, this list of conditions and the following disclaimer in the 10 documentation and/or other materials provided with the distribution. 11 - Neither the name of Internet Society, IETF or IETF Trust, nor the 12 names of specific contributors, may be used to endorse or promote 13 products derived from this software without specific prior written 14 permission. 15 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 19 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25 POSSIBILITY OF SUCH DAMAGE. 26 ***********************************************************************/ 27 28 #ifndef SILK_MAIN_FLP_H 29 #define SILK_MAIN_FLP_H 30 31 #include "SigProc_FLP.h" 32 #include "SigProc_FIX.h" 33 #include "structs_FLP.h" 34 #include "main.h" 35 #include "define.h" 36 #include "debug.h" 37 #include "entenc.h" 38 39 #ifdef __cplusplus 40 extern "C" 41 { 42 #endif 43 44 #define silk_encoder_state_Fxx silk_encoder_state_FLP 45 #define silk_encode_do_VAD_Fxx silk_encode_do_VAD_FLP 46 #define silk_encode_frame_Fxx silk_encode_frame_FLP 47 48 /*********************/ 49 /* Encoder Functions */ 50 /*********************/ 51 52 /* High-pass filter with cutoff frequency adaptation based on pitch lag statistics */ 53 void silk_HP_variable_cutoff( 54 silk_encoder_state_Fxx state_Fxx[] /* I/O Encoder states */ 55 ); 56 57 /* Encoder main function */ 58 void silk_encode_do_VAD_FLP( 59 silk_encoder_state_FLP *psEnc /* I/O Encoder state FLP */ 60 ); 61 62 /* Encoder main function */ 63 opus_int silk_encode_frame_FLP( 64 silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ 65 opus_int32 *pnBytesOut, /* O Number of payload bytes; */ 66 ec_enc *psRangeEnc, /* I/O compressor data structure */ 67 opus_int condCoding, /* I The type of conditional coding to use */ 68 opus_int maxBits, /* I If > 0: maximum number of output bits */ 69 opus_int useCBR /* I Flag to force constant-bitrate operation */ 70 ); 71 72 /* Initializes the Silk encoder state */ 73 opus_int silk_init_encoder( 74 silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ 75 int arch /* I Run-tim architecture */ 76 ); 77 78 /* Control the Silk encoder */ 79 opus_int silk_control_encoder( 80 silk_encoder_state_FLP *psEnc, /* I/O Pointer to Silk encoder state FLP */ 81 silk_EncControlStruct *encControl, /* I Control structure */ 82 const opus_int32 TargetRate_bps, /* I Target max bitrate (bps) */ 83 const opus_int allow_bw_switch, /* I Flag to allow switching audio bandwidth */ 84 const opus_int channelNb, /* I Channel number */ 85 const opus_int force_fs_kHz 86 ); 87 88 /****************/ 89 /* Prefiltering */ 90 /****************/ 91 void silk_prefilter_FLP( 92 silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ 93 const silk_encoder_control_FLP *psEncCtrl, /* I Encoder control FLP */ 94 silk_float xw[], /* O Weighted signal */ 95 const silk_float x[] /* I Speech signal */ 96 ); 97 98 /**************************/ 99 /* Noise shaping analysis */ 100 /**************************/ 101 /* Compute noise shaping coefficients and initial gain values */ 102 void silk_noise_shape_analysis_FLP( 103 silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ 104 silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ 105 const silk_float *pitch_res, /* I LPC residual from pitch analysis */ 106 const silk_float *x /* I Input signal [frame_length + la_shape] */ 107 ); 108 109 /* Autocorrelations for a warped frequency axis */ 110 void silk_warped_autocorrelation_FLP( 111 silk_float *corr, /* O Result [order + 1] */ 112 const silk_float *input, /* I Input data to correlate */ 113 const silk_float warping, /* I Warping coefficient */ 114 const opus_int length, /* I Length of input */ 115 const opus_int order /* I Correlation order (even) */ 116 ); 117 118 /* Calculation of LTP state scaling */ 119 void silk_LTP_scale_ctrl_FLP( 120 silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ 121 silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ 122 opus_int condCoding /* I The type of conditional coding to use */ 123 ); 124 125 /**********************************************/ 126 /* Prediction Analysis */ 127 /**********************************************/ 128 /* Find pitch lags */ 129 void silk_find_pitch_lags_FLP( 130 silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ 131 silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ 132 silk_float res[], /* O Residual */ 133 const silk_float x[], /* I Speech signal */ 134 int arch /* I Run-time architecture */ 135 ); 136 137 /* Find LPC and LTP coefficients */ 138 void silk_find_pred_coefs_FLP( 139 silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ 140 silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ 141 const silk_float res_pitch[], /* I Residual from pitch analysis */ 142 const silk_float x[], /* I Speech signal */ 143 opus_int condCoding /* I The type of conditional coding to use */ 144 ); 145 146 /* LPC analysis */ 147 void silk_find_LPC_FLP( 148 silk_encoder_state *psEncC, /* I/O Encoder state */ 149 opus_int16 NLSF_Q15[], /* O NLSFs */ 150 const silk_float x[], /* I Input signal */ 151 const silk_float minInvGain /* I Prediction gain from LTP (dB) */ 152 ); 153 154 /* LTP analysis */ 155 void silk_find_LTP_FLP( 156 silk_float b[ MAX_NB_SUBFR * LTP_ORDER ], /* O LTP coefs */ 157 silk_float WLTP[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Weight for LTP quantization */ 158 silk_float *LTPredCodGain, /* O LTP coding gain */ 159 const silk_float r_lpc[], /* I LPC residual */ 160 const opus_int lag[ MAX_NB_SUBFR ], /* I LTP lags */ 161 const silk_float Wght[ MAX_NB_SUBFR ], /* I Weights */ 162 const opus_int subfr_length, /* I Subframe length */ 163 const opus_int nb_subfr, /* I number of subframes */ 164 const opus_int mem_offset /* I Number of samples in LTP memory */ 165 ); 166 167 void silk_LTP_analysis_filter_FLP( 168 silk_float *LTP_res, /* O LTP res MAX_NB_SUBFR*(pre_lgth+subfr_lngth) */ 169 const silk_float *x, /* I Input signal, with preceding samples */ 170 const silk_float B[ LTP_ORDER * MAX_NB_SUBFR ], /* I LTP coefficients for each subframe */ 171 const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ 172 const silk_float invGains[ MAX_NB_SUBFR ], /* I Inverse quantization gains */ 173 const opus_int subfr_length, /* I Length of each subframe */ 174 const opus_int nb_subfr, /* I number of subframes */ 175 const opus_int pre_length /* I Preceding samples for each subframe */ 176 ); 177 178 /* Calculates residual energies of input subframes where all subframes have LPC_order */ 179 /* of preceding samples */ 180 void silk_residual_energy_FLP( 181 silk_float nrgs[ MAX_NB_SUBFR ], /* O Residual energy per subframe */ 182 const silk_float x[], /* I Input signal */ 183 silk_float a[ 2 ][ MAX_LPC_ORDER ], /* I AR coefs for each frame half */ 184 const silk_float gains[], /* I Quantization gains */ 185 const opus_int subfr_length, /* I Subframe length */ 186 const opus_int nb_subfr, /* I number of subframes */ 187 const opus_int LPC_order /* I LPC order */ 188 ); 189 190 /* 16th order LPC analysis filter */ 191 void silk_LPC_analysis_filter_FLP( 192 silk_float r_LPC[], /* O LPC residual signal */ 193 const silk_float PredCoef[], /* I LPC coefficients */ 194 const silk_float s[], /* I Input signal */ 195 const opus_int length, /* I Length of input signal */ 196 const opus_int Order /* I LPC order */ 197 ); 198 199 /* LTP tap quantizer */ 200 void silk_quant_LTP_gains_FLP( 201 silk_float B[ MAX_NB_SUBFR * LTP_ORDER ], /* I/O (Un-)quantized LTP gains */ 202 opus_int8 cbk_index[ MAX_NB_SUBFR ], /* O Codebook index */ 203 opus_int8 *periodicity_index, /* O Periodicity index */ 204 opus_int32 *sum_log_gain_Q7, /* I/O Cumulative max prediction gain */ 205 const silk_float W[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* I Error weights */ 206 const opus_int mu_Q10, /* I Mu value (R/D tradeoff) */ 207 const opus_int lowComplexity, /* I Flag for low complexity */ 208 const opus_int nb_subfr, /* I number of subframes */ 209 int arch /* I Run-time architecture */ 210 ); 211 212 /* Residual energy: nrg = wxx - 2 * wXx * c + c' * wXX * c */ 213 silk_float silk_residual_energy_covar_FLP( /* O Weighted residual energy */ 214 const silk_float *c, /* I Filter coefficients */ 215 silk_float *wXX, /* I/O Weighted correlation matrix, reg. out */ 216 const silk_float *wXx, /* I Weighted correlation vector */ 217 const silk_float wxx, /* I Weighted correlation value */ 218 const opus_int D /* I Dimension */ 219 ); 220 221 /* Processing of gains */ 222 void silk_process_gains_FLP( 223 silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ 224 silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ 225 opus_int condCoding /* I The type of conditional coding to use */ 226 ); 227 228 /******************/ 229 /* Linear Algebra */ 230 /******************/ 231 /* Calculates correlation matrix X'*X */ 232 void silk_corrMatrix_FLP( 233 const silk_float *x, /* I x vector [ L+order-1 ] used to create X */ 234 const opus_int L, /* I Length of vectors */ 235 const opus_int Order, /* I Max lag for correlation */ 236 silk_float *XX /* O X'*X correlation matrix [order x order] */ 237 ); 238 239 /* Calculates correlation vector X'*t */ 240 void silk_corrVector_FLP( 241 const silk_float *x, /* I x vector [L+order-1] used to create X */ 242 const silk_float *t, /* I Target vector [L] */ 243 const opus_int L, /* I Length of vecors */ 244 const opus_int Order, /* I Max lag for correlation */ 245 silk_float *Xt /* O X'*t correlation vector [order] */ 246 ); 247 248 /* Add noise to matrix diagonal */ 249 void silk_regularize_correlations_FLP( 250 silk_float *XX, /* I/O Correlation matrices */ 251 silk_float *xx, /* I/O Correlation values */ 252 const silk_float noise, /* I Noise energy to add */ 253 const opus_int D /* I Dimension of XX */ 254 ); 255 256 /* Function to solve linear equation Ax = b, where A is an MxM symmetric matrix */ 257 void silk_solve_LDL_FLP( 258 silk_float *A, /* I/O Symmetric square matrix, out: reg. */ 259 const opus_int M, /* I Size of matrix */ 260 const silk_float *b, /* I Pointer to b vector */ 261 silk_float *x /* O Pointer to x solution vector */ 262 ); 263 264 /* Apply sine window to signal vector. */ 265 /* Window types: */ 266 /* 1 -> sine window from 0 to pi/2 */ 267 /* 2 -> sine window from pi/2 to pi */ 268 void silk_apply_sine_window_FLP( 269 silk_float px_win[], /* O Pointer to windowed signal */ 270 const silk_float px[], /* I Pointer to input signal */ 271 const opus_int win_type, /* I Selects a window type */ 272 const opus_int length /* I Window length, multiple of 4 */ 273 ); 274 275 /* Wrapper functions. Call flp / fix code */ 276 277 /* Convert AR filter coefficients to NLSF parameters */ 278 void silk_A2NLSF_FLP( 279 opus_int16 *NLSF_Q15, /* O NLSF vector [ LPC_order ] */ 280 const silk_float *pAR, /* I LPC coefficients [ LPC_order ] */ 281 const opus_int LPC_order /* I LPC order */ 282 ); 283 284 /* Convert NLSF parameters to AR prediction filter coefficients */ 285 void silk_NLSF2A_FLP( 286 silk_float *pAR, /* O LPC coefficients [ LPC_order ] */ 287 const opus_int16 *NLSF_Q15, /* I NLSF vector [ LPC_order ] */ 288 const opus_int LPC_order /* I LPC order */ 289 ); 290 291 /* Limit, stabilize, and quantize NLSFs */ 292 void silk_process_NLSFs_FLP( 293 silk_encoder_state *psEncC, /* I/O Encoder state */ 294 silk_float PredCoef[ 2 ][ MAX_LPC_ORDER ], /* O Prediction coefficients */ 295 opus_int16 NLSF_Q15[ MAX_LPC_ORDER ], /* I/O Normalized LSFs (quant out) (0 - (2^15-1)) */ 296 const opus_int16 prev_NLSF_Q15[ MAX_LPC_ORDER ] /* I Previous Normalized LSFs (0 - (2^15-1)) */ 297 ); 298 299 /* Floating-point Silk NSQ wrapper */ 300 void silk_NSQ_wrapper_FLP( 301 silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ 302 silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ 303 SideInfoIndices *psIndices, /* I/O Quantization indices */ 304 silk_nsq_state *psNSQ, /* I/O Noise Shaping Quantzation state */ 305 opus_int8 pulses[], /* O Quantized pulse signal */ 306 const silk_float x[] /* I Prefiltered input signal */ 307 ); 308 309 #ifdef __cplusplus 310 } 311 #endif 312 313 #endif 314