main.c

来自「Express DSP compliant C55x DTMF detector」· C语言 代码 · 共 694 行 · 第 1/2 页

C
694
字号
/*-------------------------------------------------------------------------*
 *                                                                         *
 *   THIS IS AN UNPUBLISHED WORK CONTAINING CONFIDENTIAL AND PROPRIETARY   *
 *   INFORMATION.  IF PUBLICATION OCCURS, THE FOLLOWING NOTICE APPLIES:    *
 *      "COPYRIGHT 2001 MIKET DSP SOLUTIONS, ALL RIGHTS RESERVED"          *
 *                                                                         *
 *-------------------------------------------------------------------------*/
#include "dtmfi.h"
#include "tg.h"

#include <stdlib.h>

/*--------------------- local defs ----------------------------------------*/
#define DBG_IT (20)

#define STD_FR_SZ (40) 

#if (STD_FR_SZ != ITG_FR_SZ)
#error tg frame size err
#endif               
#if (STD_FR_SZ != IDTMF_FR_SZ)
#error dtmf frame size err
#endif               


#define _RUN_SZ 200

#define FR_MAX	(200)

#define dbs(x) ((S16)(170.1*x))
/*--------------------- public vars ---------------------------------------*/
/*--------------------- local vars ----------------------------------------*/

volatile S16 sErr = 0;
volatile S32 slA, slC;
volatile S16 sA, sC;
volatile S32 slCntr = 0;
volatile S16 k;

TG_tDb TgDb;
TG_tSc TgSc;
ITG_Status TgCfg;
IDTMF_Status DtmfStatus;
IDTMF_tCfg DtmfCfg;  

#pragma DATA_SECTION (DtmfDbA, ".dtmfa")
#pragma DATA_SECTION (DtmfDbC, ".dtmfa")
#pragma DATA_SECTION (DtmfScA, ".dtmfa")
#pragma DATA_SECTION (DtmfScC, ".dtmfa")
DTMF_tDb DtmfDbA; 
DTMF_tSc DtmfScA;
DTMF_tDb DtmfDbC; 
DTMF_tSc DtmfScC;

S16 asErrPosDb[8];
S16 asErrPosSc[32];

#pragma DATA_ALIGN(asRx, 2)
S16	asRx[STD_FR_SZ];

#pragma DATA_ALIGN(asRxC, 2)
S16	asRxC[STD_FR_SZ];

#pragma DATA_ALIGN(asTx, 2)
S16 asTx[STD_FR_SZ*FR_MAX];

S16 asReply[_RUN_SZ];

/*--------------------- local functions -----------------------------------*/
/*-------------------------------------------------------------------------*/
void                     tg_config
/*-------------------------------------------------------------------------*/
(
)
{
    TG_MIKET_control(&TgDb, ITG_CMD_RESET, &TgCfg);

    TgCfg.Lo.sFreq = (S16)((32768./4000.)*(770.0*0.995)); 
    TgCfg.Lo.sAmp = 2048;
    TgCfg.Hi.sFreq = (S16)((32768./4000.)*(941.0*1.005));
    TgCfg.Hi.sAmp = 2048;
#if 1
    TgCfg.sPreSilenceDuration =  (S16) (15/(STD_FR_SZ/8));
    TgCfg.sSignalDuration =      (S16) (45/(STD_FR_SZ/8));
    TgCfg.sPostSilenceDuration = (S16) (35/(STD_FR_SZ/8));
#else    
    TgCfg.sPreSilenceDuration =  (S16) 0;
    TgCfg.sSignalDuration =      (S16) -1;
    TgCfg.sPostSilenceDuration = (S16) (35/(STD_FR_SZ/8));
#endif    
    TG_MIKET_control(&TgDb, ITG_CMD_TONE, &TgCfg);
}
/*-------------------------------------------------------------------------*/
void                     tg_config_tone
/*-------------------------------------------------------------------------*/
(
)
{
    TG_MIKET_control(&TgDb,ITG_CMD_RESET, &TgCfg);

    TgCfg.Lo.sFreq = (S16)((32768./4000.)*(770.0)); 
    TgCfg.Lo.sAmp = 8192;
    TgCfg.Hi.sFreq = (S16)((32768./4000.)*(1477.0));
    TgCfg.Hi.sAmp = 8192;
    TgCfg.sPreSilenceDuration =  (S16) (25/(STD_FR_SZ/8));
    TgCfg.sSignalDuration =      (S16) (55/(STD_FR_SZ/8));
    TgCfg.sPostSilenceDuration = (S16) (20/(STD_FR_SZ/8));
    
    TG_MIKET_control(&TgDb, ITG_CMD_TONE,&TgCfg);
}
/*-------------------------------------------------------------------------*/
void                     dtmf_config
/*-------------------------------------------------------------------------*/
(
)
{
    DtmfCfg.sFwdTwistThr  = dbs(4.0);
    DtmfCfg.sRevTwistThr  = dbs(8.0);
    DtmfCfg.sMinEnThr     = dbs(-40.0);
    DtmfCfg.sNoiseThr     = dbs(10.25);
    DtmfCfg.sSumEnThr     = dbs(1.75);
    DtmfCfg.sVarThr       = dbs(2.0);
    DtmfCfg.s2kUpThr      = dbs(11.0);
    DtmfCfg.sPartThr      = dbs(2.0);
    DtmfCfg.sCleanThr     = dbs(10.75);
    DtmfCfg.sMaxFreqDevThr = dbs(2.0);
    DtmfCfg.sMinToneDuration = 1;
    DtmfCfg.sMinPostSilenceDuration = 2;
    DtmfCfg.sAbortTimeout = 2;
}    
/*-------------------------------------------------------------------------*/
void 						fill_rand
/*-------------------------------------------------------------------------*/
(
S16 *pTo,
S16 sSz,
S16 sLevel
)
{
	S16 k;
	for (k = 0; k < sSz; k++)
	{
		S16 x = rand() - (RAND_MAX/2);
		x  = (S16)((x * (S32)sLevel)>>14); /* /RAND_MAX = 32767 */
		pTo[k] = x;
	}
}

/*-------------------------------------------------------------------------*/
S16 						compare
/*-------------------------------------------------------------------------*/
(
S16 *psIn,
S16 *psInC,
S16 sSz
)
{
	S16 k;     
	S16 err = 0;
	
	for (k = 0; k < sSz; k++)
	{
		if(psIn[k] != psInC[k])err++;
	}      
	return err;
}
/*-------------------------------------------------------------------------*/
S16 						compare_db
/*-------------------------------------------------------------------------*/
(
)
{
	S16 *psC = (S16 *)&DtmfDbC;
	S16 *psA = (S16 *)&DtmfDbA;
	S16 s;     
	S16 err = 0;

	memset(asErrPosDb,0,8);
	
	for (s = 0; s < sizeof(DtmfDbC); s++)
	{
		if(psA[s] != psC[s])
		{
			err++;
			if (err < 8)
			{
				asErrPosDb[err] = s;
			}
			asErrPosDb[0] = err;
		}
	}
	return err;
}
/*-------------------------------------------------------------------------*/
S16 						compare_sc
/*-------------------------------------------------------------------------*/
(
)
{
	S16 *psC = (S16 *)&DtmfScC;
	S16 *psA = (S16 *)&DtmfScA;
	S16 s;     
	S16 err = 0;
	
	memset(asErrPosSc, 0, 32);
	
	for (s = 0; s < sizeof(DtmfScC); s++)
	{
		if(psA[s] != psC[s])
		{
			err++;
			if (err < 32)
			{
				asErrPosSc[err] = s;
			}
			asErrPosSc[0] = err;
		}
	}
	return err;
}
extern S16  dtmf_en2logC	  (S32 );
extern S16  dtmf_en2log 	  (S32 );
extern void dtmf_move_data_inC(DTMF_tDb *pDb, DTMF_tSc *pSc, S16 *psRx);
extern void dtmf_move_data_in (DTMF_tDb *pDb, DTMF_tSc *pSc, S16 *psRx);
extern void dtmf_filter_loC   (DTMF_tDb *pDb, DTMF_tSc *pSc);
extern void dtmf_filter_lo    (DTMF_tDb *pDb, DTMF_tSc *pSc);
extern void dtmf_filter_hiC   (DTMF_tDb *pDb, DTMF_tSc *pSc);
extern void dtmf_filter_hi    (DTMF_tDb *pDb, DTMF_tSc *pSc);
extern void dtmf_filter_dialC (DTMF_tDb *pDb, DTMF_tSc *pSc);
extern void dtmf_filter_dial  (DTMF_tDb *pDb, DTMF_tSc *pSc);

/*--------------------- public  functions ---------------------------------*/

/*-------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------*/
void						main
/*-------------------------------------------------------------------------*/
(
)
{
	fill_rand(DtmfDbC.as2kDataSav, DTMF_2KFLT_SZ, 3000);
	fill_rand(DtmfDbC.asBpDataSav, DTMF_BPFLT_SZ, 3000);
	fill_rand(DtmfDbC.asLoDataSav, DTMF_LOSD_SZ, 3000);
	fill_rand(DtmfDbC.asHiDataSav, DTMF_HISD_SZ, 3000);
	fill_rand(DtmfDbC.v.asSumEn, 6, 3000);
	DtmfDbC.v.slDialEn = 0x1234567;
	DtmfDbC.v.slFrameEn = 0x2345678;
	fill_rand((S16*)&DtmfScC, sizeof(DTMF_tSc), 5000);
	memcpy(&DtmfDbA, &DtmfDbC, sizeof(DtmfDbC));
	memcpy(&DtmfScA, &DtmfScC, sizeof(DtmfScC));
	
#if (DBG_IT == 0)
	test_asm();
#elif (DBG_IT == 1)

    TG_create(&TgDb);
    TG_init(&TgDb);
    tg_config();
    memset(asTx, 0, FR_MAX*STD_FR_SZ);
    for (k = 0; k < FR_MAX; k++)
    {
    	S16 sState = TG_process(&TgDb, &TgSc, &asTx[k*STD_FR_SZ]);
    	if (sState == 0)
    	{
    		tg_config();
    	}
    }
    tg_config();
#elif (DBG_IT == 2)
	for (k = 0; k< 100; k++)
	{
		fill_rand(asRx, STD_FR_SZ, 4000);
		slA = dtmf_frame_energy(asRx);
		slC = dtmf_frame_energyC(asRx);
		if (slA != slC)	sErr++;
	}
#elif (DBG_IT == 3)
	slA = 0x1234567;
	for (k = 0; k< 100; k++)
	{
		slA -= 0x12345;
		fill_rand(asRx, STD_FR_SZ, 4000);
//		slA = dtmf_frame_energy(asRx);
//		slC = dtmf_frame_energyC(asRx);
		sA = dtmf_en2log (slA);		
		sC = dtmf_en2logC(slA);		
		if (sA != sC) sErr++;
	}
#elif (DBG_IT == 4)
	for (k = 0; k< 100; k++)
	{
		fill_rand(asRx, STD_FR_SZ, 4000);
		dtmf_move_data_in (&DtmfDbA, &DtmfScA, asRx);
		dtmf_move_data_inC(&DtmfDbC, &DtmfScC,asRx);
		if (compare_sc()) sErr++;
		if (compare_db()) sErr++;
	}
#elif (DBG_IT == 5)
	for (k = 0; k< 100; k++)
	{
		extern void dtmf_filter_2kC(DTMF_tDb *pDb, DTMF_tSc *pSc);
		extern void dtmf_filter_2k (DTMF_tDb *pDb, DTMF_tSc *pSc);
		
		fill_rand(asRx, STD_FR_SZ, 4000);
		dtmf_move_data_in (&DtmfDbA, &DtmfScA, asRx);
		dtmf_move_data_in (&DtmfDbC, &DtmfScC,asRx);
		dtmf_filter_2k (&DtmfDbA, &DtmfScA);
		dtmf_filter_2kC(&DtmfDbC, &DtmfScC);
		if(compare_sc()) sErr++;
		if(compare_db()) sErr++;
	}
#elif (DBG_IT == 6)
	for (k = 0; k< 100; k++)
	{
		extern void dtmf_filter_loC(DTMF_tDb *pDb, DTMF_tSc *pSc);
		extern void dtmf_filter_lo (DTMF_tDb *pDb, DTMF_tSc *pSc);
		
		fill_rand(asRx, STD_FR_SZ, 4000);
		dtmf_move_data_in (&DtmfDbC, &DtmfScC, asRx);
		dtmf_filter_2k (&DtmfDbC, &DtmfScC);
		memcpy(&DtmfDbA, &DtmfDbC, sizeof(DtmfDbC));
		memcpy(&DtmfScA, &DtmfScC, sizeof(DtmfScC));
		
		dtmf_filter_lo (&DtmfDbA, &DtmfScA);
		dtmf_filter_loC(&DtmfDbC, &DtmfScC);
		if(compare_sc()) sErr++;
		if(compare_db()) sErr++;
	}
#elif (DBG_IT == 7)
	for (k = 0; k< 100; k++)
	{
		extern void dtmf_filter_hiC(DTMF_tDb *pDb, DTMF_tSc *pSc);
		extern void dtmf_filter_hi (DTMF_tDb *pDb, DTMF_tSc *pSc);
		
		fill_rand(asRx, STD_FR_SZ, 4000);
		dtmf_move_data_in (&DtmfDbC, &DtmfScC, asRx);
		dtmf_filter_2k (&DtmfDbC, &DtmfScC);
		dtmf_filter_lo (&DtmfDbC, &DtmfScC);
		memcpy(&DtmfDbA, &DtmfDbC, sizeof(DtmfDbC));
		memcpy(&DtmfScA, &DtmfScC, sizeof(DtmfScC));
		
		dtmf_filter_hi (&DtmfDbA, &DtmfScA);
		dtmf_filter_hiC(&DtmfDbC, &DtmfScC);
		if(compare_sc()) sErr++;
		if(compare_db()) sErr++;
	}
#elif (DBG_IT == 8)

⌨️ 快捷键说明

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