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

📄 tg.c

📁 Express DSP compliant C55x DTMF detector software is proposed in two versions: one with a 5 ms frame
💻 C
字号:
/*-------------------------------------------------------------------------*
 *                                                                         *
 *   THIS IS AN UNPUBLISHED WORK CONTAINING CONFIDENTIAL AND PROPRIETARY   *
 *   INFORMATION.  IF PUBLICATION OCCURS, THE FOLLOWING NOTICE APPLIES:    *
 *      "COPYRIGHT 2001 MICHAEL TSIROULNIKOV, ALL RIGHTS RESERVED"         *
 *                                                                         *
 *-------------------------------------------------------------------------*/

#if ! defined (_dsp)
void  indicate_start(void);
void  indicate_end(void);
#include <memory.h>
#else
#include <string.h> /* memcpy () */
#endif

#include "tg.h"
#include "tgsin.cc"

extern void tg_add_sine2(TG_tTone *pTone, S16 *pOut);

/*--------------------- local defs ----------------------------------------*/
/*--------------------- public vars ---------------------------------------*/
/*--------------------- local vars ----------------------------------------*/
/*--------------------- local functions -----------------------------------*/
/*-------------------------------------------------------------------------*/
static void             _add_sine2
/*-------------------------------------------------------------------------*/
(
TG_tTone *pTone,
S16 *pTo
)
{
    S32 ac0;
    S32 ac1;
    S32 ac2;
    S32 ac3 = pTone->sPhase;
    S16 t0, t1;

    int k;

    for (k = 0; k < TG_FR_SZ/2; k++)
    {
        ac3 = ac3 + pTone->sFreq;
        ac2 = ac3 >> 8;
        t0  = (S16)(ac2 & 0xff);

        ac3 = ac3 + pTone->sFreq;
        ac2 = ac3 >> 8;
        t1  = (S16)(ac2 & 0xff);

        ac0 = ((S32)*pTo++)<<15;
        ac1 = ((S32)*pTo--)<<15;

        ac0 = ac0 + TG_asSin[t0] * (S32) (pTone->sAmp);
        ac1 = ac1 + TG_asSin[t1] * (S32) (pTone->sAmp);

        *pTo++ = (S16)(ac0>>15);
        *pTo++ = (S16)(ac1>>15);
    }
    pTone->sPhase = (S16)ac3;
}
/*--------------------- public  functions ---------------------------------*/

/*-------------------------------------------------------------------------*/
void                        TG_MIKET_init_db
/*-------------------------------------------------------------------------*/
(
TG_tDb *pDb
)
{
    memset(pDb, 0, sizeof(TG_tDb));
}

/*-------------------------------------------------------------------------*/
void                        TG_MIKET_control
/*-------------------------------------------------------------------------*/
(
TG_tDb *pDb,
S16 sCmd,
ITG_Status *pCfg
)
{
    switch (sCmd)
    {
    case ITG_CMD_NONE:
        break;
    case ITG_CMD_RESET:
        /* reset phase */
        pDb->Lo.sPhase = 0;
        pDb->Hi.sPhase = 0;
        pDb->sState = 0;
        break;
    case ITG_CMD_TONE:
        /* copy cfg */
        pDb->Cfg = *pCfg;
        /* setup freq */
        pDb->Lo.sFreq = pCfg->Lo.sFreq;
        pDb->Hi.sFreq = pCfg->Hi.sFreq;
        if (pDb->Cfg.sPreSilenceDuration > 0)
        {
            /* setup for PRE_SILENCE */
            pDb->sState = ITG_ST_PRE_SILENCE;
	        pDb->sCurrFrame = pDb->Cfg.sPreSilenceDuration;
            pDb->Lo.sAmp = 0;
            pDb->Hi.sAmp = 0;
        }
        else
        {
			pDb->sState = ITG_ST_SIGNAL;
			pDb->sCurrFrame = pDb->Cfg.sSignalDuration;
            pDb->Lo.sAmp  = pDb->Cfg.Lo.sAmp;
            pDb->Hi.sAmp  = pDb->Cfg.Hi.sAmp;
        }
        break;
    }
  	pCfg->State = pDb->sState;
}

/*-------------------------------------------------------------------------*/
S16                         TG_MIKET_process
/*-------------------------------------------------------------------------*/
/* function returns zero when work has been done */
(
TG_tDb *pDb,
TG_tSc *pSc,
S16 *pOut
)
{
    /* copy data from Db into Scratch */
    memcpy(pSc, pDb, sizeof(TG_tDb));

	switch (pSc->sState)
	{
    case ITG_ST_IDLE:
        /* do nothing in idle state */
        break;

	case ITG_ST_PRE_SILENCE:
		--pSc->sCurrFrame;
		if (pSc->sCurrFrame <= 0)
		{
			pSc->sState = ITG_ST_SIGNAL;
			pSc->sCurrFrame = pSc->Cfg.sSignalDuration;
            pSc->Lo.sAmp  = pSc->Cfg.Lo.sAmp;
            pSc->Hi.sAmp  = pSc->Cfg.Hi.sAmp;
#if ! defined (_dsp)
            indicate_start();
#endif
		}
		break;

	case ITG_ST_SIGNAL:
        _add_sine2(&pSc->Lo, pOut);
        _add_sine2(&pSc->Hi, pOut);

        if (pSc->Cfg.sSignalDuration < 0)
        {
            /* forever */
        }
        else
        {
		    --pSc->sCurrFrame;
		    if (pSc->sCurrFrame <= 0)
		    {
                if (pSc->Cfg.sPostSilenceDuration > 0)
                {
			        pSc->sState = ITG_ST_POST_SILENCE;
			        pSc->sCurrFrame = pSc->Cfg.sPostSilenceDuration;
                }
                else
                {
        			pSc->sState = ITG_ST_IDLE;
                }
                pSc->Lo.sAmp  = 0;
                pSc->Hi.sAmp  = 0;

#if ! defined (_dsp)
                indicate_end();
#endif
		    }
        }
		break;

	case ITG_ST_POST_SILENCE:
		--pSc->sCurrFrame;
		if (pSc->sCurrFrame <= 0)
		{
			pSc->sState = ITG_ST_IDLE;
		}
		break;

	default:
/* log err ??? */
		break;
    } /* end-of-switch */

    /* copy data from Db into Scratch */
    memcpy(pDb, pSc, sizeof(TG_tDb));

    return pSc->sState;
}

⌨️ 快捷键说明

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