⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 decode.h

📁 截短长度72viterbi约束长度9测试
💻 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 + -