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

📄 g7231_vad.c

📁 G723.1语音压缩解压在tms320c54系列上的实现代码,本人已在CCS上仿真通过. 包含全部源代码,主函数请自已写(本人的就不奉送了:
💻 C
字号:

#include "typedef.h"
#include "G7231_basop.h"
#include "G7231_cst_lbc.h"
#include "G7231_tab_lbc.h"
#include "G7231_lsp.h"
#include "G7231_vad.h"
#include "G7231_coder.h"
#include "G7231_lbccodec.h"
#include "intrindefs.h"

G7231VADSTATDEF  G7231VadStat ;

void    G7231Init_Vad(void)
{
    int i ;
    G7231VadStat.Hcnt = 3 ;
    G7231VadStat.Vcnt = 0 ;
    G7231VadStat.Penr = 0x00000400L ;
    G7231VadStat.Nlev = 0x00000400L ;

    G7231VadStat.Aen = 0 ;

    G7231VadStat.Polp[0] = 1 ;
    G7231VadStat.Polp[1] = 1 ;
    G7231VadStat.Polp[2] = G7231SubFrLen ;
    G7231VadStat.Polp[3] = G7231SubFrLen ;

    for(i=0; i < G7231LpcOrder; i++) G7231VadStat.NLpc[i] = 0;

}

Flag G7231Comp_Vad( Word16 *Dpnt)
{
    int i,j ;

    Word32  Acc0,Acc1 ;
    Word16  Tm0, Tm1, Tm2 ;
    Word16  Minp ;

    Flag    VadState = 1 ;

    static  Word16  G7231ScfTab[11] = {
         9170 ,
         9170 ,
         9170 ,
         9170 ,
        10289 ,
        11544 ,
        12953 ,
        14533 ,
        16306 ,
        18296 ,
        20529 ,
    } ;

    if ( !G7231UseVx )
        return VadState ;

    /* Find Minimum pitch period */
    Minp = G7231PitchMax ;
    for ( i = 0 ; i < 4 ; i ++ ) {
        if ( Minp > G7231VadStat.Polp[i] )
            Minp = G7231VadStat.Polp[i] ;
    }

    /* Check that all are multiplies of the minimum */
    Tm2 = 0 ;
    for ( i = 0 ; i < 4 ; i ++ ) {
        Tm1 = Minp ;
        for ( j = 0 ; j < 8 ; j ++ ) {
            Tm0 = G7231sub( Tm1, G7231VadStat.Polp[i] ) ;
            Tm0 = G7231abs_s( Tm0 ) ;
            if ( Tm0 <= 3 )
                Tm2 ++ ;
            Tm1 = G7231add( Tm1, Minp ) ;
        }
    }

    /* Update adaptation enable counter if not periodic and not sine */
    if ( (Tm2 == 4) || (G7231CodStat.SinDet < 0) )
        G7231VadStat.Aen += 2 ;
    else
        G7231VadStat.Aen -- ;

    /* Clip it */
    if ( G7231VadStat.Aen > 6 )
        G7231VadStat.Aen = 6 ;
    if ( G7231VadStat.Aen < 0 )
        G7231VadStat.Aen = 0 ;

    /* Inverse filter the data */
    Acc1 = 0L ;
    for ( i = G7231SubFrLen ; i < G7231Frame ; i ++ ) {

        Acc0 = G7231L_mult( Dpnt[i], 0x2000 ) ;
        for ( j = 0 ; j < G7231LpcOrder ; j ++ )
            Acc0 = G7231L_msu( Acc0, Dpnt[i-j-1], G7231VadStat.NLpc[j] ) ;
        Tm0 = G7231round ( Acc0 ) ;
        Acc1 = G7231L_mac( Acc1, Tm0, Tm0 ) ;
    }

    /* Scale the rezidual energy */
    Acc1 = G7231L_mls( Acc1, (Word16) 2913 ) ;

    /* Clip noise level in any case */
    if ( G7231VadStat.Nlev > G7231VadStat.Penr ) {
        Acc0 = G7231L_sub( G7231VadStat.Penr, G7231L_shr( G7231VadStat.Penr, 2 ) ) ;
        G7231VadStat.Nlev = G7231L_add( Acc0, G7231L_shr( G7231VadStat.Nlev, 2 ) ) ;
    }


    /* Update the noise level, if adaptation is enabled */
    if ( !G7231VadStat.Aen ) {
        G7231VadStat.Nlev = G7231L_add( G7231VadStat.Nlev, G7231L_shr( G7231VadStat.Nlev, 5 ) ) ;
    }
    /* Decay Nlev by small amount */
    else {
        G7231VadStat.Nlev = G7231L_sub( G7231VadStat.Nlev, G7231L_shr( G7231VadStat.Nlev,11 ) ) ;
    }

    /* Update previous energy */
    G7231VadStat.Penr = Acc1 ;

    /* CLip Noise Level */
    if ( G7231VadStat.Nlev < 0x00000080L )
        G7231VadStat.Nlev = 0x00000080L ;
    if (G7231VadStat.Nlev > 0x0001ffffL )
        G7231VadStat.Nlev = 0x0001ffffL ;

    /* Compute the treshold */
    Acc0 = G7231L_shl( G7231VadStat.Nlev, 13 ) ;
    Tm0 = G7231norm_l( Acc0 ) ;
    Acc0 = G7231L_shl( Acc0, Tm0 ) ;
    Acc0 &= 0x3f000000L ;
    Acc0 <<= 1 ;
    Tm1 = G7231extract_h( Acc0 ) ;
    Acc0 = G7231L_deposit_h( G7231ScfTab[Tm0] ) ;
    Acc0 = G7231L_mac( Acc0, Tm1, G7231ScfTab[Tm0-1] ) ;
    Acc0 = G7231L_msu( Acc0, Tm1, G7231ScfTab[Tm0] ) ;
    Tm1 = G7231extract_h( Acc0 ) ;
    Tm0 = G7231extract_l( G7231L_shr( G7231VadStat.Nlev, 2 ) ) ;
    Acc0 = G7231L_mult( Tm0, Tm1 ) ;
    Acc0 >>= 11 ;

    /* Compare with the treshold */
    if ( Acc0 > Acc1 )
        VadState = 0 ;

    /* Do the various counters */
    if ( VadState ) {
        G7231VadStat.Vcnt ++ ;
        G7231VadStat.Hcnt ++ ;
    }
    else {
        G7231VadStat.Vcnt -- ;
        if ( G7231VadStat.Vcnt < 0 )
            G7231VadStat.Vcnt = 0 ;
    }

    if ( G7231VadStat.Vcnt >= 2 ) {
        G7231VadStat.Hcnt = 6 ;
        if ( G7231VadStat.Vcnt >= 3 )
            G7231VadStat.Vcnt = 3 ;
    }

    if ( G7231VadStat.Hcnt ) {
        VadState = 1 ;
        if ( G7231VadStat.Vcnt == 0 )
            G7231VadStat.Hcnt -- ;
    }

    /* Update Periodicy detector */
    G7231VadStat.Polp[0] = G7231VadStat.Polp[2] ;
    G7231VadStat.Polp[1] = G7231VadStat.Polp[3] ;

    return VadState ;
}







⌨️ 快捷键说明

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