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 + -
显示快捷键?