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

📄 gain_util.c

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 C
📖 第 1 页 / 共 4 页
字号:
 * Function:  ownUpdateUnQntPred_M475()
 *************************************************************************/
void ownUpdateUnQntPred_M475(short *a_PastQntEnergy, short *a_PastQntEnergy_M122, short expGainCodeCB,
                             short fracGainCodeCB, short codGainExp, short codGainFrac)
{
    int i;
    short tmp, exp, frac;
    short qntEnergyErr, qntEnergyErr_M122;
    int TmpQnt;

    if (codGainFrac <= 0) {
        qntEnergyErr = MIN_QUA_ENER;
        qntEnergyErr_M122 = MIN_QUA_ENER_MR122;
    } else {
        fracGainCodeCB = (short)(ownPow2_GSMAMR (14, fracGainCodeCB));
        if(codGainFrac >= fracGainCodeCB) {
            codGainFrac >>= 1;
            codGainExp++;
        }

        frac = (codGainFrac << 15)/fracGainCodeCB;
        tmp = codGainExp - expGainCodeCB - 1;
        ownLog2_GSMAMR (frac, &exp, &frac);
        exp += tmp;

        qntEnergyErr_M122 = (frac >> 5) + (exp << 10);

        if (qntEnergyErr_M122 < MIN_QUA_ENER_MR122) {
            qntEnergyErr = MIN_QUA_ENER;
            qntEnergyErr_M122 = MIN_QUA_ENER_MR122;
        } else if (qntEnergyErr_M122 > MAX_QUA_ENER_MR122) {
            qntEnergyErr = MAX_QUA_ENER;
            qntEnergyErr_M122 = MAX_QUA_ENER_MR122;
        } else {
            TmpQnt = Mul16s_32s(exp, frac, 24660);
            qntEnergyErr = Cnvrt_NR_32s16s(ShiftL_32s(TmpQnt, 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;
}


/*************************************************************************
 * Function:  ownGainQnt_M475()
 *************************************************************************/
short ownGainQnt_M475(short *a_PastQntEnergy, short *a_PastQntEnergy_M122, short vExpPredCBGain,
                      short vFracPredCBGain, short *a_ExpEnCoeff, short *a_FracEnCoeff,
                      short vExpTargetEnergy, short vFracTargetEnergy, short *codeNoSharpSF1,
                      short expGainCodeSF1, short fracGainCodeSF1, short *expCoeffSF1, short *fracCoeffSF1,
                      short expTargetEnergySF1, short fracTargetEnergySF1, short gainPitchLimit,
                      short *gainPitSF0, short *gainCodeSF0, short *gainPitSF1, short *gainCodeSF1)
{
    const short *p;
    short i, index = 0;
    short tmp;
    short exp;
    short sf0_gcode0, sf1_gcode0;
    short g_pitch, g2_pitch, g_code, g2_code, g_pit_cod;
    short coeff[10], coeff_lo[10], exp_max[10];  /* 0..4: sf0; 5..9: sf1 */
    int TmpVal, dist_min;

    sf0_gcode0 = (short)(ownPow2_GSMAMR(14, vFracPredCBGain));
    sf1_gcode0 = (short)(ownPow2_GSMAMR(14, fracGainCodeSF1));

    exp = vExpPredCBGain - 11;
    exp_max[0] = a_ExpEnCoeff[0] - 13;
    exp_max[1] = a_ExpEnCoeff[1] - 14;
    exp_max[2] = a_ExpEnCoeff[2] + 15 + (exp << 1);
    exp_max[3] = a_ExpEnCoeff[3] + exp;
    exp_max[4] = a_ExpEnCoeff[4] + 1 + exp;

    exp = expGainCodeSF1 - 11;
    exp_max[5] = expCoeffSF1[0] - 13;
    exp_max[6] = expCoeffSF1[1] - 14;
    exp_max[7] = expCoeffSF1[2] +15 + (exp << 1);
    exp_max[8] = expCoeffSF1[3] + exp;
    exp_max[9] = expCoeffSF1[4] + 1 + exp;

    exp = vExpTargetEnergy - expTargetEnergySF1;
    if (exp > 0) fracTargetEnergySF1 >>= exp;
    else         vFracTargetEnergy >>= -exp;

    exp = 0;
    tmp = fracTargetEnergySF1 >> 1;
    if (fracTargetEnergySF1 & 1) tmp++;
    if (tmp > vFracTargetEnergy) exp = 1;
    else {
        tmp = (vFracTargetEnergy + 3) >> 2;
        if(tmp > fracTargetEnergySF1) exp = -1;
    }

    for (i = 0; i < 5; i++)
        exp_max[i] += exp;

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

    p = &a_FracEnCoeff[0];
    for (i = 0; i < 5; i++) {
        tmp = exp - exp_max[i];
        TmpVal = *p++ << 16;
        if (tmp >= (short)31) TmpVal = (TmpVal < 0) ? -1 : 0;
        else                  TmpVal >>= tmp;
        L_Extract(TmpVal, &coeff[i], &coeff_lo[i]);
    }
    p = &fracCoeffSF1[0];
    for (; i < 10; i++) {
        tmp = exp - exp_max[i];
        TmpVal = *p++ << 16;
        if (tmp >= (short)31) TmpVal = (TmpVal < 0) ? -1 : 0;
        else                  TmpVal >>= tmp;
        L_Extract(TmpVal, &coeff[i], &coeff_lo[i]);
    }

    /* start with "infinite" MSE */
    dist_min = IPP_MAX_32S;

    p = &table_gain_MR475[0];
    for (i = 0; i < VEC_QNT_M475_SIZE; i++) {

        g_pitch = *p++;
        g_code = *p++;

        g_code = (short)((g_code * sf0_gcode0) >> 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 = AddProduct16s_32s(TmpVal, coeff[1], coeff_lo[1], g_pitch);
        TmpVal = AddProduct16s_32s(TmpVal, coeff[2], coeff_lo[2], g2_code);
        TmpVal = AddProduct16s_32s(TmpVal, coeff[3], coeff_lo[3], g_code);
        TmpVal = AddProduct16s_32s(TmpVal, coeff[4], coeff_lo[4], g_pit_cod);

        tmp = g_pitch - gainPitchLimit;

        g_pitch = *p++;
        g_code = *p++;

        if(tmp <= 0 && g_pitch <= gainPitchLimit)  {
            g_code = (short)((g_code * sf1_gcode0) >> 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 = AddProduct16s_32s(TmpVal, coeff[5], coeff_lo[5], g2_pitch);
            TmpVal = AddProduct16s_32s(TmpVal, coeff[6], coeff_lo[6], g_pitch);
            TmpVal = AddProduct16s_32s(TmpVal, coeff[7], coeff_lo[7], g2_code);
            TmpVal = AddProduct16s_32s(TmpVal, coeff[8], coeff_lo[8], g_code);
            TmpVal = AddProduct16s_32s(TmpVal, coeff[9], coeff_lo[9], g_pit_cod);

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

    tmp = index << 2;
    ownQntStoreResults_M475(a_PastQntEnergy, a_PastQntEnergy_M122, &table_gain_MR475[tmp],
                            sf0_gcode0, vExpPredCBGain, gainPitSF0, gainCodeSF0);

    ownPredEnergyMA_GSMAMR(a_PastQntEnergy,a_PastQntEnergy_M122, IPP_SPCHBR_4750, codeNoSharpSF1,
                           &expGainCodeSF1, &fracGainCodeSF1, &vExpPredCBGain, &sf0_gcode0);

    sf1_gcode0 = (short)(ownPow2_GSMAMR(14, fracGainCodeSF1));
    tmp += 2;

    ownQntStoreResults_M475(a_PastQntEnergy, a_PastQntEnergy_M122, &table_gain_MR475[tmp],
                            sf1_gcode0, expGainCodeSF1, gainPitSF1, gainCodeSF1);
    return index;
}
/*************************************************************************
 * Function:  ownPreQnt3CodebookGain_M795
 *************************************************************************/
static void ownPreQnt3CodebookGain_M795(short expGainCodeCB, short predGainCB, short *pitchGainCand,
                                        short *pitchGainCandIdx, short *fracCoeff, short *expCoeff,
                                        short *pitchGainVar, short *pitchGainIdx, short *codeGainVar,
                                        short *codeGainIdx, short *qntEnergyErr_M122, short *qntEnergyErr)
{
    const short *p;
    short i, j, cod_ind, pit_ind;
    short e_max, exp_code;
    short g_pitch, g2_pitch, g_code, g2_code_h, g2_code_l;
    short g_pit_cod_h, g_pit_cod_l;
    short coeff[5], coeff_lo[5];
    short exp_max[5];
    int TmpVal, TmpVal0, dist_min;

    exp_code = expGainCodeCB - 10;
    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] + exp_code + 1;

    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;
    cod_ind = 0;
    pit_ind = 0;

    for (j = 0; j < 3; j++) {
        g_pitch = pitchGainCand[j];
        g2_pitch = (short)((g_pitch * g_pitch) >> 15);
        TmpVal0 = Mul16s_32s(coeff[0], coeff_lo[0], g2_pitch);
        TmpVal0 = AddProduct16s_32s(TmpVal0, coeff[1], coeff_lo[1], g_pitch);

        p = &pTblQntGainCode[0];
        for (i = 0; i < LEN_QNT_GAIN; i++)  {
            g_code = *p++;
            p++;
            p++;

            g_code = (short)((g_code * predGainCB) >> 15);

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

            TmpVal = 2 * g_code * g_pitch;
            L_Extract (TmpVal, &g_pit_cod_h, &g_pit_cod_l);

            TmpVal = AddProduct_32s(TmpVal0, coeff[2], coeff_lo[2], g2_code_h, g2_code_l);
            TmpVal = AddProduct16s_32s(TmpVal, coeff[3], coeff_lo[3], g_code);
            TmpVal = AddProduct_32s(TmpVal, coeff[4], coeff_lo[4], g_pit_cod_h, g_pit_cod_l);

            if (TmpVal < dist_min) {
                dist_min = TmpVal;
                cod_ind = i;
                pit_ind = j;
            }
        }
    }

    p = &pTblQntGainCode[3* cod_ind];
    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);
    *codeGainIdx = cod_ind;
    *pitchGainVar = pitchGainCand[pit_ind];
    *pitchGainIdx = pitchGainCandIdx[pit_ind];
}


/*************************************************************************
 * Function:  ownGainCodebookQnt_M795
 *************************************************************************/
static short ownGainCodebookQnt_M795(short pitchGainVar, short expGainCodeCB, short predGainCB,
                                     short *fracEnergyCoeff, short *expEnergyCoeff, short alpha,
                                     short gainCodeUnQnt, short *codeGainVar, short *qntEnergyErr_M122,
                                     short *qntEnergyErr)
{
    const short *p;
    short i, index, tmp;
    short one_alpha;
    short exp, e_max;
    short g2_pitch, g_code;
    short g2_code_h, g2_code_l;
    short d2_code_h, d2_code_l;
    short coeff[5], coeff_lo[5], expCoeff[5];
    int TmpVal, Time0, Time1, dist_min;
    short decGainCode;


    /* calculate scalings of the constant terms */
    if (expGainCodeCB > 10)
        decGainCode = Cnvrt_32s16s(*codeGainVar >> (expGainCodeCB - 10));
    else
        decGainCode = Cnvrt_32s16s(*codeGainVar << (10 - expGainCodeCB));
    g2_pitch = (short)((pitchGainVar * pitchGainVar) >> 15);
    one_alpha = 32767 - alpha + 1;

    tmp = (short)((alpha * fracEnergyCoeff[1]) >> 14);
    Time1 = 2 * tmp * g2_pitch;
    expCoeff[1] = expEnergyCoeff[1] - 15;


    tmp = (short)((alpha * fracEnergyCoeff[2]) >> 14);
    coeff[2] = (short)((tmp * pitchGainVar) >> 15);
    exp = expGainCodeCB - 10;
    expCoeff[2] = expEnergyCoeff[2] + exp;

    coeff[3] = (short)((alpha * fracEnergyCoeff[3]) >> 14);
    exp = (expGainCodeCB << 1) - 7;
    expCoeff[3] = expEnergyCoeff[3] + exp;

    coeff[4] = (short)((one_alpha * fracEnergyCoeff[3]) >> 15);
    expCoeff[4] = expCoeff[3] + 1;

⌨️ 快捷键说明

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