📄 最大似然译码.cpp
字号:
#include<stdio.h>
#include<stdlib.h>
#include<string>
#define MAX 128
using namespace std;
int tonum(char b[])//将字符型的二进制转化为相应的整型
{
int len,i,sum=0,a=1;
len=strlen(b);
for(i=len-1;i>=0;i--)
{
if(b[i]=='1')
sum+=a;
a*=2;
}
return sum;
}
int mod2plus(int C,int G)//模2加实现模块
{
int q=1;
int i=0;
while(i!=11)
{
//printf("q=%d\n",q);
if((C&q)&&(G&q))
C-=q;
else if(G&q)
C+=q;
q=q<<1;
//printf("k=%d\n",k);
i++;
}
return C;
}
int main()
{
int i,j,tem,k,Rx;//Rx接收码子
char RX[10];
int Gx[7][11]={
1,0,0,1,1,0,0,0,0,0,0,
0,1,0,0,1,1,0,0,0,0,0,
0,0,1,0,0,1,1,0,0,0,0,
0,0,0,1,0,0,1,1,0,0,0,
0,0,0,0,1,0,0,1,1,0,0,
0,0,0,0,0,1,0,0,1,1,0,
0,0,0,0,0,0,1,0,0,1,1}
;//7*11生成矩阵
int Mx;//信息位
int MX[MAX][7];//信息位的二进制表示
char PECODE[MAX][20];//储存许用码字 (包括控制码)
char CODE[MAX/2][20];//储存许用码字 (控制码为1的许用码)
int CODENUM[MAX/2];//许用码字的整型表示
int Ex[11]={1,2,4,8,16,32,64,128,256,512,1024};
//,3,5,9,17,33,129,257,513,1025,1026,1028,1032,
// 1040,1056,1088,1152,1280,1536,12,24,48};//错误图样
for(i=0;i<MAX;i++)//初始化
for(j=0;j<7;j++)
MX[i][j]=0;
for(i=0;i<MAX;i++)//将信息位转化为相应的二进制表示
{
j=6;
tem=i;//临时变量
while(tem)
{
if(tem & 1)
MX[i][j--]=1;
else
MX[i][j--]=0;
tem>>=1;
}
}
for(i=0;i<MAX;i++)//将信息位与生成矩阵相乘形成许用码字
{
for(k=0;k<11;k++)
{
tem=0;
for(j=0;j<7;j++)
tem+=(MX[i][j]*Gx[j][k]);
PECODE[i][k]=tem%2+'0';
}
PECODE[i][k]='\0';
}
for(i=0;i<MAX;i++)//输出许用码子
{
// printf("%d ",i);
printf("%s",PECODE[i]);
printf("\n");
}
printf("***\n");
for(j=0,i=0;j<MAX/2&&i<MAX;i++)
{
tem=tonum(PECODE[i]);
if((tem>>4)&1)
{
strcpy(CODE[j],PECODE[i]);
CODENUM[j++]=tem;
}
}
for(i=0;i<MAX/2;i++)//输出许用码子
{
// printf("%d ",i);
printf("%s",CODE[i]);
printf("\n");
}
/* for(i=0;i<j;i++)
printf("%d\n",CODENUM[i]); */
printf("请输入接收码子:R(x)\n");
while(scanf("%s",RX)!=EOF)
{
Rx=tonum(RX);
k=0;
for(j=0;j<64;j++)
if(Rx==CODENUM[j])
{
printf("其对应的发送码字为Rx本身。\n");
printf("请输入下一个:R(x)\n");
k=64;
break;
}
for(i=0;i<11;i++)
for(j=0;j<64;j++)
if(mod2plus(Ex[i],CODENUM[j])==Rx)
{
printf("其对应的发送码字为 %s\n",CODE[j]);
printf("请输入下一个:R(x)\n");
k=64;
i=11;
break;
}
if(k!=64)
printf("不可纠错的,请输入下一个。\n");
}
/* for(i=0;i<MAX;i++)//初始化
{
printf("%d ",i);
for(j=0;j<7;j++)
printf("%d",MX[i][j]);
printf("\n");
}*/
system("pause");
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -