📄 decode.h
字号:
/*
* viterbi译码9约束长度软判决 功率归一化
************************************************************************************************
* MODULE NAME: decode.h
*************************************************************************************************
* DESCRIPTION 译码
* FUNCTION search()搜索最优路径
* count() 计算分支距离
*************************************************************************************************
*/
#include "trans.h"
struct unit //各步各状态记录
{unsigned level; //本状态的上一最优状态
int dis; //到本状态的总重量
unsigned over; //本状态是否走过
};
unsigned path[200]; //记录状态转移路径
unsigned result[200]; //记录解码信息位输出
unit step[200][256]; //记录各步各状态
int receiv1[192];
int receiv2[192];
//计算分支距离
int count(unsigned bit0,unsigned bit1,int re_bit0,int re_bit1)
{ int dis=0;
dis=(bit0-1)*2*re_bit0+(bit1-1)*2*re_bit1;
return dis;
}
//搜索最优路径
void search()
{ int i,j;
int p1,p2,last,temp;
for(i=0;i<200;i++) //清零
{
result[i]=0;
path[i]=0;
}
for(i=0;i<=m+l;i++)
for (j=0;j<256;j++)
{ //初始化清零
step[i][j].level=0;
step[i][j].dis=0;
step[i][j].over=0;
};
step[0][0].over=1; //从零状态开始
//搜索最优状态
//1—184步的状态正常搜索,状态0—255都要考虑
for(i=1;i<=l;i++)
for (j=0;j<256;j++)
{ //上一步trans[j].last1状态的重量与到本步j状态产生输出与接收的距离之和
p1=step[i-1][trans[j].last1].dis+
count(trans[j].last1_out_bit0,trans[j].last1_out_bit1,receiv1[i-1],receiv2[i-1]);
//上一步trans[j].last2状态的重量与到本步j状态产生输出与接收的距离之和
p2=step[i-1][trans[j].last2].dis+
count(trans[j].last2_out_bit0,trans[j].last2_out_bit1,receiv1[i-1],receiv2[i-1]);
//总距离p1 p2比较 取最chang者
if ((step[i-1][trans[j].last1].over==1)&&(step[i-1][trans[j].last2].over==1))
if (p1<p2)
{
//设置本状态
step[i][j].level=trans[j].last2;step[i][j].dis=p2;step[i][j].over=1;
}
else
{
//设置本状态
step[i][j].level=trans[j].last1;step[i][j].dis=p1;step[i][j].over=1;
}
//若trans[j].last1走过trans[j].last2未走过 取trans[j].last1
if ((step[i-1][trans[j].last1].over==1)&&(step[i-1][trans[j].last2].over==0))
{
//设置本状态
step[i][j].level=trans[j].last1;step[i][j].dis=p1;step[i][j].over=1;
}
//若trans[j].last2走过trans[j].last1未走过 取trans[j].last2
if ((step[i-1][trans[j].last1].over==0)&&(step[i-1][trans[j].last2].over==1))
{
//设置本状态
step[i][j].level=trans[j].last2;step[i][j].dis=p2;step[i][j].over=1;
}
}
//处理归零问题,若输入信息位为0,下一步状态只会0—127
//185—192步的状态搜索,只考虑状态0—127
for(i=l+1;i<=l+m;i++)
for (j=0;j<128;j++)
{ //上一步trans[j].last1状态的重量与到本步j状态产生输出与接收的距离之和
p1=step[i-1][trans[j].last1].dis+
count(trans[j].last1_out_bit0,trans[j].last1_out_bit1,receiv1[i-1],receiv2[i-1]);
//上一步trans[j].last2状态的重量与到本步j状态产生输出与接收的距离之和
p2=step[i-1][trans[j].last2].dis+
count(trans[j].last2_out_bit0,trans[j].last2_out_bit1,receiv1[i-1],receiv2[i-1]);
//总距离p1 p2比较 取最chang者
if ((step[i-1][trans[j].last1].over==1)&&(step[i-1][trans[j].last2].over==1))
if (p1<p2)
{
//设置本状态
step[i][j].level=trans[j].last2;step[i][j].dis=p2;step[i][j].over=1;
}
else
{
//设置本状态
step[i][j].level=trans[j].last1;step[i][j].dis=p1;step[i][j].over=1;
}
//若trans[j].last1走过trans[j].last2未走过 取trans[j].last1
if ((step[i-1][trans[j].last1].over==1)&&(step[i-1][trans[j].last2].over==0))
{
//设置本状态
step[i][j].level=trans[j].last1;step[i][j].dis=p1;step[i][j].over=1;
}
//若trans[j].last2走过trans[j].last1未走过 取trans[j].last2
if ((step[i-1][trans[j].last1].over==0)&&(step[i-1][trans[j].last2].over==1))
{
//设置本状态
step[i][j].level=trans[j].last2;step[i][j].dis=p2;step[i][j].over=1;
}
}
//回溯求路径
path[0]=0; //从0状态开始
last=0;
for(i=m+l;i>=1;i--) //最后从0状态开始向前倒推
{
path[i]=last;
last=step[i][last].level;
};
/* cout<<"状态:";
for(i=0;i<=m+l;i++)
cout<<" "<<path[i];
cout<<endl; */
for(i=1;i<=m+l;i++) //由前后的状态转移推输入信息位
{if (path[i]<path[i-1]) //本状态编号小于前状态编号输入为0
result[i-1]=0;
else if (path[i]>path[i-1])//本状态编号大于前状态编号输入为1
result[i-1]=1;
if (path[i]==path[i-1])
if (path[i]==0) result[i-1]=0;
else result[i-1]=1;
}
/* cout<<"译码结果:";
for(i=0;i<m+l;i++)
cout<<result[i]; */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -