2

ハミングコードを使用してエラーチェックを行うために、このコードを以下に示します。ウィキペディアでアルゴリズムを調べて、ハミング コードはどのように機能しますか?のスレッドで説明されているように、その動作も理解しました。

しかし、以下のコードは、どのビットがエラーであるかを検出するために、ある種のパリティ ビットの合計を使用します。

エラービットを検出するために合計をどのように使用できるかを誰かが説明できますか?

コード:

#include<stdio.h>
#include<math.h>
void main()
{
    int i,a[4],c[3],r[7],clk[3],n,sum=0;
    printf("Enter data bits\n");

    for(i=3;i>=0;i--)
        scanf("%d",&a[i]);
    printf("\n");

    c[0]=(a[0]+a[1]+a[2])%2;
    c[1]=(a[1]+a[2]+a[3])%2;
    c[2]=(a[1]+a[0]+a[3])%2;

    printf("data bits after hamming code is\n");

    for(i=3;i>=0;i--)
        printf("%d",a[i]);
    for(i=2;i>=0;i--)
        printf("%d",c[i]);
    printf("Enter recieved code\n");
    for(i=0;i<7;i++)
        scanf("%d",&r[i]);

    clk[0]=(r[3]+r[1]+r[2]+r[6])%2;
    clk[1]=(r[0]+r[2]+r[1]+r[5])%2;
    clk[2]=(r[0]+r[2]+r[3]+r[4])%2;

    sum=4*clk[2]+2*clk[1]+1*clk[0];

    if(sum==0)
        printf("\n u have recived coorrect code\n");
    if(sum==1)
    {   printf("Error in check bit 2\n");
        printf("The correct code is");
        r[6]=(r[6]+1)%2;
        for(i=0;i<7;i++)
        printf("%d",r[i]);
    }
    if(sum==2)
    {
        printf("Error in check bit 1\n");
        printf("The correct code is");
        r[5]=(r[5]+1)%2;
        for(i=0;i<7;i++)
        printf("%d",r[i]);
    }
    if(sum==3)
    {
        printf("\nError in data bit 1");
        printf("The correct code is");
        r[1]=(r[1]+1)%2;
        for(i=0;i<7;i++)
        printf("%d",r[i]);
    }
    if(sum==4)
    {
        printf("\n Error in chect bit 0");
        printf("The correct code is");
        r[4]=(r[4]+1)%2;
        for(i=0;i<7;i++)
        printf("%d",r[i]);
    }
    if(sum==5)
    {
        printf("\n Error in data bits 3");
        printf("The correct code is");
        r[3]=(r[3]+1)%2;
        for(i=0;i<7;i++)
        printf("%d",r[i]);
    }
    if(sum==6)
    {
        printf("Error in data bits 0");
        printf("The correct code");
        r[0]=(r[0]+1)%2;
        for(i=0;i<7;i++);
        printf("%d",r[i]);
    }
    if(sum==7)
    {
        printf("Error in data bits 2");
        printf("The correct code is");
        r[2]=(r[2]+1)%2;
        for(i=0;i<7;i++)
        printf("%d",r[i]);
    }
}
4

3 に答える 3

4

以下は、特にハミング符号と一般的な線形符号についての別の考え方です。ハミング コードをエンコードする 1 つの方法は、元のデータを渡し、チェックサムを追加することです。そのチェックサムは、元のデータの線形関数です (mod 2 演算で計算されます)。

データを受信したら、そこからチェックサムを計算し、mod 2 を受信したチェックサムに追加できます。結果がゼロの場合、2 つのチェックサムは同一であり、データを受け入れることもできます。

結果がゼロでない場合は、送信されたデータとそれを破損させたエラーのパターンの線形関数があります。2 つのチェックサムを追加すると、元のデータの線形関数と (エラー パターンが mod 2 に追加された元のデータ) の線形関数が加算されます。これは mod 2 の追加であるため、2 つのチェックサムを追加すると、元のデータからの 2 つの寄与が互いに相殺され、エンコードされたデータにはまったく依存せず、エラー パターンのみに依存する結果になります。この結果はシンドロームと呼ばれます(または少なくともシンドロームと同等です)。

したがって、エラー パターンが何であるかを調べる 1 つの方法は、考えられるすべてのエラー パターン (または少なくとも関心のあるエラー パターン) のシンドロームを計算し、それらのシンドロームをテーブルに格納することです。ハミング コードの場合、通常はすべてのシングル ビット エラー パターンを考慮します。これがシンドロームデコーディングです。

したがって、データを受信したら、シンドローム (期待されるチェックサムと受信したチェックサムの合計) を計算します。ゼロなら万事OK。そうでない場合は、シンドローム テーブルで検索し、存在する場合は、結果のエラー パターンを受信データに追加してエラーを修正します。そこにない場合は、シングル ビット エラー以外のエラー (おそらくダブル ビット エラー) が検出されています。

これを詳細に説明する理由の 1 つは、(十分な大きさのテーブルを作成できると仮定して) 同じアイデアを使用して、より複雑なエラー パターンを修正したり、異なるエラーの選択を修正したりできることを示すためです。可能性は非常に低いですが (表に記載しないでください)、ダブル ビット エラーが発生する可能性があります (そのため、スペースがあれば表に記載してください)。

より強力なエラー コードの場合、修正可能なエラーの数は管理不能になり、コードの構造を利用するより賢いアイデアを使用する必要があります。

于 2012-05-22T18:53:06.313 に答える
2

ビットは、考えられる各シングル ビット エラーが で一意のシグネチャを生成するように合計されsumます。たとえば、奇数番号のビットはすべてビット 0 に合計されるため、エラーが奇数番号のビットにある場合、署名は奇数になります。(まあ、サンプル プログラムの番号付けスキームはビットをごちゃ混ぜにしていますが、それが私がそれを実装する方法であり、ウィキペディアの記事が示す方法です。)

複数のハミング コードがあるため、ハミング (7,4) コードに関するウィキペディアの記事を必ずお読みください。

于 2012-05-22T14:25:41.790 に答える