📄 convolution.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 + -