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

📄 demo.cpp

📁 TI公司DSP/tms320c55x/tms320c54x系列的声学回声消除代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/*-------------------------------------------------------------------------*
 *                                                                         *
 *   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 <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define M_PI                3.14159265


#include "sim.h"

#include "stddefs.h"
#include "gaeci.h"
#include "spbpf.h"

#include "stdafx.h"
#include <mmsystem.h> 

/*--------------------- local defs ----------------------------------------*/
#define _GR_FR  (200*0)
#define IN_MODE (0)

#define LEV0    (4096.0)
#define _EPS     (1.0e-8)
#define ECHO_SZ	(500*8)
#define _HST_SZ (GAEC_FR_SZ*8) 
#define _SOUT_SZ (_HST_SZ - GAEC_FBS_SZ+10)
#define _ROUT_SZ (_HST_SZ - GAEC_FBS_SZ+10)
#define GAEC_MAX (8158)

#define X0      (20)
#define DX      (1)
#define FR_MAX  (200*3)
#define XM      (X0+FR_MAX*DX)


#define YCC     (619)
#define YCM     (80)

#define XADFE   (XM - GAEC_ADF_SZ)
#define XEN     (XM+45)
#define XADF    (XEN+203)
#define XHST    (XADF+2*GAEC_ADF_SZ+8)
#define XSND    (XHST+2*GAEC_RCV_SZ+8)
#define XERR    (XSND+2*GAEC_SND_SZ+8)

#define YADF    (60)
#define YWIN    (40)

#define YSIGWIN (22)
#define YSIG    (24)
#define XSIG    (70)
#define YDLT    (2*((YWIN)+1))

#define DYEN    (1.5)
#define DYAD    (2.75)
#define YRCVEN  (23)
#define YADFE   (10)

#define XT      (XADF+210)
#define YTA     75

#define YDBMAX  (+6.0)
#define YDBMIN  (-80.0)
#define YG      (465)
#define YV      (86*3)

#define YDHMAX  (+6.0)
#define YDHMIN  (-50.0)
#define YGH     (245)
#define YVH     (56*2)

#define XTD     (120)
#define XT0     (10)
#define XT1     (XT0+XTD)
#define XT2     (XT1+XTD)
#define XT3     (XT2+XTD)
#define XT4     (XT3+XTD)
#define XTM     (XT4+XTD)

#define YTD     (20)
#define YT0     (745)
#define YT1     (YT0+YTD)
#define YT2     (YT1+YTD)
#define YT3     (YT2+YTD)
#define YT4     (YT3+YTD)
#define YT5     (YT4+YTD)
#define YT6     (YT5+YTD)
#define YT7     (YT6+YTD)
#define YT8     (YT7+YTD)

typedef struct tControl
{
	double	fBypass;
    int		iGmode;
    double	fRxCorr;
    double	fTxCorr;
	int		iRxDelay;
	int		iTxDelay;
    int		iReplaceRx;
    int		iAddReflections; 
    double	fAddPinkNoise;
    double	fAddTxQNoise;
    double	fAddRxQNoise;
	int		iAddRxDelay;
	int		iAddRxBypass;
	double  fAddRxCorr;
	FILE	*pAddRxTrxFile;
	FILE	*pAddRxTxFile;
	FILE	*pInTrxFile;
	FILE	*pInTxFile;
	FILE	*pInRxFile;
	FILE	*pInTxBinFile;
	FILE	*pInRxBinFile;
    FILE	*pAdfFile;
	FILE	*pTmpFile;
    FILE	*pRespFile;

	FILE	*pNlpWavFile;
	FILE	*pCnlWavFile;
	FILE	*pTxWavFile;
	FILE	*pTxOutWavFile;
	FILE	*pRxWavFile;

} tControl;


typedef struct tGen {
	double fRxNoise;
	double fRxLevel;
	double fTxNoise;
	double fTxLevel;
	double fWordLen;
	double fPauseLen;
	double fDoubleTalk;
	long   liSentenceLen;
	int    iBeginFrom;
	int    iState;
	long   liStateCntr;
	long   liCurrWord;
	int    iDirection;
} tGen;

typedef struct {
    char acRiff[4];
    U32  ulLen1;
    char acWave[4];

    char acFmt[4];
    U32  ulLen2;
    U16  uMode;
    U16  uNumber;
    U32  ulFs;
    U32  ulBps;
    U16  uBytes;
    U16  uBits;

    char acData[4];
    U32  ulLen3;
} tWavHdr;

/*--------------------- public vars ---------------------------------------*/

U16         DEMO_StepMode;

/*--------------------- local vars ----------------------------------------*/

U16         _uIsSeriaOver;
static char _aBuff[81];

tGen        _Gen;
tControl    _Control;
tWavHdr     _WavHdr;

static int  _aiColor[10] = 
{
    RED, GREEN,
    3 , 3 +(2<<2), 3 +(3<<2), 3 +(3<<2) + 0x20,
    48, 48+(2<<2), 48+(3<<2), 48+(3<<2) + 0x02,
};

long        _Frame;
long        _lStartFrame;
double      _fReflection;

S16         _asRinHst   [_HST_SZ];
S16         _asRoutHst  [_ROUT_SZ];
S16         _asSinHst   [_HST_SZ];
S16         _asSoutHst  [_SOUT_SZ];
S16         _asCnlHst   [_SOUT_SZ];
S16         _asRx       [IGAEC_FR_SZ];
S16         _asTx       [IGAEC_FR_SZ];
S16         _asTxIn     [IGAEC_FR_SZ];
S16         _asTxOut    [IGAEC_FR_SZ];
S16         _asRxIn     [IGAEC_FR_SZ];
S16         _asRxOut    [IGAEC_FR_SZ];

S16         _asEchoTx   [ECHO_SZ+3*IGAEC_FR_SZ];
float       _afEcho     [ECHO_SZ];
S16         _asEchoS16  [ECHO_SZ];
double      _aasAdf     [GAEC_BANDS*2][GAEC_ADF_SZ];


S16         _asHst      [GAEC_BANDS*2*GAEC_RCV_SZ];
S16         _asAdfBuff  [GAEC_BANDS*2*GAEC_ADF_SZ];
S16         _asAdfMBuf  [GAEC_BANDS*2*GAEC_ADF_SZ];

S16         _asTmp      [512];
S16         _aasAdfEn   [GAEC_BANDS+1][GAEC_ADF_SZ-GAEC_BLKS];
double		_dTCLv;
double		_dTCLw;
double		_dTCLwa;

GAEC_MIKET_tStts _GaecStts;
GAEC_tDb         _GaecDb;
GAEC_tSc         _GaecSc;
//IGAEC_tCfg       _LecCfg;
IGAEC_Status     _GAEC_Status;

extern "C" GAEC_tScRcv      _GaecScRcv;
extern "C" GAEC_tScEpc		_GaecScEpc;
extern "C" S16				_asCnl      [GAEC_FR_SZ];
extern "C" S16				_asNr       [GAEC_FR_SZ];
extern "C" U16				_auCopyAdf  [GAEC_BANDS+1];
extern "C" S16				_asErr0EnC  [GAEC_BANDS+1];

SPBPF_tDb _SpBpfDb;
SPBPF_tSc _SpBpfSc;

char *_acOn[] = 
{
    "off",
    "on"
};

char *aVad[] =
{
	 "IDLE",
	 "PRE",
	 "ACTIVE",
	 "HANGOVER"
};

int st_x;

/*--------------------- local functions -----------------------------------*/

void dump_results(void);


/*-------------------------------------------------------------------------*/
static void             _err
/*-------------------------------------------------------------------------*/
(
int no,
int line,
char *pStr
)
{
    val_out(400, 0, LIGHTRED, "ERR %d : %s (line %d)", no, pStr, line);
}
/*-------------------------------------------------------------------------*/
void                        gaec_adf_energy
/*-------------------------------------------------------------------------*/
(
GAEC_tDb *pDb
)
{
    int band;

    for (band = 0; band < GAEC_BANDS+1; band++)
    {
        S16 *psAdf = &pDb->psAdf[band*GAEC_ADF_SZ*2];
        int idx;

        if (band == GAEC_BANDS) 
            psAdf = &pDb->psAdf[1];

        for (idx = 0; idx < GAEC_ADF_SZ-GAEC_BLKS; idx++)
        {
            S32 ac0 = 0;
            int blk;
            for (blk = 0; blk < GAEC_BLKS; blk++)
            {
                S16 x = psAdf[(idx+blk)*2];
                ac0 += x * (S32)x;
                if ((band != 0) && (band != GAEC_BANDS))
                {
                    x = x = psAdf[(idx+blk)+2+1];
                    ac0 += x * (S32)x;
                }
            }
            _aasAdfEn[band][idx] = gaec_utl_en2log(ac0);
        }
    }
}
/*-------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------*/

/*                  I N P U T ,  G E N E R A T O R                         */

/*-------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------*/

/*-------------------------------------------------------------------------*/
S16                         _limit
/*-------------------------------------------------------------------------*/
(
double f
)
{
    S16 s = (S16)(f+0.5);

    if (f >  GAEC_MAX) 
    {
        s =  GAEC_MAX;
    }
    if (f < -GAEC_MAX)
    {
        s = -GAEC_MAX;
    }
    return s;
}

/*-------------------------------------------------------------------------*/
void                        _add_rx_corr
/*-------------------------------------------------------------------------*/
(
)
{
    int k;

	for (k = 0; k < IGAEC_FR_SZ; k++)
	{
        _asRx[k] = _limit(_asRx[k] * _Control.fRxCorr);
	}
}
/*-------------------------------------------------------------------------*/
void                        _add_tx_corr
/*-------------------------------------------------------------------------*/
(
)
{
    int k;

	for (k = 0; k < IGAEC_FR_SZ; k++)
	{
        _asTx[k] = _limit(_asTx[k] * _Control.fTxCorr);
	}
}

/*-------------------------------------------------------------------------*/
void                        _add_tx_delay
/*-------------------------------------------------------------------------*/
(
)
{
    static S16 __asTxDelay[1000];
    int k;

	if (_Control.iTxDelay != 0)
	{
        for (k = 0; k < _Control.iTxDelay; k++)
        {
            __asTxDelay[k] = __asTxDelay[k + GAEC_FR_SZ];
        }
        for (k = 0; k < GAEC_FR_SZ; k++)
        {
		    __asTxDelay[_Control.iTxDelay+k] = _asTx[k];
        }
        for (k = 0; k < GAEC_FR_SZ; k++)
        {
		    _asTx[k] = __asTxDelay[k];
        }
	}
}
/*-------------------------------------------------------------------------*/
void                        _add_rx_delay
/*-------------------------------------------------------------------------*/
(
)
{
    static S16 __asRxDelay[1000];
    int k;

	if (_Control.iRxDelay != 0)
	{
        for (k = 0; k < _Control.iRxDelay; k++)
        {
            __asRxDelay[k] = __asRxDelay[k + GAEC_FR_SZ];
        }
        for (k = 0; k < GAEC_FR_SZ; k++)
        {
		    __asRxDelay[_Control.iRxDelay+k] = _asRx[k];
        }
        for (k = 0; k < GAEC_FR_SZ; k++)
        {
		    _asRx[k] = __asRxDelay[k];
        }
	}
}
/*-------------------------------------------------------------------------*/
void                        _read_rx_bin
/*-------------------------------------------------------------------------*/
(
)
{
	int k;
	int Read;
	int Tries  = 0;

    Read = fread(_asRx, sizeof(S16), IGAEC_FR_SZ, _Control.pInRxBinFile);

    if (Read != IGAEC_FR_SZ)
    {
        DEMO_StepMode = TRUE;
		rewind(_Control.pInRxBinFile);
        for(k = 0; k < IGAEC_FR_SZ; k++) _asRx[k] = 0;
    }
}
/*-------------------------------------------------------------------------*/
void                        _read_tx_bin
/*-------------------------------------------------------------------------*/
(
)
{
	int k;
	int Read;
	int Tries  = 0;

    Read = fread(_asTx, sizeof(S16), IGAEC_FR_SZ, _Control.pInTxBinFile);

    if (Read != IGAEC_FR_SZ)
    {
        DEMO_StepMode = TRUE;
		rewind(_Control.pInTxBinFile);
        for(k = 0; k < IGAEC_FR_SZ; k++) _asTx[k] = 0;
    }
}


/*-------------------------------------------------------------------------*/
void                    _read_tx_txt
/*-------------------------------------------------------------------------*/
(
)
{
    int k;

	for (k = 0; k < IGAEC_FR_SZ; k++)
	{
		int Read;
		int Tries  = 0;

		do
		{
            int iTx;
			Read = fscanf(_Control.pInTxFile, "%d", &iTx);

			if (Read != EOF)
			{
				_asTx[k] = iTx;
			}
			else /* end of file, rewind */
			{
				rewind(_Control.pInTxFile);
			}

			if (++Tries == 5)
			{
				exit(15);
			}
		}
		while (Read != 1);
	}
}
/*-------------------------------------------------------------------------*/
void                    _read_rx_txt
/*-------------------------------------------------------------------------*/
(
)
{
    int k;

	for (k = 0; k < IGAEC_FR_SZ; k++)
	{
		int Read;
		int Tries  = 0;

		do
		{
            int iRx;
			Read = fscanf(_Control.pInRxFile, "%d", &iRx);

			if (Read != EOF)
			{
				_asRx[k] = iRx;
			}
			else /* end of file, rewind */
			{
				rewind(_Control.pInRxFile);
			}

			if (++Tries == 5)
			{
				exit(15);
			}
		}
		while (Read != 1);
	}
}

/*-------------------------------------------------------------------------*/
void                    _read_trx_txt
/*-------------------------------------------------------------------------*/
(
)
{
	static int Cntr = 0;
	static char aBuffer[81];

	if (Cntr == 0)
	{
        int k;
		for (k = 0; k < IGAEC_FR_SZ; k++)
		{
            int iRx = 0;
            int iTx = 0;
			int Tries  = 0;
			char *p = fgets(aBuffer, 80, _Control.pInTrxFile);


			if (p != NULL)
			{
				sscanf(aBuffer, "%d %d", &iTx, &iRx);
    			_asTx[k] = iTx;
    			_asRx[k] = iRx;
			}
			else /* end of file, rewind */

⌨️ 快捷键说明

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