demo.cpp
来自「Express DSP compliant C55x DTMF detector」· C++ 代码 · 共 1,667 行 · 第 1/4 页
CPP
1,667 行
}
}
/*-------------------------------------------------------------------------*/
void fill_input
/*-------------------------------------------------------------------------*/
(
S16 *pIn
)
{
if(__Control.pInFile != NULL && __Frame > 0)
{
read_input(pIn);
}
else
{
gen_input(pIn);
}
for(int k=0; k < STD_FR_SZ; k++)pIn[k] <<= 2;
}
/*-------------------------------------------------------------------------*/
int str_cmp
/*-------------------------------------------------------------------------*/
(
const char *pBasis,
char **ppArg
)
{
if (_strnicmp(pBasis, *ppArg, strlen(pBasis)) == 0)
{
*ppArg += strlen(pBasis);
return 0;
}
else
{
return -1;
}
}
/*-------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------*/
/* C O N F I G U R A T I O N */
/*-------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------*/
int get_cfg_line
/*-------------------------------------------------------------------------*/
(
char *pArg
)
/* returns :
0 - no errs
1 - file err
2 - arg scanf err
3 - switch err
*/
{
int Rc = 0;
float Tmp;
int iTmp;
if ( *pArg == '-' || *pArg == '/')
{
pArg++;
if (str_cmp("DBG", &pArg) == 0)
{
__Control.pDbgFile = fopen("dbg.txt", "w");
if ( __Control.pDbgFile == NULL )
{
Rc = 1;
} /* end-of-if */
}
else if (str_cmp("OUT", &pArg) == 0)
{
__Control.pOutFile = fopen("out.txt", "w");
if ( __Control.pOutFile == NULL )
{
Rc = 1;
} /* end-of-if */
}
else if (str_cmp("TMP", &pArg) == 0)
{
__Control.pTmpFile = fopen("tmp.txt", "w");
if ( __Control.pTmpFile == NULL )
{
Rc = 1;
} /* end-of-if */
}
else if (str_cmp("BYPASS", &pArg) == 0)
{
if (sscanf(pArg, "%f", &Tmp) != 1)
{
Rc = 2;
}
else
{
__Control.fDelay = Tmp;
}
}
else if (str_cmp("GRMODE", &pArg) == 0)
{
if (sscanf(pArg, "%d", &__Control.iGmode) != 1)
{
Rc = 2;
}
}
else if (str_cmp("CATCH", &pArg) == 0)
{
if (sscanf(pArg, "%d", &__Control.iCatch) != 1)
{
Rc = 2;
}
}
else if (str_cmp("STEPMODE", &pArg) == 0)
{
DEMO_StepMode = TRUE;
}
else if (str_cmp("INPUT", &pArg) == 0)
{
__Control.pInFile = fopen(pArg+1, "rb");
if ( __Control.pInFile == NULL )
{
Rc = 1;
} /* end-of-if */
else
{
if (__Control.fDelay > 0)
{
for (long i = 0; i < __Control.fDelay * 8000; i++)
{
S16 x;
fread(&x, sizeof(S16), 1, __Control.pInFile);
if (i%8000 == 0)
{
val_out(0,0, WHITE, "second %ld ", (i+1)/8000);
}
}
}
}
}
else if (str_cmp("INCOR", &pArg) == 0)
{
if (sscanf(pArg, "%f", &Tmp) != 1)
{
Rc = 2;
}
else
{
__Control.fRxCorr = pow(10., Tmp/20.);
}
}
else if (str_cmp("HILEVEL", &pArg) == 0)
{
if (sscanf(pArg, "%f", &Tmp) != 1)
{
Rc = 2;
}
else
{
__Gen.iRxHiLevel = int(LEV0 * pow (10.0, Tmp/20.0) * 1.41);
}
}
else if (str_cmp("LOLEVEL", &pArg) == 0)
{
if (sscanf(pArg, "%f", &Tmp) != 1)
{
Rc = 2;
}
else
{
__Gen.iRxLoLevel = int(LEV0 * pow (10.0, Tmp/20.0) * 1.41);
}
}
else if (str_cmp("DIALLEVEL", &pArg) == 0)
{
if (sscanf(pArg, "%f", &Tmp) != 1)
{
Rc = 2;
}
else
{
__Gen.iDialLevel = int(LEV0 * pow (10.0, Tmp/20.0) * 1.41);
}
}
else if (str_cmp("NOISE", &pArg) == 0)
{
if (sscanf(pArg, "%f", &Tmp) != 1)
{
Rc = 2;
}
else
{
__Gen.iRxNoise = int(LEV0 * pow (10.0, Tmp/20.0));
}
}
else if (str_cmp("PRESILENCEDUR", &pArg) == 0)
{
if (sscanf(pArg, "%d", &iTmp) != 1)
{
Rc = 2;
}
else
{
__Gen.iPreSilenceDuration = iTmp;
}
}
else if (str_cmp("POSTSILENCEDUR", &pArg) == 0)
{
if (sscanf(pArg, "%d", &iTmp) != 1)
{
Rc = 2;
}
else
{
__Gen.iPostSilenceDuration = iTmp;
}
}
else if (str_cmp("SIGNALDUR", &pArg) == 0)
{
if (sscanf(pArg, "%d", &iTmp) != 1)
{
Rc = 2;
}
else
{
__Gen.iSignalDuration = iTmp;
}
}
else if (str_cmp("SAMEMAX", &pArg) == 0)
{
if (sscanf(pArg, "%d", &iTmp) != 1)
{
Rc = 2;
}
else
{
__Gen.iSameCntrMax = iTmp;
}
}
else if (str_cmp("FREQSTEPS", &pArg) == 0)
{
if (sscanf(pArg, "%d", &iTmp) != 1)
{
Rc = 2;
}
else
{
__Gen.iFreqSteps = iTmp;
}
}
else if (str_cmp("TONESTART", &pArg) == 0)
{
if (sscanf(pArg, "%d", &iTmp) != 1)
{
Rc = 2;
}
else
{
__Gen.iToneCntr = iTmp;
__Gen.iToneCntr &= 0xf;
__Gen.iLo = __Gen.iToneCntr % 4;
__Gen.iHi = __Gen.iToneCntr / 4;
}
}
else if (str_cmp("TONEINC", &pArg) == 0)
{
if (sscanf(pArg, "%d", &iTmp) != 1)
{
Rc = 2;
}
else
{
__Gen.iToneInc = iTmp;
}
}
else if (str_cmp("FREQDEV", &pArg) == 0)
{
if (sscanf(pArg, "%f", &Tmp) != 1)
{
Rc = 2;
}
else
{
__Gen.fFreqDevMax = Tmp*0.01;
}
}
else
{
Rc = 3;
}
} /* end of if */
else
{
// that's a comment
}
return Rc;
}
/*-------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------*/
/* O U T P U T */
/*-------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------*/
void dump_results
/*-------------------------------------------------------------------------*/
(
)
{
if (__Control.pOutFile != NULL)
{
#if 0
fprintf(__Control.pOutFile,
"F1=%4d[%4.1f]; F2=%4d[%4.1f]: end=%3d; start=%3d; earlyOn=%3d; earlyOff=%3d; abort=%3d\n",
__asFlo[__Gen.iLo],
__Gen.fLoDev*100.,
__asFhi[__Gen.iHi],
__Gen.fHiDev*100.,
__Stat.sEnd,
__Stat.sStart,
__Stat.sEarlyOn,
__Stat.sEarlyOff,
__Stat.sAbort
);
#else
fprintf(__Control.pOutFile,
"%5d %5d %5d %5d %5d\n",
__Stat.sEnd,
__Stat.sStart,
__Stat.sAbort,
__Stat.sEarlyOn,
__Stat.sEarlyOff
);
#endif
}
__Stat.sEnd = 0;
__Stat.sStart = 0;
__Stat.sEarlyOn = 0;
__Stat.sEarlyOff = 0;
__Stat.sAbort = 0;
}
/* ------------------------------------------------------------------- */
void graphic_init
/* ------------------------------------------------------------------- */
(
int Err
)
{
val_out(XT6, YT0, WHITE, "ERR %d", Err);
val_out(XT7, YT0, WHITE, "delay %6.2f", __Control.fDelay);
val_out(XT0, YT1, LIGHTRED, "PreSilenceDur %d", __Gen.iPreSilenceDuration);
val_out(XT0, YT2, LIGHTRED, "SignalDur %d", __Gen.iSignalDuration);
val_out(XT0, YT3, LIGHTRED, "PostSilenceDur %d", __Gen.iPostSilenceDuration);
val_out(XT2, YT1, LIGHTCYAN, "MaxDev %6.2f", __Gen.fFreqDevMax);
val_out(XT2, YT2, LIGHTCYAN, "freqSteps %d", __Gen.iFreqSteps);
val_out(XT2, YT3, LIGHTCYAN, "SameMax %d", __Gen.iSameCntrMax);
val_out(XT2, YT4, LIGHTCYAN, "ToneCntr %d", __Gen.iToneCntr);
val_out(XT2, YT5, LIGHTCYAN, "ToneInc %d", __Gen.iToneInc);
val_out(XT4, YT1, WHITE, "dbg file: %p", __Control.pDbgFile);
val_out(XT4, YT2, WHITE, "in file : %p", __Control.pInFile);
val_out(XT4, YT3, WHITE, "out file: %p", __Control.pOutFile);
val_out(XT6, YT1, LIGHTGREEN, "RxHi %d", __Gen.iRxHiLevel);
val_out(XT6, YT2, LIGHTGREEN, "RxLo %d", __Gen.iRxLoLevel);
val_out(XT6, YT3, LIGHTGREEN, "RxNo %d", __Gen.iRxNoise);
val_out(XT6, YT4, LIGHTGREEN, "Dial %d", __Gen.iDialLevel);
}
/*-------------------------------------------------------------------------*/
void plt_x
/*-------------------------------------------------------------------------*/
(
int x,
int dx,
int y,
S16 *pData,
int Sz,
double Norm,
int color
)
{
set_color(color);
for (int k = 0; k < Sz; k++)
{
int d1 = int(pData[k-1]*Norm);
int d0 = int(pData[k-0]*Norm);
line(x, y-d1, x+dx, y-d0);
x+= dx;
}
}
double dbl(S16 in)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?