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

📄 c_g_aver.cpp

📁 实现3GPP的GSM中AMR语音的CODECS。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
   if (sub(diff, 5325) > 0)  // 0.65 in Q11   {      st->hangVar = add(st->hangVar, 1);   }   else   {      st->hangVar = 0;   }   if (sub(st->hangVar, 10) > 0)   {      st->hangCount = 0;  // Speech period, reset hangover variable   }   // Compute mix constant (bgMix)   bgMix = 8192;    // 1 in Q13   if ((sub(mode, MR67) <= 0) || (sub(mode, MR102) == 0))      // MR475, MR515, MR59, MR67, MR102   {      // if errors and presumed noise make smoothing probability stronger      if (((((pdfi != 0) && (prev_pdf != 0)) || (bfi != 0) || (prev_bf != 0)) &&          (sub(voicedHangover, 1) > 0) && (inBackgroundNoise != 0) &&          ((sub(mode, MR475) == 0) ||           (sub(mode, MR515) == 0) ||           (sub(mode, MR59) == 0)) ))      {         // bgMix = min(0.25, max(0.0, diff-0.55)) / 0.25;         tmp_diff = sub(diff, 4506);   // 0.55 in Q13         // max(0.0, diff-0.55)         if (tmp_diff > 0)         {            tmp1 = tmp_diff;         }         else         {            tmp1 = 0;         }         // min(0.25, tmp1)         if (sub(2048, tmp1) < 0)         {            bgMix = 8192;         }         else         {            bgMix = shl(tmp1, 2);         }      }      else      {         // bgMix = min(0.25, max(0.0, diff-0.40)) / 0.25;         tmp_diff = sub(diff, 3277); // 0.4 in Q13         // max(0.0, diff-0.40)         if (tmp_diff > 0)         {            tmp1 = tmp_diff;         }         else         {            tmp1 = 0;         }         // min(0.25, tmp1)         if (sub(2048, tmp1) < 0)         {            bgMix = 8192;         }         else         {            bgMix = shl(tmp1, 2);         }      }      if ((sub(st->hangCount, 40) < 0) || (sub(diff, 5325) > 0)) // 0.65 in Q13      {         bgMix = 8192;  // disable mix if too short time since      }      // Smoothen the cb gain trajectory      // smoothing depends on mix constant bgMix      L_sum = L_mult(6554, st->cbGainHistory[2]); // 0.2 in Q15; L_sum in Q17      for (i = 3; i < L_CBGAINHIST; i++)      {         L_sum = L_mac(L_sum, 6554, st->cbGainHistory[i]);      }      cbGainMean = pv_round(L_sum);                      // Q1      // more smoothing in error and bg noise (NB no DFI used  here)      if (((bfi != 0) || (prev_bf != 0)) && (inBackgroundNoise != 0) &&          ((sub(mode, MR475) == 0) ||           (sub(mode, MR515) == 0) ||           (sub(mode, MR59) == 0)) )      {         L_sum = L_mult(4681, st->cbGainHistory[0]); // 0.143 in Q15; L_sum in Q17         for (i = 1; i < L_CBGAINHIST; i++)         {            L_sum = L_mac(L_sum, 4681, st->cbGainHistory[i]);         }         cbGainMean = pv_round(L_sum);                   // Q1      }      // cbGainMix = bgMix*cbGainMix + (1-bgMix)*cbGainMean;      L_sum = L_mult(bgMix, cbGainMix);               // L_sum in Q15      L_sum = L_mac(L_sum, 8192, cbGainMean);      L_sum = L_msu(L_sum, bgMix, cbGainMean);      cbGainMix = pv_round(L_shl(L_sum, 2));             // Q1   }   st->hangCount = add(st->hangCount, 1);   return cbGainMix;}------------------------------------------------------------------------------ RESOURCES USED [optional] When the code is written for a specific target processor the the resources used should be documented below. HEAP MEMORY USED: x bytes STACK MEMORY USED: x bytes CLOCK CYCLES: (cycle count equation for this function) + (variable                used to represent cycle count for each subroutine                called)     where: (cycle count variable) = cycle count for [subroutine                                     name]------------------------------------------------------------------------------ CAUTION [optional] [State any special notes, constraints or cautions for users of this function]------------------------------------------------------------------------------*/Word16 Cb_gain_average(    Cb_gain_averageState *st, /* i/o : State variables for CB gain averaging */    enum Mode mode,           /* i   : AMR mode                              */    Word16 gain_code,         /* i   : CB gain                            Q1 */    Word16 lsp[],             /* i   : The LSP for the current frame     Q15 */    Word16 lspAver[],         /* i   : The average of LSP for 8 frames   Q15 */    Word16 bfi,               /* i   : bad frame indication flag             */    Word16 prev_bf,           /* i   : previous bad frame indication flag    */    Word16 pdfi,              /* i   : potential degraded bad frame ind flag */    Word16 prev_pdf,          /* i   : prev pot. degraded bad frame ind flag */    Word16 inBackgroundNoise, /* i   : background noise decision             */    Word16 voicedHangover,    /* i   : # of frames after last voiced frame   */    Flag   *pOverflow){    Word16 i;    Word16 cbGainMix;    Word16 diff;    Word16 tmp_diff;    Word16 bgMix;    Word16 cbGainMean;    Word32 L_sum;    Word16 tmp[M];    Word16 tmp1;    Word16 tmp2;    Word16 shift1;    Word16 shift2;    Word16 shift;    /*---------------------------------------------------------*     * Compute mixed cb gain, used to make cb gain more        *     * smooth in background noise for modes 5.15, 5.9 and 6.7  *     * states that needs to be updated by all                  *     *---------------------------------------------------------*/    /* set correct cbGainMix for MR74, MR795, MR122 */    cbGainMix = gain_code;    /*-------------------------------------------------------*     *   Store list of CB gain needed in the CB gain         *     *   averaging                                           *     *-------------------------------------------------------*/    for (i = 0; i < (L_CBGAINHIST - 1); i++)    {        st->cbGainHistory[i] = st->cbGainHistory[i+1];    }    st->cbGainHistory[L_CBGAINHIST-1] = gain_code;    diff = 0;    /* compute lsp difference */    for (i = 0; i < M; i++)    {        tmp1 = abs_s(sub(*(lspAver + i), *(lsp + i), pOverflow));        /* Q15      */        shift1 = sub(norm_s(tmp1), 1, pOverflow);       /* Qn       */        tmp1 = shl(tmp1, shift1, pOverflow);            /* Q15+Qn   */        shift2 = norm_s(*(lspAver + i));                /* Qm       */        tmp2 = shl(*(lspAver + i), shift2, pOverflow);  /* Q15+Qm   */        tmp[i] = div_s(tmp1, tmp2);        /* Q15+(Q15+Qn)-(Q15+Qm) */        shift = 2 + shift1 - shift2;        if (shift >= 0)        {            *(tmp + i) = shr(*(tmp + i), shift, pOverflow);            /* Q15+Qn-Qm-Qx=Q13 */        }        else        {            *(tmp + i) = shl(*(tmp + i), negate(shift), pOverflow);            /* Q15+Qn-Qm-Qx=Q13 */        }        diff = add(diff, *(tmp + i), pOverflow);           /* Q13 */    }    /* Compute hangover */    if (diff > 5325)                /* 0.65 in Q11 */    {        st->hangVar += 1;    }    else    {        st->hangVar = 0;    }    if (st->hangVar > 10)    {        /* Speech period, reset hangover variable */        st->hangCount = 0;    }    /* Compute mix constant (bgMix) */    bgMix = 8192;    /* 1 in Q13 */    if ((mode <= MR67) || (mode == MR102))        /* MR475, MR515, MR59, MR67, MR102 */    {        /* if errors and presumed noise make smoothing probability stronger */        if (((((pdfi != 0) && (prev_pdf != 0)) || (bfi != 0) ||                (prev_bf != 0))                && (voicedHangover > 1)                && (inBackgroundNoise != 0)                && ((mode == MR475) || (mode == MR515) ||                    (mode == MR59))))        {            /* bgMix = min(0.25, max(0.0, diff-0.55)) / 0.25; */            tmp_diff = sub(diff, 4506, pOverflow);   /* 0.55 in Q13 */        }        else        {            /* bgMix = min(0.25, max(0.0, diff-0.40)) / 0.25; */            tmp_diff = sub(diff, 3277, pOverflow); /* 0.4 in Q13 */        }        /* max(0.0, diff-0.55)  or  */        /* max(0.0, diff-0.40) */        if (tmp_diff > 0)        {            tmp1 = tmp_diff;        }        else        {            tmp1 = 0;        }        /* min(0.25, tmp1) */        if (2048 < tmp1)        {            bgMix = 8192;        }        else        {            bgMix = shl(tmp1, 2, pOverflow);        }        if ((st->hangCount < 40) || (diff > 5325)) /* 0.65 in Q13 */        {            /* disable mix if too short time since */            bgMix = 8192;        }        /* Smoothen the cb gain trajectory  */        /* smoothing depends on mix constant bgMix */        L_sum = L_mult(6554, st->cbGainHistory[2], pOverflow);        /* 0.2 in Q15; L_sum in Q17 */        for (i = 3; i < L_CBGAINHIST; i++)        {            L_sum = L_mac(L_sum, 6554, st->cbGainHistory[i], pOverflow);        }        cbGainMean = pv_round(L_sum, pOverflow);               /* Q1 */        /* more smoothing in error and bg noise (NB no DFI used here) */        if (((bfi != 0) || (prev_bf != 0)) && (inBackgroundNoise != 0)                && ((mode == MR475) || (mode == MR515)                    || (mode == MR59)))        {            /* 0.143 in Q15; L_sum in Q17    */            L_sum = L_mult(4681, st->cbGainHistory[0], pOverflow);            for (i = 1; i < L_CBGAINHIST; i++)            {                L_sum =                    L_mac(L_sum, 4681, st->cbGainHistory[i], pOverflow);            }            cbGainMean = pv_round(L_sum, pOverflow);              /* Q1 */        }        /* cbGainMix = bgMix*cbGainMix + (1-bgMix)*cbGainMean; */        /* L_sum in Q15 */        L_sum = L_mult(bgMix, cbGainMix, pOverflow);        L_sum = L_mac(L_sum, 8192, cbGainMean, pOverflow);        L_sum = L_msu(L_sum, bgMix, cbGainMean, pOverflow);        cbGainMix = pv_round(L_shl(L_sum, 2, pOverflow), pOverflow);  /* Q1 */    }    st->hangCount += 1;    return (cbGainMix);}

⌨️ 快捷键说明

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