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

📄 owng729.c

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 C
📖 第 1 页 / 共 4 页
字号:
            *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 + -