📄 owng729.c
字号:
*Vad =1;
}
return;
}
void SynthesisFilterOvf_G729_16s_I(const Ipp16s * pLPC, Ipp16s * pSrcDst,
int len, char * pMemUpdated,int histLen) {
int nTaps;
SynthesisFilterState *SynFltSt;
SynFltSt=(SynthesisFilterState*)pMemUpdated;
nTaps = SynFltSt->nTaps;
if(!histLen)
ippsSynthesisFilter_G729E_16s_I(pLPC,30, pSrcDst, len, SynFltSt->buffer);
else
ippsSynthesisFilterLow_NR_16s_ISfs(pLPC,pSrcDst, len, 12, SynFltSt->buffer+histLen);
ippsCopy_16s((pSrcDst+len-nTaps), SynFltSt->buffer, nTaps);
}
IppStatus SynthesisFilter_G729_16s (const Ipp16s * pLPC, const Ipp16s * pSrc,
Ipp16s * pDst, int len, char * pMemUpdated,int histLen) {
int nTaps;
SynthesisFilterState *SynFltSt;
IppStatus sts=ippStsNoErr;
SynFltSt=(SynthesisFilterState*)pMemUpdated;
nTaps = SynFltSt->nTaps;
if(histLen==0)
ippsSynthesisFilter_G729E_16s(pLPC, 30,pSrc, pDst, len, SynFltSt->buffer);
else
sts = ippsSynthesisFilter_NR_16s_Sfs(pLPC,pSrc,pDst, len, 12, SynFltSt->buffer+histLen);
if(sts != ippStsOverflow)
ippsCopy_16s((pDst+len-nTaps), SynFltSt->buffer, nTaps);
return sts;
}
IppStatus SynthesisFilter_G729_16s_update (const Ipp16s * pLPC, const Ipp16s * pSrc,
Ipp16s * pDst, int len, char * pMemUpdated,int histLen, int update) {
int nTaps;
SynthesisFilterState *SynFltSt;
IppStatus sts=ippStsNoErr;
SynFltSt=(SynthesisFilterState*)pMemUpdated;
nTaps = SynFltSt->nTaps;
if(histLen==0) ippsSynthesisFilter_G729E_16s(pLPC, 30,pSrc, pDst, len, SynFltSt->buffer);
else
sts = ippsSynthesisFilter_NR_16s_Sfs(pLPC,pSrc,pDst, len, 12, SynFltSt->buffer+histLen);
if((sts != ippStsOverflow)&&(update==1))
ippsCopy_16s((pDst+len-nTaps), SynFltSt->buffer, nTaps);
return sts;
}
void SynthesisFilterOvf_G729_16s (const Ipp16s * pLPC, const Ipp16s * pSrc,
Ipp16s * pDst, int len, char * pMemUpdated,int histLen) {
int nTaps;
SynthesisFilterState *SynFltSt;
SynFltSt=(SynthesisFilterState*)pMemUpdated;
nTaps = SynFltSt->nTaps;
if(histLen==0) ippsSynthesisFilter_G729E_16s(pLPC, 30, pSrc, pDst, len, SynFltSt->buffer);
else
ippsSynthesisFilter_NR_16s_Sfs(pLPC,pSrc,pDst, len, 12, SynFltSt->buffer+histLen);
ippsCopy_16s((pDst+len-nTaps), SynFltSt->buffer, nTaps);
}
void SynthesisFilterSize_G729 (int *pSize) {
*pSize = sizeof(SynthesisFilterState)+BWLPCF_DIM*sizeof(short);
*pSize += 32;
}
void SynthesisFilterInit_G729 (char * pMemUpdated) {
SynthesisFilterState *SynFltSt;
int size;
SynFltSt=(SynthesisFilterState*)pMemUpdated;
size = sizeof(SynthesisFilterState);
SynFltSt->buffer = (short*)((char*)SynFltSt + size);
//SynFltSt->buffer = (short*)(((((char*)SynFltSt->buffer + 7) - (char*)NULL)&~7));
SynFltSt->buffer = IPP_ALIGNED_PTR(SynFltSt->buffer, 32);
SynFltSt->nTaps = BWLPCF_DIM;
ippsZero_16s(SynFltSt->buffer,BWLPCF_DIM);
}
void CodewordImpConv_G729(int index, const short *pSrc1,const short *pSrc2,short *pDst) {
int i;
int sign0, sign1, sign2, sign3; /* 1, -1 */
int idx0, idx1, idx2, idx3; /* position*/
idx0 = index & 0x7;
idx1 = (index>>3) & 0x7;
idx2 = (index>>6) & 0x7;
idx3 = index>>9;
idx0 = (idx0<<2)+idx0;
idx1 = (idx1<<2)+idx1+1;
idx2 = (idx2<<2)+idx2+2;
idx3 = ((idx3>>1)<<2)+(idx3>>1)+(idx3&1)+3;
if(idx0>idx1) {
i=idx0; idx0=idx1; idx1=i;
}
if(idx2>idx3) {
i=idx2; idx2=idx3; idx3=i;
}
if(idx0>idx2) {
i=idx0; idx0=idx2; idx2=i;
}
if(idx1>idx3) {
i=idx1; idx1=idx3; idx3=i;
}
if(idx1>idx2) {
i=idx1; idx1=idx2; idx2=i;
}
sign0 = ((pSrc1[idx0] >> 15)<<1)+1;
sign1 = ((pSrc1[idx1] >> 15)<<1)+1;
sign2 = ((pSrc1[idx2] >> 15)<<1)+1;
sign3 = ((pSrc1[idx3] >> 15)<<1)+1;
for(i=0; i<idx0; i++)
pDst[i]=0;
for(; i<idx1; i++)
pDst[i]=sign0*pSrc2[i-idx0];
for(; i<idx2; i++)
pDst[i]=Cnvrt_32s16s(sign0*pSrc2[i-idx0]+sign1*pSrc2[i-idx1]);
for(; i<idx3; i++)
pDst[i]=Cnvrt_32s16s(sign0*pSrc2[i-idx0]+sign1*pSrc2[i-idx1]+sign2*pSrc2[i-idx2]);
for(; i<LP_SUBFRAME_DIM; i++)
pDst[i]=Cnvrt_32s16s(sign0*pSrc2[i-idx0]+sign1*pSrc2[i-idx1]+sign2*pSrc2[i-idx2]+sign3*pSrc2[i-idx3]);
}
/*=============================================================
// pSrc - reflection coefficients
// pDst - log area ratio coefficients
*/
void _ippsRCToLAR_G729_16s (const Ipp16s* pSrc, Ipp16s* pDst, int len) {
short refC, Ax;
int i, L_tmp, L_Bx;
for(i=0; i<len; i++) {
refC = Abs_16s(pSrc[i]);
refC >>= 4;
if(refC <= 1299 /* 0.6341 */) {
pDst[i] = refC;
} else {
if(refC <= 1815 /* 0.8864 */) {
Ax = 4567;
L_Bx = 3271557L/* 0.78 */;
} else if(refC <= 1944 /* 0.9490 */) {
Ax = 11776 /* 5.75 */;
L_Bx = 16357786L /* 3.90 */;
} else {
Ax = 27443 /* 13.40 */;
L_Bx = 46808433L /* 11.16 */;
}
refC >>= 1;
L_tmp = (refC * Ax)<<1;
L_tmp=Sub_32s(L_tmp,L_Bx);
pDst[i] = L_tmp >> 11;
}
if(pSrc[i] < 0) {
pDst[i]=Cnvrt_32s16s(-pDst[i]);
}
}
}
/* ///////////////////////////////////////////////////////////////////////////////////////
// Name: ownMakeDecision
// Purpose:
// Parameters:
// bwf1 - banwidth expansion parameter
// bwf2 - bandwidth expansion parameter
// intLSF - interpolated LSF
// newLSF - new LSF vector for 2nd subframe
// pRc - reflection coefficients
*/
void _ippsPWGammaFactor_G729_16s ( const Ipp16s *pLAR, const Ipp16s *pLSF,
Ipp16s *flat, Ipp16s *pGamma1, Ipp16s *pGamma2, Ipp16s *pMem ) {
short lar0, lar1, bwf1,bwf2;
int i, L_tmp, L_min;
lar0 = pLAR[0];
lar1 = pLAR[1];
if(*flat != 0) {
if((lar0 < -3562 /* -1.74 */)&&(lar1 > 1336 /* 0.65 */)) {
*flat = 0;
}
} else {
if((lar0 > -3116 /* -1.52 */) || (lar1 < 890 /* 0.43 */) ) {
*flat = 1;
}
}
if(*flat == 0) {
ippsLShiftC_16s(pLSF,1,pMem,LPF_DIM);
bwf1 = N0_98 /* 0.98 */;
L_min = pMem[1] - pMem[0];
for(i=1; i<LPF_DIM-1; i++) {
L_tmp = pMem[i+1] - pMem[i];
if(L_tmp < L_min) {
L_min = L_tmp;
}
}
L_tmp = SIX_PI * L_min;
L_tmp >>= 15;
L_tmp = 1024 /* 1 */ - L_tmp;
L_tmp = L_tmp << 5;
if(L_tmp > BWF2 /* 0.70 */) {
bwf2 = BWF2;
} else if(L_tmp < 13107 /* 0.40 */) {
bwf2 = 13107;
} else {
bwf2=L_tmp;
}
} else {
bwf1 = 30802 /* 0.94 */;
bwf2 = 19661 /* 0.60 */;
}
*pGamma1 = bwf1;
*pGamma2 = bwf2;
}
void PitchTracking_G729E( short *delay,short *delay_frac, short *prevDelay, short *stat_N,
short *pitchStatDelayt, short *pitchStatFractiont){
short dist, dist_min, pitch_mult;
short i, is_mult;
dist = delay[0] - prevDelay[0];
if(dist < 0) {
dist = -dist;
is_mult = 0;
} else {
is_mult = 1;
}
if(dist < 5) {
*stat_N += 1;
if(*stat_N > 7) *stat_N = 7 ;
*pitchStatDelayt = delay[0];
*pitchStatFractiont = delay_frac[0];
} else {
dist_min = dist;
if( is_mult == 0) {
pitch_mult = delay[0] + delay[0];
for(i=2; i<5; i++) {
dist = Abs_16s(pitch_mult - prevDelay[0]);
if(dist <= dist_min) dist_min = dist;
pitch_mult += delay[0];
}
} else {
pitch_mult = prevDelay[0] + prevDelay[0];
for(i=2; i<5; i++) {
dist = Abs_16s(pitch_mult - delay[0]);
if(dist <= dist_min) dist_min = dist;
pitch_mult += prevDelay[0];
}
}
if(dist_min < 5) {
if(*stat_N > 0) {
delay[0] = *pitchStatDelayt;
delay_frac[0] = *pitchStatFractiont;
}
*stat_N -= 1;
if(*stat_N < 0) *stat_N = 0 ;
} else {
*stat_N = 0;
*pitchStatDelayt = delay[0];
*pitchStatFractiont = delay_frac[0];
}
}
prevDelay[0] = delay[0];
return;
}
static void stat( short prevB, short prevF, short mode, short prevMode,
short *statGlobal, short *BWDFrameCounter, short *val_BWDFrameCounter ) {
int i;
if(mode == 1) {
*BWDFrameCounter += 1;
*val_BWDFrameCounter += 250;
if(*BWDFrameCounter == 20)
statGlobal[0] = Add_16s(statGlobal[0], 2500);
else
if(*BWDFrameCounter > 20)
statGlobal[0] += 500;
}else
if((mode == 0)&&(prevMode == 1)) {
if(*BWDFrameCounter < 20) {
statGlobal[0] = statGlobal[0] - 5000 + *val_BWDFrameCounter;
}
*BWDFrameCounter = *val_BWDFrameCounter = 0;
}
if(statGlobal[0] < 13000) {
for(i=1; i<6;i++)
if(prevB > prevF + gThrs[i]) {
statGlobal[0] += gStats[i];
break;
}
}
for(i=0; i<5;i++)
if(prevB < prevF - gThrs[i]) {
statGlobal[0] -= gStats1[i];
break;
}
if( statGlobal[0] > 32000)
statGlobal[0] = 32000;
else
if(statGlobal[0] < 0)
statGlobal[0] = 0;
return;
}
void SetLPCMode_G729E ( short *pSignal, short *fwdA, short *pBwdLPC, short *mode,
short *newLSP, short *oldLSP, G729Encoder_Obj *encoderObj){
short i,gap,prevF,prevB,gpredB,temp;
int L_threshLPC,LSPdist,sigEnergy;
LOCAL_ALIGN_ARRAY(32, short, res, LP_FRAME_DIM, encoderObj);
sigEnergy = enerDB(pSignal, LP_FRAME_DIM);
ippsResidualFilter_G729E_16s(&pBwdLPC[BWLPCF1_DIM], BWLPCF_DIM,pSignal, res, LP_FRAME_DIM);
prevB = sigEnergy - enerDB(res, LP_FRAME_DIM);
encoderObj->interpCoeff2_2 -= 410;
if( encoderObj->interpCoeff2_2 < 0) encoderObj->interpCoeff2_2 = 0;
temp = (1<<12) - encoderObj->interpCoeff2_2;
ippsInterpolateC_G729_16s_Sfs(pBwdLPC + BWLPCF1_DIM, temp,
encoderObj->pPrevFilt, encoderObj->interpCoeff2_2, pBwdLPC + BWLPCF1_DIM, BWLPCF1_DIM, 12);
ippsInterpolate_G729_16s
(pBwdLPC + BWLPCF1_DIM, encoderObj->pPrevFilt, pBwdLPC, BWLPCF1_DIM);
ippsResidualFilter_G729E_16s(pBwdLPC, BWLPCF_DIM,pSignal, res, LP_SUBFRAME_DIM);
ippsResidualFilter_G729E_16s(&pBwdLPC[BWLPCF1_DIM], BWLPCF_DIM,&pSignal[LP_SUBFRAME_DIM], &res[LP_SUBFRAME_DIM], LP_SUBFRAME_DIM);
gpredB = sigEnergy - enerDB(res, LP_FRAME_DIM);
ippsResidualFilter_G729E_16s(fwdA,LPF_DIM, pSignal, res, LP_SUBFRAME_DIM);
ippsResidualFilter_G729E_16s(&fwdA[LPF_DIM+1], LPF_DIM,&pSignal[LP_SUBFRAME_DIM], &res[LP_SUBFRAME_DIM], LP_SUBFRAME_DIM);
prevF = sigEnergy - enerDB(res, LP_FRAME_DIM);
temp = encoderObj->statGlobal>>7;
temp = (short)temp * 3;
gap = temp + 205;
if( (gpredB > prevF - gap) &&
(prevB > prevF - gap) && (prevB > 0) && (gpredB > 0) )
mode[0] = 1;
else
mode[0] = 0;
for(LSPdist=i=0; i<LPF_DIM; i++) {
temp = oldLSP[i] - newLSP[i];
LSPdist += temp * temp;
}
if(encoderObj->statGlobal < 13000)
mode[0] = 0;
if(encoderObj->statGlobal < 32000) {
L_threshLPC = 0;
} else {
L_threshLPC = 32212255;
}
if((LSPdist < L_threshLPC)&&(mode[0] == 0)&&(encoderObj->prevLPmode == 1)&&(prevB > 0)&&(gpredB > 0)) {
mode[0] = 1;
}
if(sigEnergy < BWF_HARMONIC_E) {
mode[0] = 0;
if(encoderObj->statGlobal > 13000)
encoderObj->statGlobal = 13000;
} else {
tstDominantBWDmode(&encoderObj->BWDcounter2,&encoderObj->FWDcounter2,&encoderObj->dominantBWDmode, mode[0]);
stat(prevB, prevF, mode[0], encoderObj->prevLPmode,
&encoderObj->statGlobal, &encoderObj->BWDFrameCounter, &encoderObj->val_BWDFrameCounter);
}
if(mode[0] == 0)
encoderObj->interpCoeff2_2 = 4506;
LOCAL_ALIGN_ARRAY_FREE(32, short, res, LP_FRAME_DIM, encoderObj);
return;
}
void tstDominantBWDmode( short *BWDcounter2, short *FWDcounter2, short *dominantBWDmode, short mode) {
short tmp, count_all;
if(mode == 0)
*FWDcounter2+=1;
else *BWDcounter2+=1;
count_all = *BWDcounter2 + *FWDcounter2;
if(count_all == 100) {
count_all >>= 1;
*BWDcounter2 >>= 1;
*FWDcounter2 >>= 1;
}
*dominantBWDmode = 0; if(count_all >= 10) {
tmp = *FWDcounter2<<2;
if(*BWDcounter2 > tmp) *dominantBWDmode = 1;
}
return;
}
short enerDB(short *synth, short L) {
short i,energyLog,index;
int L_energy;
ippsDotProd_16s32s_Sfs(synth,synth,L,&L_energy,0);
if(L_energy > (IPP_MAX_32S>>1))
L_energy = (IPP_MAX_32S>>1);
for(i = 0; L_energy > 32; i++)
L_energy >>= 1;
index = L_energy - (1<<4);
energyLog = 617;
if(index < 0)
energyLog = 1;
else {
if(i > 1)
energyLog = i*617;
energyLog += energyLogTable[index];
}
return(energyLog);
}
static void NormBy0_32s(int *src, int *dst,int len) {
int i, sum, norm;
sum = src[0] + 1;
norm = Norm_32s_I(&sum);
dst[0] = sum;
for(i = 1; i <len; i++) {
sum = src[i] + 1;
dst[i] = sum << norm;
}
return;
}
void BWDLagWindow(int *pSrc, int *pDst) {
short i;
for(i=0; i<BWLPCF_DIM; i++) {
pSrc[i+1] = Mul_32s(pSrc[i+1]>>1,wlag_bwd[i]>>1);
}
NormBy0_32s(pSrc,pDst,BWLPCF_DIM+1);
}
int ExtractBitsG729( const unsigned char **pBits, int *nBit, int Count ) {
int temp,i,bits = 0;
for( i = 0 ; i < Count ; i ++ ) {
temp = ((pBits[0])[(i + nBit[0])>>3] >> (7 - ((i + nBit[0]) & 7)) ) & 1;
bits <<= 1 ;
bits += temp ;
}
pBits[0] += (Count + nBit[0])>>3;
nBit[0] = (Count + nBit[0]) & 7;
return bits;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -