1 /* 2 * G.723.1 common header and data tables 3 * Copyright (c) 2006 Benjamin Larsson 4 * Copyright (c) 2010 Mohamed Naufal Basheer 5 * 6 * This file is part of FFmpeg. 7 * 8 * FFmpeg is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU Lesser General Public 10 * License as published by the Free Software Foundation; either 11 * version 2.1 of the License, or (at your option) any later version. 12 * 13 * FFmpeg is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 * Lesser General Public License for more details. 17 * 18 * You should have received a copy of the GNU Lesser General Public 19 * License along with FFmpeg; if not, write to the Free Software 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21 */ 22 23 /** 24 * @file 25 * G.723.1 types, functions and data tables 26 */ 27 28 #ifndef AVCODEC_G723_1_H 29 #define AVCODEC_G723_1_H 30 31 #include <stdint.h> 32 33 #include "libavutil/log.h" 34 35 #define SUBFRAMES 4 36 #define SUBFRAME_LEN 60 37 #define FRAME_LEN (SUBFRAME_LEN << 2) 38 #define HALF_FRAME_LEN (FRAME_LEN / 2) 39 #define LPC_FRAME (HALF_FRAME_LEN + SUBFRAME_LEN) 40 #define LPC_ORDER 10 41 #define LSP_BANDS 3 42 #define LSP_CB_SIZE 256 43 #define PITCH_MIN 18 44 #define PITCH_MAX (PITCH_MIN + 127) 45 #define PITCH_ORDER 5 46 #define GRID_SIZE 2 47 #define PULSE_MAX 6 48 #define GAIN_LEVELS 24 49 #define COS_TBL_SIZE 512 50 51 /** 52 * Bitexact implementation of 2ab scaled by 1/2^16. 53 * 54 * @param a 32 bit multiplicand 55 * @param b 16 bit multiplier 56 */ 57 #define MULL2(a, b) \ 58 ((((a) >> 16) * (b) * 2) + (((a) & 0xffff) * (b) >> 15)) 59 60 /** 61 * G723.1 frame types 62 */ 63 enum FrameType { 64 ACTIVE_FRAME, ///< Active speech 65 SID_FRAME, ///< Silence Insertion Descriptor frame 66 UNTRANSMITTED_FRAME 67 }; 68 69 /** 70 * G723.1 rate values 71 */ 72 enum Rate { 73 RATE_6300, 74 RATE_5300 75 }; 76 77 /** 78 * G723.1 unpacked data subframe 79 */ 80 typedef struct G723_1_Subframe { 81 int ad_cb_lag; ///< adaptive codebook lag 82 int ad_cb_gain; 83 int dirac_train; 84 int pulse_sign; 85 int grid_index; 86 int amp_index; 87 int pulse_pos; 88 } G723_1_Subframe; 89 90 /** 91 * Pitch postfilter parameters 92 */ 93 typedef struct PPFParam { 94 int index; ///< postfilter backward/forward lag 95 int16_t opt_gain; ///< optimal gain 96 int16_t sc_gain; ///< scaling gain 97 } PPFParam; 98 99 /** 100 * Harmonic filter parameters 101 */ 102 typedef struct HFParam { 103 int index; 104 int gain; 105 } HFParam; 106 107 /** 108 * Optimized fixed codebook excitation parameters 109 */ 110 typedef struct FCBParam { 111 int min_err; 112 int amp_index; 113 int grid_index; 114 int dirac_train; 115 int pulse_pos[PULSE_MAX]; 116 int pulse_sign[PULSE_MAX]; 117 } FCBParam; 118 119 typedef struct G723_1_ChannelContext { 120 G723_1_Subframe subframe[4]; 121 enum FrameType cur_frame_type; 122 enum FrameType past_frame_type; 123 enum Rate cur_rate; 124 uint8_t lsp_index[LSP_BANDS]; 125 int pitch_lag[2]; 126 int erased_frames; 127 128 int16_t prev_lsp[LPC_ORDER]; 129 int16_t sid_lsp[LPC_ORDER]; 130 int16_t prev_excitation[PITCH_MAX]; 131 int16_t excitation[PITCH_MAX + FRAME_LEN + 4]; 132 int16_t synth_mem[LPC_ORDER]; 133 int16_t fir_mem[LPC_ORDER]; 134 int iir_mem[LPC_ORDER]; 135 136 int random_seed; 137 int cng_random_seed; 138 int interp_index; 139 int interp_gain; 140 int sid_gain; 141 int cur_gain; 142 int reflection_coef; 143 int pf_gain; ///< formant postfilter 144 ///< gain scaling unit memory 145 int16_t audio[FRAME_LEN + LPC_ORDER + PITCH_MAX + 4]; 146 147 /* encoder */ 148 int16_t prev_data[HALF_FRAME_LEN]; 149 int16_t prev_weight_sig[PITCH_MAX]; 150 151 int16_t hpf_fir_mem; ///< highpass filter fir 152 int hpf_iir_mem; ///< and iir memories 153 int16_t perf_fir_mem[LPC_ORDER]; ///< perceptual filter fir 154 int16_t perf_iir_mem[LPC_ORDER]; ///< and iir memories 155 156 int16_t harmonic_mem[PITCH_MAX]; 157 } G723_1_ChannelContext; 158 159 typedef struct G723_1_Context { 160 AVClass *class; 161 int postfilter; 162 163 G723_1_ChannelContext ch[2]; 164 } G723_1_Context; 165 166 167 /** 168 * Scale vector contents based on the largest of their absolutes. 169 */ 170 int ff_g723_1_scale_vector(int16_t *dst, const int16_t *vector, int length); 171 172 /** 173 * Calculate the number of left-shifts required for normalizing the input. 174 * 175 * @param num input number 176 * @param width width of the input, 16 bits(0) / 32 bits(1) 177 */ 178 int ff_g723_1_normalize_bits(int num, int width); 179 180 int ff_g723_1_dot_product(const int16_t *a, const int16_t *b, int length); 181 182 /** 183 * Get delayed contribution from the previous excitation vector. 184 */ 185 void ff_g723_1_get_residual(int16_t *residual, int16_t *prev_excitation, 186 int lag); 187 188 /** 189 * Generate a train of dirac functions with period as pitch lag. 190 */ 191 void ff_g723_1_gen_dirac_train(int16_t *buf, int pitch_lag); 192 193 194 /** 195 * Generate adaptive codebook excitation. 196 */ 197 void ff_g723_1_gen_acb_excitation(int16_t *vector, int16_t *prev_excitation, 198 int pitch_lag, G723_1_Subframe *subfrm, 199 enum Rate cur_rate); 200 /** 201 * Quantize LSP frequencies by interpolation and convert them to 202 * the corresponding LPC coefficients. 203 * 204 * @param lpc buffer for LPC coefficients 205 * @param cur_lsp the current LSP vector 206 * @param prev_lsp the previous LSP vector 207 */ 208 void ff_g723_1_lsp_interpolate(int16_t *lpc, int16_t *cur_lsp, 209 int16_t *prev_lsp); 210 211 /** 212 * Perform inverse quantization of LSP frequencies. 213 * 214 * @param cur_lsp the current LSP vector 215 * @param prev_lsp the previous LSP vector 216 * @param lsp_index VQ indices 217 * @param bad_frame bad frame flag 218 */ 219 void ff_g723_1_inverse_quant(int16_t *cur_lsp, int16_t *prev_lsp, 220 uint8_t *lsp_index, int bad_frame); 221 222 static const uint8_t frame_size[4] = { 24, 20, 4, 1 }; 223 224 /** 225 * Postfilter gain weighting factors scaled by 2^15 226 */ 227 static const int16_t ppf_gain_weight[2] = {0x1800, 0x2000}; 228 229 /** 230 * LSP DC component 231 */ 232 static const int16_t dc_lsp[LPC_ORDER] = { 233 0x0c3b, 234 0x1271, 235 0x1e0a, 236 0x2a36, 237 0x3630, 238 0x406f, 239 0x4d28, 240 0x56f4, 241 0x638c, 242 0x6c46 243 }; 244 245 /* Cosine table scaled by 2^14 */ 246 static const int16_t cos_tab[COS_TBL_SIZE + 1] = { 247 16384, 16383, 16379, 16373, 16364, 16353, 16340, 16324, 248 16305, 16284, 16261, 16235, 16207, 16176, 16143, 16107, 249 16069, 16029, 15986, 15941, 15893, 15843, 15791, 15736, 250 15679, 15619, 15557, 15493, 15426, 15357, 15286, 15213, 251 15137, 15059, 14978, 14896, 14811, 14724, 14635, 14543, 252 14449, 14354, 14256, 14155, 14053, 13949, 13842, 13733, 253 13623, 13510, 13395, 13279, 13160, 13039, 12916, 12792, 254 12665, 12537, 12406, 12274, 12140, 12004, 11866, 11727, 255 11585, 11442, 11297, 11151, 11003, 10853, 10702, 10549, 256 10394, 10238, 10080, 9921, 9760, 9598, 9434, 9269, 257 9102, 8935, 8765, 8595, 8423, 8250, 8076, 7900, 258 7723, 7545, 7366, 7186, 7005, 6823, 6639, 6455, 259 6270, 6084, 5897, 5708, 5520, 5330, 5139, 4948, 260 4756, 4563, 4370, 4176, 3981, 3786, 3590, 3393, 261 3196, 2999, 2801, 2603, 2404, 2205, 2006, 1806, 262 1606, 1406, 1205, 1005, 804, 603, 402, 201, 263 0, -201, -402, -603, -804, -1005, -1205, -1406, 264 -1606, -1806, -2006, -2205, -2404, -2603, -2801, -2999, 265 -3196, -3393, -3590, -3786, -3981, -4176, -4370, -4563, 266 -4756, -4948, -5139, -5330, -5520, -5708, -5897, -6084, 267 -6270, -6455, -6639, -6823, -7005, -7186, -7366, -7545, 268 -7723, -7900, -8076, -8250, -8423, -8595, -8765, -8935, 269 -9102, -9269, -9434, -9598, -9760, -9921, -10080, -10238, 270 -10394, -10549, -10702, -10853, -11003, -11151, -11297, -11442, 271 -11585, -11727, -11866, -12004, -12140, -12274, -12406, -12537, 272 -12665, -12792, -12916, -13039, -13160, -13279, -13395, -13510, 273 -13623, -13733, -13842, -13949, -14053, -14155, -14256, -14354, 274 -14449, -14543, -14635, -14724, -14811, -14896, -14978, -15059, 275 -15137, -15213, -15286, -15357, -15426, -15493, -15557, -15619, 276 -15679, -15736, -15791, -15843, -15893, -15941, -15986, -16029, 277 -16069, -16107, -16143, -16176, -16207, -16235, -16261, -16284, 278 -16305, -16324, -16340, -16353, -16364, -16373, -16379, -16383, 279 -16384, -16383, -16379, -16373, -16364, -16353, -16340, -16324, 280 -16305, -16284, -16261, -16235, -16207, -16176, -16143, -16107, 281 -16069, -16029, -15986, -15941, -15893, -15843, -15791, -15736, 282 -15679, -15619, -15557, -15493, -15426, -15357, -15286, -15213, 283 -15137, -15059, -14978, -14896, -14811, -14724, -14635, -14543, 284 -14449, -14354, -14256, -14155, -14053, -13949, -13842, -13733, 285 -13623, -13510, -13395, -13279, -13160, -13039, -12916, -12792, 286 -12665, -12537, -12406, -12274, -12140, -12004, -11866, -11727, 287 -11585, -11442, -11297, -11151, -11003, -10853, -10702, -10549, 288 -10394, -10238, -10080, -9921, -9760, -9598, -9434, -9269, 289 -9102, -8935, -8765, -8595, -8423, -8250, -8076, -7900, 290 -7723, -7545, -7366, -7186, -7005, -6823, -6639, -6455, 291 -6270, -6084, -5897, -5708, -5520, -5330, -5139, -4948, 292 -4756, -4563, -4370, -4176, -3981, -3786, -3590, -3393, 293 -3196, -2999, -2801, -2603, -2404, -2205, -2006, -1806, 294 -1606, -1406, -1205, -1005, -804, -603, -402, -201, 295 0, 201, 402, 603, 804, 1005, 1205, 1406, 296 1606, 1806, 2006, 2205, 2404, 2603, 2801, 2999, 297 3196, 3393, 3590, 3786, 3981, 4176, 4370, 4563, 298 4756, 4948, 5139, 5330, 5520, 5708, 5897, 6084, 299 6270, 6455, 6639, 6823, 7005, 7186, 7366, 7545, 300 7723, 7900, 8076, 8250, 8423, 8595, 8765, 8935, 301 9102, 9269, 9434, 9598, 9760, 9921, 10080, 10238, 302 10394, 10549, 10702, 10853, 11003, 11151, 11297, 11442, 303 11585, 11727, 11866, 12004, 12140, 12274, 12406, 12537, 304 12665, 12792, 12916, 13039, 13160, 13279, 13395, 13510, 305 13623, 13733, 13842, 13949, 14053, 14155, 14256, 14354, 306 14449, 14543, 14635, 14724, 14811, 14896, 14978, 15059, 307 15137, 15213, 15286, 15357, 15426, 15493, 15557, 15619, 308 15679, 15736, 15791, 15843, 15893, 15941, 15986, 16029, 309 16069, 16107, 16143, 16176, 16207, 16235, 16261, 16284, 310 16305, 16324, 16340, 16353, 16364, 16373, 16379, 16383, 311 16384 312 }; 313 314 /** 315 * LSP VQ tables 316 */ 317 static const int16_t lsp_band0[LSP_CB_SIZE][3] = { 318 { 0, 0, 0}, { -270, -1372, -1032}, { -541, -1650, -1382}, 319 { -723, -2011, -2213}, { -941, -1122, -1942}, { -780, -1145, -2454}, 320 { -884, -1309, -1373}, {-1051, -1523, -1766}, {-1083, -1622, -2300}, 321 { -777, -1377, -2147}, { -935, -1467, -2763}, { -802, -1327, -3471}, 322 { -935, -1959, -3999}, { -240, -89, 222}, { -661, -257, -160}, 323 { -994, -466, -419}, { -188, -164, -278}, { -342, -512, -415}, 324 { -607, -511, -797}, { 16, 19, -716}, { 374, 425, -972}, 325 { -346, 245, -282}, { -265, 506, -754}, { -620, -147, 1955}, 326 { -742, -860, 2597}, { -150, -352, 2704}, { 305, 880, 1954}, 327 { 123, 731, 2766}, { -348, 765, 3327}, { 618, 221, 3258}, 328 { -178, -47, 4219}, { 393, 1304, 3842}, { 698, 1702, 4801}, 329 { 63, -584, 1229}, { -215, -732, 1704}, { 172, -335, 1909}, 330 { -2, 216, 1797}, { 353, 127, 2205}, {-1208, 188, 11}, 331 { -513, -75, -683}, { -973, 222, -646}, { -616, -843, -388}, 332 { -950, -1113, -359}, {-1431, -623, -705}, {-1398, -1063, -178}, 333 { -45, -461, 35}, { -9, -657, -216}, { 127, -1078, 95}, 334 { -950, -1156, 584}, {-1480, -1494, 449}, { -120, -705, 516}, 335 { -368, -961, 727}, { -378, -526, 973}, { -793, -614, 676}, 336 { -801, -755, 1287}, {-1476, -340, 1636}, { -505, -1254, 1543}, 337 {-1243, -1622, 1532}, { -776, -1477, -655}, {-1151, -1296, -823}, 338 {-1153, -1672, -1124}, {-1291, -2003, -1702}, { -622, -1283, 57}, 339 { -471, -1611, 509}, {-1060, -1570, -139}, { -873, -2156, -536}, 340 {-1716, -2021, -364}, {-2150, -3218, -1291}, {-1248, -1945, -2904}, 341 {-1215, -2633, -2855}, { 167, -244, 84}, { 349, -412, -217}, 342 { -40, -352, 632}, { 227, -529, 405}, { 68, -383, -443}, 343 { 167, -558, -706}, { -275, -854, -14}, { -351, -1089, -449}, 344 { 341, -72, -289}, { 603, -106, -474}, { 322, -219, -649}, 345 { 179, -317, -998}, { 450, -291, -996}, { 555, 195, -525}, 346 { 784, 272, -831}, { -148, -384, -849}, { 82, -536, -1357}, 347 { 238, -172, -1354}, { 422, -268, -1841}, { 297, -737, -2079}, 348 { -111, -801, -598}, { 1, -668, -984}, { -131, -818, -1299}, 349 { -329, -521, -1310}, { -151, -778, -1834}, { -93, -352, -1746}, 350 { -568, -640, -1821}, { -509, -941, -2183}, { 464, -815, -1250}, 351 { 79, -1133, -1597}, { -184, -1353, -2123}, { -196, -410, -2427}, 352 { -192, -833, -2810}, { -259, -1382, -3045}, { -217, 4, -1166}, 353 { -800, -325, -1219}, { -363, -830, -898}, { -661, -1134, -960}, 354 { -386, -980, -1501}, { -627, -1159, -1722}, { -903, -829, -855}, 355 { -685, -829, -1313}, {-1065, -959, -1405}, { 441, 25, -847}, 356 { 655, -27, -1181}, { 1159, -110, -705}, { 856, 253, -1671}, 357 { 415, 404, -1}, { 322, 903, -398}, { 670, 499, -292}, 358 { 803, 591, -610}, { 1144, 591, -814}, { 717, 183, 393}, 359 { 857, 381, 106}, { 609, 62, -27}, { 792, 198, -325}, 360 { 735, 805, 88}, { 1142, 812, 78}, { 1028, 366, -292}, 361 { 1309, 743, -237}, { 1615, 589, -79}, { 1010, 639, -243}, 362 { 999, 964, -311}, { 1500, 1137, -615}, { 988, 357, 646}, 363 { 1227, 667, 683}, { 1164, 1565, 894}, { 1392, 2015, 477}, 364 { 1138, 533, 250}, { 1437, 896, 391}, { 1765, 1118, 99}, 365 { 1112, 1090, 802}, { 1596, 846, 1134}, { 937, 1161, 279}, 366 { 1719, 1254, 683}, { 1338, 1086, 35}, { 1419, 1324, 428}, 367 { 1428, 1524, 40}, { 2108, 1594, 89}, { 1015, 544, 1222}, 368 { 1121, 925, 1263}, { 1030, 1318, 1485}, { 1295, 789, 1817}, 369 { 1323, 1272, 1909}, { 1724, 1237, 1803}, { 1797, 1689, 858}, 370 { 2149, 1367, 1301}, { 2302, 1867, 761}, { 2863, 2351, 1053}, 371 { 52, 163, -76}, { 230, 309, -492}, { -71, 619, 39}, 372 { -218, 856, 499}, { -654, 736, -207}, { -535, 1259, 155}, 373 { -480, 1476, 643}, { 262, 1081, 102}, { 309, 1592, -182}, 374 { 627, 1629, 534}, { 337, 643, 456}, { 758, 670, 713}, 375 { 202, 1126, 658}, { 612, 1131, 666}, { 686, 1223, 1136}, 376 { -131, 377, 525}, { 42, 708, 907}, { 87, 1488, 1035}, 377 { 432, 2117, 904}, { 137, 981, 1332}, { -447, 1014, 1136}, 378 { -839, 1793, 1246}, { -559, 297, 198}, { -850, 685, 446}, 379 {-1273, 632, 826}, { -401, -544, 173}, { -753, -793, 144}, 380 { -436, -9, 772}, { -115, -243, 1310}, { -670, -269, 374}, 381 {-1027, -13, 639}, { -887, -81, 1137}, {-1277, -455, 158}, 382 {-1411, -720, 736}, { 172, 88, 403}, { 386, 255, 756}, 383 { -500, 522, 910}, { -958, 659, 1388}, { -395, 301, 1344}, 384 { -356, 768, 1813}, { -613, 841, 2419}, { 445, -122, 252}, 385 { 629, -87, 723}, { 283, -253, 870}, { 456, -116, 1381}, 386 { 757, 180, 1059}, { 532, 408, 1509}, { 947, 288, 1806}, 387 { 1325, 994, 2524}, { 892, 1219, 3023}, { 1397, 1596, 3406}, 388 { 1143, 1552, 2546}, { 1850, 1433, 2710}, { -10, 134, 1002}, 389 { 154, 499, 1323}, { 508, 792, 1117}, { 509, 1340, 1616}, 390 { 762, 862, 1608}, { 787, 740, 2320}, { 794, 1727, 1283}, 391 { 465, 2108, 1660}, { -120, 1451, 1613}, { -386, 2016, 2169}, 392 { 891, 1225, 2050}, { 456, 1480, 2185}, { 1493, 1283, 1209}, 393 { 1397, 1636, 1518}, { 1776, 1738, 1552}, { 1572, 1698, 2141}, 394 { 1389, 2126, 1271}, { 1959, 2413, 1119}, { 1365, 2892, 1505}, 395 { 2206, 1971, 1623}, { 2076, 1950, 2280}, { 1717, 2291, 1867}, 396 { 2366, 2515, 1953}, { 2865, 2838, 2522}, { 2535, 3465, 2011}, 397 { 3381, 4127, 2638}, { 836, 2667, 2289}, { 1761, 2773, 2337}, 398 { 1415, 3325, 2911}, { 2354, 3138, 3126}, { 2659, 4192, 4010}, 399 { 1048, 1786, 1818}, { 1242, 2111, 2240}, { 1512, 2079, 2780}, 400 { 1573, 2491, 3138}, { 2230, 2377, 2782}, { 416, 1773, 2704}, 401 { 725, 2336, 3297}, { 1252, 2373, 3978}, { 2094, 2268, 3568}, 402 { 2011, 2712, 4528}, { 1341, 3507, 3876}, { 1216, 3919, 4922}, 403 { 1693, 4793, 6012} 404 }; 405 406 static const int16_t lsp_band1[LSP_CB_SIZE][3] = { 407 { 0, 0, 0}, {-2114, -1302, 76}, {-2652, -1278, -1368}, 408 {-2847, -828, -349}, {-3812, -2190, -349}, {-3946, -364, -449}, 409 {-2725, -4492, -3607}, {-3495, -4764, -1744}, { -51, -756, 84}, 410 { -153, -1191, 504}, { 108, -1418, 1167}, { -835, -896, 390}, 411 { -569, -1702, 87}, {-1151, -1818, 933}, {-1826, -2547, 411}, 412 {-1842, -1818, 1451}, {-2438, -1611, 781}, {-2747, -2477, 1311}, 413 { -940, 1252, 477}, {-1629, 1688, 602}, {-1202, 617, 280}, 414 {-1737, 393, 580}, {-1528, 1077, 1199}, {-2165, -161, 1408}, 415 {-2504, -1087, 2371}, {-3458, -175, 1395}, {-1397, -98, -843}, 416 {-2252, -177, -1149}, {-1489, -726, -1283}, {-1558, -265, -1744}, 417 {-1867, -821, -1897}, {-2062, -1516, -2340}, {-2595, -1142, -2861}, 418 { 170, 46, -819}, { -193, -204, -1151}, { 326, -196, -1532}, 419 { 780, 329, -816}, { 201, 369, -1243}, { 650, -209, -1060}, 420 { 1144, -15, -1216}, { 1203, -259, -1867}, { -890, -564, -1430}, 421 { -638, -852, -1921}, { 177, -739, -1358}, { -261, -526, -1666}, 422 { 206, -407, -2255}, { 338, -526, -822}, { 421, -1095, -1009}, 423 { 765, -607, -1408}, { 825, -1295, -2004}, { 357, -905, -1815}, 424 { -58, -1248, -1588}, { -596, -1436, -2046}, { -73, -1159, -2116}, 425 { -115, -1382, -2581}, { -160, -1723, -1952}, { -6, -2196, -2954}, 426 { -649, -1705, -2603}, { -617, -1453, -3282}, { -949, -2019, -3102}, 427 { -812, 1544, 1937}, {-1854, 574, 2000}, {-1463, 1140, 2649}, 428 {-2683, 1748, 1452}, {-2486, 2241, 2523}, { 783, 1910, 1435}, 429 { 581, 2682, 1376}, { 236, 2197, 1885}, { -453, 2943, 2057}, 430 { -682, 2178, 2565}, {-1342, 3201, 3328}, { -288, -184, 262}, 431 { 121, -149, -183}, { 758, -412, 206}, { 1038, -204, 853}, 432 { 1577, -457, 700}, { 937, -640, -567}, { 1508, -528, -1024}, 433 { -225, -527, -427}, { -564, -1095, -332}, { -742, -353, -186}, 434 {-1288, -459, 84}, {-1853, -484, -274}, {-1554, -731, 825}, 435 {-2425, -234, 382}, {-1722, 293, -271}, {-2515, 425, -564}, 436 {-2599, 818, 464}, { -358, 118, -375}, { -613, 198, -874}, 437 { -690, 683, -324}, {-1352, 1155, -168}, {-1093, 129, -324}, 438 {-1184, 611, -858}, { 433, 386, -372}, { -120, 486, -634}, 439 { 234, 851, -631}, { 602, 128, 46}, { 1099, 410, 159}, 440 { 715, -145, -424}, { 1198, -85, -593}, { 1390, 367, -358}, 441 { 1683, 362, -964}, { 1711, 622, 45}, { 2033, 833, -383}, 442 { 2890, 549, -506}, { 7, 401, 52}, { 72, 811, 415}, 443 { 566, 668, 41}, { 467, 1218, 130}, { 68, 957, -187}, 444 { -25, 1649, -103}, { -661, 260, 214}, { -925, -94, 612}, 445 { -321, -422, 965}, { -788, -672, 1783}, { 400, -673, 779}, 446 { 741, -595, 1635}, { -161, 307, 657}, { -382, 836, 871}, 447 { -814, 400, 1223}, { 364, 606, 1247}, { 57, 75, 1571}, 448 { 151, 471, 2287}, { -81, 1021, 1502}, { 227, 1470, 1097}, 449 { 658, 1275, 1653}, { 664, 1478, 2377}, { 263, -127, 444}, 450 { 264, 89, 969}, { 794, 171, 576}, { 821, 186, 1226}, 451 { 404, 462, 517}, { 339, 918, 794}, { 1280, 1423, 196}, 452 { 1453, 2019, 365}, { 1615, 1481, 672}, { 2394, 1708, 508}, 453 { 806, 1238, 573}, { 713, 1158, 1078}, { 1285, 1436, 1232}, 454 { 1790, 1188, 1141}, { 765, 643, 864}, { 1032, 797, 1279}, 455 { 900, 563, 1827}, { 1514, 673, 2312}, { 1544, 1129, 3240}, 456 { 1469, 1050, 1594}, { 1945, 1318, 1988}, { 2397, 2026, 2060}, 457 { 3538, 2057, 2620}, { 1249, -118, 74}, { 1727, 194, 421}, 458 { 2078, -50, -463}, { 970, 688, -432}, { 1149, 952, -110}, 459 { 1254, 1275, -651}, { 1386, 929, 401}, { 1960, 1167, 232}, 460 { 407, -752, -243}, { 859, -1118, 172}, { -227, -860, -992}, 461 { -796, -1175, -1380}, { 8, -1282, -388}, { 353, -1781, -1037}, 462 { -732, -397, -807}, { -853, -28, -1342}, {-1229, -1207, -1959}, 463 {-1015, -1125, -2543}, {-1452, -1791, -2725}, {-1891, -2416, -3269}, 464 { -918, -1629, -783}, { -580, -2155, -698}, {-1097, -2364, -96}, 465 {-1387, -1513, 7}, {-1588, -2076, -664}, {-1473, -2740, -784}, 466 {-2378, -3149, -56}, {-2856, -2092, -169}, {-3391, -3708, 316}, 467 {-1176, -890, -614}, {-1944, -1061, -800}, { -299, -1517, -1000}, 468 { -640, -1850, -1526}, {-1454, -1536, -1233}, {-1890, -1955, -1756}, 469 {-1086, -1921, -2122}, { -750, -2325, -2260}, {-1325, -2413, -2673}, 470 {-1114, -2542, -3459}, {-1341, -2901, -3963}, {-1160, -2226, -1393}, 471 {-1001, -2772, -1573}, {-1594, -2641, -1978}, {-1534, -3046, -2624}, 472 {-2224, -2196, -675}, {-2807, -3054, -1102}, {-2008, -2840, -1186}, 473 {-1980, -3332, -1695}, {-1715, -3562, -505}, {-2527, -4000, -1887}, 474 {-2333, -2734, -2296}, {-3440, -2401, -3211}, {-2008, -3528, -3337}, 475 {-2247, -3291, -4510}, { -475, 949, 155}, { -149, 1365, 545}, 476 { -757, 1644, 1083}, { -217, 2053, 1353}, {-1433, 2301, 1462}, 477 { 495, 1661, 529}, { 10, 2037, 740}, { 2082, 1898, 978}, 478 { 2831, 2294, 911}, { 842, 793, 420}, { 1223, 1023, 863}, 479 { 1237, 451, 780}, { 1744, 708, 822}, { 1533, 284, 1384}, 480 { 2135, 609, 1538}, { 2305, 626, 540}, { 2368, 1187, 955}, 481 { 2586, 1255, -7}, { 3116, 1131, 726}, { 3431, 1730, 428}, 482 { 2734, 1648, 1307}, { 2988, 1231, 2010}, { 3523, 2024, 1488}, 483 { 1034, 1657, 871}, { 1206, 2163, 1036}, { 1807, 2372, 1233}, 484 { 1808, 1769, 1493}, { 1573, 2332, 1779}, { 1216, 1609, 1866}, 485 { 1480, 1898, 2513}, { 465, 2708, 2776}, { 771, 3638, 3338}, 486 { 1869, 2599, 2623}, { 2825, 2745, 2468}, { 2638, 2439, 1585}, 487 { 2094, 2970, 1308}, { 2022, 3057, 1999}, { 3428, 2912, 1816}, 488 { 4536, 2974, 2129}, { 1046, 2563, 2086}, { 1363, 3562, 2318}, 489 { 2511, 1891, 2984}, { 1866, 2306, 3986}, { 3272, 2924, 3682}, 490 { 3146, 3564, 2272}, { 3592, 3968, 2822}, { 2431, 3369, 3069}, 491 { 1931, 4709, 3090}, { 2629, 4220, 3986}, { 4639, 4056, 3664}, 492 { 4035, 5334, 4912} 493 }; 494 495 static const int16_t lsp_band2[LSP_CB_SIZE][4] = { 496 { 0, 0, 0, 0}, { 601, 512, -542, 334}, 497 { 428, 1087, -484, -132}, { 652, 622, -391, -572}, 498 { 378, 799, 141, -860}, { 1040, 409, 112, -554}, 499 { 1123, 670, -75, -847}, { 1421, 494, -315, -1095}, 500 { 787, 1001, 114, -460}, { 988, 1672, 216, -681}, 501 { 1007, 1241, -132, -1247}, { 1073, 399, 186, -5}, 502 { 1262, 193, -694, -129}, { 325, 196, 51, -641}, 503 { 861, -59, 350, -458}, { 1261, 567, 586, -346}, 504 { 1532, 885, 210, -517}, { 2027, 937, 113, -792}, 505 { 1383, 1064, 334, 38}, { 1964, 1468, 459, 133}, 506 { 2062, 1186, -98, -121}, { 2577, 1445, 506, -373}, 507 { 2310, 1682, -2, -960}, { 2876, 1939, 765, 138}, 508 { 3581, 2360, 649, -414}, { 219, 176, -398, -309}, 509 { 434, -78, -435, -880}, { -344, 301, 265, -552}, 510 { -915, 470, 657, -380}, { 419, -432, -163, -453}, 511 { 351, -953, 8, -562}, { 789, -43, 20, -958}, 512 { 302, -594, -352, -1159}, { 1040, 108, -668, -924}, 513 { 1333, 210, -1217, -1663}, { 483, 589, -350, -1140}, 514 { 1003, 824, -802, -1184}, { 745, 58, -589, -1443}, 515 { 346, 247, -915, -1683}, { 270, 796, -720, -2043}, 516 { 1208, 722, -222, -193}, { 1486, 1180, -412, -672}, 517 { 1722, 179, -69, -521}, { 2047, 860, -666, -1410}, 518 { -146, 222, -281, -805}, { -189, 90, -114, -1307}, 519 { -152, 1086, -241, -764}, { -439, 733, -601, -1302}, 520 { -833, -167, -351, -601}, { -856, -422, -411, -1059}, 521 { -747, -355, -582, -1644}, { -837, 210, -916, -1144}, 522 {-1800, 32, -878, -1687}, { -48, -23, -1146, 52}, 523 { -350, -409, -1656, -364}, { 265, -728, -858, -577}, 524 { 458, -247, -1141, -997}, { 691, -407, -1988, -1161}, 525 { -66, -104, -705, -1249}, { -431, -93, -1191, -1844}, 526 { 203, -732, -1000, -1693}, { 10, -832, -1846, -1819}, 527 { 493, -128, -1436, -1768}, { 488, -311, -1730, -2540}, 528 { -653, -532, -1150, -1172}, {-1086, -289, -1706, -1533}, 529 { -699, -1205, -1216, -1766}, {-1032, -1481, -2074, -1523}, 530 { -721, -1220, -2277, -2600}, { 12, -539, -1484, -1131}, 531 { -40, -911, -2106, -441}, { -471, -484, -2267, -1549}, 532 { -141, -988, -3006, -1721}, {-1545, -2102, -583, 342}, 533 {-1383, -2772, -386, -13}, {-2118, -2589, -1205, 72}, 534 {-2147, -3231, -965, 390}, {-2949, -3300, -621, 637}, 535 {-3907, -4138, -865, 803}, {-1287, -845, -375, -548}, 536 {-1416, -1169, -487, -1277}, {-1400, -1690, -1027, -418}, 537 {-2018, -1909, -1188, -1260}, {-1418, -2222, -2029, -128}, 538 {-2067, -2998, -2693, -310}, { -950, -1028, -1538, 185}, 539 {-1616, -915, -2205, -549}, { 19, -821, -1145, 352}, 540 { 184, -1175, -1356, -627}, { -547, -1088, -1661, -911}, 541 { -216, -1502, -2197, -948}, { -795, -1306, -2374, -451}, 542 { -924, -1889, -2796, -680}, { -600, -1614, -3609, -885}, 543 {-2392, -2528, 319, 303}, {-2908, -2095, -310, 573}, 544 {-3460, -2141, 49, -113}, {-2231, -448, 675, -146}, 545 {-2805, -532, 1231, 479}, {-2684, -486, -200, 611}, 546 {-3525, -971, -198, 704}, {-3707, 173, 349, 254}, 547 {-4734, -1447, -34, 880}, { 777, -512, 114, -10}, 548 { 1250, -66, 442, -5}, { 604, 613, 452, -352}, 549 { 1224, 777, 675, -1014}, {-1372, -79, -1208, -238}, 550 {-2389, -17, -1157, -818}, {-1504, -673, -1133, -1060}, 551 {-1984, -799, -2005, -1973}, {-2037, -798, -1068, -105}, 552 {-3190, -899, -1817, -194}, { -156, -886, 394, -318}, 553 { -258, -1283, 551, 202}, { -536, -1729, 910, 331}, 554 { -847, -1109, 795, -163}, {-1171, -1128, 715, 519}, 555 {-1080, -1319, 1685, 668}, {-1000, -1921, 96, 211}, 556 {-1487, -2148, 831, 174}, {-1139, -374, 414, -4}, 557 {-1517, -1383, 396, -352}, {-1012, 439, -59, -967}, 558 {-1812, 706, -440, -1030}, {-1971, -329, -34, -827}, 559 {-2472, -1588, -151, -606}, {-2161, 374, -281, 76}, 560 {-3012, 231, -15, -690}, { 1104, 566, 721, 209}, 561 { 1685, 564, 383, 98}, { 1898, 750, 792, -97}, 562 { 556, -64, 561, -93}, { 876, 162, 913, -22}, 563 { 961, 675, 1296, 140}, { 756, -396, 851, 544}, 564 { 360, -303, 1341, 396}, { 878, -22, 1464, 863}, 565 { -309, -273, 642, -129}, { -686, -82, 842, 454}, 566 { -5, -47, 1069, 998}, { -94, 967, 1277, 298}, 567 { -489, 385, 1473, 746}, { -369, -717, 1333, 242}, 568 { 281, -993, 1726, 924}, { 464, 601, 1575, 1376}, 569 { -250, 206, 2339, 1175}, { -438, 377, -597, -285}, 570 {-1020, 787, -790, -287}, { -458, -410, 215, 295}, 571 { -589, -860, -121, 797}, {-1175, 122, -437, 466}, 572 {-1480, -121, 367, 924}, { 234, 323, 770, -555}, 573 { 145, 30, 996, 26}, { 66, 849, 93, -145}, 574 { -117, 1261, 474, -399}, {-1495, 1051, 218, -506}, 575 {-1390, 694, 994, 88}, { 616, 7, 78, 304}, 576 { 1060, 52, -62, 835}, { 833, 454, 649, 1359}, 577 { -770, 464, 47, 93}, { -574, 1199, -39, 379}, 578 { 114, -98, 488, 485}, { 727, 244, 606, 696}, 579 { -76, 455, 671, 546}, { -565, -13, 145, 819}, 580 { -376, 569, 448, 1128}, { 218, 122, 265, 1167}, 581 { 230, 738, 932, 1003}, { 138, 477, 36, 450}, 582 { 404, 787, -73, 1000}, { 497, 1259, 387, 1231}, 583 { 17, 207, 195, -79}, { 562, 358, 53, -158}, 584 { 493, 387, 478, 189}, { 678, 831, 640, 558}, 585 { -197, 523, 613, 57}, { 429, 894, 769, 111}, 586 { 67, 1174, 568, 511}, { 1242, 824, 251, 840}, 587 { 1419, 1074, 864, 481}, { 924, 1474, 669, 724}, 588 { 1539, 1879, 654, 1590}, { 445, 337, 1111, 541}, 589 { 472, 1421, 1264, 1094}, { 794, 735, 1103, 668}, 590 { 1055, 863, 1192, 1020}, { 778, 1105, 806, 1798}, 591 { 1052, 1527, 1587, 2151}, { 881, 1552, 1265, 391}, 592 { 726, 872, 1812, 601}, { 1469, 280, 1008, 616}, 593 { 1403, 577, 1803, 1244}, { 1650, 1314, 1148, 1072}, 594 { 1297, 1669, 1911, 1026}, { 2093, 1044, 2115, 1189}, 595 { 1644, 1961, 2587, 1512}, { 25, -315, -9, -106}, 596 { 290, -339, 428, -444}, { -68, -783, 735, 772}, 597 { 245, -555, 468, 47}, { 334, -895, 814, 146}, 598 { 235, 368, -964, -959}, { -203, 315, -1566, -1217}, 599 { 801, 17, -276, -354}, { 894, -495, -789, -635}, 600 { 716, 291, -1189, -357}, { 560, -260, -733, -2}, 601 { 679, -508, -1429, 211}, { -51, -62, -428, 557}, 602 { 322, -638, -211, 614}, { -878, -1057, -84, -71}, 603 { -388, -1415, -167, -318}, { -754, -1574, 214, -539}, 604 {-1419, -2004, -92, -787}, { -47, -856, -347, -255}, 605 { 23, -1211, -173, 320}, { -658, -487, -893, 353}, 606 { -783, -1587, -584, 507}, {-1420, -859, -378, 441}, 607 {-2095, -1491, -137, 439}, { -321, -1450, -1288, -12}, 608 { -359, -2113, -553, -8}, { -831, -1918, -1561, 32}, 609 {-1014, -2487, -1359, -939}, { -475, -311, -169, -236}, 610 { -907, -426, 276, -611}, { -96, -400, 50, -710}, 611 { -426, -1022, -10, -985}, { -197, -258, -744, -575}, 612 { -611, -930, -771, -394}, { -267, -776, -612, -939}, 613 { -256, -1346, -802, -1122}, { -796, -1570, -825, -754}, 614 { 712, 876, 141, 227}, { 981, 1509, 85, 124}, 615 { 1462, 1228, 979, -39}, { 1734, 999, 1481, 440}, 616 { 2293, 1116, 769, 440}, { 2504, 1480, 1241, 356}, 617 { 2474, 1909, 1558, 810}, { 917, 1134, 607, -134}, 618 { 509, 1809, 781, -123}, { 1712, 1506, 559, -423}, 619 { 2037, 2317, 726, -155}, { 3031, 2676, 1203, 331}, 620 { 3664, 3274, 1768, 531}, { 1610, 1839, 867, 183}, 621 { 1774, 1972, 1538, 97}, { 1822, 2158, 1282, 659}, 622 { 2222, 2758, 1818, 900}, { 3251, 2124, 1723, 996}, 623 { 3633, 2336, 2408, 1453}, { 2923, 3517, 2567, 1318}, 624 }; 625 626 /** 627 * Used for the coding/decoding of the pulses positions 628 * for the MP-MLQ codebook 629 */ 630 static const int32_t combinatorial_table[PULSE_MAX][SUBFRAME_LEN/GRID_SIZE] = { 631 {118755, 98280, 80730, 65780, 53130, 632 42504, 33649, 26334, 20349, 15504, 633 11628, 8568, 6188, 4368, 3003, 634 2002, 1287, 792, 462, 252, 635 126, 56, 21, 6, 1, 636 0, 0, 0, 0, 0}, 637 638 { 23751, 20475, 17550, 14950, 12650, 639 10626, 8855, 7315, 5985, 4845, 640 3876, 3060, 2380, 1820, 1365, 641 1001, 715, 495, 330, 210, 642 126, 70, 35, 15, 5, 643 1, 0, 0, 0, 0}, 644 645 { 3654, 3276, 2925, 2600, 2300, 646 2024, 1771, 1540, 1330, 1140, 647 969, 816, 680, 560, 455, 648 364, 286, 220, 165, 120, 649 84, 56, 35, 20, 10, 650 4, 1, 0, 0, 0}, 651 652 { 406, 378, 351, 325, 300, 653 276, 253, 231, 210, 190, 654 171, 153, 136, 120, 105, 655 91, 78, 66, 55, 45, 656 36, 28, 21, 15, 10, 657 6, 3, 1, 0, 0}, 658 659 { 29, 28, 27, 26, 25, 660 24, 23, 22, 21, 20, 661 19, 18, 17, 16, 15, 662 14, 13, 12, 11, 10, 663 9, 8, 7, 6, 5, 664 4, 3, 2, 1, 0}, 665 666 { 1, 1, 1, 1, 1, 667 1, 1, 1, 1, 1, 668 1, 1, 1, 1, 1, 669 1, 1, 1, 1, 1, 670 1, 1, 1, 1, 1, 671 1, 1, 1, 1, 1}, 672 }; 673 674 static const int16_t pitch_contrib[340] = { 675 60, 0, 0, 2489, 60, 0, 0, 5217, 676 1, 6171, 0, 3953, 0, 10364, 1, 9357, 677 -1, 8843, 1, 9396, 0, 5794, -1, 10816, 678 2, 11606, -2, 12072, 0, 8616, 1, 12170, 679 0, 14440, 0, 7787, -1, 13721, 0, 18205, 680 0, 14471, 0, 15807, 1, 15275, 0, 13480, 681 -1, 18375, -1, 0, 1, 11194, -1, 13010, 682 1, 18836, -2, 20354, 1, 16233, -1, 0, 683 60, 0, 0, 12130, 0, 13385, 1, 17834, 684 1, 20875, 0, 21996, 1, 0, 1, 18277, 685 -1, 21321, 1, 13738, -1, 19094, -1, 20387, 686 -1, 0, 0, 21008, 60, 0, -2, 22807, 687 0, 15900, 1, 0, 0, 17989, -1, 22259, 688 1, 24395, 1, 23138, 0, 23948, 1, 22997, 689 2, 22604, -1, 25942, 0, 26246, 1, 25321, 690 0, 26423, 0, 24061, 0, 27247, 60, 0, 691 -1, 25572, 1, 23918, 1, 25930, 2, 26408, 692 -1, 19049, 1, 27357, -1, 24538, 60, 0, 693 -1, 25093, 0, 28549, 1, 0, 0, 22793, 694 -1, 25659, 0, 29377, 0, 30276, 0, 26198, 695 1, 22521, -1, 28919, 0, 27384, 1, 30162, 696 -1, 0, 0, 24237, -1, 30062, 0, 21763, 697 1, 30917, 60, 0, 0, 31284, 0, 29433, 698 1, 26821, 1, 28655, 0, 31327, 2, 30799, 699 1, 31389, 0, 32322, 1, 31760, -2, 31830, 700 0, 26936, -1, 31180, 1, 30875, 0, 27873, 701 -1, 30429, 1, 31050, 0, 0, 0, 31912, 702 1, 31611, 0, 31565, 0, 25557, 0, 31357, 703 60, 0, 1, 29536, 1, 28985, -1, 26984, 704 -1, 31587, 2, 30836, -2, 31133, 0, 30243, 705 -1, 30742, -1, 32090, 60, 0, 2, 30902, 706 60, 0, 0, 30027, 0, 29042, 60, 0, 707 0, 31756, 0, 24553, 0, 25636, -2, 30501, 708 60, 0, -1, 29617, 0, 30649, 60, 0, 709 0, 29274, 2, 30415, 0, 27480, 0, 31213, 710 -1, 28147, 0, 30600, 1, 31652, 2, 29068, 711 60, 0, 1, 28571, 1, 28730, 1, 31422, 712 0, 28257, 0, 24797, 60, 0, 0, 0, 713 60, 0, 0, 22105, 0, 27852, 60, 0, 714 60, 0, -1, 24214, 0, 24642, 0, 23305, 715 60, 0, 60, 0, 1, 22883, 0, 21601, 716 60, 0, 2, 25650, 60, 0, -2, 31253, 717 -2, 25144, 0, 17998 718 }; 719 720 /** 721 * Number of non-zero pulses in the MP-MLQ excitation 722 */ 723 static const int8_t pulses[4] = {6, 5, 6, 5}; 724 725 /** 726 * Size of the MP-MLQ fixed excitation codebooks 727 */ 728 static const int32_t max_pos[4] = {593775, 142506, 593775, 142506}; 729 730 static const int16_t fixed_cb_gain[GAIN_LEVELS] = { 731 1, 2, 3, 4, 6, 9, 13, 18, 732 26, 38, 55, 80, 115, 166, 240, 348, 733 502, 726, 1050, 1517, 2193, 3170, 4582, 6623, 734 }; 735 736 static const int16_t adaptive_cb_gain85[85 * 20] = { 737 0, 0, 0, 0, 0, 0, 0, 0, 738 0, 0, 0, 0, 0, 0, 0, 0, 739 0, 0, 0, 0, 800, 1496, 167, -256, 740 -338, -39, -136, -1, -4, -6, -73, -8, 741 -15, 12, 23, 2, 16, 30, 3, -5, 742 -462, -686, 493, 2575, 311, -13, -28, -14, 743 -404, -5, -19, 13, 20, 72, 107, -77, 744 8, 13, -9, -48, 1483, 144, 784, 928, 745 1243, -134, -1, -37, -52, -94, -13, -71, 746 -6, -84, -8, -44, -112, -10, -59, -70, 747 -77, 275, 3522, 1056, -1254, 0, -4, -757, 748 -68, -95, 1, 16, -59, 4, -17, -227, 749 -5, 21, 269, 80, -125, -40, -264, 381, 750 5027, 0, 0, -4, -8, -1542, 0, -2, 751 0, 2, 0, 6, 38, 12, 81, -117, 752 138, 332, 2215, 2574, 1339, -1, -6, -299, 753 -404, -109, -2, -18, -44, -21, -52, -348, 754 -11, -27, -181, -210, 3685, 2883, -887, 866, 755 -1639, -828, -507, -48, -45, -164, -648, 199, 756 156, -194, -152, 46, 368, 288, -88, 86, 757 1396, 2146, 2235, 345, 942, -118, -281, -305, 758 -7, -54, -182, -190, -292, -29, -45, -47, 759 -80, -123, -128, -19, 13, 4475, 3549, -804, 760 -655, 0, -1222, -768, -39, -26, -3, -2, 761 -969, 0, 219, 174, 0, 179, 141, -32, 762 -724, 254, 242, 6049, 2462, -32, -3, -3, 763 -2233, -370, 11, 10, -3, 267, -94, -89, 764 108, -38, -36, -909, 626, -1713, 6121, 4561, 765 -1061, -23, -179, -2287, -1270, -68, 65, -233, 766 640, -174, 477, -1704, 40, -111, 396, 295, 767 -350, 1391, 7985, 511, -405, -7, -118, -3892, 768 -15, -10, 29, 170, -678, 10, -43, -249, 769 -8, 34, 197, 12, 3144, -529, 608, 2530, 770 3878, -603, -17, -22, -390, -918, 101, -116, 771 19, -485, 81, -93, -744, 125, -144, -599, 772 2589, -689, 3045, 5603, -404, -409, -29, -566, 773 -1916, -10, 108, -481, 128, -885, 235, -1041, 774 63, -17, 75, 138, 3107, 513, 1374, -3594, 775 -4922, -589, -16, -115, -788, -1478, -97, -260, 776 -43, 681, 112, 301, 933, 154, 413, -1079, 777 2468, 6010, 1107, -390, 1961, -372, -2204, -74, 778 -9, -234, -905, -166, -406, 58, 143, 26, 779 -295, -719, -132, 46, 4773, 2766, 2368, 4862, 780 -4044, -1390, -467, -342, -1443, -998, -806, -690, 781 -399, -1416, -821, -702, 1178, 682, 584, 1200, 782 1665, -1879, 1443, 1701, 8562, -169, -215, -127, 783 -176, -4475, 190, -146, 165, -172, 195, -149, 784 -870, 982, -754, -889, 2716, 9011, -1007, 755, 785 -1785, -450, -4956, -61, -34, -194, -1493, 167, 786 554, -125, -415, 46, 296, 982, -109, 82, 787 -2727, 7548, 1285, 938, 3420, -453, -3478, -100, 788 -53, -714, 1256, 213, -592, 156, -432, -73, 789 569, -1576, -268, -196, 3677, 882, 4050, 1202, 790 2323, -825, -47, -1001, -88, -329, -198, -909, 791 -218, -269, -64, -297, -521, -125, -574, -170, 792 2046, -753, 122, 10102, 603, -255, -34, 0, 793 -6229, -22, 94, -15, 5, -1261, 464, -75, 794 -75, 27, -4, -372, 449, -1815, 10690, 3870, 795 -527, -12, -201, -6976, -914, -16, 49, -293, 796 1184, -106, 428, -2525, 14, -58, 344, 124, 797 -941, 2352, 5049, 3650, 2637, -54, -337, -1556, 798 -813, -424, 135, 290, -725, 209, -524, -1125, 799 151, -378, -812, -587, -1879, 796, 3117, 9569, 800 -404, -215, -38, -593, -5589, -9, 91, 357, 801 -151, 1097, -464, -1821, -46, 19, 76, 236, 802 -1715, 2043, -2096, 9946, 4001, -179, -254, -268, 803 -6038, -977, 213, -219, 261, 1041, -1240, 1272, 804 418, -498, 511, -2429, -5772, -618, -3921, 284, 805 -3155, -2033, -23, -938, -4, -607, -218, -1381, 806 -148, 100, 10, 68, -1111, -119, -755, 54, 807 382, 4748, 8003, -2064, 2198, -8, -1376, -3909, 808 -260, -294, -110, -186, -2319, 48, 598, 1008, 809 -51, -637, -1073, 277, -867, 3015, 11926, -1675, 810 947, -45, -555, -8681, -171, -54, 159, 631, 811 -2195, -88, 308, 1219, 50, -174, -690, 96, 812 -4933, -432, 6757, 3771, 1352, -1485, -11, -2786, 813 -867, -111, -130, 2034, 178, 1135, 99, -1555, 814 407, 35, -557, -311, 152, 9726, 4231, -1928, 815 1490, -1, -5774, -1092, -226, -135, -90, -39, 816 -2511, 17, 1144, 498, -13, -884, -384, 175, 817 2512, 193, 9033, 5361, -3148, -385, -2, -4980, 818 -1754, -605, -29, -1385, -106, -822, -63, -2956, 819 482, 37, 1735, 1030, 8464, 2844, 12, 549, 820 2132, -4373, -493, 0, -18, -277, -1469, -6, 821 -2, -284, -95, 0, -1101, -370, -1, -71, 822 2141, -2602, 7166, 9046, -1350, -279, -413, -3134, 823 -4994, -111, 340, -936, 1138, -1182, 1436, -3957, 824 176, -214, 590, 745, -244, 278, 13307, 1227, 825 -161, -3, -4, -10808, -91, -1, 4, 198, 826 -226, 18, -20, -997, -2, 2, 131, 12, 827 -1947, 8217, 6269, 917, -2559, -231, -4121, -2399, 828 -51, -399, 976, 745, -3144, 108, -460, -350, 829 -304, 1283, 979, 143, -1810, 2061, -2781, 6056, 830 10058, -200, -259, -472, -2238, -6174, 227, -307, 831 349, 669, -761, 1028, 1111, -1265, 1707, -3717, 832 7827, 9161, -3409, 2473, -1510, -3739, -5122, -709, 833 -373, -139, -4376, 1628, 1906, -1181, -1382, 514, 834 721, 844, -314, 228, -1430, 8313, 9541, -2955, 835 1626, -124, -4218, -5556, -533, -161, 725, 832, 836 -4841, -257, 1499, 1721, 142, -825, -947, 293, 837 2819, -4247, 5391, 8673, 2756, -485, -1101, -1774, 838 -4591, -463, 730, -927, 1397, -1492, 2248, -2854, 839 -474, 714, -907, -1459, 141, 14552, 690, 257, 840 -112, -1, -12926, -29, -4, 0, -125, -5, 841 -613, -2, -228, -10, 0, 99, 4, 1, 842 11938, -1859, 1806, -962, -884, -8699, -211, -199, 843 -56, -47, 1355, -1316, 205, 701, -109, 106, 844 644, -100, 97, -51, 3728, 1982, 2264, 4584, 845 3131, -848, -239, -312, -1282, -598, -451, -515, 846 -273, -1043, -554, -633, -712, -378, -432, -876, 847 -1181, 766, 720, 14303, -216, -85, -35, -31, 848 -12486, -2, 55, 51, -33, 1031, -668, -628, 849 -15, 10, 9, 189, -4385, 4826, 10112, 1569, 850 3388, -1173, -1421, -6242, -150, -700, 1291, 2706, 851 -2979, 420, -462, -969, 906, -998, -2091, -324, 852 -448, 1932, 15591, -1842, 657, -12, -227, -14837, 853 -207, -26, 52, 427, -1838, -50, 217, 1753, 854 18, -77, -626, 74, -4141, 1844, 3962, 5517, 855 6220, -1046, -207, -958, -1858, -2361, 466, 1001, 856 -446, 1394, -621, -1334, 1572, -700, -1504, -2094, 857 729, -2299, 14755, 3657, -952, -32, -322, -13288, 858 -816, -55, 102, -656, 2071, -162, 513, -3294, 859 42, -133, 857, 212, -1385, 5801, 13339, -3137, 860 1344, -117, -2054, -10861, -600, -110, 490, 1127, 861 -4723, -265, 1111, 2554, 113, -476, -1094, 257, 862 4710, 9661, 1073, -2467, 3274, -1354, -5697, -70, 863 -371, -654, -2777, -308, -633, 709, 1455, 161, 864 -941, -1930, -214, 493, 1843, -3624, 12422, 6898, 865 -1559, -207, -802, -9419, -2904, -148, 407, -1397, 866 2748, -775, 1526, -5230, 175, -344, 1182, 656, 867 1433, 2394, 2507, 1380, 8780, -125, -349, -383, 868 -116, -4705, -209, -219, -366, -120, -201, -211, 869 -768, -1283, -1343, -740, -1712, 12915, 5883, -2197, 870 991, -179, -10181, -2112, -294, -60, 1350, 615, 871 -4638, -229, 1732, 789, 103, -781, -356, 133, 872 15072, 2158, -1245, 910, -496, -13865, -284, -94, 873 -50, -15, -1986, 1145, 164, -837, -119, 69, 874 456, 65, -37, 27, 4655, 7319, 4916, 586, 875 -3381, -1322, -3270, -1475, -20, -697, -2079, -1396, 876 -2196, -166, -261, -175, 960, 1510, 1014, 120, 877 1191, -2140, 5120, 13498, -1418, -86, -279, -1600, 878 -11121, -122, 155, -372, 669, -981, 1763, -4218, 879 103, -185, 443, 1168, -1530, -817, 8191, 9632, 880 -1452, -143, -40, -4095, -5663, -128, -76, 765, 881 408, 900, 480, -4815, -135, -72, 726, 854, 882 -3236, 607, 1696, -2106, 11485, -639, -22, -175, 883 -270, -8051, 119, 335, -62, -416, 78, 218, 884 2268, -425, -1189, 1476, 3203, -1903, -837, 9679, 885 7057, -626, -221, -42, -5718, -3039, 372, 163, 886 -97, -1892, 1124, 494, -1380, 819, 360, -4169, 887 213, -655, 17015, 620, -384, -2, -26, -17671, 888 -23, -9, 8, -221, 681, -8, 24, -644, 889 5, -15, 399, 14, 5088, 35, -3339, 3726, 890 8488, -1580, 0, -680, -847, -4397, -10, 1037, 891 7, -1157, -8, 759, -2636, -18, 1730, -1930, 892 -988, 1454, -2688, 15039, 2682, -59, -129, -441, 893 -13805, -439, 87, -162, 238, 907, -1335, 2467, 894 161, -238, 440, -2462, -4865, -2842, -53, 5495, 895 6523, -1445, -493, 0, -1843, -2597, -844, -16, 896 -9, 1632, 953, 18, 1937, 1131, 21, -2188, 897 3076, 15069, -2914, 1810, -971, -577, -13860, -518, 898 -200, -57, -2829, 547, 2680, -339, -1665, 322, 899 182, 893, -172, 107, 1311, 5355, 11054, 2299, 900 -3654, -105, -1750, -7458, -322, -814, -428, -885, 901 -3613, -184, -751, -1551, 292, 1194, 2465, 512, 902 4035, 5619, 4618, 1815, 1912, -994, -1927, -1301, 903 -201, -223, -1384, -1137, -1583, -447, -622, -511, 904 -471, -656, -539, -211, -2131, 2754, -4501, 12879, 905 7432, -277, -463, -1236, -10124, -3371, 358, -585, 906 756, 1675, -2165, 3538, 967, -1249, 2042, -5842, 907 5618, -515, 3219, -4149, 4857, -1926, -16, -632, 908 -1050, -1440, 176, -1104, 101, 1422, -130, 815, 909 -1666, 152, -954, 1230, 1838, -1709, 1139, 16867, 910 716, -206, -178, -79, -17366, -31, 191, -127, 911 118, -1892, 1759, -1173, -80, 74, -49, -737, 912 1978, -3845, 10050, 11854, -2492, -238, -902, -6164, 913 -8576, -379, 464, -1213, 2358, -1431, 2782, -7271, 914 301, -585, 1529, 1803, -2600, 11246, 11289, -3647, 915 1463, -412, -7720, -7778, -812, -130, 1784, 1791, 916 -7749, -578, 2504, 2513, 232, -1004, -1008, 325, 917 3442, 907, 2725, 8970, 3638, -723, -50, -453, 918 -4911, -808, -190, -572, -150, -1884, -496, -1492, 919 -764, -201, -605, -1992, -126, 17498, 3481, -2003, 920 1090, 0, -18689, -739, -244, -72, 135, 26, 921 -3717, -15, 2139, 425, 8, -1165, -231, 133, 922 -1814, 1048, -2164, 4070, 16272, -200, -67, -285, 923 -1011, -16160, 116, -239, 138, 450, -260, 537, 924 1801, -1041, 2149, -4042, 9354, 12580, -1883, 962, 925 -617, -5341, -9660, -216, -56, -23, -7183, 1075, 926 1446, -549, -738, 110, 352, 474, -71, 36, 927 1708, 4199, 7387, 6335, 1003, -178, -1076, -3330, 928 -2449, -61, -437, -770, -1893, -660, -1623, -2856, 929 -104, -257, -452, -388, -2624, 5623, 17310, -2353, 930 592, -420, -1930, -18288, -338, -21, 900, 2772, 931 -5941, -376, 807, 2486, 94, -203, -625, 85, 932 1211, -850, 1193, -1926, 15992, -89, -44, -86, 933 -226, -15609, 62, -88, 61, 142, -100, 140, 934 -1182, 830, -1165, 1880, 3983, -2054, 11506, -19, 935 3622, -968, -257, -8080, 0, -801, 499, -2797, 936 1442, 4, -2, 13, -880, 454, -2544, 4, 937 -786, -1354, 16092, 7246, -1665, -37, -111, -15805, 938 -3205, -169, -65, 772, 1330, 348, 599, -7117, 939 -80, -137, 1636, 736, -4316, -511, 6674, 11665, 940 4633, -1137, -15, -2719, -8305, -1310, -134, 1758, 941 208, 3073, 364, -4752, 1220, 144, -1887, -3299, 942 7912, 4557, 1937, 1885, 7037, -3821, -1267, -229, 943 -216, -3022, -2200, -935, -538, -910, -524, -222, 944 -3398, -1957, -832, -809, 3434, 2967, 5867, 8196, 945 8766, -720, -537, -2101, -4100, -4690, -622, -1230, 946 -1062, -1718, -1484, -2935, -1837, -1588, -3139, -4385, 947 5881, 9176, 8119, 3934, 3355, -2111, -5139, -4023, 948 -944, -687, -3294, -2914, -4547, -1412, -2203, -1949, 949 -1204, -1879, -1662, -805 950 }; 951 952 static const int16_t adaptive_cb_gain170[170 * 20] = { 953 0, 0, 0, 0, 0, 0, 0, 0, 954 0, 0, 0, 0, 0, 0, 0, 0, 955 0, 0, 0, 0, 776, 212, 715, 670, 956 809, -36, -2, -31, -27, -39, -10, -33, 957 -9, -31, -8, -29, -38, -10, -35, -33, 958 1296, 1316, -168, -320, -815, -102, -105, -1, 959 -6, -40, -104, 13, 13, 25, 25, -3, 960 64, 65, -8, -15, -589, 680, 2478, 308, 961 -596, -21, -28, -375, -5, -21, 24, 89, 962 -102, 11, -12, -46, -21, 24, 90, 11, 963 -735, -487, -5, 2948, 468, -33, -14, 0, 964 -530, -13, -21, 0, 0, 132, 87, 0, 965 21, 13, 0, -84, 1042, 1730, 1068, 333, 966 626, -66, -182, -69, -6, -23, -110, -67, 967 -112, -21, -35, -21, -39, -66, -40, -12, 968 486, -769, 4074, 2825, -1107, -14, -36, -1013, 969 -487, -74, 22, -120, 191, -83, 132, -702, 970 32, -52, 275, 191, 1521, -767, -124, 4320, 971 1026, -141, -35, 0, -1139, -64, 71, 11, 972 -5, -401, 202, 32, -95, 48, 7, -270, 973 2425, 1267, 3439, -91, -1166, -359, -98, -722, 974 0, -83, -187, -509, -266, 13, 7, 19, 975 172, 90, 244, -6, -1251, 975, 173, 4039, 976 2005, -95, -58, -1, -996, -245, 74, 13, 977 -10, 308, -240, -42, 153, -119, -21, -494, 978 1820, 632, 1322, 2062, 1031, -202, -24, -106, 979 -259, -64, -70, -146, -51, -229, -79, -166, 980 -114, -39, -83, -129, -447, 4904, 244, -315, 981 -2038, -12, -1467, -3, -6, -253, 134, 6, 982 -73, -8, 94, 4, -55, 610, 30, -39, 983 -208, -1102, 463, -448, 5653, -2, -74, -13, 984 -12, -1950, -14, 5, 31, -5, -30, 12, 985 71, 380, -159, 154, 4739, 2600, -1864, 856, 986 -1554, -1371, -412, -212, -44, -147, -752, 539, 987 295, -247, -135, 97, 449, 246, -176, 81, 988 1894, 3533, 35, -26, 2145, -219, -762, 0, 989 0, -280, -408, -4, -7, 3, 5, 0, 990 -248, -462, -4, 3, -2699, 1841, 4072, 2443, 991 1582, -444, -207, -1012, -364, -152, 303, 670, 992 -457, 402, -274, -607, 260, -177, -393, -236, 993 -844, 3358, 6106, -1059, -537, -43, -688, -2275, 994 -68, -17, 173, 314, -1251, -54, 217, 395, 995 -27, 110, 200, -34, 1251, 1016, 3020, 2210, 996 1445, -95, -63, -556, -298, -127, -77, -230, 997 -187, -168, -137, -407, -110, -89, -266, -194, 998 2099, 2277, 4038, 3533, -2870, -269, -316, -995, 999 -762, -503, -291, -517, -561, -452, -491, -871, 1000 367, 399, 707, 619, 400, -1114, 8516, 2422, 1001 -1117, -9, -75, -4426, -358, -76, 27, -208, 1002 579, -59, 164, -1259, 27, -75, 580, 165, 1003 -4398, -2011, 3912, -2407, 2258, -1180, -247, -934, 1004 -353, -311, -540, 1050, 480, -646, -295, 575, 1005 606, 277, -539, 331, 1767, -1447, 4240, 6160, 1006 -757, -190, -127, -1097, -2316, -35, 156, -457, 1007 374, -664, 544, -1594, 81, -66, 195, 284, 1008 1594, -1463, 1035, 6938, 1920, -155, -130, -65, 1009 -2938, -225, 142, -100, 92, -675, 619, -438, 1010 -186, 171, -121, -813, -562, 4716, 4085, -591, 1011 2421, -19, -1357, -1018, -21, -357, 162, 140, 1012 -1175, -20, 170, 147, 83, -696, -603, 87, 1013 1552, 8778, -935, 354, -1424, -147, -4703, -53, 1014 -7, -123, -831, 88, 501, -33, -189, 20, 1015 134, 763, -81, 30, 4831, -4431, 41, -1479, 1016 -2976, -1424, -1198, 0, -133, -540, 1306, -12, 1017 11, 436, -400, 3, 877, -804, 7, -268, 1018 2090, 1192, 1006, 1645, 4853, -266, -86, -61, 1019 -165, -1437, -152, -128, -73, -210, -119, -101, 1020 -619, -353, -298, -487, 2386, 5712, 1426, -94, 1021 1350, -347, -1991, -124, 0, -111, -832, -207, 1022 -497, 13, 32, 8, -196, -470, -117, 7, 1023 -1349, 1091, 1659, 8891, 313, -111, -72, -168, 1024 -4825, -5, 89, 136, -110, 732, -592, -900, 1025 25, -20, -31, -170, 9980, 916, -381, -808, 1026 88, -6080, -51, -8, -39, 0, -558, 232, 1027 21, 492, 45, -18, -53, -4, 2, 4, 1028 2338, -1031, -248, 3928, 6484, -333, -64, -3, 1029 -942, -2566, 147, 35, -15, -560, 247, 59, 1030 -925, 408, 98, -1555, 6166, -1240, -337, 3672, 1031 -1277, -2320, -93, -6, -823, -99, 466, 126, 1032 -25, -1382, 278, 75, 480, -96, -26, 286, 1033 4377, -132, -2588, 1701, 4865, -1169, -1, -409, 1034 -176, -1444, 35, 691, -20, -454, 13, 268, 1035 -1299, 39, 768, -505, 2594, 3295, 3944, 1481, 1036 682, -410, -662, -949, -133, -28, -521, -624, 1037 -793, -234, -297, -356, -108, -137, -164, -61, 1038 4151, 624, 815, 4485, 2229, -1052, -23, -40, 1039 -1228, -303, -158, -206, -31, -1136, -170, -223, 1040 -565, -84, -111, -610, -3575, -361, 4924, 2791, 1041 4698, -780, -7, -1480, -475, -1347, -78, 1074, 1042 108, 609, 61, -839, 1025, 103, -1412, -800, 1043 -2518, 3791, 8623, 315, 2465, -387, -877, -4538, 1044 -6, -370, 582, 1325, -1995, 48, -73, -166, 1045 378, -570, -1297, -47, -691, 2989, 9957, -421, 1046 -1142, -29, -545, -6051, -10, -79, 126, 420, 1047 -1817, -17, 76, 256, -48, 208, 694, -29, 1048 -1918, 104, -3190, -3410, -4440, -224, 0, -621, 1049 -709, -1203, 12, -373, 20, -399, 21, -664, 1050 -519, 28, -864, -924, -3359, -1668, 1854, 6939, 1051 1430, -688, -169, -209, -2939, -124, -341, 380, 1052 188, 1422, 706, -785, 293, 145, -161, -606, 1053 42, 9706, 3164, -952, 907, 0, -5750, -611, 1054 -55, -50, -25, -8, -1874, 2, 564, 183, 1055 -2, -537, -175, 52, 1607, 785, 2862, 4327, 1056 3307, -157, -37, -500, -1143, -667, -77, -280, 1057 -137, -424, -207, -756, -324, -158, -577, -873, 1058 6801, 3416, 2227, 1682, -3217, -2823, -712, -302, 1059 -172, -631, -1418, -924, -464, -698, -350, -228, 1060 1335, 670, 437, 330, 3459, 3898, 364, 7841, 1061 -2640, -730, -927, -8, -3753, -425, -823, -76, 1062 -86, -1655, -1865, -174, 557, 628, 58, 1263, 1063 -5902, -3458, -2465, -1886, 4334, -2126, -730, -371, 1064 -217, -1146, -1245, -888, -520, -679, -398, -283, 1065 1561, 915, 652, 499, -3710, 1133, 7849, 3443, 1066 -215, -840, -78, -3760, -723, -2, 256, 1777, 1067 -543, 779, -238, -1649, -48, 14, 103, 45, 1068 4132, 2828, 2, -4212, -4116, -1042, -488, 0, 1069 -1083, -1034, -713, 0, 0, 1062, 727, 0, 1070 1038, 710, 0, -1058, 5875, 8496, -1796, 1376, 1071 -1786, -2107, -4406, -197, -115, -194, -3047, 644, 1072 931, -493, -713, 150, 640, 926, -195, 150, 1073 3143, 3483, 3546, -793, 4489, -603, -740, -767, 1074 -38, -1230, -668, -680, -754, 152, 168, 171, 1075 -861, -954, -971, 217, 2845, 7965, 3695, -5432, 1076 3978, -494, -3873, -833, -1801, -966, -1383, -641, 1077 -1796, 943, 2641, 1225, -691, -1934, -897, 1319, 1078 1538, 150, 7139, 2049, 3097, -144, -1, -3110, 1079 -256, -585, -14, -670, -65, -192, -18, -892, 1080 -290, -28, -1349, -387, 618, 7520, 4729, -238, 1081 -3373, -23, -3452, -1365, -3, -694, -283, -178, 1082 -2170, 8, 109, 68, 127, 1548, 973, -49, 1083 2965, -3013, 7912, 7076, -1997, -536, -554, -3821, 1084 -3056, -243, 545, -1431, 1455, -1280, 1301, -3417, 1085 361, -367, 964, 862, 2443, -929, -1113, 9677, 1086 4138, -364, -52, -75, -5716, -1045, 138, 166, 1087 -63, -1443, 549, 657, -617, 234, 281, -2444, 1088 1966, 3309, 10085, -3399, 2105, -236, -668, -6207, 1089 -705, -270, -397, -1210, -2037, 408, 686, 2092, 1090 -252, -425, -1295, 436, -112, -1368, 8868, 4822, 1091 2048, 0, -114, -4800, -1419, -256, -9, 61, 1092 740, 33, 402, -2610, 14, 171, -1108, -602, 1093 -2597, 438, -1839, 6229, 7266, -411, -11, -206, 1094 -2368, -3223, 69, -291, 49, 987, -166, 699, 1095 1152, -194, 816, -2763, 3454, 553, 9127, 4946, 1096 -5596, -728, -18, -5084, -1493, -1911, -116, -1924, 1097 -308, -1042, -166, -2755, 1179, 188, 3117, 1689, 1098 -532, -663, 12262, 2495, -1004, -17, -26, -9177, 1099 -380, -61, -21, 398, 496, 81, 101, -1867, 1100 -32, -40, 751, 152, -2100, 1317, -1509, 11425, 1101 2997, -269, -105, -139, -7967, -548, 168, -193, 1102 121, 1464, -918, 1052, 384, -240, 276, -2090, 1103 1193, -2697, 11259, 5373, -763, -86, -444, -7737, 1104 -1762, -35, 196, -819, 1853, -391, 884, -3692, 1105 55, -125, 525, 250, 2405, -471, 11079, 203, 1106 782, -353, -13, -7491, -2, -37, 69, -1626, 1107 318, -29, 5, -137, -114, 22, -529, -9, 1108 -1871, 5685, 11290, -2662, 1353, -213, -1972, -7780, 1109 -432, -111, 649, 1289, -3917, -304, 923, 1834, 1110 154, -469, -932, 220, -3768, 5927, -3093, 5041, 1111 5212, -866, -2144, -584, -1551, -1658, 1363, -711, 1112 1119, 1159, -1824, 951, 1198, -1885, 984, -1603, 1113 -2546, 9502, 5969, -2440, 1928, -395, -5511, -2175, 1114 -363, -226, 1477, 927, -3462, -379, 1415, 889, 1115 299, -1118, -702, 287, -4963, 3568, 4592, 5508, 1116 3451, -1503, -777, -1287, -1851, -727, 1080, 1391, 1117 -1000, 1668, -1199, -1543, 1045, -751, -967, -1160, 1118 1745, -2586, 3983, 10899, -1551, -186, -408, -968, 1119 -7250, -146, 275, -424, 628, -1161, 1720, -2649, 1120 165, -244, 377, 1032, 867, -456, -727, 3369, 1121 11822, -45, -12, -32, -692, -8531, 24, 38, 1122 -20, -178, 93, 149, -625, 329, 525, -2431, 1123 7535, 2422, 1926, 1405, 1599, -3466, -358, -226, 1124 -120, -156, -1114, -886, -284, -646, -207, -165, 1125 -735, -236, -188, -137, 1041, -735, -142, 13209, 1126 1515, -66, -33, -1, -10649, -140, 46, 9, 1127 -6, -839, 593, 114, -96, 68, 13, -1222, 1128 7950, 6745, -1444, -1008, 2721, -3857, -2777, -127, 1129 -62, -452, -3273, 700, 594, 489, 415, -88, 1130 -1320, -1120, 239, 167, -4754, -1379, 4522, -578, 1131 -5733, -1379, -116, -1248, -20, -2006, -400, 1312, 1132 380, -167, -48, 159, -1663, -482, 1582, -202, 1133 3220, 5978, 5923, 2430, -2689, -633, -2181, -2141, 1134 -360, -441, -1175, -1164, -2161, -477, -886, -878, 1135 528, 981, 972, 398, 377, 1312, 13978, -1470, 1136 677, -8, -105, -11925, -132, -28, -30, -321, 1137 -1119, 33, 117, 1254, -15, -54, -577, 60, 1138 -3435, 6770, 314, -885, 5686, -720, -2797, -6, 1139 -47, -1973, 1419, 65, -129, -185, 366, 16, 1140 1192, -2349, -109, 307, 3171, 8774, -2260, 2679, 1141 3069, -613, -4699, -312, -438, -575, -1698, 437, 1142 1210, -518, -1435, 369, -594, -1643, 423, -501, 1143 5557, 1509, 5407, -125, -7386, -1884, -139, -1784, 1144 0, -3330, -511, -1834, -498, 42, 11, 41, 1145 2505, 680, 2438, -56, -2838, 2595, 13228, 271, 1146 1793, -491, -411, -10680, -4, -196, 449, 2291, 1147 -2095, 47, -42, -219, 310, -284, -1447, -29, 1148 664, -278, 14966, 951, -711, -26, -4, -13672, 1149 -55, -30, 11, -606, 253, -38, 16, -869, 1150 28, -12, 650, 41, 808, 1770, 8658, 5863, 1151 -1486, -39, -191, -4576, -2098, -134, -87, -427, 1152 -935, -289, -633, -3098, 73, 160, 785, 531, 1153 3063, 1539, 2000, -542, 9576, -572, -144, -244, 1154 -17, -5597, -287, -374, -188, 101, 51, 66, 1155 -1790, -900, -1169, 317, 514, 14083, -323, 896, 1156 -891, -16, -12106, -6, -49, -48, -442, 10, 1157 277, -28, -770, 17, 27, 766, -17, 48, 1158 892, 158, 5237, 11057, -1603, -48, -1, -1674, 1159 -7462, -156, -8, -285, -50, -602, -106, -3534, 1160 87, 15, 512, 1082, -1612, 2564, -4296, 12526, 1161 5710, -158, -401, -1126, -9576, -1990, 252, -422, 1162 672, 1232, -1960, 3284, 561, -893, 1497, -4365, 1163 4889, -6878, 612, 6109, 4753, -1459, -2887, -22, 1164 -2277, -1379, 2052, -182, 257, -1823, 2564, -228, 1165 -1418, 1995, -177, -1772, 3053, -506, 2403, 9625, 1166 1322, -569, -15, -352, -5655, -106, 94, -448, 1167 74, -1794, 297, -1412, -246, 40, -194, -777, 1168 -754, 12904, 4480, -2113, 1471, -34, -10163, -1225, 1169 -272, -132, 594, 206, -3529, -97, 1664, 577, 1170 67, -1159, -402, 189, 4255, 1476, 5055, 2393, 1171 2912, -1105, -132, -1559, -349, -517, -383, -1313, 1172 -455, -621, -215, -738, -756, -262, -898, -425, 1173 -1371, 535, 1417, 14604, -997, -114, -17, -122, 1174 -13017, -60, 44, 118, -46, 1222, -477, -1263, 1175 -83, 32, 86, 888, 5368, -1744, 4083, -1236, 1176 3753, -1758, -185, -1017, -93, -860, 571, -1338, 1177 434, 405, -131, 308, -1229, 399, -935, 283, 1178 1588, -3097, 14415, 3699, -1171, -154, -585, -12683, 1179 -835, -83, 300, -1397, 2725, -358, 699, -3255, 1180 113, -221, 1030, 264, 212, 7989, 9471, -3344, 1181 2009, -2, -3895, -5475, -682, -246, -103, -123, 1182 -4618, 43, 1630, 1933, -26, -979, -1161, 410, 1183 856, 2294, -627, 6930, 6929, -44, -321, -24, 1184 -2931, -2930, -119, 32, 87, -362, -970, 265, 1185 -362, -970, 265, -2931, 2357, -4187, 7162, 7683, 1186 3371, -339, -1070, -3131, -3603, -693, 602, -1030, 1187 1830, -1105, 1963, -3359, -485, 861, -1474, -1581, 1188 350, 4585, 14053, -3819, 1218, -7, -1283, -12054, 1189 -890, -90, -97, -300, -3933, 81, 1068, 3275, 1190 -26, -341, -1045, 284, -3248, 3531, 475, 2137, 1191 11711, -644, -761, -13, -278, -8372, 700, 94, 1192 -102, 423, -460, -62, 2322, -2524, -340, -1528, 1193 -3017, 3852, 1725, 8440, 5257, -555, -905, -181, 1194 -4348, -1686, 709, 317, -405, 1554, -1984, -889, 1195 968, -1236, -553, -2708, -909, 3196, 15512, -2528, 1196 1066, -50, -623, -14686, -390, -69, 177, 861, 1197 -3026, -140, 493, 2393, 59, -208, -1009, 164, 1198 959, -3370, 9617, 9545, -1761, -56, -693, -5645, 1199 -5561, -189, 197, -563, 1978, -558, 1963, -5603, 1200 103, -362, 1034, 1026, 7575, 11796, -4845, 3252, 1201 -1703, -3502, -8493, -1433, -645, -177, -5454, 2240, 1202 3488, -1503, -2341, 961, 787, 1226, -503, 338, 1203 6409, 1722, 1764, -4191, 6015, -2507, -181, -189, 1204 -1072, -2208, -673, -690, -185, 1639, 440, 451, 1205 -2353, -632, -647, 1538, -2420, 12161, 5038, 1286, 1206 -2098, -357, -9027, -1549, -100, -268, 1796, 744, 1207 -3740, 190, -954, -395, -310, 1557, 645, 164, 1208 -2232, -1341, 7246, 9470, -1977, -304, -109, -3204, 1209 -5474, -238, -182, 987, 593, 1290, 775, -4188, 1210 -269, -161, 874, 1143, 1030, 7034, 4231, 1551, 1211 3077, -64, -3019, -1093, -146, -577, -442, -266, 1212 -1816, -97, -666, -400, -193, -1321, -794, -291, 1213 5121, 11835, -477, -1749, 2298, -1601, -8549, -13, 1214 -186, -322, -3699, 149, 344, 546, 1264, -50, 1215 -718, -1660, 66, 245, -3328, 3827, 5921, 9976, 1216 -1045, -676, -894, -2140, -6075, -66, 777, 1203, 1217 -1383, 2027, -2330, -3605, -212, 244, 377, 636, 1218 3813, 5718, -4666, -3412, 5674, -887, -1995, -1329, 1219 -710, -1965, -1331, 1086, 1628, 794, 1191, -972, 1220 -1320, -1980, 1616, 1181, 1348, -3672, 13154, 6938, 1221 -1690, -110, -823, -10561, -2938, -174, 302, -1082, 1222 2948, -570, 1555, -5570, 139, -379, 1357, 716, 1223 2151, -3586, 6949, 12131, -1224, -282, -785, -2947, 1224 -8982, -91, 470, -912, 1521, -1592, 2655, -5145, 1225 160, -268, 519, 906, -2889, 9647, 10276, -2728, 1226 995, -509, -5680, -6445, -454, -60, 1701, 1812, 1227 -6051, -481, 1606, 1711, 175, -586, -624, 165, 1228 6177, 2184, 555, 1985, 6589, -2329, -291, -18, 1229 -240, -2650, -823, -209, -74, -748, -264, -67, 1230 -2484, -878, -223, -798, -492, 391, 17166, -681, 1231 240, -14, -9, -17987, -28, -3, 11, 515, 1232 -410, -20, 16, 713, 7, -5, -252, 10, 1233 12628, 5448, -2630, 3011, -2695, -9733, -1811, -422, 1234 -553, -443, -4199, 2027, 874, -2321, -1001, 483, 1235 2077, 896, -432, 495, -3628, -534, 3447, 7002, 1236 6751, -803, -17, -725, -2992, -2782, -118, 763, 1237 112, 1550, 228, -1473, 1495, 220, -1420, -2885, 1238 -5239, 5901, 8107, 3650, 4846, -1675, -2125, -4012, 1239 -813, -1433, 1887, 2592, -2920, 1167, -1315, -1806, 1240 1550, -1745, -2398, -1080, 6157, 6678, 4099, -1074, 1241 2348, -2314, -2722, -1025, -70, -336, -2509, -1540, 1242 -1670, 403, 437, 268, -882, -957, -587, 153, 1243 1079, 16099, 242, -881, 1690, -71, -15820, -3, 1244 -47, -174, -1060, -16, -238, 58, 865, 13, 1245 -111, -1661, -25, 90, -278, 227, -1039, 1636, 1246 16945, -4, -3, -65, -163, -17526, 3, -17, 1247 14, 27, -22, 103, 287, -234, 1074, -1693, 1248 15778, -1454, 574, -603, -107, -15195, -129, -20, 1249 -22, 0, 1400, -553, 51, 581, -53, 21, 1250 103, -9, 3, -3, 2406, -836, 13224, 7993, 1251 -4266, -353, -42, -10673, -3899, -1111, 122, -1942, 1252 674, -1174, 407, -6451, 626, -217, 3443, 2081, 1253 3184, 14368, -3336, 2255, -1801, -619, -12600, -679, 1254 -310, -198, -2793, 648, 2926, -438, -1977, 459, 1255 350, 1580, -366, 247, -1698, 17076, 2504, -539, 1256 -646, -176, -17798, -382, -17, -25, 1770, 259, 1257 -2610, -55, 561, 82, -67, 673, 98, -21, 1258 2375, -797, -2696, 14483, 5383, -344, -38, -443, 1259 -12803, -1769, 115, 391, -131, -2100, 705, 2384, 1260 -780, 262, 886, -4759, -2691, 2554, -4520, 9573, 1261 10655, -442, -398, -1247, -5594, -6930, 419, -742, 1262 704, 1572, -1492, 2641, 1750, -1661, 2939, -6226, 1263 -4332, -4399, -1657, 4880, 7375, -1145, -1181, -167, 1264 -1453, -3319, -1163, -438, -444, 1290, 1310, 493, 1265 1950, 1980, 745, -2196, -3498, 7405, 9955, 2693, 1266 -2971, -746, -3347, -6049, -442, -538, 1581, 2125, 1267 -4499, 575, -1217, -1636, -634, 1342, 1805, 488, 1268 6717, -3792, 7739, 2798, 3489, -2754, -877, -3655, 1269 -477, -743, 1554, -3173, 1791, -1147, 647, -1321, 1270 -1430, 807, -1648, -595, 5263, 9770, 3463, 1069, 1271 -3971, -1690, -5826, -732, -69, -962, -3138, -1112, 1272 -2065, -343, -637, -226, 1275, 2368, 839, 259, 1273 1243, -2634, 16772, 1871, 332, -94, -423, -17169, 1274 -213, -6, 199, -1273, 2696, -142, 300, -1915, 1275 -25, 53, -339, -37, 2691, 2836, 3105, 5711, 1276 4817, -442, -491, -588, -1991, -1416, -465, -510, 1277 -537, -938, -988, -1082, -791, -834, -913, -1679, 1278 4366, 2944, 7210, 3627, 1161, -1163, -529, -3172, 1279 -803, -82, -784, -1921, -1295, -966, -651, -1596, 1280 -309, -208, -511, -257, 13888, 3951, -671, -2305, 1281 3354, -11773, -953, -27, -324, -686, -3349, 569, 1282 161, 1954, 556, -94, -2843, -809, 137, 472, 1283 7053, 5847, 2929, 8378, -4794, -3036, -2086, -523, 1284 -4284, -1403, -2517, -1261, -1045, -3607, -2990, -1498, 1285 2064, 1711, 857, 2451, -2191, 12838, 9182, -3915, 1286 1617, -293, -10059, -5146, -935, -159, 1717, 1228, 1287 -7195, -523, 3068, 2194, 216, -1267, -906, 386, 1288 -4881, 13114, 5767, -435, 4155, -1454, -10498, -2030, 1289 -11, -1054, 3907, 1718, -4616, -129, 348, 153, 1290 1238, -3326, -1462, 110, 7843, -1250, 210, 7106, 1291 -5203, -3754, -95, -2, -3082, -1652, 598, -100, 1292 16, -3402, 542, -91, 2491, -397, 66, 2257, 1293 -2463, 8168, 14551, -3908, 1828, -370, -4072, -12923, 1294 -932, -204, 1228, 2188, -7254, -587, 1948, 3471, 1295 274, -911, -1623, 436, -1579, 347, -272, -2735, 1296 16031, -152, -7, -4, -456, -15686, 33, -26, 1297 5, -263, 58, -45, 1545, -340, 266, 2676, 1298 -6327, 1328, 5093, -5079, 7617, -2443, -107, -1583, 1299 -1574, -3541, 513, 1967, -413, -1961, 411, 1578, 1300 2941, -617, -2367, 2361, 3286, -4509, 11306, 11025, 1301 -2623, -659, -1241, -7802, -7419, -420, 904, -2267, 1302 3112, -2211, 3034, -7608, 526, -722, 1810, 1765, 1303 5567, 17853, -3754, 1166, -519, -1892, -19455, -860, 1304 -83, -16, -6067, 1275, 4090, -396, -1271, 267, 1305 176, 566, -119, 37, -2136, -424, 15292, 5108, 1306 -1648, -278, -10, -14273, -1593, -165, -55, 1993, 1307 396, 666, 132, -4768, -214, -42, 1538, 514, 1308 2267, -3297, 2549, 16563, -791, -313, -663, -396, 1309 -16745, -38, 456, -352, 513, -2291, 3333, -2576, 1310 109, -159, 123, 799, 3655, 1899, -3364, 6279, 1311 12510, -815, -220, -690, -2406, -9552, -423, 750, 1312 390, -1400, -728, 1289, -2791, -1450, 2568, -4794, 1313 8052, 2285, -6193, 5138, 6003, -3957, -318, -2341, 1314 -1611, -2199, -1123, 3044, 864, -2525, -716, 1942, 1315 -2950, -837, 2269, -1882, -386, -2291, 7679, 15387, 1316 -2723, -9, -320, -3599, -14452, -452, -54, 181, 1317 1074, 362, 2152, -7212, -64, -380, 1276, 2557, 1318 2777, -1173, 3984, 13079, 2508, -470, -84, -969, 1319 -10440, -384, 198, -675, 285, -2217, 936, -3180, 1320 -425, 179, -610, -2002, -1879, 1771, -2684, 16705, 1321 1833, -215, -191, -439, -17032, -205, 203, -308, 1322 290, 1916, -1805, 2736, 210, -198, 300, -1869, 1323 1052, 4495, 15519, 1467, -4032, -67, -1233, -14700, 1324 -131, -992, -288, -997, -4257, -94, -402, -1389, 1325 259, 1106, 3819, 361, 3010, 2544, 6969, 7559, 1326 1996, -553, -395, -2964, -3487, -243, -467, -1280, 1327 -1082, -1388, -1174, -3215, -366, -310, -849, -921, 1328 -5209, -1867, 8713, 10351, 1549, -1656, -212, -4634, 1329 -6540, -146, -593, 2770, 993, 3291, 1180, -5505, 1330 492, 176, -824, -979, -4314, 8513, 913, 7547, 1331 -2723, -1135, -4423, -50, -3476, -452, 2241, 240, 1332 -474, 1987, -3921, -420, -717, 1415, 151, 1254, 1333 12929, -1219, 2448, 1757, 6303, -10204, -90, -365, 1334 -188, -2425, 962, -1932, 182, -1386, 130, -262, 1335 -4974, 469, -941, -676, 6465, 4132, 3167, 3160, 1336 5697, -2551, -1042, -612, -609, -1981, -1630, -1249, 1337 -798, -1247, -797, -611, -2248, -1437, -1101, -1099, 1338 -3636, 4859, 18914, -1335, 810, -807, -1441, -21836, 1339 -108, -40, 1078, 4198, -5609, -296, 396, 1541, 1340 179, -240, -936, 66, 8844, 7864, 654, -4063, 1341 -5680, -4774, -3774, -26, -1007, -1969, -4245, -353, 1342 -314, 2193, 1950, 162, 3066, 2726, 226, -1408, 1343 1859, 2634, 9228, 996, 9464, -211, -423, -5197, 1344 -60, -5467, -299, -1047, -1483, -113, -160, -561, 1345 -1074, -1521, -5330, -575, 2949, 12260, 10290, -497, 1346 -3943, -530, -9174, -6463, -15, -949, -2206, -1852, 1347 -7700, 89, 372, 312, 709, 2950, 2476, -119, 1348 -2903, 1552, 14867, 9970, -496, -514, -147, -13491, 1349 -6068, -15, 275, 2634, -1408, 1766, -944, -9047, 1350 -87, 47, 450, 302, 3243, 8234, 7586, 3373, 1351 2151, -642, -4138, -3512, -694, -282, -1630, -1501, 1352 -3812, -667, -1695, -1561, -425, -1081, -996, -442, 1353 -9631, 60, 3501, 5359, 10150, -5662, 0, -748, 1354 -1752, -6288, 35, 2058, -12, 3150, -19, -1145, 1355 5967, -37, -2169, -3320, -6874, -2553, -5446, -2195, 1356 -7841, -2884, -397, -1810, -294, -3753, -1071, -2285, 1357 -848, -921, -342, -729, -3290, -1221, -2606, -1050, 1358 -3413, -1141, 4630, 13612, 7897, -711, -79, -1308, 1359 -11310, -3806, -237, 964, 322, 2836, 948, -3847, 1360 1645, 550, -2231, -6561, 4410, -5678, 8006, -3992, 1361 3811, -1187, -1968, -3912, -973, -886, 1528, -2155, 1362 2775, 1074, -1383, 1951, -1025, 1321, -1862, 928, 1363 5659, 11535, 2203, -452, 7169, -1954, -8121, -296, 1364 -12, -3137, -3984, -761, -1551, 156, 318, 60, 1365 -2476, -5048, -964, 197, 2914, -2914, 3485, -3965, 1366 13675, -518, -518, -741, -959, -11414, 518, -620, 1367 620, 705, -705, 843, -2433, 2432, -2909, 3310, 1368 7843, 1907, 1022, 8882, 7972, -3755, -222, -63, 1369 -4815, -3879, -913, -489, -119, -4252, -1034, -554, 1370 -3816, -928, -497, -4322, 13807, 9531, 1436, 1612, 1371 1779, -11636, -5544, -125, -158, -193, -8032, -1210, 1372 -835, -1358, -938, -141, -1499, -1035, -156, -175, 1373 13620, -5337, 5450, -2263, 1723, -11322, -1738, -1813, 1374 -312, -181, 4436, -4531, 1775, 1881, -737, 752, 1375 -1432, 561, -573, 238, 5297, 8374, 8872, 7694, 1376 6538, -1712, -4280, -4804, -3613, -2609, -2707, -2868, 1377 -4534, -2487, -3932, -4166, -2113, -3341, -3540, -3070 1378 }; 1379 1380 /** 1381 * 0.65^i (Zero part) and 0.75^i (Pole part) scaled by 2^15 1382 */ 1383 static const int16_t postfilter_tbl[2][LPC_ORDER] = { 1384 /* Zero */ 1385 {21299, 13844, 8999, 5849, 3802, 2471, 1606, 1044, 679, 441}, 1386 /* Pole */ 1387 {24576, 18432, 13824, 10368, 7776, 5832, 4374, 3281, 2460, 1845} 1388 }; 1389 1390 /** 1391 * Hamming window coefficients scaled by 2^15 1392 */ 1393 static const int16_t hamming_window[LPC_FRAME] = { 1394 2621, 2631, 2659, 2705, 2770, 2853, 2955, 3074, 3212, 3367, 1395 3541, 3731, 3939, 4164, 4405, 4663, 4937, 5226, 5531, 5851, 1396 6186, 6534, 6897, 7273, 7661, 8062, 8475, 8899, 9334, 9780, 1397 10235, 10699, 11172, 11653, 12141, 12636, 13138, 13645, 14157, 14673, 1398 15193, 15716, 16242, 16769, 17298, 17827, 18356, 18884, 19411, 19935, 1399 20457, 20975, 21489, 21999, 22503, 23002, 23494, 23978, 24455, 24924, 1400 25384, 25834, 26274, 26704, 27122, 27529, 27924, 28306, 28675, 29031, 1401 29373, 29700, 30012, 30310, 30592, 30857, 31107, 31340, 31557, 31756, 1402 31938, 32102, 32249, 32377, 32488, 32580, 32654, 32710, 32747, 32766, 1403 32766, 32747, 32710, 32654, 32580, 32488, 32377, 32249, 32102, 31938, 1404 31756, 31557, 31340, 31107, 30857, 30592, 30310, 30012, 29700, 29373, 1405 29031, 28675, 28306, 27924, 27529, 27122, 26704, 26274, 25834, 25384, 1406 24924, 24455, 23978, 23494, 23002, 22503, 21999, 21489, 20975, 20457, 1407 19935, 19411, 18884, 18356, 17827, 17298, 16769, 16242, 15716, 15193, 1408 14673, 14157, 13645, 13138, 12636, 12141, 11653, 11172, 10699, 10235, 1409 9780, 9334, 8899, 8475, 8062, 7661, 7273, 6897, 6534, 6186, 1410 5851, 5531, 5226, 4937, 4663, 4405, 4164, 3939, 3731, 3541, 1411 3367, 3212, 3074, 2955, 2853, 2770, 2705, 2659, 2631, 2621 1412 }; 1413 1414 /** 1415 * Binomial window coefficients scaled by 2^15 1416 */ 1417 static const int16_t binomial_window[LPC_ORDER] = { 1418 32749, 32695, 32604, 32477, 32315, 32118, 31887, 31622, 31324, 30995 1419 }; 1420 1421 /** 1422 * 0.994^i scaled by 2^15 1423 */ 1424 static const int16_t bandwidth_expand[LPC_ORDER] = { 1425 32571, 32376, 32182, 31989, 31797, 31606, 31416, 31228, 31040, 30854 1426 }; 1427 1428 /** 1429 * 0.5^i scaled by 2^15 1430 */ 1431 static const int16_t percept_flt_tbl[2][LPC_ORDER] = { 1432 /* Zero part */ 1433 {29491, 26542, 23888, 21499, 19349, 17414, 15673, 14106, 12695, 11425}, 1434 /* Pole part */ 1435 {16384, 8192, 4096, 2048, 1024, 512, 256, 128, 64, 32} 1436 }; 1437 1438 static const int cng_adaptive_cb_lag[4] = { 1, 0, 1, 3 }; 1439 1440 static const int cng_filt[4] = { 273, 998, 499, 333 }; 1441 1442 static const int cng_bseg[3] = { 2048, 18432, 231233 }; 1443 1444 #endif /* AVCODEC_G723_1_H */ 1445