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

📄 utilamrwb.c

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 C
📖 第 1 页 / 共 2 页
字号:
        pIsfCorrvec[0] += s;
    }
    for (i = 7; i < (LP_ORDER - 2); i++)
    {
        tmp2 = pIsfDiffvec[i] - valMean;
        tmp3 = pIsfDiffvec[i - 3] - valMean;
        s = tmp2 * tmp3;
        valHigh = s >> 15;
        valLow = s & 0x7fff;
        s = (valHigh*valHigh + ((valHigh*valLow + valLow*valHigh)>>15)) << 1;
        pIsfCorrvec[1] += s;
    }
    for (i = 7; i < (LP_ORDER - 2); i++)
    {
        tmp2 = pIsfDiffvec[i] - valMean;
        tmp3 = pIsfDiffvec[i - 4] - valMean;
        s = tmp2 * tmp3;
        valHigh = s >> 15;
        valLow = s & 0x7fff;
        s = (valHigh*valHigh + ((valHigh*valLow + valLow*valHigh)>>15) ) << 1;
        pIsfCorrvec[2] += s;
    }

    if (pIsfCorrvec[0] > pIsfCorrvec[1])
        valMaxCorr = 0;
    else
        valMaxCorr = 1;

    if (pIsfCorrvec[2] > pIsfCorrvec[valMaxCorr]) valMaxCorr = 2;
    valMaxCorr += 1;

    for (i = LP_ORDER - 1; i < (LP_ORDER_16K - 1); i++)
    {
        tmp = (pHfIsf[i - 1 - valMaxCorr] - pHfIsf[i - 2 - valMaxCorr]);
        pHfIsf[i] = (pHfIsf[i - 1] + tmp);
    }

    tmp = (pHfIsf[4] + pHfIsf[3]);
    tmp = (pHfIsf[2] - tmp);
    tmp = Mul_16s_Sfs(tmp, 5461, 15);
    tmp += 20390;
    if (tmp > 19456) tmp = 19456;
    tmp -= pHfIsf[LP_ORDER - 2];
    tmp2 = (pHfIsf[LP_ORDER_16K - 2] - pHfIsf[LP_ORDER - 2]);

    valExp2 = Exp_16s(tmp2);
    valExp = Exp_16s(tmp);
    valExp -= 1;
    tmp <<= valExp;
    tmp2 <<= valExp2;
    valCoeff = (tmp << 15) / tmp2;
    valExp = (valExp2 - valExp);

    for (i = LP_ORDER - 1; i < (LP_ORDER_16K - 1); i++)
    {
        tmp = ((pHfIsf[i] - pHfIsf[i - 1]) * valCoeff) >> 15;
        if (valExp > 0)
            pIsfDiffvec[i - (LP_ORDER - 1)] = (tmp << valExp);
        else
            pIsfDiffvec[i - (LP_ORDER - 1)] = (tmp >> (-valExp));
    }

    for (i = LP_ORDER; i < (LP_ORDER_16K - 1); i++)
    {
        tmp = (pIsfDiffvec[i - (LP_ORDER - 1)] + pIsfDiffvec[i - LP_ORDER]) - 1280;
        if (tmp < 0)
        {
            if (pIsfDiffvec[i - (LP_ORDER - 1)] > pIsfDiffvec[i - LP_ORDER])
                pIsfDiffvec[i - LP_ORDER] = 1280 - pIsfDiffvec[i - (LP_ORDER - 1)];
            else
                pIsfDiffvec[i - (LP_ORDER - 1)] = 1280 - pIsfDiffvec[i - LP_ORDER];
        }
    }
    for (i = LP_ORDER-1; i < (LP_ORDER_16K-1); i++)
        pHfIsf[i] = Add_16s(pHfIsf[i-1], pIsfDiffvec[i-(LP_ORDER-1)]);

    ownMulC_16s_ISfs(26214, pHfIsf, LP_ORDER_16K-1, 15);

    ippsISFToISP_AMRWB_16s(pHfIsf, pHfIsf, LP_ORDER_16K);

    return;
}

short ownGpClip(short *pMem)
{
    short clip;

    clip = 0;
    if ((pMem[0] < THRESH_DISTANCE_ISF) && (pMem[1] > THRESH_GAIN_PITCH))
        clip = 1;

    return (clip);
}

void ownCheckGpClipIsf(short *pIsfvec, short *pMem)
{
    short valDist, valDistMin;
    int i;

    valDistMin = (pIsfvec[1] - pIsfvec[0]);
    for (i = 2; i < LP_ORDER - 1; i++)
    {
        valDist = (pIsfvec[i] - pIsfvec[i - 1]);
        if (valDist < valDistMin) valDistMin = valDist;
    }

    valDist = (short)((26214 * pMem[0] + 6554 * valDistMin) >> 15);
    if (valDist > MAX_DISTANCE_ISF) valDist = MAX_DISTANCE_ISF;
    pMem[0] = valDist;

    return;
}

void ownCheckGpClipPitchGain(short valPitchGain, short *pMem)
{
    short valGain;
    int s;

    s = 29491 * pMem[1];
    s += 3277 * valPitchGain;
    valGain = (short)(s>>15);

    if (valGain < MIN_GAIN_PITCH) valGain = MIN_GAIN_PITCH;
    pMem[1] = valGain;

    return;
}

void ownSynthesisFilter_AMRWB_16s32s_ISfs
       ( const Ipp16s *pSrcLpc, int valLpcOrder, const Ipp16s *pSrcExcitation,
       Ipp32s *pSrcDstSignal, int len, int scaleFactor )
{
//    IPP_BAD_PTR3_RET(pSrcLpc, pSrcExcitation, pSrcDstSignal);
//    IPP_BAD_SIZE_RET(valLpcOrder);
//    IPP_BAD_SIZE_RET(len);

    {
      int i, j, s, s1;
      short tmp;
      for (i = 0; i < len; i++)
      {
        s = 0;
        for (j = 1; j <= valLpcOrder; j++) {
           tmp = (short)((pSrcDstSignal[i - j]>>4)&0x0FFF);
           s -= tmp * pSrcLpc[j];
        }

        s >>= 11;

        s1 = pSrcExcitation[i] * pSrcLpc[0];

        for (j = 1; j <= valLpcOrder; j++)
            s1 -= (pSrcDstSignal[i - j]>>16) * pSrcLpc[j];

        s = Add_32s(s, Mul2_32s(s1));
        s = ShiftL_32s(s, (unsigned short)scaleFactor);

        pSrcDstSignal[i] = s;
      }
    }
    return;
}

#define NC16k_AMRWB 10
#define ownLSPPolinomials(pLSP,shift, pPolinom,len,ScaleFactor)\
{\
    short high, low;\
    int i, j, n, k, tmp;\
\
    pPolinom[0] = 1 << (21 + ScaleFactor);\
    pPolinom[1] = (-pLSP[0+shift]) << (7 + ScaleFactor);\
\
    for(i=2,k=2; i<=len; i++,k+=2){\
        pPolinom[i] = pPolinom[i-2];\
        for(j=1,n=i; j<i; j++,n--) {\
            high = (short)(pPolinom[n-1] >> 16);\
            low = (pPolinom[n-1] >> 1) & 0x7fff;\
            tmp = high * pLSP[k+shift] + ((low * pLSP[k+shift])>>15);\
            pPolinom[n] -= 4*tmp;\
            pPolinom[n] += pPolinom[n-2];\
        }\
        pPolinom[n] -=  pLSP[k+shift] << (7 + ScaleFactor);\
    }\
}

#define GetLPCFromPoli(pDstLpc,len,lenBy2,f1,f2,scaleFactor,RoundOperation,tmax)\
{\
   int i,j;\
   int tmp;\
\
   pDstLpc[0] = 4096;\
   tmax = 1;\
   for (i = 1, j = len - 1; i < lenBy2; i++, j--) {\
      tmp = Add_32s(f1[i],f2[i]);\
      tmax |= tmp;\
      pDstLpc[i] = RoundOperation((tmp + (1 << scaleFactor)) >> (scaleFactor+1));\
\
      tmp = f1[i] - f2[i];\
      tmax |= Abs_32s(tmp);\
      pDstLpc[j] = RoundOperation((tmp + (1 << scaleFactor)) >> (scaleFactor+1));\
   }\
}

void ownISPToLPC_AMRWB_16s
       ( const Ipp16s *pSrcIsp, Ipp16s *pDstLpc, Ipp32s len, Ipp32s adaptive_scaling )
{
    short high, low, sq, sq_sug;
    int i, j, nc, tmp, tmax;
    IPP_ALIGNED_ARRAY(16, int, f1, NC16k_AMRWB + 1);
    IPP_ALIGNED_ARRAY(16, int, f2, NC16k_AMRWB);
    IPP_ALIGNED_ARRAY(16, int, f3, NC16k_AMRWB + 1);

//    IPP_BAD_PTR2_RET(pSrcIsp, pDstLpc)
//    IPP_BAD_SIZE_RET(len);
//    IPP_BADARG_RET( (len > 20), ippStsSizeErr )

    nc = len >> 1;
    if (nc > 8) {
        ownLSPPolinomials(pSrcIsp,0,f1,nc,0);
        ippsLShiftC_32s_I(2, f1, nc);
        f1[nc] = ShiftL_32s(f1[nc], 2);
        ownLSPPolinomials(pSrcIsp,1,f2,nc-1,0);
        ippsLShiftC_32s_I(2, f2, nc);
    } else {
        ownLSPPolinomials(pSrcIsp,0,f1,nc,2);
        ownLSPPolinomials(pSrcIsp,1,f2,nc-1,2);
    }

    for (i = nc - 1; i > 1; i--) {
        f2[i] -= f2[i - 2];
    }

    for (i = 0; i < nc; i++) {
        L_Extract(f1[i], &high, &low);
        tmp = Mpy_32_16(high, low, pSrcIsp[len - 1]);
        f1[i] = Add_32s(f1[i], tmp);

        L_Extract(f2[i], &high, &low);
        tmp = Mpy_32_16(high, low, pSrcIsp[len - 1]);
        f2[i] -= tmp;
    }
    GetLPCFromPoli(pDstLpc,len,nc,f1,f2,11,(short),tmax);

    /* rescale data if overflow has occured and reprocess the loop */

    if ( adaptive_scaling == 1 )
       sq = 4 - Exp_32s(tmax);
    else
       sq = 0;

    if (sq > 0)
    {
      sq_sug = sq + 12;
      for (i = 1, j = (len - 1); i < nc; i++, j--)
        {
          tmp = Add_32s(f1[i], f2[i]);
          pDstLpc[i] = (short)((tmp + (1 << (sq_sug-1))) >> sq_sug);

          tmp = f1[i] - f2[i];
          pDstLpc[j] = (short)((tmp + (1 << (sq_sug-1))) >> sq_sug);
        }
      pDstLpc[0] >>= sq;
    }
    else
    {
      sq_sug = 12;
      sq     = 0;
    }

    L_Extract(f1[nc], &high, &low);
    tmp = Mpy_32_16(high, low, pSrcIsp[len - 1]);

    tmp = Add_32s(f1[nc], tmp);
    pDstLpc[nc] = (short)((tmp + (1 << 11)) >> sq_sug);

    pDstLpc[len] = ShiftR_NR_16s(pSrcIsp[len - 1], (short)(sq+3));

    return;
}

⌨️ 快捷键说明

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