提交 9750ef65 编写于 作者: 丁劲犇's avatar 丁劲犇 😸

更新维特比算法,解决上周演示课上的尴尬问题。一个64位的整数数组,用32位的memset清零,导致尾巴有野值。

上级 16624cf7
......@@ -17,9 +17,9 @@ typedef struct {
} tag_statusjmp_last;
//最优路径表,采用double_buffer技术
typedef struct {
unsigned long long nCurrentHamming[2]; //当前全路径汉明
long long nCurrentHamming[2]; //当前全路径汉明
int nInitialStatus[2]; //本路径的起始初态
unsigned long long *nHamming[2]; //各个跳转的汉明
long long *nHamming[2]; //各个跳转的汉明
int *nInChain[2]; //各个跳转的输入(触发)
//int nOutChain[2][L]; //各个跳转的输出
//int nRegChain[2][L]; //各步状态
......@@ -82,8 +82,8 @@ void * new_lsm_codec(const int reg_status, const int data_status, const int code
newitem->table_lastjmp[i].nLastStatus= (int *)malloc(sizeof(int)*data_status);
newitem->best_path[i].nInChain[0] = (int *)malloc(sizeof(int)*L);
newitem->best_path[i].nInChain[1] = (int *)malloc(sizeof(int)*L);
newitem->best_path[i].nHamming[0] = (unsigned long long *)malloc(sizeof(unsigned long long)*L);
newitem->best_path[i].nHamming[1] = (unsigned long long *)malloc(sizeof(unsigned long long)*L);
newitem->best_path[i].nHamming[0] = (long long *)malloc(sizeof(long long)*L);
newitem->best_path[i].nHamming[1] = (long long *)malloc(sizeof(long long)*L);
memset (newitem->table_nextjmp[i].nNextStatus,0, sizeof(int) * data_status);
memset (newitem->table_nextjmp[i].nOutput,0, sizeof(int) * data_status);
......@@ -126,7 +126,7 @@ void delete_lsm_codec(void * item)
free(codec);
}
unsigned long long worst_hamming(void * item)
long long worst_hamming(void * item)
{
clsm_codec_arg * codec = (clsm_codec_arg *)item;
if (!item)
......@@ -152,8 +152,8 @@ void reset_status(void *codec)
{
memset (item->best_path[i].nInChain[0],0, sizeof(int) * item->L);
memset (item->best_path[i].nInChain[1],0, sizeof(int) * item->L);
memset (item->best_path[i].nHamming[0],0, sizeof(int) * item->L);
memset (item->best_path[i].nHamming[1],0, sizeof(int) * item->L);
memset (item->best_path[i].nHamming[0],0, sizeof(long long) * item->L);
memset (item->best_path[i].nHamming[1],0, sizeof(long long) * item->L);
item->best_path[i].nCurrentHamming[0] = 0;
item->best_path[i].nCurrentHamming[1] = 0;
item->best_path[i].nInitialStatus[0] = i;
......@@ -240,18 +240,18 @@ int encode(void * pcodec,const int inputArray[], int nLen, int outputArray[], in
* \return int 目前,缓存中有多少个判决可以读取。(调用 pop_data)
*
*/
int decode(void * pcodec,const int CodeArray[], int nSymbolLen, int bFinished/*, int InitialStatus*/)
int decode(void * pcodec,const int CodeArray[], int nSymbolLen, int bFinished)
{
int cd = 0,i,j,yy,pos,mirror,raw;
unsigned long long nHamm = 0;
long long nHamm = 0;
int nBestStatus = 0;
int nMaxHit = 0;
int *tmp;
int nBests = 0;
unsigned long long nPathHamm = 0;
long long nPathHamm = 0;
int nBestLastStatus = 0, nBestInput = 0; /*nBestOutput = 0, */
unsigned long long nBestHamm = (unsigned long long) (((unsigned long long)-1)>>1);
unsigned long long nBestDHamm = 0;
long long nBestHamm = 0x7ffffffffffffffe;
long long nBestDHamm = 0;
int * nStatusCounter = 0;
int bitweight[16] = {0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4};
clsm_codec_arg * codec = (clsm_codec_arg *) pcodec;
......@@ -263,13 +263,13 @@ int decode(void * pcodec,const int CodeArray[], int nSymbolLen, int bFinished/*
对每次输入,codec->nCLock ++, 对各个寄存器状态,查下 lastjmp 表,
从而知道每个新状态由哪些老的状态而来,同时计算汉明距离。
*/
codec->nBestHamming = (long long) (((unsigned long long)-1)>>1);
codec->nBestHamming = 0x7ffffffffffffffe;
codec->nBestStatus_sz = 0;
//对每个状态,统计最优路径
for (i=0;i<codec->reg_status; i++)
{
//用于记录最优路径的临时变量
nBestLastStatus = 0, nBestInput = 0, /*nBestOutput = 0, */nBestHamm = (long long) (((unsigned long long)-1)>>1),
nBestLastStatus = 0, nBestInput = 0, /*nBestOutput = 0, */nBestHamm = 0x7ffffffffffffffe,
nBestDHamm = 0;
//某个状态是由以下几个状态转来的
for (j=0;j<codec->data_status; j++)
......@@ -355,22 +355,6 @@ int decode(void * pcodec,const int CodeArray[], int nSymbolLen, int bFinished/*
{
//统计各个跳转的大数判决
memset(nStatusCounter,0,sizeof(int)*codec->data_status);
// if (InitialStatus>=0)
// {
// bool Hit = false;
// for (i=0;i< nBests ; i++)
// {
// if ( InitialStatus == codec->best_path[i].nInitialStatus[raw])
// nStatusCounter[codec->best_path[codec->nBestStatus[i]].nInChain[raw][pos]] ++,Hit=true;
// }
// if (!Hit)
// {
// nStatusCounter = nStatusCounter;
// }
// }
// else
// {
for (i=0;i< nBests ; i++)
nStatusCounter[codec->best_path[codec->nBestStatus[i]].nInChain[raw][pos]] ++;
// }
......@@ -418,7 +402,7 @@ int decode(void * pcodec,const int CodeArray[], int nSymbolLen, int bFinished/*
* \return int 目前,缓存中有多少个判决可以读取。(调用 pop_data)
*
*/
int decode_soft(void * pcodec,const int CodeArray[], int nBitLen, int val_0, int val_1, int val_omit, int bFinished/*, int InitialStatus*/)
int decode_soft(void * pcodec,const int CodeArray[], int nBitLen, int val_0, int val_1, int val_omit, int bFinished)
{
int cd = 0,i,j,pos,mirror,raw,ot;
long long nHamm = 0;
......@@ -427,10 +411,10 @@ int decode_soft(void * pcodec,const int CodeArray[], int nBitLen, int val_0, int
int *tmp;
long long ev, ddd;
int nBests;
unsigned long long nPathHamm;
long long nPathHamm;
int nBestLastStatus = 0, nBestInput = 0; /*nBestOutput = 0, */
unsigned long long nBestHamm = (unsigned long long) (((unsigned long long)-1)>>1);
unsigned long long nBestDHamm = 0;
long long nBestHamm = 0x7ffffffffffffffe;
long long nBestDHamm = 0;
int * nStatusCounter = 0;
int maxval = val_0<val_1?val_1:val_0;
int minval = val_0>val_1?val_1:val_0;
......@@ -445,13 +429,13 @@ int decode_soft(void * pcodec,const int CodeArray[], int nBitLen, int val_0, int
对每次输入,codec->nCLock ++, 对各个寄存器状态,查下 lastjmp 表,
从而知道每个新状态由哪些老的状态而来,同时计算汉明距离。
*/
codec->nBestHamming = (unsigned long long) (((unsigned long long)-1)>>1);
codec->nBestHamming = 0x7ffffffffffffffe;
codec->nBestStatus_sz = 0;
//对每个状态,统计最优路径
for (i=0;i<codec->reg_status; i++)
{
//用于记录最优路径的临时变量
nBestLastStatus = 0, nBestInput = 0, /*nBestOutput = 0, */nBestHamm = (unsigned long long) (((unsigned long long)-1)>>1),
nBestLastStatus = 0, nBestInput = 0, /*nBestOutput = 0, */nBestHamm = 0x7ffffffffffffffe,
nBestDHamm = 0;
//某个状态是由以下几个状态转来的
for (j=0;j<codec->data_status; j++)
......@@ -544,19 +528,8 @@ int decode_soft(void * pcodec,const int CodeArray[], int nBitLen, int val_0, int
{
//统计各个跳转的大数判决
memset(nStatusCounter,0,sizeof(int)*codec->data_status);
// if (InitialStatus>=0)
// {
// for (i=0;i< nBests ; i++)
// {
// if ( InitialStatus == codec->best_path[i].nInitialStatus[raw])
// nStatusCounter[codec->best_path[codec->nBestStatus[i]].nInChain[raw][pos]] ++;
// }
// }
// else
// {
for (i=0;i< nBests ; i++)
nStatusCounter[codec->best_path[codec->nBestStatus[i]].nInChain[raw][pos]] ++;
// }
nBestStatus = 0;
nMaxHit = 0;
......@@ -614,7 +587,7 @@ int pop_data(void * pcodec,int DataArray[], int nLen)
return cps;
}
unsigned long long curr_best_hamming(void * pcodec)
long long curr_best_hamming(void * pcodec)
{
clsm_codec_arg * codec = (clsm_codec_arg *) pcodec;
return codec->nBestHamming;
......
......@@ -21,8 +21,8 @@ namespace LSMVIT{
int decode(void * codec,const int CodeArray[], int nSymbolLen, int bFinished/*, int InitialStatus*/);
int decode_soft(void * codec,const int CodeArray[], int nBitLen, int v0, int v1, int vOmit, int bFinished/*, int InitialStatus*/);
int pop_data(void * codec,int DataArray[], int nLen);
unsigned long long curr_best_hamming(void * codec);
unsigned long long worst_hamming(void * item);
long long curr_best_hamming(void * codec);
long long worst_hamming(void * item);
int get_initial_status(void * item);
}
#endif // CLSM_VITERBI_H_INCLUDED
......@@ -86,14 +86,16 @@ int demo_216()
for (int i=0;i<5;++i)
code[rand()%1024] ^= rand() % 4;
decode(codec,code,1024,false);
int e = curr_best_hamming(codec);
unsigned long long e = curr_best_hamming(codec);
int poped = pop_data(codec,recv,1024);
printf ("group %03d Ham=%7d, poped %d symbols\r",i+1,e,poped);
}
unsigned long long w = worst_hamming(codec);
int st = get_initial_status(codec);
delete_lsm_codec(codec);
printf ("\n");
printf ("\nInitial Status = %d, worst Hamming = %lld\n",w,st);
return 0;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册