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

📄 dec_amr.cpp

📁 实现3GPP的GSM中AMR语音的CODECS。
💻 CPP
📖 第 1 页 / 共 5 页
字号:
         *-------------------------------------------------------*/        if ((mode == MR475) || (mode == MR515))        {   /* MR475, MR515 */            index = *parm++;        /* index of position */            i = *parm++;            /* signs             */            decode_2i40_9bits(subfrNr, i, index, code, pOverflow);            L_temp = (Word32)st->sharp << 1;            if (L_temp != (Word32)((Word16) L_temp))            {                pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16;            }            else            {                pit_sharp = (Word16) L_temp;            }        }        else if (mode == MR59)        {   /* MR59 */            index = *parm++;        /* index of position */            i = *parm++;            /* signs             */            decode_2i40_11bits(i, index, code);            L_temp = (Word32)st->sharp << 1;            if (L_temp != (Word32)((Word16) L_temp))            {                pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16;            }            else            {                pit_sharp = (Word16) L_temp;            }        }        else if (mode == MR67)        {   /* MR67 */            index = *parm++;        /* index of position */            i = *parm++;            /* signs             */            decode_3i40_14bits(i, index, code);            L_temp = (Word32)st->sharp << 1;            if (L_temp != (Word32)((Word16) L_temp))            {                pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16;            }            else            {                pit_sharp = (Word16) L_temp;            }        }        else if (mode <= MR795)        {   /* MR74, MR795 */            index = *parm++;        /* index of position */            i = *parm++;            /* signs             */            decode_4i40_17bits(i, index, code);            L_temp = (Word32)st->sharp << 1;            if (L_temp != (Word32)((Word16) L_temp))            {                pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16;            }            else            {                pit_sharp = (Word16) L_temp;            }        }        else if (mode == MR102)        {  /* MR102 */            dec_8i40_31bits(parm, code, pOverflow);            parm += 7;            L_temp = (Word32)st->sharp << 1;            if (L_temp != (Word32)((Word16) L_temp))            {                pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16;            }            else            {                pit_sharp = (Word16) L_temp;            }        }        else        {  /* MR122 */            index = *parm++;            if (bfi != 0)            {                ec_gain_pitch(                    &(st->ec_gain_p_st),                    st->state,                    &gain_pit,                    pOverflow);            }            else            {                gain_pit = d_gain_pitch(mode, index);            }            ec_gain_pitch_update(                &(st->ec_gain_p_st),                bfi,                st->prev_bf,                &gain_pit,                pOverflow);            dec_10i40_35bits(parm, code);            parm += 10;            /* pit_sharp = gain_pit;                   */            /* if (pit_sharp > 1.0) pit_sharp = 1.0;   */            L_temp = (Word32)gain_pit << 1;            if (L_temp != (Word32)((Word16) L_temp))            {                pit_sharp = (gain_pit > 0) ? MAX_16 : MIN_16;            }            else            {                pit_sharp = (Word16) L_temp;            }        }        /*-------------------------------------------------------*         * - Add the pitch contribution to code[].               *         *-------------------------------------------------------*/        for (i = T0; i < L_SUBFR; i++)        {            temp = mult(*(code + i - T0), pit_sharp, pOverflow);            *(code + i) = add(*(code + i), temp, pOverflow);        }        /*------------------------------------------------------------*         * - Decode codebook gain (MR122) or both pitch               *         *   gain and codebook gain (all others)                      *         * - Update pitch sharpening "sharp" with quantized gain_pit  *         *------------------------------------------------------------*/        if (mode == MR475)        {            /* read and decode pitch and code gain */            if (evenSubfr != 0)            {                index_mr475 = *parm++;         /* index of gain(s) */            }            if (bfi == 0)            {                Dec_gain(                    &(st->pred_state),                    mode,                    index_mr475,                    code,                    evenSubfr,                    &gain_pit,                    &gain_code,                    pOverflow);            }            else            {                ec_gain_pitch(                    &(st->ec_gain_p_st),                    st->state,                    &gain_pit,                    pOverflow);                ec_gain_code(                    &(st->ec_gain_c_st),                    &(st->pred_state),                    st->state,                    &gain_code,                    pOverflow);            }            ec_gain_pitch_update(                &st->ec_gain_p_st,                bfi,                st->prev_bf,                &gain_pit,                pOverflow);            ec_gain_code_update(                &st->ec_gain_c_st,                bfi,                st->prev_bf,                &gain_code,                pOverflow);            pit_sharp = gain_pit;            if (pit_sharp > SHARPMAX)            {                pit_sharp = SHARPMAX;            }        }        else if ((mode <= MR74) || (mode == MR102))        {            /* read and decode pitch and code gain */            index = *parm++;                 /* index of gain(s) */            if (bfi == 0)            {                Dec_gain(                    &(st->pred_state),                    mode,                    index,                    code,                    evenSubfr,                    &gain_pit,                    &gain_code,                    pOverflow);            }            else            {                ec_gain_pitch(                    &(st->ec_gain_p_st),                    st->state,                    &gain_pit,                    pOverflow);                ec_gain_code(                    &(st->ec_gain_c_st),                    &(st->pred_state),                    st->state,                    &gain_code,                    pOverflow);            }            ec_gain_pitch_update(                &(st->ec_gain_p_st),                bfi,                st->prev_bf,                &gain_pit,                pOverflow);            ec_gain_code_update(                &(st->ec_gain_c_st),                bfi,                st->prev_bf,                &gain_code,                pOverflow);            pit_sharp = gain_pit;            if (pit_sharp > SHARPMAX)            {                pit_sharp = SHARPMAX;            }            if (mode == MR102)            {                if (st->old_T0 > (L_SUBFR + 5))                {                    if (pit_sharp < 0)                    {                        pit_sharp = ~((~pit_sharp) >> 2);                    }                    else                    {                        pit_sharp = pit_sharp >> 2;                    }                }            }        }        else        {            /* read and decode pitch gain */            index = *parm++;                 /* index of gain(s) */            if (mode == MR795)            {                /* decode pitch gain */                if (bfi != 0)                {                    ec_gain_pitch(                        &(st->ec_gain_p_st),                        st->state,                        &gain_pit,                        pOverflow);                }                else                {                    gain_pit = d_gain_pitch(mode, index);                }                ec_gain_pitch_update(                    &(st->ec_gain_p_st),                    bfi,                    st->prev_bf,                    &gain_pit,                    pOverflow);                /* read and decode code gain */                index = *parm++;                if (bfi == 0)                {                    d_gain_code(                        &(st->pred_state),                        mode,                        index,                        code,                        &gain_code,                        pOverflow);                }                else                {                    ec_gain_code(                        &(st->ec_gain_c_st),                        &(st->pred_state),                        st->state,                        &gain_code,                        pOverflow);                }                ec_gain_code_update(                    &(st->ec_gain_c_st),                    bfi,                    st->prev_bf,                    &gain_code,                    pOverflow);                pit_sharp = gain_pit;                if (pit_sharp > SHARPMAX)                {                    pit_sharp = SHARPMAX;                }            }            else            { /* MR122 */                if (bfi == 0)                {                    d_gain_code(                        &(st->pred_state),                        mode,                        index,                        code,                        &gain_code,                        pOverflow);                }                else                {                    ec_gain_code(                        &(st->ec_gain_c_st),                        &(st->pred_state),                        st->state,                        &gain_code,                        pOverflow);                }                ec_gain_code_update(                    &(st->ec_gain_c_st),                    bfi,                    st->prev_bf,                    &gain_code,                    pOverflow);                pit_sharp = gain_pit;            }        }        /* store pitch sharpening for next subframe             */        /* (for modes which use the previous pitch gain for     */        /* pitch sharpening in the search phase)                */        /* do not update sharpening in even subframes for MR475 */        if ((mode != MR475) || (evenSubfr == 0))        {            st->sharp = gain_pit;            if (st->sharp > SHARPMAX)            {                st->sharp = SHARPMAX;            }        }        pit_sharp = shl(pit_sharp, 1, pOverflow);        if (pit_sharp > 16384)        {            for (i = 0; i < L_SUBFR; i++)            {                temp = mult(st->exc[i], pit_sharp, pOverflow);                L_temp = L_mult(temp, gain_pit, pOverflow);                if (mode == MR122)                {                    if (L_temp < 0)                    {                        L_temp = ~((~L_temp) >> 1);                    }                    else                    {                        L_temp = L_temp >> 1;                    }                }                *(excp + i) = pv_round(L_temp, pOverflow);            }        }        /*-------------------------------------------------------*         * - Store list of LTP gains needed in the source        *         *   characteristic detector (SCD)                       *         *-------------------------------------------------------*/        if (bfi == 0)        {            for (i = 0; i < 8; i++)            {                st->ltpGainHistory[i] = st->ltpGainHistory[i+1];            }            st->ltpGainHistory[8] = gain_pit;        }        /*-------------------------------------------------------*        * - Limit gain_pit if in background noise and BFI       *        *   for MR475, MR515, MR59                              *        *-------------------------------------------------------*/        if ((st->prev_bf != 0 || bfi != 0) && st->inBackgroundNoise != 0 &&                ((mode == MR475) || (mode == MR515) || (mode == MR59)))        {            if (gain_pit > 12288)    /* if (gain_pit > 0.75) in Q14*/            {     

⌨️ 快捷键说明

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