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

📄 convolution.cpp

📁 通信系统的卷积编码
💻 CPP
字号:
#include <stdio.h>
#include <math.h>
unsigned char Trans_data[]={"$VSBP,0000,45,3937.3090,11611.6057,理工大学北门大工桥下"};//$VSBP,0000,45,3937.3090,11611.6057,理工大学北门大工桥下
unsigned int* viterbi_encode(unsigned int* convol_data,unsigned int data_length);
unsigned int* char2binary(unsigned char *,unsigned int);
//////////////////////////////////////////////////////////////////////////
void main()
{
  unsigned int *p;
  unsigned int *p_viterbi;
  unsigned int init0=0;
  unsigned int init1=0;
  unsigned int y1=0;
  unsigned int y2=0;
  unsigned int conv_bin_data[4000];
 
 
  unsigned int Trans_data_size;
  Trans_data_size=sizeof(Trans_data);
  Trans_data_size-=1;
   p=char2binary(Trans_data,Trans_data_size);
  if (Trans_data_size==0)
  {
    printf("%s\n","There is zero data!Plese check the data.");
  }
  else
  {
	  for (unsigned int i=0;i<Trans_data_size*8;i++)
	  {
	  y1=(init1+(*(p+i)))%2;
	  y2=(init0+init1+(*(p+i)))%2;
      conv_bin_data[2*i]=y2;
      conv_bin_data[2*i+1]=y1;
	  init1=init0;
	  init0=*(p+i);
	  }
     
  }
  
  for (unsigned int j2=0;j2<Trans_data_size*16;j2++)
  {
	  printf("%d\n",conv_bin_data[j2]);
	  }
  p_viterbi=viterbi_encode(conv_bin_data,Trans_data_size*16);

 for (unsigned int j1=0;j1<Trans_data_size*8;j1++)
 {
	 printf("%d\n\n",p_viterbi[j1]);
	  }
}

//////////////////////////////////////////////////////////////////////////
//将字符串转换成二进制数组
unsigned int* char2binary(unsigned char *char_data,unsigned int char_size)
{
 unsigned int dec_data[2000];
 unsigned int bin_data[4000];
 
  unsigned int *p;
  p=bin_data;
  for (unsigned int i=0;i<char_size;i++)
  {
	  dec_data[i]=char_data[i];
  }
  for (unsigned int k=0;k<char_size;k++)
  {
	  int a;
	  a=dec_data[k];
	 for (int j=7;j>=0;j--)
	 {
		 if(a>=pow(2.0,j))
		 {
			 bin_data[k*8+j]=1;
			 a=a-pow(2.0,j);
		 }
		 else bin_data[k*8+j]=0;
	 }
  }
return p;
}

//////////////////////////////////////////////////////////////////////////


unsigned int* viterbi_encode(unsigned int* convol_data,unsigned int data_length)
{
	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=data_length;
//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]!=c_f61[ic])
			code_dis_c1+=1;
		if(convol_data[ic]!=c_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]!=d_f61[id])
			code_dis_d1+=1;
		if(convol_data[id]!=d_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_d;
	 unsigned int code_dis_d_d=code_dis_d;
	 unsigned int a_f6_temp[4000];
	 unsigned int b_f6_temp[4000];
	 unsigned int c_f6_temp[4000];
	 unsigned int d_f6_temp[4000];
	 for (unsigned int it=0;it<j;it++)
	 {
       a_f6_temp[it]=a_f6[it];
	   b_f6_temp[it]=b_f6[it];
	   c_f6_temp[it]=c_f6[it];
	   d_f6_temp[it]=d_f6[it];
	 }
    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;
         for (unsigned int ka=0;ka<j;ka++)
             a_f6[ka]=c_f6_temp[ka];
		     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;
		  for (unsigned int kb1=0;kb1<j;kb1++)
		        b_f6[kb1]=c_f6_temp[kb1];
			    b_f6[j]=1;
         
		  
	  }
      else
	  { 
		  code_dis_b=code_dis_a_b;
		  for (unsigned int kb2=0;kb2<j;kb2++)
			  b_f6[kb2]=a_f6_temp[kb2];
			    b_f6[j]=1;
		  
	  }
//
	  if (code_dis_b_c>=code_dis_d_c)
	  {
		  code_dis_c=code_dis_d_c;
		  for (unsigned int kc1=0;kc1<j;kc1++)
			  c_f6[kc1]=d_f6_temp[kc1];
		      c_f6[j]=0;
	  }
      else
	  { 
		  code_dis_c=code_dis_b_c;
		  for (unsigned int kc2=0;kc2<j;kc2++)
			  c_f6[kc2]=b_f6_temp[kc2];
		      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;
		  for (unsigned int kd=0;kd<j;kd++)
			  d_f6[kd]=b_f6_temp[kd];
		      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; 
}

//////////////////////////////////////////////////////////////////////////
//2008年11月5日16:58:39

⌨️ 快捷键说明

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