📄 gain_util.c
字号:
/*/////////////////////////////////////////////////////////////////////////////
//
// INTEL CORPORATION PROPRIETARY INFORMATION
// This software is supplied under the terms of a license agreement or
// nondisclosure agreement with Intel Corporation and may not be copied
// or disclosed except in accordance with the terms of that agreement.
// Copyright(c) 2005 Intel Corporation. All Rights Reserved.
//
// Intel(R) Integrated Performance Primitives
// USC - Unified Speech Codec interface library
//
// By downloading and installing USC codec, you hereby agree that the
// accompanying Materials are being provided to you under the terms and
// conditions of the End User License Agreement for the Intel(R) Integrated
// Performance Primitives product previously accepted by you. Please refer
// to the file ipplic.htm located in the root directory of your Intel(R) IPP
// product installation for more information.
//
// A speech coding standards promoted by ITU, ETSI, 3GPP and other
// organizations. Implementations of these standards, or the standard enabled
// platforms may require licenses from various entities, including
// Intel Corporation.
//
//
// Purpose: GSMAMR speech codec: GAIN utilities.
//
*/
#include "owngsmamr.h"
/*********************************************************************************
* Scalar quantization tables of the codebook gain.
*********************************************************************************/
static __ALIGN32 CONST short pTblQntGainCode[LEN_QNT_GAIN*3] =
{
159, -3776, -22731, 206, -3394, -20428, 268, -3005,
-18088, 349, -2615, -15739, 419, -2345, -14113, 482,
-2138, -12867, 554, -1932, -11629, 637, -1726, -10387,
733, -1518, -9139, 842, -1314, -7906, 969, -1106,
-6656, 1114, -900, -5416, 1281, -694, -4173, 1473,
-487, -2931, 1694, -281, -1688, 1948, -75, -445,
2241, 133, 801, 2577, 339, 2044, 2963, 545,
3285, 3408, 752, 4530, 3919, 958, 5772, 4507,
1165, 7016, 5183, 1371, 8259, 5960, 1577, 9501,
6855, 1784, 10745, 7883, 1991, 11988, 9065, 2197,
13231, 10425, 2404, 14474, 12510, 2673, 16096, 16263,
3060, 18429, 21142, 3448, 20763, 27485, 3836, 23097
};
/****************************************************************************
* Function: ownQntGainCodebook_GSMAMR()
***************************************************************************/
short ownQntGainCodebook_GSMAMR (IppSpchBitRate rate, short expGainCodeCB, short fracGainCodeCB,
short *gain, short *pQntEnergyErr_M122, short *pQntEnergyErr)
{
const short *p;
short i, index;
short predGainCB, err, err_min;
short g_q0;
g_q0 = 0;
if(rate == IPP_SPCHBR_12200) g_q0 = *gain >> 1;
predGainCB = (short)(ownPow2_GSMAMR (expGainCodeCB, fracGainCodeCB));
if (rate == IPP_SPCHBR_12200) predGainCB = Cnvrt_32s16s(predGainCB << 4);
else predGainCB = Cnvrt_32s16s(predGainCB << 5);
p = &pTblQntGainCode[0];
if(rate == IPP_SPCHBR_12200)
err_min = Abs_16s((short)(g_q0 - (short)((predGainCB * *p++) >> 15)));
else
err_min = Abs_16s((short)(*gain - (short)((predGainCB * *p++) >> 15)));
p += 2;
index = 0;
for (i = 1; i < LEN_QNT_GAIN; i++) {
if (rate == IPP_SPCHBR_12200) err = Abs_16s((short)(g_q0 - ((predGainCB * *p++) >> 15)));
else err = Abs_16s((short)(*gain - ((predGainCB * *p++) >> 15)));
p += 2;
if (err < err_min) { err_min = err; index = i; }
}
p = &pTblQntGainCode[index * 3];
if (rate == IPP_SPCHBR_12200) *gain = Cnvrt_32s16s(((predGainCB * *p++) >> 15) << 1);
else *gain = (short)((predGainCB * *p++) >> 15);
*pQntEnergyErr_M122 = *p++;
*pQntEnergyErr = *p;
return index;
}
/***************************************************************************
* Function: ownQntGainPitch_M7950_GSMAMR() *
***************************************************************************/
short ownQntGainPitch_M7950_GSMAMR (short gainPitchLimit, short *gain, short *gain_cand, short *gain_cind)
{
short i, index;
short ii;
index = ownQntGainPitch_M122_GSMAMR(gainPitchLimit,*gain);
/* compute three pitchGainVar candidates around the index */
if (index == 0) ii = index;
else {
if (index == LEN_QNT_PITCH-1 || TableQuantGainPitch[index+1] > gainPitchLimit) ii = index - 2;
else ii = index - 1;
}
/* store candidate indices and values */
for (i = 0; i < 3; i++) {
gain_cind[i] = ii;
gain_cand[i] = TableQuantGainPitch[ii];
ii++;
}
*gain = TableQuantGainPitch[index];
return index;
}
short ownQntGainPitch_M122_GSMAMR (short gainPitchLimit, short gain)
{
short i, index, err_min;
IPP_ALIGNED_ARRAY (16,short,gain_diff,LEN_QNT_PITCH);
ippsSubC_16s_Sfs(TableQuantGainPitch, gain, gain_diff, LEN_QNT_PITCH, 0);
ippsAbs_16s_I(gain_diff,LEN_QNT_PITCH);
err_min = gain_diff[0];
index = 0;
for (i = 1; i < LEN_QNT_PITCH; i++) {
if (TableQuantGainPitch[i] > gainPitchLimit) break; /* qua_gain_pitch is mounting */
if (gain_diff[i] < err_min) {
err_min = gain_diff[i];
index = i;
}
}
return index;
}
#define MIN_QUA_ENER ( -5443) /* Q10 <-> log2 (0.0251189) */
#define MIN_QUA_ENER_MR122 (-32768) /* Q10 <-> 20*log10(0.0251189) */
#define MAX_QUA_ENER ( 3037) /* Q10 <-> log2 (7.8125) */
#define MAX_QUA_ENER_MR122 ( 18284) /* Q10 <-> 20*log10(7.8125) */
static __ALIGN32 CONST short table_gain_MR475[VEC_QNT_M475_SIZE*4] = {
812, 128, 542, 140, 2873, 1135, 2266, 3402,
2067, 563, 12677, 647, 4132, 1798, 5601, 5285,
7689, 374, 3735, 441, 10912, 2638, 11807, 2494,
20490, 797, 5218, 675, 6724, 8354, 5282, 1696,
1488, 428, 5882, 452, 5332, 4072, 3583, 1268,
2469, 901, 15894, 1005, 14982, 3271, 10331, 4858,
3635, 2021, 2596, 835, 12360, 4892, 12206, 1704,
13432, 1604, 9118, 2341, 3968, 1538, 5479, 9936,
3795, 417, 1359, 414, 3640, 1569, 7995, 3541,
11405, 645, 8552, 635, 4056, 1377, 16608, 6124,
11420, 700, 2007, 607, 12415, 1578, 11119, 4654,
13680, 1708, 11990, 1229, 7996, 7297, 13231, 5715,
2428, 1159, 2073, 1941, 6218, 6121, 3546, 1804,
8925, 1802, 8679, 1580, 13935, 3576, 13313, 6237,
6142, 1130, 5994, 1734, 14141, 4662, 11271, 3321,
12226, 1551, 13931, 3015, 5081, 10464, 9444, 6706,
1689, 683, 1436, 1306, 7212, 3933, 4082, 2713,
7793, 704, 15070, 802, 6299, 5212, 4337, 5357,
6676, 541, 6062, 626, 13651, 3700, 11498, 2408,
16156, 716, 12177, 751, 8065, 11489, 6314, 2256,
4466, 496, 7293, 523, 10213, 3833, 8394, 3037,
8403, 966, 14228, 1880, 8703, 5409, 16395, 4863,
7420, 1979, 6089, 1230, 9371, 4398, 14558, 3363,
13559, 2873, 13163, 1465, 5534, 1678, 13138, 14771,
7338, 600, 1318, 548, 4252, 3539, 10044, 2364,
10587, 622, 13088, 669, 14126, 3526, 5039, 9784,
15338, 619, 3115, 590, 16442, 3013, 15542, 4168,
15537, 1611, 15405, 1228, 16023, 9299, 7534, 4976,
1990, 1213, 11447, 1157, 12512, 5519, 9475, 2644,
7716, 2034, 13280, 2239, 16011, 5093, 8066, 6761,
10083, 1413, 5002, 2347, 12523, 5975, 15126, 2899,
18264, 2289, 15827, 2527, 16265, 10254, 14651, 11319,
1797, 337, 3115, 397, 3510, 2928, 4592, 2670,
7519, 628, 11415, 656, 5946, 2435, 6544, 7367,
8238, 829, 4000, 863, 10032, 2492, 16057, 3551,
18204, 1054, 6103, 1454, 5884, 7900, 18752, 3468,
1864, 544, 9198, 683, 11623, 4160, 4594, 1644,
3158, 1157, 15953, 2560, 12349, 3733, 17420, 5260,
6106, 2004, 2917, 1742, 16467, 5257, 16787, 1680,
17205, 1759, 4773, 3231, 7386, 6035, 14342, 10012,
4035, 442, 4194, 458, 9214, 2242, 7427, 4217,
12860, 801, 11186, 825, 12648, 2084, 12956, 6554,
9505, 996, 6629, 985, 10537, 2502, 15289, 5006,
12602, 2055, 15484, 1653, 16194, 6921, 14231, 5790,
2626, 828, 5615, 1686, 13663, 5778, 3668, 1554,
11313, 2633, 9770, 1459, 14003, 4733, 15897, 6291,
6278, 1870, 7910, 2285, 16978, 4571, 16576, 3849,
15248, 2311, 16023, 3244, 14459, 17808, 11847, 2763,
1981, 1407, 1400, 876, 4335, 3547, 4391, 4210,
5405, 680, 17461, 781, 6501, 5118, 8091, 7677,
7355, 794, 8333, 1182, 15041, 3160, 14928, 3039,
20421, 880, 14545, 852, 12337, 14708, 6904, 1920,
4225, 933, 8218, 1087, 10659, 4084, 10082, 4533,
2735, 840, 20657, 1081, 16711, 5966, 15873, 4578,
10871, 2574, 3773, 1166, 14519, 4044, 20699, 2627,
15219, 2734, 15274, 2186, 6257, 3226, 13125, 19480,
7196, 930, 2462, 1618, 4515, 3092, 13852, 4277,
10460, 833, 17339, 810, 16891, 2289, 15546, 8217,
13603, 1684, 3197, 1834, 15948, 2820, 15812, 5327,
17006, 2438, 16788, 1326, 15671, 8156, 11726, 8556,
3762, 2053, 9563, 1317, 13561, 6790, 12227, 1936,
8180, 3550, 13287, 1778, 16299, 6599, 16291, 7758,
8521, 2551, 7225, 2645, 18269, 7489, 16885, 2248,
17882, 2884, 17265, 3328, 9417, 20162, 11042, 8320,
1286, 620, 1431, 583, 5993, 2289, 3978, 3626,
5144, 752, 13409, 830, 5553, 2860, 11764, 5908,
10737, 560, 5446, 564, 13321, 3008, 11946, 3683,
19887, 798, 9825, 728, 13663, 8748, 7391, 3053,
2515, 778, 6050, 833, 6469, 5074, 8305, 2463,
6141, 1865, 15308, 1262, 14408, 4547, 13663, 4515,
3137, 2983, 2479, 1259, 15088, 4647, 15382, 2607,
14492, 2392, 12462, 2537, 7539, 2949, 12909, 12060,
5468, 684, 3141, 722, 5081, 1274, 12732, 4200,
15302, 681, 7819, 592, 6534, 2021, 16478, 8737,
13364, 882, 5397, 899, 14656, 2178, 14741, 4227,
14270, 1298, 13929, 2029, 15477, 7482, 15815, 4572,
2521, 2013, 5062, 1804, 5159, 6582, 7130, 3597,
10920, 1611, 11729, 1708, 16903, 3455, 16268, 6640,
9306, 1007, 9369, 2106, 19182, 5037, 12441, 4269,
15919, 1332, 15357, 3512, 11898, 14141, 16101, 6854,
2010, 737, 3779, 861, 11454, 2880, 3564, 3540,
9057, 1241, 12391, 896, 8546, 4629, 11561, 5776,
8129, 589, 8218, 588, 18728, 3755, 12973, 3149,
15729, 758, 16634, 754, 15222, 11138, 15871, 2208,
4673, 610, 10218, 678, 15257, 4146, 5729, 3327,
8377, 1670, 19862, 2321, 15450, 5511, 14054, 5481,
5728, 2888, 7580, 1346, 14384, 5325, 16236, 3950,
15118, 3744, 15306, 1435, 14597, 4070, 12301, 15696,
7617, 1699, 2170, 884, 4459, 4567, 18094, 3306,
12742, 815, 14926, 907, 15016, 4281, 15518, 8368,
17994, 1087, 2358, 865, 16281, 3787, 15679, 4596,
16356, 1534, 16584, 2210, 16833, 9697, 15929, 4513,
3277, 1085, 9643, 2187, 11973, 6068, 9199, 4462,
8955, 1629, 10289, 3062, 16481, 5155, 15466, 7066,
13678, 2543, 5273, 2277, 16746, 6213, 16655, 3408,
20304, 3363, 18688, 1985, 14172, 12867, 15154, 15703,
4473, 1020, 1681, 886, 4311, 4301, 8952, 3657,
5893, 1147, 11647, 1452, 15886, 2227, 4582, 6644,
6929, 1205, 6220, 799, 12415, 3409, 15968, 3877,
19859, 2109, 9689, 2141, 14742, 8830, 14480, 2599,
1817, 1238, 7771, 813, 19079, 4410, 5554, 2064,
3687, 2844, 17435, 2256, 16697, 4486, 16199, 5388,
8028, 2763, 3405, 2119, 17426, 5477, 13698, 2786,
19879, 2720, 9098, 3880, 18172, 4833, 17336, 12207,
5116, 996, 4935, 988, 9888, 3081, 6014, 5371,
15881, 1667, 8405, 1183, 15087, 2366, 19777, 7002,
11963, 1562, 7279, 1128, 16859, 1532, 15762, 5381,
14708, 2065, 20105, 2155, 17158, 8245, 17911, 6318,
5467, 1504, 4100, 2574, 17421, 6810, 5673, 2888,
16636, 3382, 8975, 1831, 20159, 4737, 19550, 7294,
6658, 2781, 11472, 3321, 19397, 5054, 18878, 4722,
16439, 2373, 20430, 4386, 11353, 26526, 11593, 3068,
2866, 1566, 5108, 1070, 9614, 4915, 4939, 3536,
7541, 878, 20717, 851, 6938, 4395, 16799, 7733,
10137, 1019, 9845, 964, 15494, 3955, 15459, 3430,
18863, 982, 20120, 963, 16876, 12887, 14334, 4200,
6599, 1220, 9222, 814, 16942, 5134, 5661, 4898,
5488, 1798, 20258, 3962, 17005, 6178, 17929, 5929,
9365, 3420, 7474, 1971, 19537, 5177, 19003, 3006,
16454, 3788, 16070, 2367, 8664, 2743, 9445, 26358,
10856, 1287, 3555, 1009, 5606, 3622, 19453, 5512,
12453, 797, 20634, 911, 15427, 3066, 17037, 10275,
18883, 2633, 3913, 1268, 19519, 3371, 18052, 5230,
19291, 1678, 19508, 3172, 18072, 10754, 16625, 6845,
3134, 2298, 10869, 2437, 15580, 6913, 12597, 3381,
11116, 3297, 16762, 2424, 18853, 6715, 17171, 9887,
12743, 2605, 8937, 3140, 19033, 7764, 18347, 3880,
20475, 3682, 19602, 3380, 13044, 19373, 10526, 23124
};
/*********************************************************************************
* Quantization of pitch and codebook gains for MR475.
*********************************************************************************/
static void ownQntStoreResults_M475(short *a_PastQntEnergy, short *a_PastQntEnergy_M122, const short *p,
short predGainCB, short expGainCodeCB, short *pitchGainVar, short *codeGainVar)
{
int i;
short g_code, exp, frac, tmp;
int TmpCode;
short qntEnergyErr_M122;
short qntEnergyErr;
*pitchGainVar = *p++;
g_code = *p++;
TmpCode = 2 * g_code * predGainCB;
if(expGainCodeCB > 10) TmpCode <<= (expGainCodeCB - 10);
else TmpCode >>= (10 - expGainCodeCB);
*codeGainVar = (short)(TmpCode >> 16);
ownLog2_GSMAMR (g_code, &exp, &frac);
exp -= 12;
tmp = frac >> 5;
qntEnergyErr_M122 = tmp + (exp << 10);
TmpCode = Mul16s_32s(exp, frac, 24660);
qntEnergyErr = Cnvrt_NR_32s16s(TmpCode << 13);
for (i = 3; i > 0; i--) {
a_PastQntEnergy[i] = a_PastQntEnergy[i - 1];
a_PastQntEnergy_M122[i] = a_PastQntEnergy_M122[i - 1];
}
a_PastQntEnergy_M122[0] = qntEnergyErr_M122;
a_PastQntEnergy[0] = qntEnergyErr;
}
/*************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -