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

📄 gaecepcs.c

📁 TI公司DSP/tms320c55x/tms320c54x系列的声学回声消除代码
💻 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 + -