⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gain_util.c

📁 G.711,G.723.1,G.726,G.729,GSM CODEC C/C++ code
💻 C
📖 第 1 页 / 共 4 页
字号:


    TmpVal = 2 * alpha * fracEnergyCoeff[0];
    Time0 = ownSqrt_Exp_GSMAMR(TmpVal, &exp);
    exp += 47;
    expCoeff[0] = expEnergyCoeff[0] - exp;

    e_max = expCoeff[0] + 31;
    for (i = 1; i <= 4; i++)  {
        if (expCoeff[i] > e_max) e_max = expCoeff[i];
    }

    tmp = e_max - expCoeff[1];
    Time1 >>= tmp;

    for (i = 2; i <= 4; i++) {
        tmp = e_max - expCoeff[i];
        TmpVal = coeff[i] << 16;
        TmpVal >>= tmp;
        L_Extract(TmpVal, &coeff[i], &coeff_lo[i]);
    }

    exp = e_max - 31;             /* new exponent */
    tmp = exp - expCoeff[0];
    Time0 >>= (tmp >> 1);

    if((tmp & 0x1) != 0) {
        L_Extract(Time0, &coeff[0], &coeff_lo[0]);
        Time0 = Mul16s_32s(coeff[0], coeff_lo[0], 23170);
    }

    dist_min = IPP_MAX_32S;
    index = 0;
    p = &pTblQntGainCode[0];

    for (i = 0; i < LEN_QNT_GAIN; i++) {
        g_code = *p;
        p+=3;
        g_code = (short)((g_code * predGainCB) >> 15);

        if(g_code >= decGainCode) break;

        TmpVal = 2 * g_code * g_code;
        L_Extract (TmpVal, &g2_code_h, &g2_code_l);

        tmp = g_code - gainCodeUnQnt;
        TmpVal = 2 * tmp * tmp;
        L_Extract (TmpVal, &d2_code_h, &d2_code_l);

        TmpVal = AddProduct16s_32s (Time1, coeff[2], coeff_lo[2], g_code);
        TmpVal = AddProduct_32s(TmpVal, coeff[3], coeff_lo[3], g2_code_h, g2_code_l);

        TmpVal = ownSqrt_Exp_GSMAMR(TmpVal, &exp);
        TmpVal >>= (exp >> 1);

        tmp = Cnvrt_NR_32s16s(TmpVal - Time0);
        TmpVal = 2 * tmp * tmp;

        TmpVal = AddProduct_32s(TmpVal, coeff[4], coeff_lo[4], d2_code_h, d2_code_l);

        if (TmpVal < dist_min) {
            dist_min = TmpVal;
            index = i;
        }
    }

    p = &pTblQntGainCode[3 * index];
    g_code = *p++;
    *qntEnergyErr_M122 = *p++;
    *qntEnergyErr = *p;

    TmpVal = 2 * g_code * predGainCB;
    if (expGainCodeCB > 9) TmpVal <<= (expGainCodeCB - 9);
    else                   TmpVal >>= (9 - expGainCodeCB);
    *codeGainVar = (short)(TmpVal >> 16);

    return index;
}

/*************************************************************************
 * Function:  ownGainQuant_M795_GSMAMR
 *************************************************************************/
void ownGainQuant_M795_GSMAMR(short *vOnSetQntGain, short *vPrevAdaptOut, short *vPrevGainZero, short *a_LTPHistoryGain,
                              short *pLTPRes, short *pLTPExc, short *code, short *fracCoeff, short *expCoeff, short expCodeEnergy,
                              short fracCodeEnergy, short expGainCodeCB, short fracGainCodeCB,  short L_subfr, short codGainFrac,
                              short codGainExp, short gainPitchLimit, short *pitchGainVar, short *codeGainVar,
                              short *qntEnergyErr_M122, short *qntEnergyErr, short **ppAnalysisParam)
{
    short fracEnergyCoeff[4];
    short expEnergyCoeff[4];
    short ltpg, alpha, predGainCB;
    short pitchGainCand[3];
    short pitchGainCandIdx[3];
    short gain_pit_index;
    short gain_cod_index;
    short exp;
    short gainCodeUnQnt;

    gain_pit_index = ownQntGainPitch_M7950_GSMAMR (gainPitchLimit, pitchGainVar,pitchGainCand, pitchGainCandIdx);
    predGainCB = (short)(ownPow2_GSMAMR(14, fracGainCodeCB));          /* Q14 */

    ownPreQnt3CodebookGain_M795(expGainCodeCB, predGainCB, pitchGainCand, pitchGainCandIdx,
                                fracCoeff, expCoeff, pitchGainVar, &gain_pit_index, codeGainVar,
                                &gain_cod_index, qntEnergyErr_M122, qntEnergyErr);

    ownCalcUnFiltEnergy_GSMAMR(pLTPRes, pLTPExc, code, *pitchGainVar, L_subfr, fracEnergyCoeff, expEnergyCoeff, &ltpg);

    ownGainAdaptAlpha_GSMAMR(vOnSetQntGain,vPrevAdaptOut,vPrevGainZero,a_LTPHistoryGain, ltpg, *codeGainVar, &alpha);

    if (fracEnergyCoeff[0] != 0 && alpha > 0)  {
        fracEnergyCoeff[3] = fracCodeEnergy;
        expEnergyCoeff[3] = expCodeEnergy;

        exp = codGainExp - expGainCodeCB + 10;
        if (exp < 0) gainCodeUnQnt = codGainFrac >> -exp;
        else         gainCodeUnQnt = ShiftL_16s(codGainFrac, exp);

        gain_cod_index = ownGainCodebookQnt_M795(*pitchGainVar, expGainCodeCB, predGainCB,
                                                 fracEnergyCoeff, expEnergyCoeff, alpha, gainCodeUnQnt,
                                                 codeGainVar, qntEnergyErr_M122, qntEnergyErr);
    }

    *(*ppAnalysisParam)++ = gain_pit_index;
    *(*ppAnalysisParam)++ = gain_cod_index;
}


static __ALIGN32 CONST short TableGainHighRates[VEC_QNT_HIGHRATES_SIZE*4] = {
    577,      662,     -2692,   -16214,      806,     1836,     -1185,    -7135,
   3109,     1052,     -2008,   -12086,     4181,     1387,     -1600,    -9629,
   2373,     1425,     -1560,    -9394,     3248,     1985,     -1070,    -6442,
   1827,     2320,      -840,    -5056,      941,     3314,      -313,    -1885,
   2351,     2977,      -471,    -2838,     3616,     2420,      -777,    -4681,
   3451,     3096,      -414,    -2490,     2955,     4301,        72,      434,
   1848,     4500,       139,      836,     3884,     5416,       413,     2484,
   1187,     7210,       835,     5030,     3083,     9000,      1163,     7002,
   7384,      883,     -2267,   -13647,     5962,     1506,     -1478,    -8900,
   5155,     2134,      -963,    -5800,     7944,     2009,     -1052,    -6335,
   6507,     2250,      -885,    -5327,     7670,     2752,      -588,    -3537,
   5952,     3016,      -452,    -2724,     4898,     3764,      -125,     -751,
   6989,     3588,      -196,    -1177,     8174,     3978,       -43,     -260,
   6064,     4404,       107,      645,     7709,     5087,       320,     1928,
   5523,     6021,       569,     3426,     7769,     7126,       818,     4926,
   6060,     7938,       977,     5885,     5594,    11487,      1523,     9172,
  10581,     1356,     -1633,    -9831,     9049,     1597,     -1391,    -8380,
   9794,     2035,     -1033,    -6220,     8946,     2415,      -780,    -4700,
  10296,     2584,      -681,    -4099,     9407,     2734,      -597,    -3595,
   8700,     3218,      -356,    -2144,     9757,     3395,      -277,    -1669,
  10177,     3892,       -75,     -454,     9170,     4528,       148,      891,
  10152,     5004,       296,     1781,     9114,     5735,       497,     2993,
  10500,     6266,       628,     3782,    10110,     7631,       919,     5534,
   8844,     8727,      1117,     6728,     8956,    12496,      1648,     9921,
  12924,      976,     -2119,   -12753,    11435,     1755,     -1252,    -7539,
  12138,     2328,      -835,    -5024,    11388,     2368,      -810,    -4872,
  10700,     3064,      -429,    -2580,    12332,     2861,      -530,    -3192,
  11722,     3327,      -307,    -1848,    11270,     3700,      -150,     -904,
  10861,     4413,       110,      663,    12082,     4533,       150,      902,
  11283,     5205,       354,     2132,    11960,     6305,       637,     3837,
  11167,     7534,       900,     5420,    12128,     8329,      1049,     6312,
  10969,    10777,      1429,     8604,    10300,    17376,      2135,    12853,
  13899,     1681,     -1316,    -7921,    12580,     2045,     -1026,    -6179,
  13265,     2439,      -766,    -4610,    14033,     2989,      -465,    -2802,
  13452,     3098,      -413,    -2482,    12396,     3658,      -167,    -1006,
  13510,     3780,      -119,     -713,    12880,     4272,        62,      374,
  13533,     4861,       253,     1523,    12667,     5457,       424,     2552,
  13854,     6106,       590,     3551,    13031,     6483,       678,     4084,
  13557,     7721,       937,     5639,    12957,     9311,      1213,     7304,
  13714,    11551,      1532,     9221,    12591,    15206,      1938,    11667,
  15113,     1540,     -1445,    -8700,    15072,     2333,      -832,    -5007,
  14527,     2511,      -723,    -4352,    14692,     3199,      -365,    -2197,
  15382,     3560,      -207,    -1247,    14133,     3960,       -50,     -300,
  15102,     4236,        50,      298,    14332,     4824,       242,     1454,
  14846,     5451,       422,     2542,    15306,     6083,       584,     3518,
  14329,     6888,       768,     4623,    15060,     7689,       930,     5602,
  14406,     9426,      1231,     7413,    15387,     9741,      1280,     7706,
  14824,    14271,      1844,    11102,    13600,    24939,      2669,    16067,
  16396,     1969,     -1082,    -6517,    16817,     2832,      -545,    -3283,
  15713,     2843,      -539,    -3248,    16104,     3336,      -303,    -1825,
  16384,     3963,       -49,     -294,    16940,     4579,       165,      992,
  15711,     4599,       171,     1030,    16222,     5448,       421,     2537,
  16832,     6382,       655,     3945,    15745,     7141,       821,     4944,
  16326,     7469,       888,     5343,    16611,     8624,      1100,     6622,
  17028,    10418,      1379,     8303,    15905,    11817,      1565,     9423,
  16878,    14690,      1887,    11360,    16515,    20870,      2406,    14483,
  18142,     2083,      -999,    -6013,    19401,     3178,      -375,    -2257,
  17508,     3426,      -264,    -1589,    20054,     4027,       -25,     -151,
  18069,     4249,        54,      326,    18952,     5066,       314,     1890,
  17711,     5402,       409,     2461,    19835,     6192,       610,     3676,
  17950,     7014,       795,     4784,    21318,     7877,       966,     5816,
  17910,     9289,      1210,     7283,    19144,     9290,      1210,     7284,
  20517,    11381,      1510,     9089,    18075,    14485,      1866,    11234,
  19999,    17882,      2177,    13108,    18842,    32764,      3072,    18494
};

static __ALIGN32 CONST short TableGainLowRates[VEC_QNT_LOWRATES_SIZE*4] = {
  10813,    28753,      2879,    17333,    20480,     2785,      -570,    -3431,
  18841,     6594,       703,     4235,     6225,     7413,       876,     5276,
  17203,    10444,      1383,     8325,    21626,     1269,     -1731,   -10422,
  21135,     4423,       113,      683,    11304,     1556,     -1430,    -8609,
  19005,    12820,      1686,    10148,    17367,     2498,      -731,    -4398,
  17858,     4833,       244,     1472,     9994,     2498,      -731,    -4398,
  17530,     7864,       964,     5802,    14254,     1884,     -1147,    -6907,
  15892,     3153,      -387,    -2327,     6717,     1802,     -1213,    -7303,
  18186,    20193,      2357,    14189,    18022,     3031,      -445,    -2678,
  16711,     5857,       528,     3181,     8847,     4014,       -30,     -180,
  15892,     8970,      1158,     6972,    18022,     1392,     -1594,    -9599,
  16711,     4096,         0,        0,     8192,      655,     -2708,   -16305,
  15237,    13926,      1808,    10884,    14254,     3112,      -406,    -2444,
  14090,     4669,       193,     1165,     5406,     2703,      -614,    -3697,
  13434,     6553,       694,     4180,    12451,      901,     -2237,   -13468,
  12451,     2662,      -637,    -3833,     3768,      655,     -2708,   -16305,
  14745,    23511,      2582,    15543,    19169,     2457,      -755,    -4546,
  20152,     5079,       318,     1913,     6881,     4096,         0,        0,
  20480,     8560,      1089,     6556,    19660,      737,     -2534,   -15255,
  19005,     4259,        58,      347,     7864,     2088,      -995,    -5993,
  11468,    12288,      1623,     9771,    15892,     1474,     -1510,    -9090,
  15728,     4628,       180,     1086,     9175,     1433,     -1552,    -9341,
  16056,     7004,       793,     4772,    14827,      737,     -2534,   -15255,
  15073,     2252,      -884,    -5321,     5079,     1228,     -1780,   -10714,
  13271,    17326,      2131,    12827,    16547,     2334,      -831,    -5002,
  15073,     5816,       518,     3118,     3932,     3686,      -156,     -938,
  14254,     8601,      1096,     6598,    16875,      778,     -2454,   -14774,
  15073,     3809,      -107,     -646,     6062,      614,     -2804,   -16879,
   9338,     9256,      1204,     7251,    13271,     1761,     -1247,    -7508,
  13271,     3522,      -223,    -1343,     2457,     1966,     -1084,    -6529,
  11468,     5529,       443,     2668,    10485,      737,     -2534,   -15255,
  11632,     3194,      -367,    -2212,     1474,      778,     -2454,   -14774
};
/*************************************************************************
 * Function: ownGainQntInward_GSMAMR()
 *************************************************************************/
short ownGainQntInward_GSMAMR(IppSpchBitRate rate, short expGainCodeCB, short fracGainCodeCB,
                              short *fracCoeff, short *expCoeff, short gainPitchLimit, short *pitchGainVar,
                              short *codeGainVar, short *qntEnergyErr_M122, short *qntEnergyErr)
{
    const short *p;
    short i, j, index = 0;
    short predGainCB, e_max, exp_code;
    short g_pitch, g2_pitch, g_code, g2_code, g_pit_cod;
    short coeff[5], coeff_lo[5];
    short exp_max[5];
    int TmpVal, dist_min;
    const short *table_gain;
    short table_len;

    if (rate == IPP_SPCHBR_10200 || rate == IPP_SPCHBR_7400 || rate == IPP_SPCHBR_6700) {
       table_len = VEC_QNT_HIGHRATES_SIZE;
       table_gain = TableGainHighRates;
    } else {
       table_len = VEC_QNT_LOWRATES_SIZE;
       table_gain = TableGainLowRates;
    }

    predGainCB = (short)(ownPow2_GSMAMR(14, fracGainCodeCB));
    exp_code = expGainCodeCB - 11;

    exp_max[0] = expCoeff[0] - 13;
    exp_max[1] = expCoeff[1] - 14;
    exp_max[2] = expCoeff[2] + 15 + (exp_code << 1);
    exp_max[3] = expCoeff[3] + exp_code;
    exp_max[4] = expCoeff[4] + 1 + exp_code;

    e_max = exp_max[0];
    for(i = 1; i < 5; i++) {
       if (exp_max[i] > e_max) e_max = exp_max[i];
    }
    e_max++;

    for (i = 0; i < 5; i++) {
        j = e_max - exp_max[i];
        TmpVal = fracCoeff[i] << 16;
        if (j >= (short)31) TmpVal = (TmpVal < 0) ? -1 : 0;
        else                TmpVal >>= j;
        L_Extract(TmpVal, &coeff[i], &coeff_lo[i]);
    }


    dist_min = IPP_MAX_32S;
    p = &table_gain[0];

    for (i = 0; i < table_len; i++) {
        g_pitch = *p++;
        g_code = *p++;
        p+=2;

        if (g_pitch <= gainPitchLimit) {
            g_code = (short)((g_code * predGainCB) >> 15);
            g2_pitch = (short)((g_pitch * g_pitch) >> 15);
            g2_code = (short)((g_code * g_code) >> 15);
            g_pit_cod = (short)((g_code * g_pitch) >> 15);

            TmpVal = Mul16s_32s(coeff[0], coeff_lo[0], g2_pitch);
            TmpVal += Mul16s_32s(coeff[1], coeff_lo[1], g_pitch);
            TmpVal += Mul16s_32s(coeff[2], coeff_lo[2], g2_code);
            TmpVal += Mul16s_32s(coeff[3], coeff_lo[3], g_code);
            TmpVal += Mul16s_32s(coeff[4], coeff_lo[4], g_pit_cod);

            if (TmpVal < dist_min) {
                dist_min = TmpVal;
                index = i;
            }
        }
    }

    p = &table_gain[index << 2];
    *pitchGainVar = *p++;
    g_code = *p++;
    *qntEnergyErr_M122 = *p++;
    *qntEnergyErr = *p;

    TmpVal = 2 * g_code * predGainCB;
    if (expGainCodeCB > 10) TmpVal = ShiftL_32s(TmpVal, (unsigned short)(expGainCodeCB - 10));
    else                    TmpVal >>= (10 - expGainCodeCB);
    *codeGainVar = (short)(TmpVal >> 16);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -