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