Реализовать процесс декодирования кода Голея - C#

Узнай цену своей работы

Формулировка задачи:

Приветствую. Нужна помощь. Как реализовать процесс декодирования? Есть пример, но не могу разобраться, нужно до завтра дописать код. http://bmstu-sm5.narod.ru/ivanov/ivanov_goley_metoda.pdf
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.IO;
 
namespace ConsoleApplication1
{
    class Test
    {
        static void Main()
        {
            char[] data = new char[12];
            int[] encoded = new int[23];
            int[] edata = new int[23];
            int[] syndrome = new int[7];
            int[,] hmatrix = new int[4, 15]{{1,0,0,0,1,0,0,1,0,1,1,0,1,1,1},
                                            {0,1,0,0,1,1,0,0,1,0,1,1,0,1,1},
                                            {0,0,1,0,0,1,1,1,0,0,1,1,1,0,1},
                                            {0,0,0,1,0,0,1,0,1,1,0,1,1,1,1}};
 
            char[,] gmatrix = new char[11, 23] {{'1','0','0','0','0','0','0','0','0','0','0','1','0','0','1','1','1','0','0','0','1','1','1'},
                                                {'0','1','0','0','0','0','0','0','0','0','0','1','0','1','0','1','1','0','1','1','0','0','1'},
                                                {'0','0','1','0','0','0','0','0','0','0','0','1','0','1','1','0','1','1','0','1','0','1','0'},
                                                {'0','0','0','1','0','0','0','0','0','0','0','1','0','1','1','1','0','1','1','0','1','0','0'},
                                                {'0','0','0','0','1','0','0','0','0','0','0','1','1','0','0','1','1','1','0','1','1','0','0'},
                                                {'0','0','0','0','0','1','0','0','0','0','0','1','1','0','1','0','1','1','1','0','0','0','1'},
                                                {'0','0','0','0','0','0','1','0','0','0','0','1','1','0','1','1','0','0','1','1','0','1','0'},
                                                {'0','0','0','0','0','0','0','1','0','0','0','1','1','1','0','0','1','0','1','0','1','1','0'},
                                                {'0','0','0','0','0','0','0','0','1','0','0','1','1','1','0','1','0','1','0','0','0','1','1'},
                                                {'0','0','0','0','0','0','0','0','0','1','0','1','1','1','0','0','0','0','0','1','1','0','1'},
                                                {'0','0','0','0','0','0','0','0','0','0','1','0','1','1','1','1','1','1','1','1','1','1','1'}};
            int i, j;
            Console.Write("\nКод Голея. Кодирование\n\nВведите 12-битовое слово: \n");
            for (int d = 0; d < 12; d++)
            {
                data[d] = Convert.ToChar(Console.ReadLine());
            }
            Console.Write("\nПорождающая матрица\n");
            for (i = 0; i < 11; i++)
            {
                for (j = 0; j < 23; j++)
                {
                    Console.Write("{0} \t|", gmatrix[i, j]);
                }
                Console.WriteLine();
            }
            Console.WriteLine("\nКодированные данные\n");
            for (i = 0; i < 23; i++)
            {
                for (j = 0; j < 11; j++)
                    encoded[i] += ((data[j] - 0) * (gmatrix[j, i] - 0));
                encoded[i] = encoded[i] % 2;
                Console.Write("{0} |", encoded[i]);
            }
 
            Console.Write("\nКод Голея. Декодирование\n\nВведите кодированные данные : \n");
            for (i = 0; i < 23; i++)
                edata[i] = Convert.ToChar(Console.ReadLine());
            Console.ReadKey();
        }
    }
}

Решение задачи: «Реализовать процесс декодирования кода Голея»

textual
Листинг программы
static class Program
{
    const int sz_in  = 12;  // размер данных
    const int sz_out = 23;  // рамер закодированного сигнала
    const int g = 0xC75;    // образующий полином 110001110101
    const int r18 = 0x6CC;  // 2^17 mod2 g = 11011001100
    const int r17 = 0x366;  // 2^16 mod2 g = 01101100110
    const int e18 = 1 << 17;
    const int e17 = 1 << 16;
 
    static string IntToBS(this int Data, int Size = sz_out)
    {
        return Convert.ToString(Data, 2).PadLeft(Size, '0');
    }
 
    static int BSToInt(string BinaryString)
    {
        return Convert.ToInt32(BinaryString, 2);
    }
 
    // умножение (по модулю 2)
    static int Mul2(int x, int y)
    {
        int m = 0;
        while (y != 0)
        {
            if ((y & 1) != 0) m ^= x;
            y >>= 1;
            x <<= 1;
        }
        return m;
    }
 
    // деление с остатком (по модулю 2)
    static int Div2(int x, int y, out int rem, int size = sz_out)
    {
        int mask = 1 << size - 1; // маска старшего бита
        int n = 1, div = 0; rem = x;
 
        while ((y & mask) == 0) { y <<= 1; n++; }
 
        while (n-- != 0)
        {
            div <<= 1;
            if ((rem & mask) != 0)
            {
                rem ^= y;
                div |= 1;
            }
            y >>= 1;
            mask >>= 1;
        }
        return div;
    }
 
    // Деление (по модулю два)
    static int Div2(int x, int y, int size = sz_out)
    {
        int rem; return Div2(x, y, out rem, size);
    }
 
    // Число единиц в двоичной записи
    static int Bits(int x)
    {
        int n = 0;
        while (x > 0) { n++; x &= x - 1; }
        return n;
    }
 
    // Циклический сдвиг влево (на count бит)
    static int Lshl(int x, int count = 1, int size = sz_out)
    {
        int mask = 1 << size;
        return x >> sz_out - count | x << count & mask - 1;
    }
 
    // Циклический сдвиг вправо (на count бит)
    static int Lshr(int x, int count = 1, int size = sz_out)
    {
        int mask = 1 << size;
        return x >> count | x << sz_out - count & mask - 1;
    }
 
    // Кодирование
    static int Encode(int Data)
    {
        return Mul2(Data, g);
    }
 
    // Расшифровка. Метод ловли ошибок
    static bool TryDecode(int Signal, out int Result)
    {
        bool f = false; Result = 0;
        int x, syndrome, r, e; 
        for (int n = 0; n < sz_out; n++)
        {
            x = Div2(Signal, g, out syndrome);
 
            if (f = Bits(e = syndrome) < 4) ;
            else if (f = Bits(e = syndrome ^ r17) < 3) e |= e17;
            else if (f = Bits(e = syndrome ^ r18) < 3) e |= e18;
                
            if (f)
            {
                // Если ошибки были найдены, убираем их,
                // сдвигаем все назад и снова делим
                Result = Div2(Lshl(Signal ^ e, n), g);
                return true;
            }
            Signal = Lshr(Signal);
        }
        return false;
    }
 
    static int Decode(int Signal)
    {
        int word; TryDecode(Signal, out word);
        return word;
    }
 
    static void Main()
    {
        int x = BSToInt("10010011100111110001101");
        int y = Decode(x);
 
        Console.WriteLine("Пример с методички:");
        Console.WriteLine("сигнал: " + IntToBS(x));
        Console.WriteLine("слово: " + IntToBS(y, sz_in));
        Console.WriteLine();
 
        int s = new Random().Next();
        var r = new Random(s);
            
        y = new Random().Next(0, 1 << sz_in);
        x = Encode(y);
 
        Console.WriteLine("Случайный пример (seed = {0}):", s);
        Console.WriteLine(IntToBS(y, sz_in) + " - информационное слово");
        Console.WriteLine(IntToBS(x, sz_out) + " - сигнал");
 
        for (int i = 0; i < 3; i++) x ^= 1 << r.Next(sz_out + 1);
        Console.WriteLine(IntToBS(x, sz_out) + " - испорченный сигнал");
        Console.WriteLine(TryDecode(x, out y) ?
            IntToBS(y, sz_in) + " - декодированное слово" :
            "Слишком много ошибок");
 
        Console.ReadKey();
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.133 из 5
Похожие ответы