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

📄 viterbi_deconbolution.cpp

📁 viterbi译码
💻 CPP
字号:
#include <stdlib.h>
#include <math.h>
 


unsigned int* viterbi(unsigned int* convol_data)
{
	unsigned int* deconvol_data;
	unsigned int *result_temp1;
	unsigned int *result_temp2;
    unsigned int code_dis_temp1;
	unsigned int code_dis_temp2;
    unsigned int deconvol_num=(sizeof(convol_data)/2);
//a前三节点的码距,存入code_dis_a;解码data存入a_f6;
	unsigned int a_f6[4000];
	unsigned int a_f61[6]={0,0,0,0,0,0};
	unsigned int a_f62[6]={1,1,1,0,1,1};
    unsigned int code_dis_a;
	unsigned int code_dis_a1=0;
    unsigned int code_dis_a2=0;
	
	for(int ia=0;ia<6;ia++)
	{
		if(convol_data[ia]==a_f61[ia])
	      code_dis_a1+=1;
		if(convol_data[ia]==a_f62[ia])
	      code_dis_a2+=1;
	}
	if(code_dis_a1>=code_dis_a2)
	{
		code_dis_a=code_dis_a2;
		
		a_f6[0]=1;
		a_f6[1]=0;
		a_f6[2]=0;
	}
	else
	{
		code_dis_a=code_dis_a1;
		a_f6[0]=0;
		a_f6[1]=0;
		a_f6[2]=0;
	}
//b前三节点的码距;
	unsigned int b_f6[4000];
	unsigned int b_f61[6]={0,0,0,0,1,1};
	unsigned int b_f62[6]={1,1,1,0,0,0};
    unsigned int code_dis_b;
	unsigned int code_dis_b1=0;
    unsigned int code_dis_b2=0;
	
	for(int ib=0;ib<6;ib++)
	{
		if(convol_data[ib]==b_f61[ib])
			code_dis_b1+=1;
		if(convol_data[ib]==b_f62[ib])
			code_dis_b2+=1;
	}
	if(code_dis_b1>=code_dis_b2)
	{
		code_dis_b=code_dis_b2;
		
		b_f6[0]=1;
		b_f6[1]=0;
		b_f6[2]=1;
	}
	else
	{
		code_dis_b=code_dis_b1;
		b_f6[0]=0;
		b_f6[1]=0;
		b_f6[2]=1;
	}
//c前三节点的码距;
	unsigned int c_f6[4000];
	unsigned int c_f61[6]={0,0,1,1,1,0};
	unsigned int c_f62[6]={1,1,0,1,0,1};
    unsigned int code_dis_c;
	unsigned int code_dis_c1=0;
    unsigned int code_dis_c2=0;
	
	for(int ic=0;ic<6;ic++)
	{
		if(convol_data[ic]==b_f61[ic])
			code_dis_b1+=1;
		if(convol_data[ic]==b_f62[ic])
			code_dis_c2+=1;
	}
	if(code_dis_c1>=code_dis_c2)
	{
		code_dis_c=code_dis_c2;
		
		c_f6[0]=1;
		c_f6[1]=1;
		c_f6[2]=0;
	}
	else
	{
		code_dis_c=code_dis_c1;
		c_f6[0]=0;
		c_f6[1]=1;
		c_f6[2]=0;
	}
//d前三节点的码距;
	unsigned int d_f6[4000];
	unsigned int d_f61[6]={0,0,1,1,0,1};
	unsigned int d_f62[6]={1,1,0,1,1,0};
    unsigned int code_dis_d;
	unsigned int code_dis_d1=0;
    unsigned int code_dis_d2=0;
	
	for(int id=0;id<6;id++)
	{
		if(convol_data[id]==b_f61[id])
			code_dis_d1+=1;
		if(convol_data[id]==b_f62[id])
			code_dis_d2+=1;
	}
	if(code_dis_d1>=code_dis_d2)
	{
		code_dis_d=code_dis_d2;
		
		d_f6[0]=1;
		d_f6[1]=1;
		d_f6[2]=1;
	}
	else
	{
		code_dis_d=code_dis_d1;
		d_f6[0]=0;
		d_f6[1]=1;
		d_f6[2]=1;
	}
//四节点以后解码处理;
	for (unsigned int j=3;j<deconvol_num;j++)
   {
//a节点只从上一节点的a,和c走线
     unsigned int code_dis_a_a=code_dis_a;
	 unsigned int code_dis_a_b=code_dis_a;
	 unsigned int code_dis_b_c=code_dis_b;
	 unsigned int code_dis_b_d=code_dis_b;
	 unsigned int code_dis_c_a=code_dis_c;
	 unsigned int code_dis_c_b=code_dis_c;
	 unsigned int code_dis_d_c=code_dis_c;
	 unsigned int code_dis_d_d=code_dis_d;
    if(convol_data[j*2]==0)
	{
		code_dis_c_a+=1;
        code_dis_a_b+=1;
		code_dis_b_c+=1;
		code_dis_d_d+=1;

	}
     else 
	 {
		 code_dis_a_a+=1;
		 code_dis_c_b+=1;
		 code_dis_d_c+=1;
		 code_dis_b_d+=1;
	 }

	 if(convol_data[j*2+1]==0)
	 {
		 code_dis_c_a+=1;
		 code_dis_a_b+=1;
		 code_dis_d_c+=1;
		 code_dis_b_d+=1;
		 
	 }
     else 
	 {
		 code_dis_a_a+=1;
		 code_dis_c_b+=1;
		 code_dis_b_c+=1;
		 code_dis_d_d+=1;
	 }

//
	 if (code_dis_a_a>=code_dis_c_a)
	 {
		 code_dis_a=code_dis_c_a;
         a_f6[j]=0;
	 }
      else
	  { 
		  code_dis_a=code_dis_a_a;
         a_f6[j]=0;

	  }
//
	  if (code_dis_a_b>=code_dis_c_b)
	  {
		  code_dis_b=code_dis_c_b;
		  b_f6[j]=1;
	  }
      else
	  { 
		  code_dis_b=code_dis_a_b;
		  b_f6[j]=1;
	  }
//
	  if (code_dis_b_c>=code_dis_d_c)
	  {
		  code_dis_c=code_dis_d_c;
		  c_f6[j]=0;
	  }
      else
	  { 
		  code_dis_c=code_dis_b_c;
		  c_f6[j]=0;
		  
	  }
//
	  if (code_dis_b_d>=code_dis_d_d)
	  {
		  code_dis_d=code_dis_d_d;
		  d_f6[j]=1;
	  }
      else
	  { 
		  code_dis_d=code_dis_b_d;
		  d_f6[j]=1;
		  
	  }
	}

if (code_dis_a>=code_dis_b)
{
  result_temp1=b_f6;
  code_dis_temp1=code_dis_b;
}
else
{
	result_temp1=a_f6;
  code_dis_temp1=code_dis_a;
}
//
if (code_dis_c>=code_dis_d)
{
	result_temp2=d_f6;
	code_dis_temp2=code_dis_d;
}
else
{
	result_temp2=c_f6;
	code_dis_temp2=code_dis_c;
}

if (code_dis_temp1>=code_dis_temp2)
     deconvol_data=result_temp2;
else deconvol_data=result_temp1;
 return deconvol_data; 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -