ハミング距離によるエラー検出および訂正のためのC言語実装方法


  1. ハミング距離の計算方法: ハミング距離は、2つの等しい長さのビット列の間の異なるビットの数を計算します。以下は、2つのビット列のハミング距離を計算するC言語の関数の例です。
#include <stdio.h>
int hammingDistance(char* str1, char* str2, int length) {
    int distance = 0;
    for (int i = 0; i < length; i++) {
        if (str1[i] != str2[i]) {
            distance++;
        }
    }
    return distance;
}
int main() {
    char* bitString1 = "1010101";
    char* bitString2 = "1001001";
    int length = 7;
    int distance = hammingDistance(bitString1, bitString2, length);
    printf("Hamming Distance: %d\n", distance);
    return 0;
}
  1. エラー検出: ハミング距離を使用してエラーを検出する方法です。送信側は、データにパリティビットを追加して送信します。受信側では、受信したデータとパリティビットのハミング距離を計算し、距離が0でない場合はエラーが発生したことを検出します。以下は、エラー検出のためのC言語の関数の例です。
#include <stdio.h>
int checkErrorDetection(char* data, int length) {
    int errorDetected = 0;
    char parityBit = data[length - 1];
    data[length - 1] = '\0'; // パリティビットを一時的に削除
    int distance = hammingDistance(data, "0000000", length - 1); // 送信時のパリティビットを含めない
    if (distance != 0) {
        errorDetected = 1;
    }
    data[length - 1] = parityBit; // パリティビットを元に戻す
    return errorDetected;
}
int main() {
    char* data = "10101010"; // パリティビットを含むデータ
    int length = 9; // パリティビットを含むデータの長さ
    int errorDetected = checkErrorDetection(data, length);
    if (errorDetected) {
        printf("Error detected!\n");
    } else {
        printf("No errors detected.\n");
    }
    return 0;
}
  1. エラー訂正: ハミング距離を使用してエラーを訂正する方法です。送信側は、データに冗長ビットを追加して送信します。受信側では、受信したデータと冗長ビットのハミング距離を計算し、最も近いビット列を正しいデータとして訂正します。以下は、エラー訂正のためのC言語の関数の例です。
#include <stdio.h>
void correctError(char* data, int length) {
    int minDistance = length + 1; // 初期値を最大距離よりも大きく設定
    int errorIndex = -1;
    char parityBit = data[length - 1];
   data[length - 1] = '\0'; // パリティビットを一時的に削除
    // すべての可能なデータパターンとの距離を計算して最小距離を見つける
    for (int i = 0; i < length - 1; i++) {
        int distance = hammingDistance(data, "0000000", length - 1); // 送信時のパリティビットを含めない
        if (distance < minDistance) {
            minDistance = distance;
            errorIndex = i;
        }
        data[i] = (data[i] == '0') ? '1' : '0'; // 次のデータパターンを試すためにビットを反転させる
    }
    if (minDistance > 0) {
        printf("Error corrected at index: %d\n", errorIndex);
    } else {
        printf("No errors detected.\n");
    }
    data[length - 1] = parityBit; // パリティビットを元に戻す
}
int main() {
    char* data = "10101010"; // 冗長ビットを含むデータ
    int length = 9; // 冗長ビットを含むデータの長さ
    correctError(data, length);
    printf("Corrected data: %s\n", data);
    return 0;
}

上記のコード例を使用して、ハミング距離によるエラー検出および訂正の方法を実装することができます。これにより、データの送信時および受信時に発生するエラーを検出し、必要に応じて訂正することができます。