📄 lecvs.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 + -