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