Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
colorEagleStdio
taskbus_course
提交
9750ef65
taskbus_course
项目概览
colorEagleStdio
/
taskbus_course
通知
28
Star
5
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
taskbus_course
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
9750ef65
编写于
10月 02, 2022
作者:
丁劲犇
😸
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
更新维特比算法,解决上周演示课上的尴尬问题。一个64位的整数数组,用32位的memset清零,导致尾巴有野值。
上级
16624cf7
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
28 addition
and
53 deletion
+28
-53
3rdlibs/lsmviterbi/clsm_viterbi.cpp
3rdlibs/lsmviterbi/clsm_viterbi.cpp
+21
-48
3rdlibs/lsmviterbi/clsm_viterbi.h
3rdlibs/lsmviterbi/clsm_viterbi.h
+2
-2
3rdlibs/lsmviterbi/demo_viterbi.cpp
3rdlibs/lsmviterbi/demo_viterbi.cpp
+5
-3
未找到文件。
3rdlibs/lsmviterbi/clsm_viterbi.cpp
浏览文件 @
9750ef65
...
...
@@ -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
;
...
...
3rdlibs/lsmviterbi/clsm_viterbi.h
浏览文件 @
9750ef65
...
...
@@ -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
3rdlibs/lsmviterbi/demo_viterbi.cpp
浏览文件 @
9750ef65
...
...
@@ -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
(
"
\n
Initial 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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录