📄 owng723.c
字号:
Params->sAmplitude[sNSbfr] = sSign;
Params->sPosition[sNSbfr] = lCdbkIdx;
LOCAL_ARRAY_FREE(short, pDstFixedPosition,4, encoderObj) ;
LOCAL_ARRAY_FREE(short, pDstFixedSign, 4, encoderObj) ;
LOCAL_ALIGN_ARRAY_FREE(16, short, pAlignBuff, G723_SBFR_LEN, encoderObj) ;
LOCAL_ALIGN_ARRAY_FREE(16, int, pToeplizMatrix, G723_TOEPLIZ_MATRIX_SIZE, encoderObj) ;
LOCAL_ALIGN_ARRAY_FREE(16, short, pFltFixedVector, G723_SBFR_LEN+4, encoderObj) ;
LOCAL_ALIGN_ARRAY_FREE(16, short, pFixedVector, G723_SBFR_LEN+4, encoderObj) ;
LOCAL_ALIGN_ARRAY_FREE(16, short, pTargetImpRespCorr, G723_SBFR_LEN+4, encoderObj) ;
break;
}
}
}
void InterpolationIndex_G723_16s( short *pDecodedExc, short sPitchLag, short *pGain, short *pGainSFS, short *pDstIdx)
{
int lSfs, lIdx, lTmp;
short sTargetVecEnergy, sMaxCorr, sBestEnergy;
short *pExc;
/* Normalize the excitation */
lSfs=3;
ippsAutoScale_16s_I( pDecodedExc, G723_MAX_PITCH+G723_FRM_LEN, &lSfs );
*pGainSFS = lSfs;
if ( sPitchLag > (short) (G723_MAX_PITCH-3) )
sPitchLag = (short) (G723_MAX_PITCH-3);
lIdx = sPitchLag;
pExc = &pDecodedExc[G723_MAX_PITCH+G723_FRM_LEN-2*G723_SBFR_LEN];
ippsAutoCorrLagMax_Inv_16s(pExc,2*G723_SBFR_LEN,sPitchLag-3,sPitchLag+3,&lTmp,&lIdx);
if(lTmp > 0 ) {
sMaxCorr = Cnvrt_NR_32s16s( lTmp );
/* Compute target energy */
ippsDotProd_16s32s_Sfs(pExc,pExc,2*G723_SBFR_LEN,&lTmp,0);
lTmp <<=1;
sTargetVecEnergy = Cnvrt_NR_32s16s( lTmp );
*pGain = sTargetVecEnergy;
/* Calculate the best energy */
ippsDotProd_16s32s_Sfs(pExc-lIdx,pExc-lIdx,2*G723_SBFR_LEN,&lTmp,0);
lTmp <<=1;
sBestEnergy = Cnvrt_NR_32s16s( lTmp );
lTmp = sBestEnergy * sTargetVecEnergy;
lTmp >>= 3;
if ( lTmp < sMaxCorr * sMaxCorr ) *pDstIdx = (short)lIdx;
else *pDstIdx = 0;
} else *pDstIdx = 0;
return;
}
typedef struct _G723_VADmemory{
int PrevEnergy;
int NoiseLevel;
short HangoverCounter;
short VADCounter;
short AdaptEnableFlag;
short OpenLoopDelay[4];
}G723_VADmemory;
/*
Name: VoiceActivityDetectSize
Purpose: VAD decision memory size query
pVADmem pointer to the VAD decision memory
*/
void VoiceActivityDetectSize_G723(int* pVADsize)
{
*pVADsize = sizeof(G723_VADmemory);
*pVADsize = (*pVADsize+7)&(~7);
}
/*
Name: VoiceActivityDetectInit
Purpose: VAD decision memory init
pVADmem pointer to the VAD decision memory
*/
void VoiceActivityDetectInit_G723(char* pVADmem)
{
G723_VADmemory* vadMem = (G723_VADmemory*)pVADmem;
vadMem->HangoverCounter = 3;
vadMem->VADCounter = 0;
vadMem->PrevEnergy = 0x400;
vadMem->NoiseLevel = 0x400;
vadMem->AdaptEnableFlag = 0;
vadMem->OpenLoopDelay[0] = 1;
vadMem->OpenLoopDelay[1] = 1;
}
static __ALIGN32 CONST int LogAdd_Tbl[11] = {
300482560, 300482560, 300482560, 300482560,337149952,378273792,424443904,476217344,534315008,599523328,672694272
};
static __ALIGN32 CONST short LogMul_Tbl[11] = {
0, 0, 0, 0, 1119, 1255, 1409, 1580, 1773, 1990, 2233
};
void VoiceActivityDetect_G723(const Ipp16s *pSrc, const Ipp16s *pNoiseLPC,
const Ipp16s *pOpenLoopDelay, int SineWaveDetector, int *pVADDecision, int *pAdaptEnableFlag, char* pVADmem, short *AlignBuff)
{
G723_VADmemory* vadMem = (G723_VADmemory*)pVADmem;
int i, j, lTmp0, lTmp1;
short sTmp0, sTmp1, sNmult, MinOLP;
int VADResult = 1 ;
vadMem->OpenLoopDelay[2] = pOpenLoopDelay[0] ;
vadMem->OpenLoopDelay[3] = pOpenLoopDelay[1] ;
/* Find Minimum pitch period */
MinOLP = G723_MAX_PITCH ;
for ( i = 0 ; i < 4 ; i ++ ) {
if ( MinOLP > vadMem->OpenLoopDelay[i] )
MinOLP = vadMem->OpenLoopDelay[i] ;
}
/* How many olps are multiplies of their min */
sNmult = 0 ;
for ( i = 0 ; i < 4 ; i++ ) {
sTmp1 = MinOLP ;
for ( j = 0 ; j < 8 ; j++ ) {
sTmp0 = sTmp1 - vadMem->OpenLoopDelay[i];
if(sTmp0 < 0) sTmp0 = -sTmp0;
if ( sTmp0 <= 3 ) sNmult++ ;
sTmp1 += MinOLP;
}
}
/* Update adaptation enable counter if not periodic and not sine and clip it.*/
if ( (sNmult == 4) || (SineWaveDetector == -1) )
if(vadMem->AdaptEnableFlag > 5) vadMem->AdaptEnableFlag = 6;
else vadMem->AdaptEnableFlag += 2;
else
if ( vadMem->AdaptEnableFlag < 1 ) vadMem->AdaptEnableFlag = 0;
else vadMem->AdaptEnableFlag--;
/* Inverse filter the data */
ippsResidualFilter_AMRWB_16s_Sfs(pNoiseLPC, G723_LPC_ORDER, &pSrc[G723_SBFR_LEN], AlignBuff, G723_FRM_LEN-G723_SBFR_LEN, 14);
ippsDotProd_16s32s_Sfs(AlignBuff,AlignBuff,G723_FRM_LEN-G723_SBFR_LEN,&lTmp1,-1);
/* Scale the rezidual energy */
lTmp1 = MulC_32s(2913, lTmp1 ) ;
/* Clip noise level */
if ( vadMem->NoiseLevel > vadMem->PrevEnergy ) {
lTmp0 = vadMem->PrevEnergy - (vadMem->PrevEnergy>>2);
vadMem->NoiseLevel = lTmp0 + (vadMem->NoiseLevel>>2);
}
/* Update the noise level */
if ( !vadMem->AdaptEnableFlag ) {
vadMem->NoiseLevel = vadMem->NoiseLevel + (vadMem->NoiseLevel>>5);
} else { /* Decay NoiseLevel */
vadMem->NoiseLevel = vadMem->NoiseLevel - (vadMem->NoiseLevel>>11);
}
/* Update previous energy */
vadMem->PrevEnergy = lTmp1 ;
/* CLip Noise Level */
if ( vadMem->NoiseLevel < 0x80 )
vadMem->NoiseLevel = 0x80 ;
if ( vadMem->NoiseLevel > 0x1ffff )
vadMem->NoiseLevel = 0x1ffff ;
/* Compute the treshold */
lTmp0 = vadMem->NoiseLevel<<13;
sTmp0 = Norm_32s_Pos_I(&lTmp0);
sTmp1 = (lTmp0>>15)& 0x7e00;
lTmp0 = LogAdd_Tbl[sTmp0] - sTmp1 * LogMul_Tbl[sTmp0];
sTmp1 = lTmp0 >> 15;
sTmp0 = (short)(vadMem->NoiseLevel>>2);
lTmp0 = sTmp0*sTmp1;
lTmp0 >>= 10;
/* treshold */
if ( lTmp0 > lTmp1 )
VADResult = 0 ;
/* update counters */
if ( VADResult ) {
vadMem->VADCounter++ ;
vadMem->HangoverCounter++ ;
} else {
vadMem->VADCounter-- ;
if ( vadMem->VADCounter < 0 )
vadMem->VADCounter = 0 ;
}
if ( vadMem->VADCounter >= 2 ) {
vadMem->HangoverCounter = 6 ;
if ( vadMem->VADCounter >= 3 )
vadMem->VADCounter = 3 ;
}
if ( vadMem->HangoverCounter ) {
VADResult = 1 ;
if ( vadMem->VADCounter == 0 )
vadMem->HangoverCounter -- ;
}
/* Update periodicy detector */
vadMem->OpenLoopDelay[0] = vadMem->OpenLoopDelay[2] ;
vadMem->OpenLoopDelay[1] = vadMem->OpenLoopDelay[3] ;
*pAdaptEnableFlag = vadMem->AdaptEnableFlag; /* adaptation enable counter */
*pVADDecision = VADResult; /* VAD desision : 0 - noise, 1 - voice */
}
static __ALIGN32 CONST short StratingPositionTbl[G723_SBFR_LEN/GRIDSIZE] = {
0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58};
#define MAX_CACHE_NUM 32
static __ALIGN32 CONST short SeedCacheTbl[MAX_CACHE_NUM] = {
17547, -15555, 11855, 26561, -20077, -21051, 24151, 9545,
-15205, 24141, 29791, -5935, -605, 21717, -3993, 12889,
-9045, 4445, 21103, -32287, -7757, 5093, 6775, 22377,
-29509, -9107, -14209, 13041, 24003, -5387, -9081, -27527};
static __ALIGN32 CONST short OlpCache[MAX_CACHE_NUM][2] = {
{129, 137}, {143, 135}, {137, 140}, {133, 136},
{129, 124}, {139, 140}, {129, 133}, {123, 129},
{139, 128}, {128, 125}, {140, 132}, {137, 133},
{136, 127}, {131, 132}, {129, 138}, {133, 127},
{142, 123}, {127, 141}, {137, 128}, {134, 133},
{136, 135}, {137, 129}, {143, 125}, {138, 130},
{139, 143}, {140, 139}, {127, 128}, {124, 138},
{130, 126}, {136, 129}, {130, 138}, {136, 136}};
static __ALIGN32 CONST short GainCache[MAX_CACHE_NUM][4] = {
{34, 31, 18, 35}, {38, 16, 47, 22}, { 9, 29, 48, 36}, {16, 44, 4, 15},
{16, 27, 34, 34}, { 5, 26, 45, 8}, {14, 32, 31, 36}, {12, 18, 25, 8},
{ 7, 50, 46, 49}, {43, 26, 1, 21}, { 3, 37, 35, 27}, { 5, 7, 29, 4},
{ 6, 50, 4, 28}, { 3, 16, 16, 12}, {25, 44, 10, 8}, {43, 10, 17, 2},
{14, 27, 8, 22}, {33, 46, 40, 30}, {31, 4, 6, 28}, {28, 29, 39, 3},
{31, 32, 9, 31}, {34, 15, 22, 26}, {20, 17, 23, 38}, { 9, 12, 44, 6},
{ 6, 14, 5, 5}, { 7, 25, 13, 49}, {44, 31, 11, 38}, {36, 10, 33, 11},
{40, 24, 48, 44}, { 1, 24, 12, 49}, {50, 48, 21, 28}, { 9, 23, 5, 19}};
static __ALIGN32 CONST short SignCache[MAX_CACHE_NUM][24] = {
{ 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},
{ 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,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -