0

您好,我无法在实现汉明代码的代码中查明错误。基本上它的作用是:获取一条消息(比如说ASCII a:01100001)将它乘以矩阵H,从而为该消息生成控制位(奇偶校验位)。我们这样做是为了确保如果某些位(在我的情况下最多 2 位)传输错误,它仍然可以成功解码。我的矩阵 H 是 8x16。所以编码的消息看起来像:0110000110011110(0-7 位是消息位,8-15 位是控制位)

...

如果我在控制位中有 2 个错误,那么理论上我的代码无法解码消息。如果消息位中有 2 个错误,则它会成功解码。如果任何地方出现 1 个错误,它也会成功解码。当我在说索引 14 和 15 中更改两位时,它会检测到索引 6 和 7 中的错误。我认为我的错误在这个函数的某个地方:

 internal static void CorrectChar(List<int> message, List<int> errorVector, int[,] matrix_H)
    {
        if (errorVector.Count != ROWS)
        {
            throw new ArgumentOutOfRangeException("Liczba bitów wiadomości i liczba kolumn macierzy kodowej są różne.");
        }
        else
        {
            int wrongBitIndex = -1;
            int wrongBitIndex1 = -1;
            int wrongBitIndex2 = -1;
            // szukanie kolumny macierzy H identycznej do wektora błędu
            for (int i = 0; i < COLUMNS; i++)
            {
                bool identical = true;
                for (int j = 0; j < ROWS; j++)
                {
                    if (matrix_H[j, i] != errorVector[j])
                    {
                        identical = false;
                        break;
                    }
                }
                if (identical)
                {
                    wrongBitIndex = i;
                    break;
                }
            }
            // searching matrix columns which sum equals errorVector
            if (wrongBitIndex == -1)
            {
                for (int i = 0; i < COLUMNS - 1; i++)
                {
                    bool identical = false;
                    for (int j = i + 1; j < COLUMNS; j++)
                    {
                        identical = true;
                        for (int k = 0; k < ROWS; k++)
                        {                              
                            bool tmp1 = matrix_H[k, i] == 1;
                            bool tmp2 = matrix_H[k, j] == 1;
                            bool tmp3 = errorVector[k] == 1;
                            Console.WriteLine($"ijk=({i},{j},{k}        m[{k}, {i}] ^ m[{k},{j}]={tmp3 != tmp1 ^ tmp2}      errorVctor[{k}]={tmp3}");
                            if (tmp3 != tmp1 ^ tmp2)
                            {
                                //Console.WriteLine($"ijk=({i},{j},{k}        m[{k}, {i}] ^ m[{k},{j}]={tmp3 != tmp1 ^ tmp2}      errorVctor[{k}]={tmp3}");
                                identical = false; //XOR NA WYBRANYCH KOLUMNACH MACIERZY H - SPRAWDZENIE CZY SA 2 BLEDY
                                break;
                            }
                        }
                        if (identical)
                        {
                            //Console.WriteLine($"======IDENTICAL======\nij=({i},{j})");
                            wrongBitIndex1 = i;
                            wrongBitIndex2 = j;
                            i = COLUMNS;
                            break;
                        }
                    }
                    //if (identical)
                    //{
                    //    break;
                    //}
                }
            }

            if (wrongBitIndex != -1)
            {
                // korekcja jednego błędu
                FlipBit(message, wrongBitIndex);
                Console.Write($"Poprawiam 1 błąd na pozycji: {wrongBitIndex + 1}... ");
            }
            else if (wrongBitIndex1 != -1 && wrongBitIndex2 != -1)
            {
                // korekcja dwóch błędów
                FlipBit(message, wrongBitIndex1);
                FlipBit(message, wrongBitIndex2);
                Console.Write($"Poprawiam 2 błędy na pozycjach: {wrongBitIndex1 + 1} i {wrongBitIndex2 + 1}... ");
            }
            Console.WriteLine($"poprawnie zakodowana wiadomość ma postać:\n{Logic.ToString(message)}");
        }
    }

您可以在我的 github 上找到完整代码:https ://github.com/janwadolowski/Telecommunication-hamming-code/blob/master/TiPS_1/TiPS_1/Logic.cs

我花了很多时间研究这个函数,以至于我不能再批判性地思考这段代码了。

4

0 回答 0