demo.cpp
来自「Express DSP compliant C55x DTMF detector」· C++ 代码 · 共 1,667 行 · 第 1/4 页
CPP
1,667 行
{
double en = in/170.1;
if (en < YEDBMIN) en = YEDBMIN;
if (en > YEDBMAX) en = YEDBMAX;
return en;
}
/*-------------------------------------------------------------------------*/
void plot_results
/*-------------------------------------------------------------------------*/
(
)
{
DTMF_tDb *pDb = &__DtmfDb;
DTMF_tSc *pSc = &__DtmfSc;
int k;
int iLo = (pSc->sDigit&0x3)>>0;
int iHi = (pSc->sDigit&0xc)>>2;
double afNew[10];
int x;
int clr;
static int sOldState = 0;
int iStateChange = 0;
if (pDb->v.sState != sOldState)
{
sOldState = pDb->v.sState;
iStateChange = TRUE;
}
/* plot curr packet */
if ((__Control.iGmode & 0x1) == 0)
{
double Norm = YIA/(double(__Gen.iRxLoLevel+__Gen.iRxHiLevel+__Gen.iDialLevel+1)*4);
// double Norm = 0.5*YIA/8159.0;
S16 aData[DTMF_DFR_SZ+1];
x = X0 + (__Frame%IFR_MAX) * STD_FR_SZ;
// prepare
bar(x+1, YI-YIA-2, x+STD_FR_SZ+STD_FR_SZ/2, YI+YIA+2);
cline(x+STD_FR_SZ+1, YI-YIA, x+STD_FR_SZ+1, YI+YIA, LIGHTRED);
cline(x+STD_FR_SZ,YI-YIA,x+STD_FR_SZ, YI+YIA, LIGHTGRAY);
cline(x, YI, x+STD_FR_SZ, YI, LIGHTGRAY);
cline(x, YI-YIA, x+STD_FR_SZ, YI-YIA, LIGHTGRAY);
cline(x, YI+YIA, x+STD_FR_SZ, YI+YIA, LIGHTGRAY);
cline(x, YI-YIA/2, x+STD_FR_SZ, YI-YIA/2, LIGHTGRAY);
cline(x, YI+YIA/2, x+STD_FR_SZ, YI+YIA/2, LIGHTGRAY);
// draw
for (k=0; k< 5;k++) aData[k]=pSc->asLoData[DTMF_LOSD_SZ+2*k-2];
plt_x(x, 10, YI+YIA/4, &aData[1], DTMF_DFR_SZ, Norm, RED);
for (k=0; k< 5;k++) aData[k]=pSc->asLoData[DTMF_LOSD_SZ+2*k-1];
plt_x(x, 10, YI+YIA/4, &aData[1], DTMF_DFR_SZ, Norm, LIGHTRED);
for (k=0; k< 5;k++) aData[k]=pSc->asHiData[DTMF_HISD_SZ+2*k-2];
plt_x(x, 10, YI-YIA/4, &aData[1], DTMF_DFR_SZ, Norm, BLUE);
for (k=0; k< 5;k++) aData[k]=pSc->asHiData[DTMF_HISD_SZ+2*k-1];
plt_x(x, 10, YI-YIA/4, &aData[1], DTMF_DFR_SZ, Norm, LIGHTBLUE);
// the newest data, this is RxIn
plt_x(x, 1, YI+YIA/2, &pSc->as2kData[DTMF_2KFLT_SZ-1],STD_FR_SZ,Norm, WHITE);
plt_x(x, 2, YI-YIA/2, &pSc->asBpData[DTMF_BPFLT_SZ-1],STD_FR_SZ/2,Norm, GREEN);
if (pDb->v.sState > 1) // switched to TONE, gave early ind out.
{
cline(x, YI, x+STD_FR_SZ, YI, YELLOW);
}
#if 0 /* it is ok */
if (__Control.pOutFile != NULL)
{
int k;
for(k = 0; k < STD_FR_SZ/2; k++)
fprintf(__Control.pOutFile, "%d\n",pSc->asBpData[DTMF_BPFLT_SZ+k]);
}
#endif
}
x = X0 + (__Frame % EDFR_MAX)*DX;
/* plot Energy for current Packet */
if ((__Control.iGmode & 0x2) == 0)
{
static int _aiLast[11];
int t;
// prepare for drawing
/* row 5 --------------------------------------------- */
bar(XT0, YT5, XTM, YT5+YTD);
bar(XE1, YE0-YEDBMAX*DBE2PX, XE1+100, YE0-YEDBMIN*DBE2PX);
bar(x+1, YE0-YEDBMAX*DBE2PX, x+4*DX, YE0-YEDBMIN*DBE2PX);
cline(x+DX+1, YE0-YEDBMAX*DBE2PX, x+DX+1, YE0 - YEDBMIN*DBE2PX, LIGHTRED);
if (iStateChange)
cline(x,YE0-YEDBMAX*DBE2PX, x, YE0 - YEDBMIN*DBE2PX, DARKGRAY);
set_color(DARKGRAY);
for (k = 0; k < -YEDBMIN/10+1; k++)
{
line(x+1, YE0+DBE2PX*10*k, x+DX, YE0+DBE2PX*10*k);
line(XE1, YE0+DBE2PX*10*k, XE1+100, YE0+DBE2PX*10*k);
}
// set data arrays and draw
afNew[0] = dbl(pSc->sLoBpEn);
afNew[1] = dbl(pSc->sHiBpEn);
for (k = 0; k < 4; k++)
{
afNew[k+2] = dbl(pSc->asLoMainEn[k]);
val_out(XT0+k*XTD, YT5, __aiColor[k+2], "%d: %6.1f", __asFlo[k], afNew[k+2]);
afNew[k+6] = dbl(pSc->asHiMainEn[k]);
val_out(XT0+(k+4)*XTD, YT5, __aiColor[k+6], "%d: %6.1f", __asFhi[k], afNew[k+6]);
}
{
static int _iLast = 0;
t = int(dbl(dtmf_en2log(pDb->v.slFrameEn))*DBE2PX);
cline(x, YE0-_iLast, x+DX, YE0-t, LIGHTGRAY);
_iLast = t;
}
{
static int _iLast = 0;
t = int(dbl(DBG_sFrameEn)*DBE2PX);
cline(x, YE0-_iLast, x+DX, YE0-t, WHITE);
_iLast = t;
}
{
static int _iLast = 0;
// int t = int(dbl(dtmf_en2log(DBG_slDialEn))*DBE2PX);
int t = int(dbl(pSc->sSumDialEn)*DBE2PX);
cline(x, YE0-_iLast, x+DX, YE0-t, LIGHTGREEN);
_iLast = t;
}
{
static int _iLast = 0;
int t = int(dbl(dtmf_en2log(DBG_slDialEn))*DBE2PX);
// int t = int(dbl(pSc->sSumDialEn)*DBE2PX);
cline(x, YE0-_iLast, x+DX, YE0-t, GREEN);
_iLast = t;
}
for (k = 0; k < 10; k++)
{
t = int(afNew[k]*DBE2PX);
cline(x, YE0-_aiLast[k], x+DX, YE0-t, __aiColor[k]);
cline(XE1+k*10, YE0-t, XE1+k*10, YE0-YEDBMIN*DBE2PX, __aiColor[k]);
cline(XE1+k*10+1, YE0-t, XE1+k*10+1, YE0-YEDBMIN*DBE2PX, __aiColor[k]);
cline(XE1+k*10+2, YE0-t, XE1+k*10+2, YE0-YEDBMIN*DBE2PX, __aiColor[k]);
_aiLast[k] = t;
}
}
if ((__Control.iGmode & 0x4) == 0)
{
#define DM5 (4)
#define DM3 (3)
// prepare for drawing
/* row 6 --------------------------------------------- */
bar(XT0, YT6, XTM, YT6+YTD);
bar(XE1, YD0-DBD2PX*DM5-2, XE1+100, YD0+DBD2PX*DM5+2);
bar(x+1,YD0-DBD2PX*DM5-2,x+DX*4,YD0+DBD2PX*DM5+2);
cline(x+DX+1,YD0-DBD2PX*DM5-2,x+DX+1,YD0+DBD2PX*DM5+2, LIGHTRED);
if (iStateChange)
cline(x, YD0-DBD2PX*DM5, x, YD0+DBD2PX*DM5, DARKGRAY);
/* .aPM is: M MM P PP */
static int _aiLast[10];
afNew[0] = afNew[2+iLo];
afNew[1] = afNew[6+iHi];
afNew[2]=dbl(pSc->asLoDevEn[1]) - dbl(pSc->asLoDevEn[0]);
afNew[3]=afNew[0]-dbl(pSc->asLoDevEn[1]);
afNew[4]=afNew[0]-dbl(pSc->asLoDevEn[2]);
afNew[5]=dbl(pSc->asLoDevEn[2]) - dbl(pSc->asLoDevEn[3]);
afNew[6]=dbl(pSc->asHiDevEn[1]) - dbl(pSc->asHiDevEn[0]);
afNew[7]=afNew[1]-dbl(pSc->asHiDevEn[1]);
afNew[8]=afNew[1]-dbl(pSc->asHiDevEn[2]);
afNew[9]=dbl(pSc->asHiDevEn[2]) - dbl(pSc->asHiDevEn[3]);
set_color(DARKGRAY);
for (k=0; k < DM5+1;k++)
{
line (x+1,YD0-DBD2PX*k, x+DX, YD0-DBD2PX*k);
line (x+1,YD0+DBD2PX*k, x+DX, YD0+DBD2PX*k);
line (XE1,YD0-DBD2PX*k, XE1+100, YD0-DBD2PX*k);
line (XE1,YD0+DBD2PX*k, XE1+100, YD0+DBD2PX*k);
}
// draw and text
for (k = 0; k < 4; k++)
{
int t;
t = int(afNew[2+k]*DBD2PX);
if (t < -DM3*DBD2PX) t=-DM3*DBD2PX;
if (t > DM3*DBD2PX) t= DM3*DBD2PX;
// if (k == 0 || k == 3) cline(x, YD0+DBD2PX-_aiLast[k+2], x+DX, YD0+DBD2PX-t, __aiColor[k+2]);
_aiLast[k+2] = t;
val_out(XT0 + XTD*k, YT6, __aiColor[k+2], "LoD%d %6.2f", k+1, afNew[k+2]);
t = int(afNew[6+k]*DBD2PX);
if (t < -DM3*DBD2PX) t=-DM3*DBD2PX;
if (t > DM3*DBD2PX) t= DM3*DBD2PX;
// if (k == 0 || k == 3) cline(x, YD0-DBD2PX-_aiLast[k+6], x+DX, YD0-DBD2PX-t, __aiColor[k+6]);
_aiLast[k+6] = t;
val_out(XT0 + XTD*(k+4), YT6, __aiColor[k+6], "HiD%d %6.2f", k+1, afNew[k+6]);
}
{
static int _iLast = 0;
int t = int((pSc->sLoFreqDev/170.)*DBD2PX);
if (t < -DM5*DBD2PX) t=-DM5*DBD2PX;
if (t > DM5*DBD2PX) t= DM5*DBD2PX;
cline(x, YD0-_iLast, x+DX, YD0-t, __aiColor[3]);
_iLast = t;
}
{
static int _iLast = 0;
int t = int((pSc->sHiFreqDev/170.)*DBD2PX);
if (t < -DM5*DBD2PX) t=-DM5*DBD2PX;
if (t > DM5*DBD2PX) t= DM5*DBD2PX;
cline(x, YD0-_iLast, x+DX, YD0-t, __aiColor[7]);
_iLast = t;
}
{
static int _iLast = 0;
int t = int((pDb->v.Stat.sLoFreqDev/170.)*DBD2PX);
if (t < -DM5*DBD2PX) t=-DM5*DBD2PX;
if (t > DM5*DBD2PX) t= DM5*DBD2PX;
cline(x, YD0-_iLast, x+DX, YD0-t, __aiColor[4]);
_iLast = t;
}
{
static int _iLast = 0;
int t = int((pDb->v.Stat.sHiFreqDev/170.)*DBD2PX);
if (t < -DM5*DBD2PX) t=-DM5*DBD2PX;
if (t > DM5*DBD2PX) t= DM5*DBD2PX;
cline(x, YD0-_iLast, x+DX, YD0-t, __aiColor[8]);
_iLast = t;
}
{
static int _iLast = 0;
// int t = int(((pSc->Hi.sMaxFreqEnLog - pSc->Lo.sMaxFreqEnLog)/170.1)*DBD2PX*0.5);
int t = int(((pSc->sHiBpEn-pSc->sLoBpEn)/170.1)*DBD2PX*0.5);
if (t < -DM5*DBD2PX) t=-DM5*DBD2PX;
if (t > DM5*DBD2PX) t= DM5*DBD2PX;
cline(x, YD0-_iLast, x+DX, YD0-t, WHITE);
_iLast = t;
}
afNew[2]=afNew[0]-dbl(pSc->asLoDevEn[0]);
afNew[3]=afNew[0]-dbl(pSc->asLoDevEn[1]);
afNew[4]=afNew[0]-dbl(pSc->asLoDevEn[2]);
afNew[5]=afNew[0]-dbl(pSc->asLoDevEn[3]);
afNew[6]=afNew[1]-dbl(pSc->asHiDevEn[0]);
afNew[7]=afNew[1]-dbl(pSc->asHiDevEn[1]);
afNew[8]=afNew[1]-dbl(pSc->asHiDevEn[2]);
afNew[9]=afNew[1]-dbl(pSc->asHiDevEn[3]);
for (k =0; k < 4; k++)
{
int t;
t = int(afNew[2+k]*DBD2PX);
if (t < -DM5*DBD2PX) t=-DM5*DBD2PX;
if (t > DM5*DBD2PX) t= DM5*DBD2PX;
cline(XE1+10*k, YD0-t, XE1+10*k, YD0, __aiColor[k+2]);
cline(XE1+10*k+1, YD0-t, XE1+10*k+1,YD0, __aiColor[k+2]);
cline(XE1+10*k+2, YD0-t, XE1+10*k+2,YD0, __aiColor[k+2]);
t = int(afNew[6+k]*DBD2PX);
if (t < -DM5*DBD2PX) t=-DM5*DBD2PX;
if (t > DM5*DBD2PX) t= DM5*DBD2PX;
cline(XE1+10*k+50, YD0-t, XE1+10*k+50, YD0, __aiColor[k+6]);
cline(XE1+10*k+50+1, YD0-t, XE1+10*k+50+1,YD0, __aiColor[k+6]);
cline(XE1+10*k+50+2, YD0-t, XE1+10*k+50+2,YD0, __aiColor[k+6]);
}
}
if ((__Control.iGmode & 0x8) == 0)
{
#define plt_s(n)\
cline(x,YS0+(n)*4,x+DX,YS0+(n)*4,clr);\
cline(x,YS0+(n)*4+1,x+DX,YS0+(n)*4+1,clr)
#define plt_ss(n)\
cline(x,YS0+(n)*4+1,x+DX,YS0+(n)*4+1,clr);
// prepare
bar(x+1,YS0,x+DX*4,YS0+80);
cline(x+DX+1, YS0, x+DX+1, YS0+80, LIGHTRED);
// draw
if (iStateChange)
cline(x, YS0, x, YS0+80, DARKGRAY);
if(pSc->sTestFailed & 0x0001) clr=BLACK; else clr=LIGHTCYAN; plt_s(0);
if(pSc->sTestFailed & 0x0002) clr=BLACK; else clr=CYAN; plt_s(1);
if(pSc->sTestFailed & 0x0004) clr=BLACK; else clr=LIGHTGREEN; plt_s(2);
if(pSc->sTestFailed & 0x0008) clr=BLACK; else clr=GREEN; plt_s(3);
clr=DARKGRAY; plt_ss(4);
if(pSc->sTestFailed & 0x0010) clr=BLACK; else clr=CYAN; plt_s(5);
if(pSc->sTestFailed & 0x0020) clr=BLACK; else clr=WHITE; plt_s(6);
if(pSc->sTestFailed & 0x0040) clr=BLACK; else clr=YELLOW; plt_s(7);
if(pSc->sTestFailed & 0x0080) clr=BLACK; else clr=LIGHTMAGENTA;plt_s(8);
clr=DARKGRAY; plt_ss(9);
if(pSc->sTestFailed & 0x0100) clr=BLACK; else clr=RED; plt_s(10);
if(pSc->sTestFailed & 0x0200) clr=BLACK; else clr=LIGHTRED; plt_s(11);
if(pSc->sTestFailed & 0x0400) clr=BLACK; else clr=YELLOW; plt_s(12);
if(pSc->sTestFailed & 0x0800) clr=BLACK; else clr=LIGHTGREEN; plt_s(13);
clr=DARKGRAY; plt_ss(14);
if(pSc->sTestFailed & 0x1000) clr=BLACK; else clr=BLUE; plt_s(15);
if(pSc->sTestFailed & 0x2000) clr=BLACK; else clr=LIGHTBLUE; plt_s(16);
if(pSc->sTestFailed & 0x4000) clr=BLACK; else clr=LIGHTCYAN; plt_s(17);
{
switch(pDb->v.sState)
{
case 0:clr=BLACK;break;
case 1:clr=LIGHTBLUE;break;
case 2:clr=WHITE;break;
case 3:clr=LIGHTGREEN;break;
case 4:clr=LIGHTCYAN;break;
case 5:clr=LIGHTRED;break;
default:clr=RED;break;
}
plt_s(18);
}
clr=DARKGRAY; plt_ss(19);
}
/* row 0 --------------------------------------------- */
{
#define CNTR_MAX (1000)
int run = 0;
static int cntr = 0;
static double _dSpeed = 0;
static unsigned long _ulTime = 0;
if (__Frame % CNTR_MAX == 0)
{
unsigned long ulTime = timeGetTime();
_dSpeed = (6.0*CNTR_MAX)/(ulTime - _ulTime);
_ulTime = ulTime;
}
if (__Control.iGmode & 0x10)
{
if (cntr == CNTR_MAX)
{
cntr = 0;
run = 1;
}
else
{
run = 0;
cntr++;
}
}
else
{
run = 1;
}
if (run)
{
bar(XT0, YT0, XTM, YT0+YTD);
val_out(XT0, YT0, GREEN, "Frame %ld", __Frame);
val_out(XT1, YT0, GREEN, "Time,s %6.2f", __Frame*0.005);
val_out(XT2, YT0, GREEN, "Speed %8.2f", _dSpeed);
val_out(XT3, YT0, BROWN, "catch %5d", __Control.iCatchCntr);
val_out(XT4, YT0, LIGHTRED, "GLo[%d]%d", __Gen.iLo, __asFlo[__Gen.iLo]);
val_out(XT5, YT0, LIGHTBLUE, "GHi[%d]%d", __Gen.iHi, __asFhi[__Gen.iHi]);
#if 0
val_out(XT6, YT0, RED, "GLoF %6.2f%%", 100.*__Gen.fLoDev);
val_out(XT7, YT0, BLUE, "GHiF %6.2f%%", 100.*__Gen.fHiDev);
val_out(XT8, YT0, WHITE, "Hits %d", __Stat.sEarlyOn);
#else
val_out(XT6, YT0, WHITE, "early %d", __Stat.sEarlyOn);
val_out(XT7, YT0, WHITE, "start %d", __Stat.sStart);
val_out(XT8, YT0, WHITE, "end %d", __Stat.sEnd);
#endif
}
}
if ((__Control.iGmode & 0x10) == 0)
{
/* row 1 --------------------------------------------- */
bar(XT0, YT1, XTM, YT1+YTD);
{
val_out(XT0, YT1, LIGHTGREEN, "DState %d", pDb->v.sState);
val_out(XT1, YT1, LIGHTCYAN, "DSts %x", pSc->sTestFailed);
/* update low freq component */
if((pSc->sTestFailed & 0x7ff5)==0)
{
val_out(XT2,YT1, LIGHTRED,"DTone %c[%1d%1d]",
__aaDtmfTable[iLo][iHi], iLo, iHi);
}
else
{
val_out(XT2,YT1,RED, "DTone X[%1d%1d]", iLo, iHi);
}
val_out(XT3, YT1, BLUE, "DGood %d", pDb->v.sGood);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?