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

📄 gaecadf.c

📁 TI公司DSP/tms320c55x/tms320c54x系列的声学回声消除代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*-------------------------------------------------------------------------*
 *                                                                         *
 *   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"          *
 *                                                                         *
 *-------------------------------------------------------------------------*/

#if !defined(_dsp)
#include <memory.h>
#else
#include <string.h>
#endif

#include "gaeci.h"

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

#define _CONV_ACC_MAX       (2000*1)
#define _CONV_ACC3          (600*1)
#define _CONV_ACC2          (1*GAEC_ADF_SZ/GAEC_BLKS)

/*--------------------- public vars ---------------------------------------*/
#if !defined(_dsp)
U16 _auCopyAdf[GAEC_BANDS+1];
#endif
/*--------------------- local vars ----------------------------------------*/
/*--------------------- local functions -----------------------------------*/
/*-------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------*/
void                        _update_energy2
/*-------------------------------------------------------------------------*/
(
GAEC_tDb *pDb,
GAEC_tSc *pSc
)
{
    S16 blk;
    for (blk = 0; blk < GAEC_BLKS; blk++)
    {
        gaec_get_energy2(pDb, blk);
    }
}
/*-------------------------------------------------------------------------*/
void                        _adapt2
/*-------------------------------------------------------------------------*/
(
GAEC_tDb *pDb,
GAEC_tSc *pSc,
S16 blk
)
{
    gaec_get_energy2   (pDb, blk);

    memclr(pSc->u.aA2, sizeof(GAEC_tScA2));
    gaec_adapt_dc2p (pDb, pSc, blk, 0);
    gaec_adapt_dc2d (pDb, pSc, blk, 0);

    memclr(pSc->u.aA2, sizeof(GAEC_tScA2));
    gaec_adapt_dc2p (pDb, pSc, blk, GAEC_BANDS);
    gaec_adapt_dc2d (pDb, pSc, blk, GAEC_BANDS);

    memclr(pSc->u.aA2, sizeof(pSc->u.aA2));
    gaec_adapt_ac2p (pDb, pSc, blk);
    gaec_adapt_ac2d (pDb, pSc, blk);
}
/*-------------------------------------------------------------------------*/
void                        _update_energy3
/*-------------------------------------------------------------------------*/
(
GAEC_tDb *pDb,
GAEC_tSc *pSc
)
{
    S16 blk;
    for (blk = 0; blk < GAEC_BLKS; blk++)
    {
        gaec_get_energy3(pDb, blk);
    }
}
/*-------------------------------------------------------------------------*/
void                        _adapt3
/*-------------------------------------------------------------------------*/
(
GAEC_tDb *pDb,
GAEC_tSc *pSc,
S16 blk
)
{
    gaec_get_energy3   (pDb, blk);
    gaec_get_energy3   (pDb, blk+1);

    memclr(pSc->u.aA3, sizeof(GAEC_tScA3));
    gaec_adapt_dc3p (pDb, pSc, blk, 0);
    gaec_adapt_dc3d (pDb, pSc, blk, 0);

    memclr(pSc->u.aA3, sizeof(GAEC_tScA3));
    gaec_adapt_dc3p (pDb, pSc, blk, GAEC_BANDS);
    gaec_adapt_dc3d (pDb, pSc, blk, GAEC_BANDS);

    memclr(pSc->u.aA3, sizeof(pSc->u.aA3));
    gaec_adapt_ac3p (pDb, pSc, blk);
    gaec_adapt_ac3d (pDb, pSc, blk);
}
/*-------------------------------------------------------------------------*/
void                        _update_energy4
/*-------------------------------------------------------------------------*/
(
GAEC_tDb *pDb,
GAEC_tSc *pSc
)
{
    gaec_get_energy4(pDb);
}
/*-------------------------------------------------------------------------*/
void                        _adapt4
/*-------------------------------------------------------------------------*/
(
GAEC_tDb *pDb,
GAEC_tSc *pSc
)
{
    gaec_get_energy4   (pDb); 

    memclr(pSc->u.aA4, sizeof(GAEC_tScA4));
    gaec_adapt_dc4p (pDb, pSc, 0);
    gaec_adapt_dc4d (pDb, pSc, 0);

    memclr(pSc->u.aA4, sizeof(GAEC_tScA4));
    gaec_adapt_dc4p (pDb, pSc, GAEC_BANDS);
    gaec_adapt_dc4d (pDb, pSc, GAEC_BANDS);

    memclr(pSc->u.aA4, sizeof(pSc->u.aA4));
    gaec_adapt_ac4p (pDb, pSc);
    gaec_adapt_ac4d (pDb, pSc);
}

/*-------------------------------------------------------------------------*/
void                        _cancel
/*-------------------------------------------------------------------------*/
(
GAEC_tDb *pDb,
GAEC_tSc *pSc,
S16 blk
)
{
    gaec_cancel_dc(pDb, pSc, pDb->psAdf, &pSc->aasErr[0][0], blk, 0);
    gaec_cancel_dc(pDb, pSc, pDb->psAdf, &pSc->aasErr[0][0], blk, GAEC_BANDS);
    gaec_cancel_ac(pDb, pSc, pDb->psAdf, &pSc->aasErr[0][0], blk);
}

/*-------------------------------------------------------------------------*/
void                        _cancel_m
/*-------------------------------------------------------------------------*/
(
GAEC_tDb *pDb,
GAEC_tSc *pSc,
S16 blk
)
{
    gaec_cancel_dc(pDb, pSc, pDb->psAdfM, &pSc->aasErrM[0][0], blk, 0);
    gaec_cancel_dc(pDb, pSc, pDb->psAdfM, &pSc->aasErrM[0][0], blk, GAEC_BANDS);
    gaec_cancel_ac(pDb, pSc, pDb->psAdfM, &pSc->aasErrM[0][0], blk);
}
/*--------------------- public  functions ---------------------------------*/

/*-------------------------------------------------------------------------*/
void                        gaec_adf_cancel
/*-------------------------------------------------------------------------*/
(
GAEC_tDb *pDb,
GAEC_tSc *pSc
)
{
    S16 blk;

  	for (blk = 0; blk < GAEC_BLKS; blk++)
   	{
       	_cancel(pDb, pSc, blk);
        _cancel_m(pDb, pSc, blk);
   	}
}
/*-------------------------------------------------------------------------*/
void                        gaec_adf_adapt
/*-------------------------------------------------------------------------*/
(
GAEC_tDb *pDb,
GAEC_tSc *pSc
)
{
    S16 blk;

    pSc->uAdapt = 
		(!(pDb->uControl & IGAEC_CMD_ADAPT_OFF)) &&
//        (pDb->sErlCrit < GAEC_CRIT_MAX/2) && 
        (!pDb->uIsTone);
#if 0
    {
        extern long _Frame;
        if (_Frame > 200*5) pSc->uAdapt = FALSE;
    }
#endif
//    pSc->uAdapt = 0;

    switch (pDb->uAdfMode)
    {
    case 0:
        _update_energy2(pDb, pSc);
        _update_energy3(pDb, pSc);
        _update_energy4(pDb, pSc);
        break;
    case 2:
        {
            if (pSc->uAdapt)
            {
                for (blk = 0; blk < GAEC_BLKS; blk++)
                {
                    if (blk != 0)
                    {
                        _cancel(pDb, pSc, blk);
                    }
                    _adapt2 (pDb, pSc, blk);
                }
            }
            else
            {
                _update_energy2(pDb, pSc);
            }
            _update_energy3(pDb, pSc);
            _update_energy4(pDb, pSc);
            break;
        }
    case 3:
        {
            if (pSc->uAdapt)
            {
                for (blk = 0; blk < GAEC_BLKS/2; blk++)
                {
                    if (blk != 0)
                    {
                        _cancel(pDb, pSc, blk*2);
                        _cancel(pDb, pSc, blk*2+1);
                    }
                    _adapt3 (pDb, pSc, blk*2);
                }
            }
            else
            {
                _update_energy3(pDb, pSc);
            }
            _update_energy2(pDb, pSc);
            _update_energy4(pDb, pSc);
            break;
        }
    case 4:
        {
            if (pSc->uAdapt)
            {
                _adapt4 (pDb, pSc);
            }
            else
            {
                _update_energy4 (pDb, pSc);
            }
            _update_energy2(pDb, pSc);
            _update_energy3(pDb, pSc);
            break;
        }
    default:
        break;
    } // end-of-switch

}
/*-------------------------------------------------------------------------*/
void                        gaec_adf_stepsize
/*-------------------------------------------------------------------------*/
(
GAEC_tDb *pDb,
GAEC_tSc *pSc
)
{
// asTmp use: GAEC_BANDS+1
    S16 band;
    S16 sAddLoss = GAEC_DB(1.0) * (GAEC_BANDS/2);

    for (band = 0; band < GAEC_BANDS+1; band++)
    {
        pSc->u.asTmp[band] = 0;
    }
    for (band = 0; band < GAEC_BANDS/2; band++)
    {
        pSc->u.asTmp[band] = sAddLoss;
        sAddLoss -= GAEC_DB(1.0);
    }

    for (band = 0; band < GAEC_BANDS+1; band++)
    {
        S16 sErleLoss;
        S16 sExpectedErrEn = pDb->asExpectedErrEn[band];

        sAddLoss = 0;

        switch (pDb->uAdfMode)
        {

⌨️ 快捷键说明

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