📄 gaecepcs.c
字号:
/*-------------------------------------------------------------------------*
* *
* THIS IS AN UNPUBLISHED WORK CONTAINING CONFIDENTIAL AND PROPRIETARY *
* INFORMATION. IF PUBLICATION OCCURS, THE FOLLOWING NOTICE APPLIES: *
* "COPYRIGHT 2002 MIKET DSP SOLUTIONS, ALL RIGHTS RESERVED" *
* *
*-------------------------------------------------------------------------*/
#include "gaeci.h"
/*--------------------- local defs ----------------------------------------*/
#define _IN_SHFT (3)
#define _EN_SHFT (1)
#define _NORM_SHFT (15)
#define _REG2 (1L << 24)
/*--------------------- public vars ---------------------------------------*/
/*--------------------- local vars ----------------------------------------*/
/*--------------------- local functions -----------------------------------*/
S16 gl_sInv;
//S16 gl_sInvA;
S16 gl_sShift;
/*-------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------*/
#if defined(_dsp)
void gaec_epc_inC
#else
void gaec_epc_in
#endif
/*-------------------------------------------------------------------------*/
(
S16 *psSav,
S32 *pslXcAcc,
S16 *psXc,
S16 *psIn,
S32 *plsReg
)
{
S16 k;
S16 sInv;
S16 sDelay;
S16 sShift;
S32 ac0;
// shift old data back
for (k = 0; k < GAEC_EPC_SSZ; k++)
{
psSav[k] = psSav[k+GAEC_FR_SZ/2];
}
// add new data, subsampled by 2
for (k = 0; k < GAEC_FR_SZ/2; k++)
{
psSav[k+GAEC_EPC_SSZ] = (psIn[k*2] + psIn[k*2+1]) >> _IN_SHFT;
// psSav[k+GAEC_EPC_SSZ] = psIn[k] >> _IN_SHFT;
}
// calculate autocorrelation coeffs
for (sDelay = 0; sDelay < GAEC_EPC_MAXD; sDelay++)
{
ac0 = 0;
for (k = 0; k < GAEC_FR_SZ/2; k++)
{
ac0 += psSav[GAEC_EPC_SZ-1-k] * ((S32)
psSav[GAEC_EPC_SZ-1-k - sDelay]);
}
pslXcAcc[sDelay] +=
(ac0 - pslXcAcc[sDelay]) >> _EN_SHFT;
}
pslXcAcc[0] += *plsReg;
ac0 = pslXcAcc[0];
for (sShift = 0; sShift < 32; sShift ++)
{
if (ac0 & (1L << 30))
{
break;
}
ac0 <<= 1;
}
ac0 = (1L << 28) / (ac0 >> 16);
sInv = (S16)ac0;
sShift -= 2; // protection against xc(k) > xc(0)
gl_sInv = sInv; // dbg
gl_sShift = sShift;
for (sDelay = 0; sDelay < GAEC_EPC_MAXD; sDelay++)
{
S16 sTmp;
ac0 = pslXcAcc[sDelay];
if (sShift > 0)
ac0 <<= sShift;
else
ac0 >>= (-sShift);
sTmp = (S16)(ac0 >> 16);
ac0 = sTmp * (S32) sInv;
psXc[sDelay] = (S16) (ac0 >> _NORM_SHFT);
}
#if 0
#endif
}
/*-------------------------------------------------------------------------*/
#if defined(_dsp)
void gaec_epc_corrC
#else
void gaec_epc_corr
#endif
/*-------------------------------------------------------------------------*/
(
GAEC_tDb *pDb,
GAEC_tScEpc *pSc
)
{
S16 sDelay;
S32 ac0;
S32 ac1;
S32 ac2;
// S32 lsReg;
ac0 = 0;
ac1 = 0;
ac2 = 0;
for (sDelay = GAEC_EPC_MIND; sDelay < GAEC_EPC_MAXD; sDelay++)
{
ac0 += pSc->asEpcSnd[sDelay] * ((S32) pSc->asEpcSnd[sDelay]);
ac1 += pSc->asEpcRcv[sDelay] * ((S32) pSc->asEpcRcv[sDelay]);
}
for (sDelay = GAEC_EPC_MIND; sDelay < GAEC_EPC_MAXD; sDelay++)
{
ac2 += pSc->asEpcSnd[sDelay] * ((S32) pSc->asEpcRcv[sDelay]);
}
if (ac2 < 0)
ac2 = 0;
pSc->sEpcSnd = gaec_utl_en2log(ac0 + _REG2);
pSc->sEpcRcv = gaec_utl_en2log(ac1 + _REG2);
pSc->sEpcXcr = gaec_utl_en2log(ac2);
ac0 = pSc->sEpcXcr;
ac0 -= (pSc->sEpcSnd + pSc->sEpcRcv) >> 1;
if (ac0 < GAEC_DB(-30))
ac0 = GAEC_DB(-30);
// pDb->sEpcXcr += (S16)(ac0 - pDb->sEpcXcr) >> 1;
pDb->sEpcXcr = (S16)ac0;
#if 0
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -