?? vad.c
字號:
/*** Test if prediction error is smaller than threshold ***/
swTemp = sub(swPredErr, 1464);
if (swTemp < 0)
*pswTone = 1;
}
/****************************************************************************
*
* FUNCTION: threshold_adaptation
*
* VERSION: 1.2
*
* PURPOSE: Evaluates the secondary VAD decision. If speech is not
* present then the noise model rvad and adaptive threshold
* thvad are updated.
*
* INPUTS: swStat flag to indicate spectral stationarity
* swPtch flag to indicate a periodic signal component
* swTone flag to indicate a tone signal component
* pswRav1[0..8] ACF obtained from l_av1
* swNormRav1 r_av1 scaling factor
* swM_pvad mantissa of filtered signal energy
* swE_pvad exponent of filtered signal energy
* swM_acf0 mantissa of signal frame energy
* swE_acf0 exponent of signal frame energy
*
* OUTPUTS: pswRvad[0..8] autocorrelated adaptive filter coefficients
* pswNormRvad rvad scaling factor
* pswM_thvad mantissa of decision threshold
* pswE_thvad exponent of decision threshold
*
***************************************************************************/
void threshold_adaptation(Shortword swStat,
Shortword swPtch,
Shortword swTone,
Shortword pswRav1[],
Shortword swNormRav1,
Shortword swM_pvad,
Shortword swE_pvad,
Shortword swM_acf0,
Shortword swE_acf0,
Shortword pswRvad[],
Shortword *pswNormRvad,
Shortword *pswM_thvad,
Shortword *pswE_thvad)
{
/*_________________________________________________________________________
| |
| Automatic Variables |
|_________________________________________________________________________|
*/
Longword
L_temp;
Shortword
swTemp,
swComp,
swComp2,
swM_temp,
swE_temp;
int
i;
/*_________________________________________________________________________
| |
| Executable Code |
|_________________________________________________________________________|
*/
swComp = 0;
/*** Test if acf0 < pth; if yes set thvad to plev ***/
if (swE_acf0 < E_PTH)
swComp = 1;
if ((swE_acf0 == E_PTH) && (swM_acf0 < M_PTH))
swComp = 1;
if (swComp == 1)
{
*pswE_thvad = E_PLEV;
*pswM_thvad = M_PLEV;
return;
}
/*** Test if an adaption is required ***/
if (swPtch == 1)
swComp = 1;
if (swStat == 0)
swComp = 1;
if (swTone == 1)
swComp = 1;
if (swComp == 1)
{
swAdaptCount = 0;
return;
}
/*** Increment adaptcount ***/
swAdaptCount = add(swAdaptCount, 1);
if (swAdaptCount <= 8)
return;
/*** computation of thvad-(thvad/dec) ***/
*pswM_thvad = sub(*pswM_thvad, shr(*pswM_thvad, 5));
if (*pswM_thvad < 0x4000)
{
*pswM_thvad = shl(*pswM_thvad, 1);
*pswE_thvad = sub(*pswE_thvad, 1);
}
/*** computation of pvad*fac ***/
L_temp = L_mult(swM_pvad, 20889);
L_temp = L_shr(L_temp, 15);
swE_temp = add(swE_pvad, 1);
if (L_temp > 0x7fffL)
{
L_temp = L_shr(L_temp, 1);
swE_temp = add(swE_temp, 1);
}
swM_temp = extract_l(L_temp);
/*** test if thvad < pavd*fac ***/
if (*pswE_thvad < swE_temp)
swComp = 1;
if ((*pswE_thvad == swE_temp) && (*pswM_thvad < swM_temp))
swComp = 1;
/*** compute minimum(thvad+(thvad/inc), pvad*fac) when comp = 1 ***/
if (swComp == 1)
{
/*** compute thvad + (thvad/inc) ***/
L_temp = L_add(L_deposit_l(*pswM_thvad),L_deposit_l(shr(*pswM_thvad, 4)));
if (L_temp > 0x7fffL)
{
*pswM_thvad = extract_l(L_shr(L_temp, 1));
*pswE_thvad = add(*pswE_thvad, 1);
}
else
*pswM_thvad = extract_l(L_temp);
swComp2 = 0;
if (swE_temp < *pswE_thvad)
swComp2 = 1;
if ((swE_temp == *pswE_thvad) && (swM_temp < *pswM_thvad))
swComp2 = 1;
if (swComp2 == 1)
{
*pswE_thvad = swE_temp;
*pswM_thvad = swM_temp;
}
}
/*** compute pvad + margin ***/
if (swE_pvad == E_MARGIN)
{
L_temp = L_add(L_deposit_l(swM_pvad), L_deposit_l(M_MARGIN));
swM_temp = extract_l(L_shr(L_temp, 1));
swE_temp = add(swE_pvad, 1);
}
else
{
if (swE_pvad > E_MARGIN)
{
swTemp = sub(swE_pvad, E_MARGIN);
swTemp = shr(M_MARGIN, swTemp);
L_temp = L_add(L_deposit_l(swM_pvad), L_deposit_l(swTemp));
if (L_temp > 0x7fffL)
{
swE_temp = add(swE_pvad, 1);
swM_temp = extract_l(L_shr(L_temp, 1));
}
else
{
swE_temp = swE_pvad;
swM_temp = extract_l(L_temp);
}
}
else
{
swTemp = sub(E_MARGIN, swE_pvad);
swTemp = shr(swM_pvad, swTemp);
L_temp = L_add(L_deposit_l(M_MARGIN), L_deposit_l(swTemp));
if (L_temp > 0x7fffL)
{
swE_temp = add(E_MARGIN, 1);
swM_temp = extract_l(L_shr(L_temp, 1));
}
else
{
swE_temp = E_MARGIN;
swM_temp = extract_l(L_temp);
}
}
}
/*** Test if thvad > pvad + margin ***/
swComp = 0;
if (*pswE_thvad > swE_temp)
swComp = 1;
if ((*pswE_thvad == swE_temp) && (*pswM_thvad > swM_temp))
swComp = 1;
if (swComp == 1)
{
*pswE_thvad = swE_temp;
*pswM_thvad = swM_temp;
}
/*** Normalise and retain rvad[0..8] in memory ***/
*pswNormRvad = swNormRav1;
for (i = 0; i <= 8; i++)
pswRvad[i] = pswRav1[i];
/*** Set adaptcount to adp + 1 ***/
swAdaptCount = 9;
}
/****************************************************************************
*
* FUNCTION: vad_decision
*
* VERSION: 1.2
*
* PURPOSE: Computes the VAD decision based on the comparison of the
* floating point representations of pvad and thvad.
*
* INPUTS: swM_pvad mantissa of filtered signal energy
* swE_pvad exponent of filtered signal energy
* swM_thvad mantissa of decision threshold
* swE_thvad exponent of decision threshold
*
* OUTPUTS: pswVvad vad decision before hangover is added
*
***************************************************************************/
void vad_decision(Shortword swM_pvad,
Shortword swE_pvad,
Shortword swM_thvad,
Shortword swE_thvad,
Shortword *pswVvad)
{
/*_________________________________________________________________________
| |
| Executable Code |
|_________________________________________________________________________|
*/
*pswVvad = 0;
if (swE_pvad > swE_thvad)
*pswVvad = 1;
if ((swE_pvad == swE_thvad) && (swM_pvad > swM_thvad))
*pswVvad = 1;
}
/****************************************************************************
*
* FUNCTION: vad_hangover
*
* VERSION: 1.2
*
* PURPOSE: Computes the final VAD decision for the current frame
* being processed.
*
* INPUTS: swVvad vad decision before hangover is added
*
* OUTPUTS: pswVadFlag vad decision after hangover is added
*
***************************************************************************/
void vad_hangover(Shortword swVvad,
Shortword *pswVadFlag)
{
/*_________________________________________________________________________
| |
| Executable Code |
|_________________________________________________________________________|
*/
if (swVvad == 1)
swBurstCount = add(swBurstCount, 1);
else
swBurstCount = 0;
if (swBurstCount >= 3)
{
swHangCount = 5;
swBurstCount = 3;
}
*pswVadFlag = swVvad;
if (swHangCount >= 0)
{
*pswVadFlag = 1;
swHangCount = sub(swHangCount, 1);
}
}
/****************************************************************************
*
* FUNCTION: periodicity_update
*
* VERSION: 1.2
*
* PURPOSE: Computes the ptch flag needed for the threshold
* adaptation decision for the next frame.
*
* INPUTS: pswLags[0..3] speech encoder long term predictor lags
*
* OUTPUTS: pswPtch Boolean voiced / unvoiced decision
*
***************************************************************************/
void periodicity_update(Shortword pswLags[4],
Shortword *pswPtch)
{
/*_________________________________________________________________________
| |
| Automatic Variables |
|_________________________________________________________________________|
*/
Shortword
swMinLag,
swMaxLag,
swSmallLag,
swLagCount,
swTemp;
int
i,
j;
/*_________________________________________________________________________
| |
| Executable Code |
|_________________________________________________________________________|
*/
/*** Run loop for No. of sub-segments in the frame ***/
swLagCount = 0;
for (i = 0; i <= 3; i++)
{
/*** Search the maximum and minimum of consecutive lags ***/
if (swOldLag > pswLags[i])
{
swMinLag = pswLags[i];
swMaxLag = swOldLag;
}
else
{
swMinLag = swOldLag;
swMaxLag = pswLags[i];
}
/*** Compute smallag (modulo operation not defined) ***/
swSmallLag = swMaxLag;
for (j = 0; j <= 2; j++)
{
if (swSmallLag >= swMinLag)
swSmallLag = sub(swSmallLag, swMinLag);
}
/*** Minimum of smallag and minlag - smallag ***/
swTemp = sub(swMinLag, swSmallLag);
if (swTemp < swSmallLag)
swSmallLag = swTemp;
if (swSmallLag < 2)
swLagCount = add(swLagCount, 1);
/*** Save the current LTP lag ***/
swOldLag = pswLags[i];
}
/*** Update the veryoldlagcount and oldlagcount ***/
swVeryOldLagCount = swOldLagCount;
swOldLagCount = swLagCount;
/*** Make ptch decision ready for next frame ***/
swTemp = add(swOldLagCount, swVeryOldLagCount);
if (swTemp >= 7)
*pswPtch = 1;
else
*pswPtch = 0;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -