📄 decode.h
字号:
/*
* viterbi译码9约束长度 截短测试
*************************************************************************************************
* DESCRIPTION 译码 截短长度72
* FUNCTION search()搜索最优路径
*
*************************************************************************************************
*/
#include "trans.h"
struct unit //各步各状态记录
{unsigned level; //本状态的上一最优状态
unsigned dis; //到本状态的总重量
unsigned over; //本状态是否走过
};
unsigned path[200]; //记录状态转移路径
unsigned result[200]; //记录解码信息位输出
unit step[200][256]; //记录各步各状态
unsigned receiv1[192];
unsigned receiv2[192];
//搜索最优路径
void search()
{
int i,j,k;
unsigned p1,p2,last,temp1,temp2;
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; //从零状态开始
//搜索最优状态,实际处理时等效长度为73的寄存器
//到72步时输出8比特
//截短译码以48比特为一个译码单位
for(i=1;i<=l+m;i++)
{ if(i<=l) //1--184步的状态正常搜索,状态0—255都要考虑
for (j=0;j<256;j++)
{ //上一步trans[j].last1状态的重量与到本步j状态产生输出与接收的距离之和
p1=step[i-1][trans[j].last1].dis+(trans[j].last1_out_bit0+receiv1[i-1])%2
+(trans[j].last1_out_bit1+receiv2[i-1])%2;
//上一步trans[j].last2状态的重量与到本步j状态产生输出与接收的距离之和
p2=step[i-1][trans[j].last2].dis+(trans[j].last2_out_bit0+receiv1[i-1])%2
+(trans[j].last2_out_bit1+receiv2[i-1])%2;
//总距离p1 p2比较 取最短者
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;
}
}
else //处理归零问题,若输入信息位为0,下一步状态只会0—127
//184—192步的状态搜索,只考虑状态0—127
for(i=l+1;i<=l+m;i++)
for (j=0;j<128;j++)
{ //上一步trans[j].2last1状态的重量与到本步j状态产生输出与接收的距离之和
p1=step[i-1][trans[j].last1].dis+(trans[j].last1_out_bit0+receiv1[i-1])%2
+(trans[j].last1_out_bit1+receiv2[i-1])%2;
//上一步trans[j].last2状态的重量与到本步j状态产生输出与接收的距离之和
p2=step[i-1][trans[j].last2].dis+(trans[j].last2_out_bit0+receiv1[i-1])%2
+(trans[j].last2_out_bit1+receiv2[i-1])%2;
//总距离p1 p2比较 取最短者
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;
}
}
if((i%8==0)&&(i>=72)&&(i<192)) //每接受8个码段输出前8个信息比特
{ temp1=10000;last=0;
for (k=0;k<256;k++)
if ((step[i][k].dis<temp1)&&(step[i][k].over==1))
{
temp1=step[i][k].dis;
last=k;
}
path[i]=last;
last=step[i][path[i]].level;
for(j=i-1;j>=i-72;j--) //最后向前倒推
{
path[j]=last;
last=step[j][last].level;
};
for(j=i-72+1;j<=i-72+8;j++) //由前后的状态转移推输入信息位
{
if (path[j]<path[j-1]) //本状态编号小于前状态编号输入为0
result[j-1]=0;
else if (path[j]>path[j-1])//本状态编号大于前状态编号输入为1
result[j-1]=1;
if (path[j]==path[j-1])
if (path[j]==0) result[j-1]=0;
else result[j-1]=1;
}
}
}
//到接受信息全部输入后,输出了第0—119比特信息,寄存器保留到120—192步的网格图
//最后从0状态开始向前倒推,输出第120—191比特信息位
last=0;
for(i=m+l;i>=120;i--)
{
path[i]=last;
last=step[i][last].level;
};
/* cout<<"状态:";
for(i=0;i<=m+l;i++)
cout<<" "<<path[i];
cout<<endl; */
for(i=120;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 + -