разное / ИТ / Лабораторная 8 / Комментарии к восьмой
.docВведение
Циклическим кодом называется линейный блоковый (n,k)-код, который характеризуется свойством цикличности, т.е. сдвиг влево на один шаг любого разрешенного кодового слова дает также разрешенное кодовое слово, принадлежащее этому же коду и у которого, множество кодовых слов представляется совокупностью многочленов степени (n-1) и менее, делящихся на некоторый многочлен g(x) степени r = n-k, являющийся сомножителем двучлена xn+1. Многочлен g(x) называется порождающим.
Длина циклического кода называется примитивной и сам код называется примитивным, если его длина n=qm-1. Если длина кода меньше длины примитивного кода, то код называется укороченным или непримитивным. Как следует из определения общее свойство кодовых слов циклического кода - это их делимость без остатка на некоторый многочлен g(x), называемый порождающим. Результатом деления двучлена xn+1 на многочлен g(x) является проверочный многочлен h(x). При декодировании циклических кодов используются многочлен ошибок e(x) и синдромный многочлен S(x). Многочлен ошибок степени не более (n-1) определяется из выражения e(x)=¢(x)+(x), где ¢(x), (x) - многочлены, отображающие соответственно принятое (с ошибкой) и переданное кодовые слова. Ненулевые коэффициенты в e(x) занимают позиции, которые соответствуют ошибкам.
Синдромный многочлен, используемый при декодировании циклического кода, определяется как остаток от деления принятого кодового слова на порождающий многочлен.
В процессе декодирования по принятому кодовому слову вычисляется синдром, затем в таблице находится соответствующий многочлен е(х), суммирование которого с принятым кодовым словом дает исправленное кодовое слово, т.е.i(x)=i¢(x)+ei(x). Перечисленные многочлены (x), ¢(x), g(x), h(x), e(x), S(x) можно складывать, умножать и делить, используя известные правила алгебры, но с приведением результата по mod 2, а затем по mod xn+1, если степень результата превышает степень (n-1).
Матричное задание кодов
Циклический код может быть задан порождающей и проверочной матрицами. Для их построения достаточно знать порождающий g(x) и проверочный h(x) многочлены. Для несистематического циклического кода матрицы строятся циклическим сдвигом порождающего и проверочного многочленов, т.е. путем их умножения на x
При построении матрицы H(n,k) старший коэффициент многочлена h(x) располагается справа.
Одна из основных задач, стоящих перед разработчиками устройств защиты от ошибок при передаче дискретных сообщений по каналам связи является выбор порождающего многочлена g(x) для построения циклического кода, обеспечивающего требуемое минимальное кодовое расстояние для гарантийного обнаружения и исправления t-кратных ошибок. В данной лабораторной работе для контроля целостности данных будут использоваться CRC коды.
Порядок выполнения лабораторной работы
Как и в лабораторной работе №6 для примера я возьму длину кода равную 7. И построю по нему циклический код. Нечего говорить, что каждый из вас должен взять свой вариант( такой же, что и в шестой).
На самом деле, циклический код, как мы увидим далее, можно построить по-разному (в зависимости от выбора делителя), но я буду строить по принципу(7,4,3). Надеюсь, вы помните, что это значит. Как выясняется уже после разбиения на полиномы, такой код оказывается возможным. При этом СRС основан на операции деления и получения остатков, значений которых не безгранично и замыкается в кольцо.
Общая схема будет следующая


где
R- остаток, то есть CRC
P- код делителя, он же неприводимый полином
Q - наш код, информационный
Множитель x3 появляется вследствие сдвига в коде информационных битов проверочными (конечно, возможны и другие трактовки).
1 Построение образующего и проверочного полинома
Из определения CRC вначале «Пояснения», который я выделил жирным цветом и которое я хочу, чтобы вы понимали дословно что означает, понятно, что главное это разобраться на что бы поделить наш код. Эта попытка разобраться приведёт нас к важным понятиям для CRC порождающего и проверочного полинома.
Итак, их того же определения нам нужно, чтобы х7-1 делилось на что-то. То есть нужно представить его в виде произведения сомножителей. Причём, если разложить правильно, то при делении будет получаться кольцо остатков (или лучше сказать цикл остатков), что я ещё докажу.
Вместо х х1 х2 х3 х4 х5 х6 х7 х8 х9 х10
Получим х х1 х2 х3 х4 х5 х6 х7 х1 х2 х3
Вообще-то полином х7-1, как и любой из ваших полиномов J, не легко разбить на множители(я прошу множетели со степенью >1, потом объясните мне сами почему). Это не тривиальная задача. Кроме того, спешу напомнить, что мы работаем в алгебре не обычной, умножение заменено конъюнкцией, а сложение производиться по модулю 2. Я вам советую для этих целей написать программу переборную, но вряд ли универсальную. Например, в моём случае «ручками» я попробовал (x-1)
х7-1=(x-1)(x6 +x5+x4+x3+x2+x1+1)
Затем предположим, что
х7-1= (x-1)(x3 +…)( x3 +…)
И вот тут программно перебор даст
х7-1= (x-1)(x3 +x2 +1)( x3 +x +1),
где выбирем g(x)= ( x3 +x +1);
h(x)= (x-1)(x3 +x2 +1) =x4+ x2+x1+1
2 Циклы и полиномы
Здесь я хочу пояснить понятие цикла из остатков и полиномов и значений чисел. Давайте будем передавать значения 1 со сдвигом вправо 1, 10, 100…, что по определению и являестя циклическим кодом, также будем делить на наше выражение на наш выделенный порождающий полином и находить остатки.
|
Что передаём |
Остаток |
Действия |
|
1 |
1 |
|
|
х |
x |
|
|
х2 |
х2 |
|
|
х3 |
x+1 |
|
|
х4 |
х2+х |
|
|
х5 |
х2+х+1 |
|
|
х6 |
х2+1 |
|
|
х7 |
1 |
|
Всё это можно сделать и более привычным способом, например для х3
x
3
x3+x+1
x3+x+1

x+1
и так далее. Я к этому комментарию сброшу вам также pdf, в котором ещё раз разъясняются правила умножения и деления в данной алгебре.
3 Построение порождающей матрицы
Я ещё раз обращаю внимание на слова «блоковый, разделимый код» в определении циклического кода. Фактически эти слова говорят нам, что мы вновь сможем работать с понятиями порождающеё матрицы( умножение информационного вектора на которую даст нам циклический код) и проверочной матрицы( транспонируя и умножая на неё мы получим синдром ошибки). В данном разделе остановимся на первом понятии.
Итак, порождающая матрица будет иметь вид:
G
=

Заполним её значениями из таблицы в предыдущем разделе(напомню, что код сдвинут на три позиции влево из-за наличия проверочных и начнём с четвёртой строки). x+1 запишется как 011; х2+х+1 -111 и т.д. получим:
G
=

4 Построение проверочной матрицы
Проверочная матрица имеет вид H(n,i)=|Ki,kT, Ii|; где Ii - единичная матрица;
Ki,kT - прямоугольная матрица в транспонированном виде матрицы Ki,k из порождающей матрицы. Если проще объяснять, то проверочная матрица построится по аналогии с проверочной из кода Хэмминга. И в моём случае будет иметь вид:
H =

4 Промоделируем передачу
Сформируем кодовое слово исследуемого кода, введем одиночную ошибку и покажем ее исправление путем вычисления синдрома. Произведение любого кодового слова G1 на транспонированную проверочную матрицу дает нулевой вектор размерности (n-i): Gi·Hn,iT =[00...]
Возьмем любой код из порождающей матрицы G, умножим на HT и проверим на наличие ошибки:

5 Допустим ошибку
в первом бите(когда будите оформлять смотрите на оформление соответствующего пункта в шестой лабораторной)

5 Различия кодов Хэмминга и CRC
Хочу подчеркнуть на отличия от кодов Хэмминга. Отталкнёмся от исходных данных для CRC. Помните, мы могли выбрать любой из полиномов в качестве порождающего
х7-1= (x-1)(x3 +x2 +1)( x3 +x +1),
Если мы взяли x-1, чего я просил не делать и указал, что объясню почему, то мы бы получили:
i=1; k=6;
Что соответствует максимальной избыточности и теоретически позволяет исправлять любое число ошибок.
Всем удачи!!!
