Реализовать процесс декодирования кода Голея - 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(); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д