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

📄 lecvs.c

📁 The line echo canceller (LEC) is designed to provide the maximum attainable transparent voice qualit
💻 C
字号:
/*-------------------------------------------------------------------------*
 *                                                                         *
 *   THIS IS AN UNPUBLISHED WORK CONTAINING CONFIDENTIAL AND PROPRIETARY   *
 *   INFORMATION.  IF PUBLICATION OCCURS, THE FOLLOWING NOTICE APPLIES:    *
 *      "COPYRIGHT 2001 MICHAEL TSIROULNIKOV, ALL RIGHTS RESERVED"         *
 *                                                                         *
 *-------------------------------------------------------------------------*/

#include "leci.h"

/*--------------------- local defs ----------------------------------------*/

#define _EN_NOISE_MIN 		LEC_DB(-73)
#define _EN_THR             LEC_DB(2)


/*-------------------------------------------------------------------------*/
void                  lec_vad_logic
/*-------------------------------------------------------------------------*/
(
LEC_tVad *pDb
)
{
    S16 deltaZc;
    S16 deltaEn;

	deltaZc = (pDb->sZc - pDb->sZcNoise)>>1;
	if (deltaZc < 0) deltaZc >>= 2;

	deltaEn = pDb->sEn - pDb->sEnNoise;
	if (deltaEn < 0) deltaEn <<= 1;

	pDb->sCrit += deltaEn + deltaZc - _EN_THR;

    if (pDb->sCrit > 15 * _EN_THR) pDb->sCrit = 15 * _EN_THR;
    if (pDb->sCrit < -_EN_THR)  pDb->sCrit = -_EN_THR;


    if (pDb->sCrit < 0)
    {
        pDb->sState = LEC_VAD_ST_IDLE;
	    /* there may be absolute silence in the
		    beginning, before dial. let's ignore it.
            noise can not be such low.
	     */
		if (pDb->sEn > _EN_NOISE_MIN)
		{
    		/* let's estimate noise & Zc & peak value */
		    pDb->sEnNoise += (deltaEn + 0x20)>>6;
	    	pDb->sZcNoise += (deltaZc + 0x20)>>6;
	    	/* and limit that by from above,
		     that means the room is never too quiet and it should
			 not be too noisy  -
    		 in that case everything will be wrong */
	    	if (pDb->sEnNoise > pDb->sEnNoiseMax)pDb->sEnNoise = pDb->sEnNoiseMax;
        }
    }
    else
    {
		/* we are still is ACTIVE state
		   what may happen is that a person can press mute
		   or close the handset's microphone with fingers.
		   then noise energy drops to very low level.
		   when mute is unpressed or fingers are off,
		   we start to perceice noise as active voice.
		   to have a chance to recover, let's adapt slowly.
		 */
		if (pDb->sEn < pDb->sEnNoiseMax)
		{
			pDb->sEnNoise += (pDb->sEn - pDb->sEnNoise + (S16)(1<<9))>>10;
		}

        if (pDb->sCrit > 10 * _EN_THR) 
        {
            pDb->sState = LEC_VAD_ST_ACTIVE;
        }
        else  
        {
            // if prev state was active, then go to hangover
            if (pDb->sState >= LEC_VAD_ST_ACTIVE)
            {
                pDb->sState = LEC_VAD_ST_HANGOVER;
            }
            else
            {
                pDb->sState = LEC_VAD_ST_PRE;
            }
        }
    }

}

⌨️ 快捷键说明

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