📄 utilamrwb.c
字号:
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 + -