视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
线性分组码编译码报告
2025-10-02 08:00:16 责编:小OO
文档
实  验  报  告  书

课程名称:    信息论与编码实验                             

实验名称:    线性分组码的编译码                             

一、实验内容

借助C++编程来实现对线性分组码的编码及其译码算法的实现

二、实验环境

   1、计算机

   2、VC++6.0

三、实验目的

  1、进一步熟悉线性分组码编译码的原理,及其基本的算法;

  2、通过编译,充分对于线性分组编译码有进一步的了解和掌握;

  3、掌握C++语言编程(尤其是数值的进制转换,数值与字符串之间的转换等)

四、实验要求

(1)实验前编写源程序、准备测试数据。

(2)在Turbo C下完成程序的编辑、编译、运行,获得程序结果。如果结果有误,应找出原因,并设法更正之。

五、实验总体思路

六、实验程序及分析

(7,4)码编译器整体程序:

#include

#include

void main()    

{

    /*G:生成矩阵  H:监督矩阵  HT:监督矩阵对应的转置矩阵*/

    /*M:输入信息序列  C:编码输出序列  Input:输入接收码序列  B:译码输出序列  S:伴随式*/

    int Q,N;/*定义开始*/

    int i,j,s,r,k,t,p,u,m;

    int G[4][7]={{1,0,0,0,1,1,1},{0,1,0,0,1,1,0},{0,0,1,0,1,0,1},{0,0,0,1,0,1,1}};

    int IR[3][3]={{1,0,0,},{0,1,0},{0,0,1}};

    int H[3][7], C[10][7],M[10][4],B[20][7],Input[100],HT[7][3],P[10],S[100][3];/*定义结束*/

    printf("\\n您好!欢迎使用线性分组码编译器!\\n");

    printf("\\n\\n本编译器针对(7,4)码,所采用的生成矩阵G=\\n");

for(i=0;i<4;i++)

    {

        for(j=0;j<7;j++)

            printf(" %d",G[i][j]);

        printf("\\n");

    }

    printf("编译码过程都是针对二进制码组,除了系统要求选择功能,其他情况下禁止输入除0,1以外的数。请在使用的过程中严格按照编译器要求的格式输入数据。\\n\\n");

    printf("现在请输入您所选择的编译器所对应的序号,按回车键继续:\\n");

    printf("\\n1.编码器  2.译码器  3.退出\\n");

    printf("\\n我选择:");

    scanf("%d",&Q);

    if(Q==0)

        Q+=4;

    while(Q)

    {

    if(Q==1||Q==2||Q==3)break;

    else

    {

        printf("对不起,您输入有误,请重新输入");

        scanf("%d",&Q);

    }

    }

    while(Q==1||Q==2||Q==3)

        {

            if(Q==1)/*编码程序*/

                {printf("\\n请输入您需要编码的信息组数");

                scanf("%d",&N);

                printf("\\n\\n请输入您需要编码的%d组四位二进制信息组,码组间用空格分开,按回车键确认。\\n",N);/*输入信息码*/

                printf("\\n信息组m=");

                for(i=0;i        scanf("%1d%1d%1d%1d",&M[i][3],&M[i][2],&M[i][1],&M[i][0]);/*求监督码*/

                for(i=0;i                {

                C[i][2]=M[i][3]^M[i][2]^M[i][1];

                C[i][1]=M[i][3]^M[i][2]^M[i][0];

                C[i][0]=M[i][3]^M[i][1]^M[i][0];

                }

                for(j=0;j                for (i=6;i>2;i--)/*输出编码结果*/

                    C[j][i]=M[j][i-3];

                printf("\\n您所输入的信息组编码结果c=");

                for(j=0;j                    for(i=6;i>=0;i--)

                    printf("%d",C[j][i]);

                printf("\\n\\n");

                printf("\\n接下来您想:\\n\\n");/*选择功能*/

                printf("1.用编码器 2.用译码器 3.退出\\n\\n");

                printf("我想:");

                scanf("%d",&Q);

            }

            else if(Q==2)/*译码程序*/

            {

                for(i=0;i<3;i++)/*求监督矩阵*/

                {

                    for(j=0;j<4;j++)

                        H[i][j]=G[j][i+4];

                    for(j=4;j<7;j++)

                        H[i][j]=IR[i][j-4];

                }

                printf("\\n监督矩阵H=\\n");/*输出监督矩阵*/

                for(i=0;i<3;i++)

                {

                    for(j=0;j<7;j++)

                        printf(" %d",H[i][j]);

                    printf("\\n");

                }

                t=1;

                while(t!=2)/*输入接收码组*/

                {

                    p=1;

                    printf("\\n请输入总位数为7的倍数的接收码组,每位用空格隔开,每组位数为7的倍数,以十进制2作为结束标志!按回车键确认\\n");

                    while(p)

                    {

                        for(i=0;;i++)

                        {

                            scanf("%d",&Input[i]);

                            if(Input[i]==2)break;

                        }

                        k=i%7;

                        if(k==0){p=0;t=2;}

                        else

                        {

                            p=1;

                            k=-k+7;

                            printf("您接收到的码组丢失了%d位,系统不能判断丢失位的具体位置,请重新输入\\n",k);

                        }

                    }

                }

                u=i/7;

                i=0;

                for(r=0;r                {    for(j=6;j>=0;j--,i++)

                        B[r][j]=Input[i];

                }

                printf("\\n将接收码组每七位分为一个码组,如下:\\n");

                    for(i=0;i                    {

                        for(j=0;j<7;j++)

                            printf(" %1d",B[i][6-j]);

                        printf("\\n");

                    }

                for(i=0;i<3;i++)/*求监督矩阵H的转置矩阵*/

                    for(j=0;j<7;j++)

                        HT[j][i]=H[i][j];

                    for(i=0;i                    {

                        for(m=0;m<3;m++)

                        {

                            for(j=0;j<7;j++)

                            {

                                s+=(B[i][6-j]*HT[j][m]);

                            }

                            if (s%2==1)s=1;

                            else 

                                s=0;

                            S[i][2-m]=s;

                            s=0;

                        }

                    }

                    printf("\\n\\n伴随式S=\\n");/*输出伴随式*/

                for(j=0;j                {for(i=2;i>=0;i--)

                    printf(" %1d",S[j][i]);

                printf("\\n");}

                printf("\\n");

                for(i=0;i                {

                P[i]=4*S[i][2]+2*S[i][1]+S[i][0]+1;

                switch(P[i])/*根据伴随式判断接收码,并译码*/

                {

                case 1:

                    {

                        printf("\\n\\n您所接收的第%d个码组正确,它是:",++i);

                        i--;

                        for(j=6;j>=0;j--)

                            printf("%1d",B[i][j]);

                        printf("请您再次确认!");

                            printf("译出的信息序列为:");

                        for(j=6;j>2;j--)

                            printf("%d",B[i][j]);break;

                    }

                case 2:

                    {

                        B[i][0]=1^B[i][0];

                    printf("\\n\\n您接收的第%d个码组有错误,正确的码组应为:",++i);

                        i--;

                        for(j=6;j>=0;j--)

                            printf("%1d",B[i][j]);

                        printf("译出的信息序列为:");

                        for(j=6;j>2;j--)

                            printf("%d",B[i][j]);break;

                    }

                case 3:

                    {

                        B[i][1]=1^B[i][1];

                    printf("\\n\\n您接收的第%d个码组有错误,正确的码组应为:",++i);

                        i--;

                        for(j=6;j>=0;j--)

                            printf("%1d",B[i][j]);

                            printf("译出的信息序列为:");

                        for(j=6;j>2;j--)

                            printf("%d",B[i][j]);break;

                    }

                case 4:

                    {

                        B[i][3]=1^B[i][3];

                    printf("\\n\\n您接收的第%d个码组有错误,正确的码组应为:",++i);

                        i--;

                        for(j=6;j>=0;j--)

                            printf("%1d",B[i][j]);

                            printf("译出的信息序列为:");

                        for(j=6;j>2;j--)

                            printf("%d",B[i][j]);break;

                    }

                case 5:

                    {

                        B[i][2]=1^B[i][2];

                    printf("\\n\\n您接收的第%d个码组有错误,正确的码组应为:",++i);

                        i--;

                        for(j=6;j>=0;j--)

                            printf("%1d",B[i][j]);

                            printf("译出的信息序列为:");

                        for(j=6;j>2;j--)

                            printf("%d",B[i][j]);break;

                    }

                case 6:

                    {

                        B[i][4]=1^B[i][4];

                    printf("\\n\\n您接收的第%d个码组有错误,正确的码组应为:",++i);

                        i--;

                        for(j=6;j>=0;j--)

                            printf("%1d",B[i][j]);

                            printf("译出的信息序列为:");

                        for(j=6;j>2;j--)

                            printf("%d",B[i][j]);break;

                    }

                case 7:

                    {

                        B[i][5]=1^B[i][5];

                    printf("\\n\\n您接收的第%d个码组有错误,正确的码组应为:",++i);

                        i--;

                        for(j=6;j>=0;j--)

                            printf("%1d",B[i][j]);

                            printf("译出的信息序列为:");

                        for(j=6;j>2;j--)

                            printf("%d",B[i][j]);break;

                    }

                case 8:

                    {

                        B[i][6]=1^B[i][6];

                    printf("\\n\\n您接收的第%d个码组有错误,正确的码组应为:",++i);

                        i--;

                        for(j=6;j>=0;j--)

                            printf("%1d",B[i][j]);

                            printf("译出的信息序列为:");

                        for(j=6;j>2;j--)

                            printf("%d",B[i][j]);break;

                    }

                }

                }

                printf("\\n\\n总的译码结果为:");

                for(i=0;i                    for(j=6;j>2;j--)

                        printf("%1d",B[i][j]);

                printf("\\n\\n接下来您想:\\n\\n");/*继续选择功能*/

                printf("1.用编码器 2.用译码器 3.退出\\n\\n");

                printf("我想:");

                scanf("%d",&Q);

                if(Q==0)

                    Q=Q+4;

                while(Q)

                {

                    if(Q==1||Q==2||Q==3)break;

                    else

                    {

                        printf("对不起,您输入有误,请重新输入");

                        scanf("%d",&Q);

                    }

                }

            }

            else if(Q==3)/*退出程序*/

            {

                printf("\\n谢谢您的使用,欢迎再次使用!\\n");    Q=0;

            }

        }

}

运行的结果:

编码实验:B=A*G

译码实验: 

七、实验心得体会

通过本次实验,将课本上的理论知识与实际结合起来操作,我对线性分组码的原理及其编译码方法有了更为深入的理解。

    在实验过程中,我们经过对程序进行分析与调试后,我们在课本上找了个例子,对其编码器的编译码做了一步理论上的检验,运行的出来的结果与我们的计算结果是完全符合。

    希望在下次实验中能有更大的收获。

下载本文
显示全文
专题