main.c
来自「The line echo canceller (LEC) is designe」· C语言 代码 · 共 766 行 · 第 1/2 页
C
766 行
#include "leci.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "ilec.c"
#include "splec.h"
#include "spbpf.h"
#define DBG_IT (35)
S16 asTx[ILEC_FR_SZ];
S16 asRxC[ILEC_FR_SZ];
S16 asRxA[ILEC_FR_SZ];
S16 aS[ILEC_FR_SZ*2];
S16 aC[ILEC_FR_SZ*2];
LEC_MIKET_tStts SttsC;
LEC_MIKET_tStts SttsA;
#pragma DATA_SECTION(asHstC, ".lecb")
#pragma DATA_SECTION(asHstA, ".lecb")
S16 asHstC[LEC_HST_SZ*2];
S16 asHstA[LEC_HST_SZ*2];
LEC_tDb LecDbA, LecDbC;
LEC_tSc LecScA, LecScC;
SPBPF_tDb BpfDbA, BpfDbC;
SPBPF_tSc BpfScA, BpfScC;
volatile S16 sErr = 0;
volatile S32 slA, slC;
volatile S16 sA, sC;
volatile S32 slCntr = 0;
volatile S16 k;
S16 asErrPosDb[8];
S16 asErrPosSc[32];
S16 sErrPos;
// stubs
SPLEC_tDb SPLEC_aDb[1];
SPLEC_tHst SPLEC_aHst[1];
U16 SP_uInstCur;
U16 SP_uInstMax;
void *SP_pScratch;
SPIF_tLog *SP_pLog;
void SPIFcbLog(const SPIF_tLog *SP_pLog){}
/*-------------------------------------------------------------------------*/
void fill_rand
/*-------------------------------------------------------------------------*/
(
S16 *pTo,
S16 sSz,
S16 sLevel
)
{
S16 s;
for (s = 0; s < sSz; s++)
{
S16 x = rand() - (RAND_MAX/2);
x = (S16)((x * (S32)sLevel)>>14); /* /RAND_MAX = 32767 */
pTo[s] = x;
}
}
/*-------------------------------------------------------------------------*/
void fill_cnt
/*-------------------------------------------------------------------------*/
(
S16 *pTo,
S16 sSz,
S16 sStart
)
{
S16 s;
S16 x = sStart;
for (s = 0; s < sSz; s++)
{
pTo[s] = x;
x += 0x100;
}
}
/*-------------------------------------------------------------------------*/
S16 compare
/*-------------------------------------------------------------------------*/
(
S16 *psIn,
S16 *psInC,
S16 sSz
)
{
S16 s;
S16 err = 0;
for (s = 0; s < sSz; s++)
{
if(psIn[s] != psInC[s]) {
err++;
sErrPos = s;
}
}
return err;
}
/*-------------------------------------------------------------------------*/
S16 compare_db
/*-------------------------------------------------------------------------*/
(
)
{
S16 *psC = (S16 *)&LecDbC;
S16 *psA = (S16 *)&LecDbA;
S16 s;
S16 err = 0;
for (s = 0; s < 8; s++)asErrPosDb[s] = 0;
for (s = 2; s < sizeof(LecDbC); s++)
{
if(psA[s] != psC[s])
{
err++;
if (err < 8)
{
asErrPosDb[err] = s;
}
asErrPosDb[0] = err;
}
}
return err;
}
/*-------------------------------------------------------------------------*/
S16 compare_sc
/*-------------------------------------------------------------------------*/
(
)
{
S16 *psC = (S16 *)&LecScC;
S16 *psA = (S16 *)&LecScA;
S16 s;
S16 err = 0;
for (s = 0; s < 32; s++)asErrPosSc[s] = 0;
/* last is ptr, which is different */
/* all structures are long-word aligned */
for (s = 2; s < sizeof(LecScC); s++)
{
if(psA[s] != psC[s])
{
err++;
if (err < 32)
{
asErrPosSc[err] = s;
}
asErrPosSc[0] = err;
}
}
return err;
}
void main ()
{
memset(&LecDbA, 0, sizeof(LecDbA));
memset(&LecDbC, 0, sizeof(LecDbC));
memset(&LecScA, 0, sizeof(LecScA));
memset(&LecScC, 0, sizeof(LecScC));
LecScA.psRx = asRxA;
LecScC.psRx = asRxC;
LecScA.psTx = asTx;
LecScC.psTx = asTx;
LecDbA.psHst = asHstA;
LecDbC.psHst = asHstC;
LecDbA.psTxF = asHstA+LEC_HST_SZ;
LecDbC.psTxF = asHstC+LEC_HST_SZ;
sErr = 0;
#if (DBG_IT == 0)
{
if (sizeof(SPLEC_tDb) != sizeof(LEC_tDb))
{
exit(1);
}
if (sizeof(SPLEC_tSc) != sizeof(LEC_tSc))
{
exit(1);
}
}
#elif (DBG_IT == 1)
fill_rand(BpfDbC.asSav, SPBPF_SSZ, 3333);
memcpy(BpfDbA.asSav, BpfDbC.asSav, SPBPF_SSZ);
for (k = 0; k < 100; k++)
{
fill_rand(asRxC, ILEC_FR_SZ, 4444);
// fill_cnt(LecDbC.asBandPassSav, LEC_BP_SSZ, 0x12);
// fill_cnt(asRxC, ILEC_FR_SZ, 0x34);
memcpy(asRxA, asRxC, ILEC_FR_SZ);
sp_bpfC(&BpfDbC, &BpfScC, asRxC);
sp_bpf (&BpfDbA, &BpfScA, asRxA);
sErr += compare((S16*)&BpfDbC, (S16*)&BpfDbA, sizeof(BpfDbA));
sErr += compare((S16*)&BpfScC, (S16*)&BpfScA, sizeof(BpfScA));
sErr += compare(asRxC, asRxA, ILEC_FR_SZ);
}
#elif (DBG_IT == 2)
LecScC.asRk[0] = 32767;
LecScC.asRk[1] = 25000;
LecScC.asRk[2] = 20000;
LecScC.asRk[3] = 10000;
LecScC.asRk[4] = 5000;
LecScC.asRk[5] = 3000;
memcpy(LecScA.asRk, LecScC.asRk, 6);
LecScC.sJ0 = lec_durbinC(&LecDbC, &LecScC);
LecScA.sJ0 = lec_durbin (&LecDbA, &LecScA);
for (k = 0; k < 6; k++) LecScC.aslG[k] = LecScC.aslG[k]<<1;
sErr += compare_sc();
#elif (DBG_IT == 3)
LecScC.asRk[0] = 32767;
for (k = 0; k < 100; k++)
{
S16 i;
fill_rand(&LecScC.asRk[1], 5, 25000);
memcpy(LecScA.asRk, LecScC.asRk, 6);
LecScC.sJ0 = lec_durbinC(&LecDbC, &LecScC);
LecScA.sJ0 = lec_durbin (&LecDbA, &LecScA);
for (i = 0; i < 6; i++) LecScC.aslG[i] = LecScC.aslG[i]<<1;
sErr += compare_sc();
}
#elif (DBG_IT == 4)
{
LecScC.aslRk[0] = 2900000;
LecScC.aslRk[1] = 2500000;
LecScC.aslRk[2] = 2000000;
LecScC.aslRk[3] = 1000000;
LecScC.aslRk[4] = 500000;
LecScC.aslRk[5] = 300000;
memcpy(LecScA.aslRk, LecScC.aslRk, 2*6);
lec_normalise_rkC(&LecDbC, &LecScC, -4, (1<<4));
lec_normalise_rk (&LecDbA, &LecScA, -4, (1<<4));
sErr += compare_sc();
}
#elif (DBG_IT == 51)
for (k = 0; k < 100; k++)
{
fill_rand(asTx, ILEC_FR_SZ, 8000);
fill_rand(LecDbC.psHst, LEC_HST_SZ, 8000);
memcpy(LecDbA.psHst, LecDbC.psHst, LEC_HST_SZ);
lec_tx_momentsC(&LecDbC, &LecScC);
lec_tx_moments (&LecDbA, &LecScA);
sErr += compare_sc();
sErr += compare_db();
}
#elif (DBG_IT == 5)
for (k = 0; k < 100; k++)
{
fill_rand((S16*)LecDbC.aslRk, 12, 8000);
fill_rand((S16*)LecScC.aslRk, 12, 8000);
fill_rand((S16*)LecScC.aslRkTx, 12, 8000);
memcpy(LecDbA.aslRk,LecDbC.aslRk,12);
memcpy(LecScA.aslRk,LecScC.aslRk,12);
memcpy(LecScA.aslRkTx,LecScC.aslRkTx,12);
lec_gs_momentsC(&LecDbC, &LecScC);
lec_gs_moments (&LecDbA, &LecScA);
sErr += compare_sc();
sErr += compare_db();
}
#elif (DBG_IT == 6)
for (k = 0; k < 100; k++)
{
fill_rand(asHstC, LEC_HST_SZ*2, 8000);
memcpy(asHstA, asHstC, LEC_HST_SZ*2);
LecScC.asF[0] = 32767;
LecScC.asF[1] = -30000;
LecScC.asF[2] = 20000;
LecScC.asF[3] = -15000;
LecScC.asF[4] = 10000;
LecScC.asF[5] = -5000;
memcpy(LecScA.asF, LecScC.asF, 6);
lec_gs_filterC(&LecDbC, &LecScC);
lec_gs_filter (&LecDbA, &LecScA);
sErr += compare_sc();
sErr += compare(asHstC, asHstA, LEC_HST_SZ*2);
}
#elif (DBG_IT == 7)
for (k = 0; k < 100; k++)
{
fill_rand((S16*)LecDbC.aslRkSav, 12, 8000);
fill_rand((S16*)LecScC.aslRk, 12, 8000);
fill_rand((S16*)LecScC.aslRkTx, 12, 8000);
memcpy(LecDbA.aslRkSav,LecDbC.aslRkSav,12);
memcpy(LecScA.aslRk,LecScC.aslRk,12);
memcpy(LecScA.aslRkTx,LecScC.aslRkTx,12);
lec_ts_momentsC(&LecDbC, &LecScC);
lec_ts_moments (&LecDbA, &LecScA);
sErr += compare_sc();
sErr += compare_db();
}
#elif (DBG_IT == 8)
for (k = 0; k < 100; k++)
{
extern S16 _aasLpFilter[][6];
fill_rand(LecScC.asErr1, ILEC_FR_SZ, 8000);
fill_rand(LecDbC.asLpSav, 5, 8000);
memcpy(LecScA.asErr1, LecScC.asErr1, ILEC_FR_SZ);
memcpy(LecDbA.asLpSav, LecDbC.asLpSav, 5);
lec_lp_residual_errorC(&LecDbC, &LecScC, &_aasLpFilter[3][0]);
lec_lp_residual_error (&LecDbA, &LecScA, &_aasLpFilter[3][0]);
sErr += compare_sc();
sErr += compare_db();
}
#elif (DBG_IT == 9)
{
for(k = 0; k < ILEC_FR_SZ*3; k++) asHstA[k] = k;
lec_pkts_cpy(asHstC, asHstA, 2);
}
#elif (DBG_IT == 10)
for (k = 0; k < 100; k++)
{
S16 C, A;
C = asRxC[ILEC_FR_SZ-1];
A = asRxC[ILEC_FR_SZ-1];
lec_pkt_randC(asRxC, &C);
lec_pkt_rand (asRxA, &A);
sErr += compare(asRxC, asRxA, ILEC_FR_SZ);
}
#elif (DBG_IT == 11)
for (k = 0; k < 100; k++)
{
extern S32 lec_pkt_energy(S16*);
extern S32 lec_pkt_energyC(S16*);
// S32 slC, slA;
fill_rand(asRxC, ILEC_FR_SZ, 8000);
slC = lec_pkt_energyC(asRxC);
slA = lec_pkt_energy (asRxC);
sErr += compare((S16*)&slC,(S16*)&slA,2);
}
#elif (DBG_IT == 12)
for (k = 0; k < 100; k++)
{
extern S16 lec_en2log(S32 slEn);
extern S16 lec_en2logC(S32 slEn);
fill_rand((S16 *)&slC, 2, 8000);
slC = labs(slC);
// slC = 0x2000000L;
slA = slC;
sC = lec_en2logC(slC);
sA = lec_en2log (slC);
sErr += abs(sC-sA);
}
#elif (DBG_IT == 13)
for (k = 0; k < 100; k++)
{
sC = (rand()-RAND_MAX/2);
if (sC > 170*18) sC = 170*18;
if (sC < -170*100) sC = -170*100;
// sC = -512*3+100;
sA = sC;
sC = lec_expC(sC);
sA = lec_exp (sA);
sErr += abs(sC-sA);
}
#elif (DBG_IT == 14)
for (k = 0; k < 100; k++)
{
fill_rand(asRxC, ILEC_FR_SZ, 8000);
sC = lec_pkt_zcC(asRxC);
sA = lec_pkt_zc (asRxC);
sErr += abs(sC - sA);
}
#elif (DBG_IT == 15)
for (k = 0; k < 100; k++)
{
fill_rand(asRxC, ILEC_FR_SZ, 8000);
sC = lec_pkt_peakC(asRxC);
sA = lec_pkt_peak (asRxC);
sErr += abs(sC - sA);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?