📄 owng723.c
字号:
-16384, 16384, -16384, -16384, 16384, 16384, 16384, 16384,
16384, 16384, -16384, 16384, 16384, 16384, 0, 0},
{-16384, 16384, -16384, 16384, 16384, 16384, 16384, -16384,
16384, -16384, 16384, 16384, -16384, 16384, 16384, 16384,
-16384, -16384, -16384, -16384, 16384, 16384, 0, 0},
{-16384, 16384, 16384, 16384, 16384, 16384, -16384, -16384,
-16384, -16384, 16384, -16384, 16384, -16384, -16384, -16384,
-16384, 16384, -16384, 16384, 16384, -16384, 0, 0},
{-16384, -16384, -16384, 16384, 16384, 16384, 16384, 16384,
16384, 16384, 16384, 16384, -16384, 16384, 16384, -16384,
-16384, -16384, -16384, 16384, -16384, -16384, 0, 0},
{-16384, -16384, -16384, 16384, -16384, -16384, 16384, 16384,
16384, 16384, 16384, -16384, 16384, 16384, 16384, 16384,
-16384, -16384, 16384, 16384, 16384, 16384, 0, 0},
{-16384, 16384, 16384, 16384, -16384, -16384, 16384, 16384,
-16384, -16384, -16384, -16384, 16384, 16384, -16384, 16384,
-16384, -16384, -16384, 16384, -16384, 16384, 0, 0},
{ 16384, 16384, -16384, 16384, -16384, 16384, -16384, -16384,
-16384, 16384, 16384, 16384, 16384, -16384, -16384, 16384,
-16384, -16384, 16384, 16384, -16384, 16384, 0, 0},
{ 16384, -16384, 16384, 16384, 16384, 16384, 16384, 16384,
-16384, -16384, -16384, -16384, 16384, 16384, -16384, 16384,
16384, -16384, -16384, 16384, 16384, -16384, 0, 0},
{ 16384, -16384, 16384, -16384, -16384, 16384, 16384, -16384,
-16384, -16384, -16384, 16384, 16384, 16384, 16384, 16384,
-16384, -16384, -16384, -16384, 16384, 16384, 0, 0},
{ 16384, 16384, -16384, -16384, -16384, -16384, -16384, 16384,
16384, -16384, -16384, -16384, 16384, 16384, 16384, -16384,
16384, 16384, -16384, -16384, -16384, 16384, 0, 0},
{ 16384, 16384, 16384, -16384, 16384, 16384, 16384, -16384,
16384, 16384, 16384, 16384, 16384, -16384, -16384, -16384,
-16384, 16384, -16384, -16384, 16384, -16384, 0, 0},
{ 16384, -16384, -16384, -16384, -16384, 16384, 16384, -16384,
16384, 16384, -16384, -16384, 16384, 16384, 16384, 16384,
16384, -16384, 16384, 16384, -16384, -16384, 0, 0},
{ 16384, -16384, -16384, -16384, -16384, 16384, 16384, -16384,
-16384, -16384, 16384, 16384, 16384, 16384, 16384, 16384,
16384, 16384, 16384, -16384, 16384, -16384, 0, 0}
};
static __ALIGN32 CONST short PosCache[MAX_CACHE_NUM][24] = {
{ 47, 51, 27, 41, 21, 9, 117, 83,
69, 81, 109, 54, 52, 24, 20, 10,
58, 72, 66, 68, 104, 86, 0, 0},
{ 46, 28, 50, 38, 22, 36, 114, 64,
100, 112, 60, 24, 34, 6, 4, 28,
42, 60, 118, 82, 114, 86, 0, 0},
{ 42, 52, 34, 36, 58, 14, 66, 88,
68, 100, 74, 19, 35, 9, 53, 3,
1, 84, 64, 88, 74, 78, 0, 0},
{ 41, 17, 1, 7, 13, 29, 86, 94,
90, 112, 66, 11, 33, 23, 51, 37,
5, 104, 100, 60, 62, 102, 0, 0},
{ 37, 43, 11, 19, 3, 5, 94, 72,
108, 96, 98, 14, 50, 18, 32, 12,
0, 117, 119, 69, 67, 81, 0, 0},
{ 8, 56, 4, 20, 22, 58, 113, 109,
99, 95, 61, 30, 40, 12, 20, 14,
18, 111, 109, 115, 93, 79, 0, 0},
{ 38, 28, 16, 50, 14, 58, 87, 103,
83, 77, 119, 47, 53, 5, 21, 51,
31, 117, 113, 71, 83, 99, 0, 0},
{ 17, 37, 15, 31, 11, 33, 75, 113,
73, 63, 97, 33, 7, 39, 29, 23,
43, 89, 95, 81, 71, 75, 0, 0},
{ 55, 21, 5, 29, 33, 17, 113, 67,
115, 103, 97, 6, 44, 30, 26, 18,
46, 90, 62, 100, 78, 86, 0, 0},
{ 10, 26, 38, 44, 34, 6, 104, 112,
76, 78, 82, 24, 56, 50, 30, 14,
28, 104, 64, 78, 112, 98, 0, 0},
{ 30, 24, 36, 12, 10, 0, 118, 90,
94, 70, 84, 19, 37, 45, 53, 25,
7, 104, 84, 110, 112, 106, 0, 0},
{ 1, 31, 25, 15, 47, 39, 88, 116,
62, 94, 72, 15, 23, 1, 33, 49,
37, 106, 84, 114, 62, 102, 0, 0},
{ 37, 47, 9, 13, 7, 45, 112, 62,
86, 96, 104, 30, 34, 2, 54, 24,
14, 111, 75, 107, 87, 119, 0, 0},
{ 54, 0, 38, 4, 2, 32, 93, 75,
119, 65, 117, 6, 24, 58, 38, 30,
22, 103, 105, 87, 115, 95, 0, 0},
{ 18, 36, 38, 32, 26, 4, 101, 109,
119, 79, 63, 51, 47, 19, 41, 27,
29, 113, 95, 97, 119, 105, 0, 0},
{ 57, 59, 31, 17, 13, 47, 67, 109,
63, 103, 95, 13, 17, 23, 3, 15,
41, 99, 71, 111, 89, 81, 0, 0},
{ 43, 3, 23, 25, 29, 37, 91, 61,
85, 79, 69, 28, 18, 46, 14, 34,
4, 118, 96, 88, 90, 116, 0, 0},
{ 16, 34, 6, 54, 30, 36, 76, 112,
90, 106, 86, 38, 2, 50, 40, 8,
48, 102, 108, 84, 70, 66, 0, 0},
{ 0, 8, 20, 58, 14, 46, 92, 102,
116, 104, 78, 29, 21, 37, 55, 5,
47, 76, 86, 116, 80, 92, 0, 0},
{ 3, 57, 31, 35, 13, 7, 70, 90,
72, 84, 60, 29, 51, 45, 57, 21,
5, 60, 110, 68, 96, 118, 0, 0},
{ 17, 5, 45, 15, 55, 43, 110, 62,
106, 114, 94, 58, 0, 50, 8, 46,
14, 115, 73, 101, 91, 99, 0, 0},
{ 20, 12, 54, 52, 16, 50, 115, 109,
71, 99, 119, 54, 50, 12, 40, 4,
10, 105, 81, 71, 65, 69, 0, 0},
{ 38, 54, 42, 24, 22, 30, 95, 69,
101, 91, 75, 7, 21, 43, 55, 11,
51, 61, 117, 79, 71, 113, 0, 0},
{ 19, 29, 57, 13, 49, 21, 99, 117,
93, 119, 75, 3, 9, 15, 55, 17,
25, 119, 87, 97, 89, 95, 0, 0},
{ 15, 53, 21, 35, 7, 59, 111, 67,
95, 117, 77, 0, 34, 16, 40, 8,
44, 98, 114, 86, 84, 64, 0, 0},
{ 4, 52, 14, 32, 10, 24, 88, 64,
118, 92, 76, 0, 48, 4, 34, 14,
54, 110, 78, 100, 66, 96, 0, 0},
{ 10, 2, 44, 50, 56, 52, 106, 66,
94, 114, 118, 49, 45, 37, 5, 47,
23, 60, 70, 72, 84, 88, 0, 0},
{ 45, 35, 21, 9, 15, 37, 92, 74,
64, 86, 84, 55, 5, 45, 53, 3,
57, 86, 116, 118, 62, 80, 0, 0},
{ 39, 31, 7, 29, 15, 1, 90, 74,
106, 70, 68, 36, 4, 54, 52, 26,
46, 71, 109, 103, 77, 99, 0, 0},
{ 28, 36, 54, 2, 12, 10, 119, 97,
87, 89, 105, 54, 56, 26, 24, 40,
32, 119, 99, 65, 79, 103, 0, 0},
{ 40, 26, 28, 56, 2, 14, 69, 97,
83, 113, 71, 35, 37, 21, 29, 7,
53, 79, 63, 71, 67, 97, 0, 0},
{ 23, 13, 9, 21, 15, 5, 113, 79,
103, 105, 91, 5, 39, 19, 9, 29,
43, 89, 85, 95, 73, 69, 0, 0}
};
void ComfortNoiseExcitation_G723_16s (Ipp16s gain, Ipp16s *pPrevExc, Ipp16s *pExc,
Ipp16s *pSeed, Ipp16s *pOlp, Ipp16s *pLags,
Ipp16s *pGains, G723_Rate currRate, char *buff, Ipp16s *CasheCounter)
{
int i, lNSbfr, lNBlock;
short j, sTmp, sTmp1;
short *pPosition, *pSign;
short *ppPosition;
short *pCurrExcitation;
short sfs, sX1, sX2, sDiscr, sB, sAbsX2, sAbsX1;
int lTmp, lC, lExcEnergy;
short *pTmpPos;
short *pOff;
short *pTmpExcitation;
pPosition = (short *)buff;
pSign = pPosition + 2*NUM_PULSE_IN_BLOCK;
pTmpPos = pSign + 2*NUM_PULSE_IN_BLOCK;
pOff = pTmpPos + G723_SBFR_LEN/GRIDSIZE;
pTmpExcitation = pOff + 4;
/* generate LTP codes */
if(*CasheCounter < -1) {
int curr = *CasheCounter;
pOlp[0] = OlpCache[curr][0];
pOlp[1] = OlpCache[curr][1];
pGains[0] = GainCache[curr][0];
pGains[1] = GainCache[curr][1];
pGains[2] = GainCache[curr][2];
pGains[3] = GainCache[curr][3];
*pSeed = SeedCacheTbl[curr];
ippsCopy_16s(SignCache[curr],pSign,2*NUM_PULSE_IN_BLOCK);
ippsCopy_16s(PosCache[curr],pPosition,2*NUM_PULSE_IN_BLOCK);
*CasheCounter += 1;
} else {
pOlp[0] = NormRand_16s(21, pSeed) + 123;
pOlp[1] = NormRand_16s(21, pSeed) + 123;
for(lNSbfr=0; lNSbfr<4; lNSbfr++) { /* in [1, MAX_GAIN] */
pGains[lNSbfr] = NormRand_16s(MAX_GAIN, pSeed) + 1;
}
/* Generate signs and grids */
for(lNBlock=0; lNBlock<4; lNBlock += 2) {
sTmp = NormRand_16s((1 << (NUM_PULSE_IN_BLOCK+2)), pSeed);
pOff[lNBlock] = sTmp & 0x1;
sTmp >>= 1;
pOff[lNBlock+1] = G723_SBFR_LEN + (sTmp & 0x1);
for(i=0; i<NUM_PULSE_IN_BLOCK; i++) {
pSign[i+NUM_PULSE_IN_BLOCK*(lNBlock>>1)] = ((sTmp & 0x2) - 1)<<14;
sTmp >>= 1;
}
}
/* Generate positions */
ppPosition = pPosition;
for(lNSbfr=0; lNSbfr<4; lNSbfr++) {
ippsCopy_16s(StratingPositionTbl, pTmpPos, G723_SBFR_LEN/GRIDSIZE);
sTmp=(G723_SBFR_LEN/GRIDSIZE); for(i=0; i<NPulse[lNSbfr]; i++) {
j = NormRand_16s(sTmp, pSeed);
*ppPosition++ = pTmpPos[j] + pOff[lNSbfr];
sTmp --; pTmpPos[j] = pTmpPos[sTmp];
}
}
}
pLags[0] = 1;
pLags[1] = 0;
pLags[2] = 1;
pLags[3] = 3;
/* calculate fixed codebook gains */
pCurrExcitation = pExc;
lNSbfr = 0;
for(lNBlock=0; lNBlock<2; lNBlock++) {
/* decode LTP only */
{
short lag1 = pOlp[lNBlock];
short lag2 = pLags[lNSbfr];
ippsDecodeAdaptiveVector_G723_16s(lag1, lag2, pGains[lNSbfr], &pPrevExc[0], pCurrExcitation, SA_Rate[currRate]);
lag2 = pLags[lNSbfr+1];
ippsDecodeAdaptiveVector_G723_16s(lag1, lag2, pGains[lNSbfr+1], &pPrevExc[G723_SBFR_LEN], &pCurrExcitation[G723_SBFR_LEN], SA_Rate[currRate]);
}
/*ippsMaxAbs_16s(pCurrExcitation,2*G723_SBFR_LEN,&sTmp1);*/
ippsMax_16s(pCurrExcitation,2*G723_SBFR_LEN,&sTmp1);
ippsMin_16s(pCurrExcitation,2*G723_SBFR_LEN,&sTmp);
if(-sTmp > sTmp1) sTmp1 = -sTmp;
if(sTmp1 == 0) sfs = 0;
else {
sfs = 4 - Exp_16s(sTmp1); /* 4 bits of margin */
if(sfs < -2) sfs = -2;
}
if(sfs<0)
ippsLShiftC_16s(pCurrExcitation,-sfs,pTmpExcitation,2*G723_SBFR_LEN);
else
ippsRShiftC_16s(pCurrExcitation,sfs,pTmpExcitation,2*G723_SBFR_LEN);
lTmp = pTmpExcitation[pPosition[0+NUM_PULSE_IN_BLOCK*lNBlock]] * pSign[0+NUM_PULSE_IN_BLOCK*lNBlock];
for(i=1; i<NUM_PULSE_IN_BLOCK; i++) {
lTmp += pTmpExcitation[pPosition[i+NUM_PULSE_IN_BLOCK*lNBlock]] * pSign[i+NUM_PULSE_IN_BLOCK*lNBlock];
}
sTmp = lTmp>>14;
sB = ((sTmp*INV_NUM_PULSE_IN_BLOCK)+0x4000)>>15;
/* excitation energy */
ippsDotProd_16s32s_Sfs(pTmpExcitation,pTmpExcitation,2*G723_SBFR_LEN,&lExcEnergy,-1);
/* compute 2*G723_SBFR_LEN x gain**2 x 2**(-2sh1+1) */
/* gain input = 2**5 gain */
sTmp = (short)((gain * G723_SBFR_LEN)>>5);
lTmp = 2 * sTmp * gain;
sTmp = (sfs<<1)+4;
lTmp = lTmp>>sTmp;
lTmp = lExcEnergy - lTmp;
lC = MulC_32s(INV_NUM_PULSE_IN_BLOCK, lTmp); /* * 1/NbPuls */
/* Solve EQ(X) = X**2 + 2 sB X + c */
lTmp = 2* sB * sB - lC;
if(lTmp <= 0) {
sX1 = -sB;
}
else {
sDiscr = ownSqrt_32s(lTmp>>1);
sX1 = sDiscr - sB;
sX2 = sDiscr + sB;
sAbsX2 = abs(sX2);
sAbsX1 = abs(sX1);
if (sAbsX2 < sAbsX1) sX1 = -sX2;
}
/* Update Excitation */
if(++sfs < 0) sTmp = sX1>>(-sfs);
else sTmp = sX1<<sfs;
if(sTmp > G723_MAX_GAIN)
sTmp = G723_MAX_GAIN;
if(sTmp < -G723_MAX_GAIN)
sTmp = -G723_MAX_GAIN;
for(i=0; i<NUM_PULSE_IN_BLOCK; i++) { j = pPosition[i+NUM_PULSE_IN_BLOCK*lNBlock]; pCurrExcitation[j] = pCurrExcitation[j] +
(sTmp * (pSign[i+NUM_PULSE_IN_BLOCK*lNBlock])>>15);
}
/* update PrevExcitation */
ippsCopy_16s(&pPrevExc[2*G723_SBFR_LEN],pPrevExc,G723_MAX_PITCH-2*G723_SBFR_LEN);
ippsCopy_16s(pCurrExcitation,&pPrevExc[G723_MAX_PITCH-2*G723_SBFR_LEN],2*G723_SBFR_LEN);
pCurrExcitation += 2*G723_SBFR_LEN;
lNSbfr += 2;
}
}
__ALIGN32 CONST IppSpchBitRate SA_Rate[2] = {IPP_SPCHBR_6300, IPP_SPCHBR_5300};
__ALIGN32 CONST short LPCDCTbl[G723_LPC_ORDER] = {
3131,4721,7690,10806,13872,16495,19752,22260,25484,27718};
__ALIGN32 CONST short PerceptualFltCoeffTbl[2*G723_LPC_ORDER] = {
29491,26542,23888,21499,19349,17414,15673,14106,12695,11425,/* Zero part */
16384, 8192, 4096, 2048, 1024, 512, 256, 128, 64, 32,/* Pole part */
};
__ALIGN32 CONST short GainDBLvls[N_GAINS] = {
0xFFFF, 0xFFFE, 0xFFFD, 0xFFFC, 0xFFFA, 0xFFF7, 0xFFF3, 0xFFEE,
0xFFE6, 0xFFDA, 0xFFC9, 0xFFB0, 0xFF8D, 0xFF5A, 0xFF10, 0xFEA4,
0xFE0A, 0xFD2A, 0xFBE6, 0xFA13, 0xF76F, 0xF39E, 0xEE1A, 0xE621
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -