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

📄 最大似然译码.cpp

📁 最大似然译码 最大似然译码 最大似然译码
💻 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 + -