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

📄 owng729.c

📁 G.711,G.723.1,G.726,G.729,GSM CODEC C/C++ code
💻 C
📖 第 1 页 / 共 4 页
字号:

#if defined(__ICL ) && defined(_IPP_A6)
static int ownSignChangeRate_A6(short *pSrc /* [ZEROcrossEnd-ZEROcrossBegin+1] */) {
    int    i,ll;
    Ipp32s sum=0;
    __m64 m1,m2,m3,m4,mmSum,left_3_zer0;
    mmSum = _mm_setzero_si64();
    left_3_zer0 = _mm_set_pi16(0,0,0,0xffff);
    i = 0;
    m1    = *(__m64*)&pSrc[i];       /* m1 = first 4 */
    for(i+=16; i<=ZEROcrossEnd-ZEROcrossBegin; i+=16) {
        m3    = *(__m64*)&pSrc[i-12];/* m3 = second 4 */
        m2    = _mm_srli_si64(m1,16);
        m4    = _mm_slli_si64(m3,48);
        m4    = _mm_or_si64(m4,m2);

        m1    = _mm_mulhi_pi16(m1,m4);
        m1    = _mm_srli_pi16(m1,15);/* get the sign bit to lowest position*/
        mmSum = _mm_add_pi16(mmSum,m1);

        m1    = *(__m64*)&pSrc[i-8]; /* m1 = third 4 */
        m2    = _mm_srli_si64(m3,16);
        m4    = _mm_slli_si64(m1,48);
        m4    = _mm_or_si64(m4,m2);

        m3    = _mm_mulhi_pi16(m3,m4);
        m3    = _mm_srli_pi16(m3,15);/* get the sign bit to lowest position*/
        mmSum = _mm_add_pi16(mmSum,m3);

        m3    = *(__m64*)&pSrc[i-4]; /* m3 = fourth 4 */
        m2    = _mm_srli_si64(m1,16);
        m4    = _mm_slli_si64(m3,48);
        m4    = _mm_or_si64(m4,m2);

        m1    = _mm_mulhi_pi16(m1,m4);
        m1    = _mm_srli_pi16(m1,15);/* get the sign bit to lowest position*/
        mmSum = _mm_add_pi16(mmSum,m1);

        m1    = *(__m64*)&pSrc[i];   /* m1 = fifth 4 */
        m2    = _mm_srli_si64(m3,16);
        m4    = _mm_slli_si64(m1,48);
        m4    = _mm_or_si64(m4,m2);

        m3  = _mm_mulhi_pi16(m3,m4);
        m3    = _mm_srli_pi16(m3,15);/* get the sign bit to lowest position*/
        mmSum = _mm_add_pi16(mmSum,m3);
    }
    /* sum the lower 4 counts to 1*/
    m1    = mmSum;
    m1    = _mm_srli_si64(m1,32);
    mmSum = _mm_add_pi16(mmSum,m1);
    m1    = mmSum;
    m1    = _mm_srli_si64(m1,16);
    mmSum = _mm_add_pi16(mmSum,m1);
    mmSum = _mm_and_si64(mmSum,left_3_zer0);
    ll    = _mm_cvtsi64_si32(mmSum);
    sum  += ll;
    _mm_empty();
    return sum;
}
#else

static int ownSignChangeRate(short *pSrc /* [ZEROcrossEnd-ZEROcrossBegin+1] */) {
    int    i;
    Ipp32s sum=0;
    for(i=1; i<=ZEROcrossEnd-ZEROcrossBegin; i++)
        sum += (pSrc[i-1] * pSrc[i] < 0);
    return sum;
}

#endif

void VoiceActivityDetect_G729(Ipp16s *pSrc,Ipp16s *pLSF,Ipp32s *pAutoCorr,
                              Ipp16s autoExp, Ipp16s pRc, Ipp16s *pVad, char *pVADmem,short *pTmp) {
    Ipp32s L_tmp;
    VADmemory *vadMem =  (VADmemory*)pVADmem;
    const short *pVadTable;

    short frameCounter, VADPrev, VADPPrev, *LSFMean, *min_buf;
    short vadmin,SEMean,minPrev=IPP_MAX_16S,minNext,lessCounter,updateCounter;
    short SZCMean,SLEMean,EMean,prev_vadEner,SILcounter,v_flag,cnt_ext,cur_flag;
    short i, j, exp, fractal;
    short energy, energyLow, spectrDist, ZC, highBandE, lowBandE, crossZeroRate;
    int   r0;

    r0 = pAutoCorr[0];
    for(i=0; i<= VAD_LPC_DIM ; i++)
        pTmp[i]=pAutoCorr[i]>>16;

    VADPrev = vadMem->VADPrev;
    VADPPrev = vadMem->VADPPrev;
    LSFMean = vadMem->LSFMean;
    min_buf = vadMem->minBuf;
    vadmin = vadMem->minVAD;
    SEMean = vadMem->SEMean;
    minPrev = vadMem->minPrev;
    minNext = vadMem->minNext;
    lessCounter = vadMem->lessCounter;
    updateCounter = vadMem->updateCounter;
    SZCMean = vadMem->SZCMean;
    SLEMean = vadMem->SLEMean;
    EMean = vadMem->EMean;
    prev_vadEner = vadMem->VADPrevEnergy;
    SILcounter = vadMem->SILcounter;
    v_flag = vadMem->VADflag2;
    cnt_ext = vadMem->extCounter;
    cur_flag = vadMem->VADflag;
    frameCounter = vadMem->frameCounter;
    if(frameCounter == IPP_MAX_16S) frameCounter = 256;
    else frameCounter++;

    /* get frame energy */
    Log2_G729(r0, &exp, &fractal);
    L_tmp = (autoExp+exp)*9864 + ((fractal*9864)>>15);
    energy = L_tmp>>4;
    energy -= 6108;

    /* get low band energy */
    ippsDotProd_16s32s_Sfs(pTmp+1,lbfCorr+1,VAD_LPC_DIM ,&L_tmp,0);
    L_tmp = 4 * L_tmp;
    L_tmp = Add_32s(L_tmp, 2 * pTmp[0] * lbfCorr[0]);
    Log2_G729(L_tmp, &exp, &fractal);
    L_tmp = (autoExp+exp)*9864 + ((fractal*9864)>>15);
    energyLow = L_tmp>>4;
    energyLow -= 6108;

    /* calculate spectrDist */
    for(i=L_tmp=0; i<LPF_DIM; i++) {
        j = pLSF[i] - LSFMean[i];
        L_tmp += j * j;
    }
    spectrDist = L_tmp >> 15;

    /* compute # zero crossing */
#if defined(__ICL ) && defined(_IPP_A6)
    ZC=ownSignChangeRate_A6(pSrc+ZEROcrossBegin)*410;
#else
    ZC=ownSignChangeRate(pSrc+ZEROcrossBegin)*410;
#endif

    if(frameCounter < 129) {
        if(energy < vadmin) {
            vadmin = energy;
            minPrev = energy;
        }

        if(0 == (frameCounter & 7)) {
            i = (frameCounter>>3) - 1;
            min_buf[i] = vadmin;
            vadmin = IPP_MAX_16S;
        }
    }

    if(0 == (frameCounter & 7)) {
        ippsMin_16s(min_buf,16,&minPrev);
    }

    if(frameCounter >= 129) {
        if((frameCounter & 7) == 1) {
            vadmin = minPrev;
            minNext = IPP_MAX_16S;
        }
        if(energy < vadmin)
            vadmin = energy;
        if(energy < minNext)
            minNext = energy;

        if(!(frameCounter & 7)) {
            for(i=0; i<15; i++)
                min_buf[i] = min_buf[i+1];
            min_buf[15] = minNext;
            ippsMin_16s(min_buf,16,&minPrev);
        }

    }

    if(frameCounter <= VADinitFrame) {
        if(energy < 3072) {
            pVad[0] = 0;
            lessCounter++;
        } else {
            pVad[0] = 1;
            EMean += energy>>5;
            SZCMean += ZC>>5;
            for(i=0; i<LPF_DIM; i++) {
                LSFMean[i] += pLSF[i] >> 5;
            }
        }
    }

    if(frameCounter >= VADinitFrame) {
        if(VADinitFrame==frameCounter) {
            L_tmp = EMean * ifactor[lessCounter];
            EMean = L_tmp>>ishift[lessCounter];

            L_tmp = SZCMean * ifactor[lessCounter];
            SZCMean = L_tmp >> ishift[lessCounter];

            for(i=0; i<LPF_DIM; i++) {
                L_tmp = LSFMean[i] * ifactor[lessCounter];
                LSFMean[i] = L_tmp >> ishift[lessCounter];
            }
            SEMean = EMean - 2048;
            SLEMean = EMean - 2458;
        }

        highBandE = SEMean - energy;
        lowBandE = SLEMean - energyLow;
        crossZeroRate = SZCMean - ZC;

        if(energy < 3072)
            pVad[0] = 0;
        else
            pVad[0] = ownMakeDecision(lowBandE, highBandE, spectrDist, crossZeroRate);

        v_flag = 0;
        if((VADPrev==1) && (pVad[0]==0) && (highBandE < -410) && (energy > 3072)) {
            pVad[0] = 1;
            v_flag = 1;
        }

        if(cur_flag == 1) {
            if((VADPPrev == 1) && (VADPrev == 1) && (pVad[0] == 0) &&
               Abs_16s(prev_vadEner -energy) <= 614) {
                cnt_ext++;
                pVad[0] = 1;
                v_flag = 1;
                if(cnt_ext <= 4)
                    cur_flag = 1;
                else {
                    cnt_ext = cur_flag = 0;
                }
            }
        } else
            cur_flag=1;

        if(pVad[0] == 0)
            SILcounter++;

        if((pVad[0] == 1) && (SILcounter > 10)
           && (energy - prev_vadEner <= 614)) {
            pVad[0] = 0;
            SILcounter=0;
        }

        if(pVad[0] == 1)
            SILcounter=0;

        if(((energy - 614) < SEMean) && (frameCounter > 128) && (!v_flag) && (pRc < 19661))
            pVad[0] = 0;

        if(((energy - 614) < SEMean) && (pRc < 24576) && (spectrDist < 83)) {
            updateCounter++;
            if(updateCounter < 20)
                pVadTable = vadTable[0];
            else
                if(updateCounter < 30)
                    pVadTable = vadTable[1];
                else
                    if(updateCounter < 40)
                        pVadTable = vadTable[2];
                    else
                        if(updateCounter < 50)
                            pVadTable = vadTable[3];
                        else
                            if(updateCounter < 60)
                                pVadTable = vadTable[4];
                            else
                                pVadTable = vadTable[5];
            /* update means */
            L_tmp = pVadTable[0] * SEMean + pVadTable[1] * energy;
            SEMean = L_tmp >> 15;

            L_tmp = pVadTable[0] * SLEMean + pVadTable[1] * energyLow;
            SLEMean = L_tmp>>15;

            L_tmp = pVadTable[2] * SZCMean + pVadTable[3] * ZC;
            SZCMean = L_tmp>>15;

            for(i=0; i<LPF_DIM; i++) {
                L_tmp = pVadTable[4] * LSFMean[i] + pVadTable[5] * pLSF[i];
                LSFMean[i] = L_tmp>>15;
            }
        }
        if(frameCounter > 128 && ((SEMean < vadmin &&
           spectrDist < 83) || (SEMean -vadmin) > 2048)) {
            SEMean = vadmin;
            updateCounter = 0;
        }
    }
    vadMem->VADPrevEnergy = energy;
    vadMem->minVAD = vadmin;
    vadMem->SEMean = SEMean;
    vadMem->minPrev = minPrev;
    vadMem->minNext = minNext;
    vadMem->lessCounter = lessCounter;
    vadMem->updateCounter = updateCounter;
    vadMem->SZCMean = SZCMean;
    vadMem->SLEMean = SLEMean;
    vadMem->EMean = EMean;
    vadMem->SILcounter = SILcounter;
    vadMem->VADflag2 = v_flag;
    vadMem->extCounter = cnt_ext;
    vadMem->VADflag = cur_flag;
    vadMem->frameCounter = frameCounter;
}
void VADMusicDetection(G729Codec_Type codecType,int autoCorr,short expAutoCorr,short *pRc,
                       short *lags, short *pgains,short stat_flg,short *Vad,char* pVADmem) {
    short i, j, exp, fractal, tmp, tmp1, tmp2, tmp3, flag1, flag2, flag,
            pderr=IPP_MAX_16S, logE , spectrDist, threshold;
    int   L_tmp;
    VADmemory *vadMem = (VADmemory*)pVADmem;
    for(i=0; i<4; i++) {
        j = (pRc[i] * pRc[i])>>15;
        j = IPP_MAX_16S - j;
        pderr = (pderr * j)>>15;
    }
    L_tmp = 2*(autoCorr>>16)*pderr + 2*((((autoCorr>>1)&0x7fff)*pderr)>>15);
    Log2_G729(L_tmp, &exp, &fractal);
    L_tmp = 9864*exp + ((fractal*9864)>>15);
    i = expAutoCorr - 2;
    L_tmp += 9864 * i;
    L_tmp = ShiftL_32s(L_tmp,12);
    logE = (L_tmp>>16) - 4875;
    L_tmp = 0;
    for(i=0; i<10; i++) {
        j = vadMem->musicRC[i] - pRc[i];
        L_tmp += j * j;
    }
    if(L_tmp > IPP_MAX_32S/2)
        spectrDist = IPP_MAX_32S >> 16;
    else
        spectrDist = L_tmp>>15;
    if( *Vad == 0 ) {
        for(i=0; i<10; i++) {
            L_tmp = COEFF1 * vadMem->musicRC[i];
            L_tmp += PITCH_SHARP_MIN * pRc[i];
            vadMem->musicRC[i] = L_tmp>>15;
        }
        L_tmp = COEFF1 * vadMem->musicSEMean;
        L_tmp += PITCH_SHARP_MIN * logE;
        vadMem->musicSEMean = L_tmp>>15;
    }
    /* flag determination */
    tmp3=L_tmp=0;
    for(i=0; i<5; i++) {
        L_tmp += pgains[i] * 6554;
        tmp3 += lags[i];
    }
    L_tmp = (L_tmp>>15) * 6554;
    L_tmp += vadMem->MeanPgain * 26214;
    vadMem->MeanPgain = L_tmp>>15;
    L_tmp = 0;
    for(i=0; i<5; i++) {
        j = lags[i] << 2;
        j += lags[i];
        j -= tmp3;
        L_tmp += j * j;
    }
    if(L_tmp > 256)
        tmp2 = IPP_MAX_32S>>16;
    else
        tmp2 = L_tmp<<7;
    if( codecType == G729D_CODEC)
        threshold = 11960;
    else
        threshold = 10322;
    if(vadMem->MeanPgain > threshold)
        flag2 =1;
    else
        flag2 =0;
    if( (tmp2 < 21632)  && (vadMem->MeanPgain > 7373))
        flag1 =1;
    else
        flag1 =0;
    flag= ( (vadMem->VADPrev & (flag1 | flag2))| (flag2));
    if( (pRc[1] <= 14746) && (pRc[1] >= 0) && (vadMem->MeanPgain < BWF_HARMONIC_E))
        vadMem->conscCounterFlagR++;
    else
        vadMem->conscCounterFlagR =0;
    if( (stat_flg == 1) && (*Vad == 1))
        vadMem->musicCounter += 256;
    if( (vadMem->frameCounter & 0x003f) == 0) {
        if( vadMem->frameCounter == 64)
            vadMem->musicMCounter = vadMem->musicCounter;
        else {
            L_tmp = COEFF1 * vadMem->musicMCounter;
            L_tmp += PITCH_SHARP_MIN * vadMem->musicCounter;
            vadMem->musicMCounter = L_tmp>>15;
        }
    }
    if( vadMem->musicCounter == 0)
        vadMem->conscCounter++;
    else
        vadMem->conscCounter = 0;
    if(  ((vadMem->conscCounter > 500) || (vadMem->conscCounterFlagR > 150))) vadMem->musicMCounter = 0;

    if( (vadMem->frameCounter & 0x003f) == 0) {
        vadMem->musicCounter = 0;
    }

    if( flag== 1 )
        vadMem->count_pflag += 256;

    if( (vadMem->frameCounter & 0x003f) == 0) {
        if( vadMem->frameCounter == 64)
            vadMem->Mcount_pflag = vadMem->count_pflag;
        else {
            if(vadMem->count_pflag > 6400) {
                tmp1 = N0_98;
                tmp = 655;
            } else
                if(vadMem->count_pflag > 5120) {
                tmp1 = 31130;
                tmp = 1638;
            } else {
                tmp1 = COEFF1;
                tmp = PITCH_SHARP_MIN;
            }
            L_tmp = tmp1 * vadMem->Mcount_pflag;
            L_tmp += tmp * vadMem->count_pflag;
            vadMem->Mcount_pflag = L_tmp>>15;
        }
    }
    if( vadMem->count_pflag == 0)
        vadMem->conscCounterFlagP++;
    else
        vadMem->conscCounterFlagP = 0;

    if(((vadMem->conscCounterFlagP > 100) || (vadMem->conscCounterFlagR > 150))) vadMem->Mcount_pflag = 0;


    if( (vadMem->frameCounter & 0x003f) == 0)
        vadMem->count_pflag = 0;

    if(codecType == G729E_CODEC) {
        if( (spectrDist > 4915) && (logE > (vadMem->musicSEMean + 819)) && (vadMem->VADPrevEnergy > 10240) )
            *Vad =1;
        else if( ((spectrDist > 12452) || (logE > (vadMem->musicSEMean + 819))) &&
                 (vadMem->VADPrevEnergy > 10240) )
            *Vad =1;
        else if( ( (vadMem->Mcount_pflag > 2560) || (vadMem->musicMCounter > 280) || (vadMem->frameCounter < 64))
                 && (vadMem->VADPrevEnergy > 1433))

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -