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

📄 decode.h

📁 软判决功率归一viterbi约束长度9
💻 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 + -