⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demo.cpp

📁 The line echo canceller (LEC) is designed to provide the maximum attainable transparent voice qualit
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			    Rc  = 1;
		    } /* end-of-if */
            else
            {
				if (_Control.fBypass > 0)
				{
					for (long i = 0; i < _Control.fBypass * 8000; i++)
					{
						S16 x;
                        fscanf(_Control.pInTxFile, "%d", &x);
						if (i%8000 == 0)
						{
							val_out(0,0, WHITE, "second %ld   ", (i+1)/8000);
						}
					}
				}

            }
	    }
        else if (str_cmp("TX_BIN", &pArg) == 0)
	    {
		    _Control.pInTxBin = fopen(pArg+1, "rb");
		    if ( _Control.pInTxBin == NULL )
		    {
			    Rc  = 1;
		    } /* end-of-if */
            else
            {
                long i;
                S16 x;
                for (i = 0; i < sizeof(tWavHdr)/sizeof(x); i++)
                {
                    fread(&x,sizeof(x),1,_Control.pInTxBin); 
                }
				if (_Control.fBypass > 0)
				{
					for (i = 0; i < _Control.fBypass * 8000; i++)
					{
                        fread(&x,sizeof(x),1,_Control.pInTxBin); 
						if (i%8000 == 0)
						{
							val_out(0,0, WHITE, "second %ld   ", (i+1)/8000);
						}
					}
				}

            }
	    }
        else if (str_cmp("RX_BIN", &pArg) == 0)
	    {
		    _Control.pInRxBin = fopen(pArg+1, "rb");
		    if ( _Control.pInRxBin == NULL )
		    {
			    Rc  = 1;
		    } /* end-of-if */
            else
            {
                long i;
                S16 x;
                for (i = 0; i < sizeof(tWavHdr)/sizeof(x); i++)
                {
                    fread(&x,sizeof(x),1,_Control.pInRxBin); 
                }
				if (_Control.fBypass > 0)
				{
					for (i = 0; i < _Control.fBypass * 8000; i++)
					{
                        fread(&x,sizeof(x),1,_Control.pInRxBin); 
					}
				}

            }
	    }
        else if (str_cmp("ECHO_FILE", &pArg) == 0)
	    {
			FILE *pFile = fopen(pArg+1, "r");
			if ( pFile == NULL )
			{
				Rc = 10;
			}
			else
			{
				int i;
				for (i = 0; i < ECHO_SZ; i++)
				{
					if (fscanf(pFile, "%f", &fTmp) == 1)
                    {
                        _afEcho[i] = fTmp;
                    }
                    else
                    {
                        break;
                    }
				}
				fclose(pFile);
			} /* end-of-if */

        }
        else if (str_cmp("REPLACE_RX", &pArg) == 0)
	    {
		    if (sscanf(pArg, "%d", &iTmp) != 1)
		    {
                Rc = 2;
		    }
            else
            {
                _Control.iReplaceRx = iTmp;
            }
        }
        else if (str_cmp("ADD_REFLECTIONS", &pArg) == 0)
	    {
		    if (sscanf(pArg, "%d", &iTmp) != 1)
		    {
                Rc = 2;
		    }
            else
            {
                _Control.iAddReflections = iTmp;
            }
        }
        else if (str_cmp("TX_CORR", &pArg) == 0)
	    {
		    if (sscanf(pArg, "%f", &fTmp) != 1)
		    {
                Rc = 2;
		    }
            else
            {
                _Control.fTxCorr = pow(10., fTmp/20.);
            }
        }
        else if (str_cmp("RX_CORR", &pArg) == 0)
	    {
		    if (sscanf(pArg, "%f", &fTmp) != 1)
		    {
                Rc = 2;
		    }
            else
            {
                _Control.fRxCorr = pow(10., fTmp/20.);
            }
        }
        else if (str_cmp("TX_DELAY", &pArg) == 0)
	    {
			if (sscanf(pArg, "%f", &fTmp) != 1)
			{
				Rc = 2;
			}
			else
			{
				_Control.iTxDelay = int(fTmp*8 + 0.5);
			}
        }
        else if (str_cmp("GTXSIGNAL", &pArg) == 0)
	    {
			if (sscanf(pArg, "%f", &fTmp) != 1)
			{
				Rc = 2;
			}
			else
			{
				_Gen.fTxLevel = LEV0 * pow (10.0, fTmp/20.0);
			}
        }
        else if (str_cmp("GTXNOISE", &pArg) == 0)
	    {
			if (sscanf(pArg, "%f", &fTmp) != 1)
			{
				Rc = 2;
			}
			else
			{
				_Gen.fTxNoise = LEV0 * pow (10.0, fTmp/20.0);
			}
        }
        else if (str_cmp("RX_DELAY", &pArg) == 0)
	    {
			if (sscanf(pArg, "%f", &fTmp) != 1)
			{
				Rc = 2;
			}
			else
			{
				_Control.iRxDelay = int(fTmp*8 + 0.5);
			}
        }
        else if (str_cmp("GRXSIGNAL", &pArg) == 0)
	    {
			if (sscanf(pArg, "%f", &fTmp) != 1)
			{
				Rc = 2;
			}
			else
			{
				_Gen.fRxLevel = LEV0 * pow (10.0, fTmp/20.0);
			}
        }
        else if (str_cmp("GRXNOISE", &pArg) == 0)
	    {
			if (sscanf(pArg, "%f", &fTmp) != 1)
			{
				Rc = 2;
			}
			else
			{
				_Gen.fRxNoise = LEV0 * pow (10.0, fTmp/20.0);
			}
        }
        else if (str_cmp("GWORDLEN", &pArg) == 0)
	    {
			if (sscanf(pArg, "%f", &fTmp) != 1)
			{
				Rc = 2;
			}
			else
			{
				_Gen.fWordLen = fTmp;
			}
        }
        else if (str_cmp("GPAUSELEN", &pArg) == 0)
	    {
			if (sscanf(pArg, "%f", &fTmp) != 1)
			{
				Rc = 2;
			}
			else
			{
				_Gen.fPauseLen = fTmp;
			}
        }
        else if (str_cmp("GSENTENCELEN", &pArg) == 0)
	    {
			if (sscanf(pArg, "%f", &fTmp) != 1)
			{
				Rc = 2;
			}
			else
			{
				_Gen.liSentenceLen = long(fTmp);
			}
        }
        else if (str_cmp("GSTATE", &pArg) == 0)
	    {
			if (sscanf(pArg, "%d", &iTmp) != 1)
			{
				Rc = 2;
			}
			else
			{
				_Gen.iState = iTmp;
			}
        }
        else if (str_cmp("GDOUBLETALK", &pArg) == 0)
	    {
			if (sscanf(pArg, "%f", &fTmp) != 1)
			{
				Rc = 2;
			}
			else
			{
				_Gen.fDoubleTalk = fTmp;
			}
        }
        else
	    {
		    Rc = 3;
	    }
    } /* end of if */
    else
    {
        // that's a comment
    }
    return Rc;
}

/*-------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------*/

/*                  O U T P U T                                            */

/*-------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------*/

/* ------------------------------------------------------------------- */
void                    _dump_vars
/* ------------------------------------------------------------------- */
(
)
{
    fprintf(_Control.pTmpFile, "%f %f %f %f %f %f\n", 
        _LecSc.sTxEn/170.1,
        _LecSc.sRxEn/170.1,
        _LecDb.VadErr.sEn/170.1,
        lec_en2log(lec_pkt_energy(_asRxOut))/170.1,
        _LecSc.sErle/170.1,
        -(_LecDb.Adf2.sMSE/170.1)
        );
}

/* ------------------------------------------------------------------- */
void                    _dump_out
/* ------------------------------------------------------------------- */
(
)
{
    static S16 aTmp[ILEC_FR_SZ];

    S16 k;
    for (k = 0; k < ILEC_FR_SZ; k++) 
    {
        aTmp[k] = _asRxOut[k] << 2;
    }

    fwrite(aTmp, sizeof(S16), ILEC_FR_SZ, _Control.pPcmFile);
}

/* ------------------------------------------------------------------- */
void                    _dump_wav
/* ------------------------------------------------------------------- */
(
)
{
    static S16 aTmp[ILEC_FR_SZ];
    S16 k;

    for (k = 0; k < ILEC_FR_SZ; k++) aTmp[k] = _asRxOut[k] << 2;
    fwrite(aTmp, sizeof(S16), ILEC_FR_SZ, _Control.pNlpWavFile);

    for (k = 0; k < ILEC_FR_SZ; k++) aTmp[k] = _asRxIn[k] << 2;
    fwrite(aTmp, sizeof(S16), ILEC_FR_SZ, _Control.pRxWavFile);

    for (k = 0; k < ILEC_FR_SZ; k++) aTmp[k] = _asTx[k] << 2;
    fwrite(aTmp, sizeof(S16), ILEC_FR_SZ, _Control.pTxWavFile);

    for (k = 0; k < ILEC_FR_SZ; k++) aTmp[k] = _asCnl[k] << 2;
    fwrite(aTmp, sizeof(S16), ILEC_FR_SZ, _Control.pCnlWavFile);

    _WavHdr.ulLen1 += 80;
    _WavHdr.ulLen3 += 80;
}

/* ------------------------------------------------------------------- */
void                    _dump_filters
/* ------------------------------------------------------------------- */
(
)
{
	rewind(_Control.pAdfFile);
//	if (_Frame % 100 == 0)
	if (_Frame % (1000/5) == 0)
	{
//        double fDiv = double(1<<_LecDb.Adf1.sShift);
        double fDiv = double(1<<_LecDb.Adf2.sShift);

//		fprintf(gControl.pDbgFile, "\n--- frame %ld\n", Frame);
		for(int i = 0; i < ADF_SZ; i++)
		{
				fprintf(_Control.pAdfFile,"%+07.5f\n",
//                    _LecDb.psFlt1[i+ILEC_FR_SZ]/32767.0/fDiv);
                    _LecDb.asAdf2[i+ILEC_FR_SZ]/32767.0/fDiv);
		}
	}
}

/* ------------------------------------------------------------------- */
int                         plot_out
/* ------------------------------------------------------------------- */
(
S16 *p,
int size,
int x,
int y,
int amp,
char *pTitle,
int color
)
{
	int iMax = 0;
	int t;
	double f;

	for(int k=0; k < size; k++)
	{
		t = abs(p[k]); 
		if(t > iMax) iMax = t;
	}
	bar(x, y-amp, x+size, y+amp+10);
    cline(x, y,x+size, y, color);

	val_out(x, y+amp, color, "%s %-6d", pTitle, iMax);

	set_color(DARKGRAY);
	for (k = 0; k <= (size+1)/ILEC_FR_SZ; k++)
	{
		line(k*ILEC_FR_SZ+x,y-amp,k*ILEC_FR_SZ+x,y+amp);
	}

	set_color(color);

	f = amp /((double(iMax) + EPS));

	if (iMax > 0)
	{
		for (k = 0; k < size; k++)
		{
			t = (int)(f * p[k]);
            line(k+x, y, k+x, y-t);
		}
	}

	return iMax;
}

/* ------------------------------------------------------------------- */
int                         plot_out32
/* ------------------------------------------------------------------- */
(
S32 *p,
int size,
int x,
int y,
int amp,
char *pTitle,
int color
)
{
	S32 iMax = 0;
	S32 t;
	double f;

	for(int k=0; k < size; k++)
	{
		t = abs(p[k]); 
		if(t > iMax) iMax = t;
	}
	bar(x, y-amp, x+size, y+amp+10);

	val_out(x, y+amp, color, "%s %-6ld", pTitle, iMax);

	set_color(DARKGRAY);
	for (k = 0; k <= (size+1)/ILEC_FR_SZ; k++)
	{
		line(k*ILEC_FR_SZ+x,y-amp,k*ILEC_FR_SZ+x,y+amp);
	}

	set_color(color);

	f = amp /((double(iMax) + EPS));

	if (iMax > 0)
	{
		for (k = 0; k < size; k++)
		{
			t = (int)(f * p[k]);
            line(k+x, y, k+x, y-t);
		}
	}

	return iMax;
}

/* ------------------------------------------------------------------- */
void                    graphic_init
/* ------------------------------------------------------------------- */
(
int Err
)
{

	int k;
	float fMax = 0.0;
	float fReflection = 0;

	set_color(WHITE);

	line(X0, YG, XM, YG);

	for (k = 0; k < 9; k++)
	{
		int y = int(YG+(YV/(YDBMAX-YDBMIN))*(10*k+YDBMAX));
		val_out(0, y-8, BROWN, "%d", -k*10);
		cline(X0, y, XM, y, DARKGRAY);
	}

	for (k = 0; k < 6; k++)
	{
		int y = int(YGH+(YVH/(YDHMAX-YDHMIN))*(10*k+YDHMAX));
		val_out(0, y-8, BROWN, "%d", -k*10);
		cline(X0, y, XM, y, DARKGRAY);
	}

    for (k = 1; k < 12; k++)
    {
        val_out(X0+50*k-20, YG+YV+5, DARKGRAY, "%5.2f", k*0.25);
		cline(X0+50*k, YG+YV, X0+50*k, YG+YV+10, LIGHTGRAY);
    }

	for (k = 0; k < ECHO_SZ; k++)
	{
		if(fabs(_afEcho[k]) > fMax)
		{
			fMax = float(fabs(_afEcho[k]));
		}
		fReflection += _afEcho[k]*_afEcho[k];
	}
    _fReflection = fReflection;

	val_out(XADF, 0, RED, "ERL %5.2f", -10.0*log10(fReflection+EPS));


	for(k = 0; k < ECHO_SZ; k++)

⌨️ 快捷键说明

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