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

📄 vad.c

📁 嵌入式linux系统的网络编程(C++) 在ARM上实现视频会议 此程序获得全国研究生电子大赛一等奖 压缩包内为全部源码
💻 C
字号:
/***** File:        "vad.c"**** Description:     Voice Activity Detection**** Functions:       Init_Vad()**                  Vad()*****//*    ITU-T G.723 Speech Coder   ANSI-C Source Code     Version 5.00    copyright (c) 1995, AudioCodes, DSP Group, France Telecom,    Universite de Sherbrooke.  All rights reserved.*/#include <stdio.h>#include "typedef.h"#include "basop.h"#include "cst_lbc.h"#include "tab_lbc.h"#include "lsp.h"#include "lbccodec.h"#include "coder_pc.h"VADSTATDEF  VadStat ;void    Init_Vad(void){    int i ;    VadStat.Hcnt = 3 ;    VadStat.Vcnt = 0 ;    VadStat.Penr = 0x00000400L ;    VadStat.Nlev = 0x00000400L ;    VadStat.Aen = 0 ;    VadStat.Polp[0] = 1 ;    VadStat.Polp[1] = 1 ;    VadStat.Polp[2] = SubFrLen ;    VadStat.Polp[3] = SubFrLen ;    for(i=0; i < LpcOrder; i++) VadStat.NLpc[i] = 0;}Flag Comp_Vad( Word16 *Dpnt){    int i,j ;    Word32  Acc0,Acc1 ;    Word16  Tm0, Tm1, Tm2 ;    Word16  Minp ;    Flag    VadState = 1 ;    static  Word16  ScfTab[11] = {         9170 ,         9170 ,         9170 ,         9170 ,        10289 ,        11544 ,        12953 ,        14533 ,        16306 ,        18296 ,        20529 ,    } ;    if ( !UseVx )        return VadState ;    /* Find Minimum pitch period */    Minp = PitchMax ;    for ( i = 0 ; i < 4 ; i ++ ) {        if ( Minp > VadStat.Polp[i] )            Minp = VadStat.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 = sub( Tm1, VadStat.Polp[i] ) ;            Tm0 = abs_s( Tm0 ) ;            if ( Tm0 <= 3 )                Tm2 ++ ;            Tm1 = add( Tm1, Minp ) ;        }    }    /* Update adaptation enable counter if not periodic and not sine */    if ( (Tm2 == 4) || (CodStat.SinDet < 0) )        VadStat.Aen += 2 ;    else        VadStat.Aen -- ;    /* Clip it */    if ( VadStat.Aen > 6 )        VadStat.Aen = 6 ;    if ( VadStat.Aen < 0 )        VadStat.Aen = 0 ;    /* Inverse filter the data */    Acc1 = 0L ;    for ( i = SubFrLen ; i < Frame ; i ++ ) {        Acc0 = L_mult( Dpnt[i], 0x2000 ) ;        for ( j = 0 ; j < LpcOrder ; j ++ )            Acc0 = L_msu( Acc0, Dpnt[i-j-1], VadStat.NLpc[j] ) ;        Tm0 = round ( Acc0 ) ;        Acc1 = L_mac( Acc1, Tm0, Tm0 ) ;    }    /* Scale the rezidual energy */    Acc1 = L_mls( Acc1, (Word16) 2913 ) ;    /* Clip noise level in any case */    if ( VadStat.Nlev > VadStat.Penr ) {        Acc0 = L_sub( VadStat.Penr, L_shr( VadStat.Penr, 2 ) ) ;        VadStat.Nlev = L_add( Acc0, L_shr( VadStat.Nlev, 2 ) ) ;    }    /* Update the noise level, if adaptation is enabled */    if ( !VadStat.Aen ) {        VadStat.Nlev = L_add( VadStat.Nlev, L_shr( VadStat.Nlev, 5 ) ) ;    }    /* Decay Nlev by small amount */    else {        VadStat.Nlev = L_sub( VadStat.Nlev, L_shr( VadStat.Nlev,11 ) ) ;    }    /* Update previous energy */    VadStat.Penr = Acc1 ;    /* CLip Noise Level */    if ( VadStat.Nlev < 0x00000080L )        VadStat.Nlev = 0x00000080L ;    if ( VadStat.Nlev > 0x0001ffffL )        VadStat.Nlev = 0x0001ffffL ;    /* Compute the treshold */    Acc0 = L_shl( VadStat.Nlev, 13 ) ;    Tm0 = norm_l( Acc0 ) ;    Acc0 = L_shl( Acc0, Tm0 ) ;    Acc0 &= 0x3f000000L ;    Acc0 <<= 1 ;    Tm1 = extract_h( Acc0 ) ;    Acc0 = L_deposit_h( ScfTab[Tm0] ) ;    Acc0 = L_mac( Acc0, Tm1, ScfTab[Tm0-1] ) ;    Acc0 = L_msu( Acc0, Tm1, ScfTab[Tm0] ) ;    Tm1 = extract_h( Acc0 ) ;    Tm0 = extract_l( L_shr( VadStat.Nlev, 2 ) ) ;    Acc0 = L_mult( Tm0, Tm1 ) ;    Acc0 >>= 11 ;    /* Compare with the treshold */    if ( Acc0 > Acc1 )        VadState = 0 ;    /* Do the various counters */    if ( VadState ) {        VadStat.Vcnt ++ ;        VadStat.Hcnt ++ ;    }    else {        VadStat.Vcnt -- ;        if ( VadStat.Vcnt < 0 )            VadStat.Vcnt = 0 ;    }    if ( VadStat.Vcnt >= 2 ) {        VadStat.Hcnt = 6 ;        if ( VadStat.Vcnt >= 3 )            VadStat.Vcnt = 3 ;    }    if ( VadStat.Hcnt ) {        VadState = 1 ;        if ( VadStat.Vcnt == 0 )            VadStat.Hcnt -- ;    }    /* Update Periodicy detector */    VadStat.Polp[0] = VadStat.Polp[2] ;    VadStat.Polp[1] = VadStat.Polp[3] ;    return VadState ;}

⌨️ 快捷键说明

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