Циклічні коди
Циклічним кодом називається лінійний блоковий (n, m) - код, в якого безліч кодових слів представляється сукупністю багаточленів ступеня (n – 1) і менш, що діляться на деякий багаточлен Р(x) ступеня k = n – m, що є співмножником двочлена (xn +1). Багаточлен Р(x) називається таким, що породжує чи породжуючим. Як випливає з визначення загальна властивість кодових слів циклічного коду – це їх подільність без залишку на деякий багаточлен Р(x), званий породжуючим.
З відомих завадостійких кодів циклічні коди відрізняються високою ефективністю виявлення спотворень і порівняльною простотою реалізації кодуючих і декодуючих пристроїв. Назва цією класу кодів відбулася від їх властивості, що полягає у тому, що якщо кодова комбінація а0, а1, а2,..., аn-1, аn, належать коду А, то комбінація аn, а0, а1, а2,..., аn-1, одержана циклічною перестановкою елементів, також належить коду А, тобто зсув вліво на один крок будь-якого дозволеного кодового слова дає також дозволене кодове слово, що належить цьому ж коду.
Циклічні коди достатньо часто описуються з використанням багаточленів змінної х. Для побудови таких кодів цифри двійкового коду слід розглядати як коефіцієнти багаточлена змінної х, де х – основа системи числення. У двійкових кодах х = 2. Наприклад, записане в двійковому коді повідомлення 1001101 може бути представлене багаточленом виду
1·х6 + 0·х5 + 0·х4 + 1·х3 + 1·х2 + 0·х1 + 1·х0 = х6 + х3 + х2 + х0.
При такому представленні кодів математичні операції з отриманими багаточленами здійснюються відповідно до законів звичної алгебри, за винятком того, що складання здійснюється по модулю 2: ха + ха = 0, ха + 0 = ха,
0 + 0 = 0.
Ідея побудови циклічних кодів базується на використанні багаточленів, що не приводяться. Багаточленом, що не приводяться, називається багаточлен, який не може бути представленим у вигляді добутку багаточленів нижчих ступенів, тобто такий багаточлен ділитися тільки на самого себе або на одиницю і не ділитися ні на який інший багаточлен (аналог простих чисел). На такий багаточлен ділитися без залишку двочлен xn +1. Багаточлени, що не приводяться, в теорії циклічних кодів грають роль поліномів, що утворюють, чи утворюючих поліномів.
У найбільш розповсюдженому варіанті контрольна ознака циклічного коду розраховується із застосуванням виразу, що генерує коди:
(mod Р),
де як символ коду аі розглядається вихідна т – значна інформаційна послідовність G(x), яка підлягає кодуванню. Отже, в цьому випадку, оскільки та , кількість доданків в сумі дорівнює одиниці (і =1). Тоді як множник слід використати величину, яка забезпечить в подальшому, після кодування, вільне місце для запису k надлишкових символів. Оскільки для цього слід забезпечити зсув інформаційної послідовність G(x), яка підлягає кодуванню, на ці ж k позицій, то ваговий коефіцієнт сі = с повинен мати вигляд чи з використанням поліноміального запису . У результаті множення G(x) на xk ступінь кожного одночлену, що входить в G(x), підвищується на k. Тоді вираз для розрахунку контрольної ознаки набуває вигляду:
(mod Р).
Як значення обраного модуля – Р використовується один із уже згаданих утворюючих поліномів P(x), ступінь якого дорівнює k. Ці поліноми вибираються із відповідних таблиць.
Операція обчислення лишку по деякому модулю, наразі це утворюючий поліном – P(x), виконується за правилом:
(mod Р) = – [] · P(x),
де позначка [] означає обчислення цілої частини від виразу в дужках. Позначимо цю цілу частину через C(x). Тоді:
(mod Р) =– C(x)· P(x), (1)
чи
F(x) = C(x) · P(x) =+. (2)
Звернемо увагу на те, що оскільки ступінь утворюючого поліному P(x) дорівнює k, частка C(x) має таку ж ступінь, як і кодова комбінація G(x), тому C(x) є кодовою комбінацією цього ж простого k-значного коду. Слід зауважити, що ступінь залишку не може бути більше ступеня утворюючого поліному, тобто його найвища ступінь дорівнює (k – 1). Отже, найбільше число розрядів залишку R(x) не перевищує числа k.
Звернемо увагу на два висновки, які витікають із аналізу виразу (2).
По-перше, після розподілу (2) на утворюючий поліном P(x) одержимо:
F(x)/P(x) = C(x) = (xk·G(x) + R(x))/P(x).
Тобто сума результату множення кодової комбінації G(x) простого коду на одночлен xk і залишку R(x)
xkG(x) + R(x) (3)
ділиться націло на утворюючий поліном P(x):
C(x) = (xkG(x) + R(x))/P(x),
а отже є шуканим циклічним кодом.
По-друге, результат множення кодової комбінації С(x) простого коду на утворюючий поліном P(x):
F(x) = C(x) · P(x)
дорівнює величині (3), також ділиться націло на утворюючий поліном P(x):
F(x)/P(x) = C(x),
а отже також є шуканим циклічним кодом.
Таким чином, процедура кодування, тобто одержання кодової комбінації циклічного n-значного коду може бути здійснена двома способами:
1) множенням кодової комбінації G(x) простого коду на одночлен xk і додаванням до цього добутку залишку R(x), отриманого в результаті розподілу добутку xkG(x) на утворюючий поліном P(x). Звернемо увагу, що процедура одержання залишку R(x) може бути реалізованою як R(x) = xkG(x) mod P(x).
2) множенням інформаційної послідовності – кодової комбінації G(x) простого m - значного коду на утворюючий поліном P(x). Звернемо увагу, що остання процедура може бути реалізованою як (mod Р), де як символ коду аі розглядається вихідна т – значна інформаційна послідовність G(x), яка підлягає кодуванню. Отже, в цьому випадку, оскільки та , кількість доданків в сумі дорівнює одиниці (і =1). Як множник слід використати утворюючий поліном P(x), а як значення модуля – величину , що є еквівалентним виконанню лише операції множення G(x)·P(x).
При побудові циклічних кодів першим способом розташування інформаційних символів у всіх комбінаціях строго впорядковане – вони займають m старших розрядів комбінації, а решта (k = n – m) розрядів відводяться під контрольні. Тобто, при такому методі побудови коефіцієнти при вищих ступенях х є значеннями інформаційних розрядів, а коефіцієнти при ступенях порядку (k – 1) і нижче - є перевірочними. Нагадаємо, що такі коди мають назву роздільних несистематичних (надлишкові символи мають чітко визначені позиції і не є лінійними комбінаціями інформаційних).
При другому способі утворення циклічних кодів інформаційні і контрольні символи в комбінаціях циклічного коду не відокремлені один від одного, що утрудняє процес декодування. Такі коди мають назву нероздільних систематичних (надлишкові символи не мають чітко визначених позицій і є лінійними комбінаціями інформаційних).
Приклад реалізації першого способу кодування.Дано: n = 7, m = 4,
k = 3 і Р(x) = х3 + х + 1 = 1011. Потрібно закодувати повідомлення
G(x) = х3 + х2+ + 1 = 1101.
Множимо кодову комбінацію G(x) вихідного коду на одночлен xk = х3, і одержуємо xk·G(x) = х6 + х5 + х3. Надалі ділимо цей добуток на утворюючий поліном Р(x) = х3 + х + 1, в наслідок чого одержимо:
х6 + х5 + х3 х3 + х + 1
х6 + х4 + х3 х3 + х2 + х+ 1
х5 + х4
х5 + х3 + х2
х4+ х3 + х2
х4+ х2 + х
х3 + х
х3 + х + 1
R(x) = 1
У результаті цій операції одержимо залишок R(x) = 1.
Додаючи добуток х3G(х) до одержаного залишку, одержимо кодовий багаточлен
F(x) = x3G (х) + R (x) = х6 + х5 + х3+ 1.
У двійковому коді цьому багаточлену відповідає кодова комбінація 1101001, в якій перевірочні розряди займають три останні позиції і яку слід передавати каналом зв’язку.
В разі відсутності спотворень на приймальному боці прийнята кодова комбінація F/(x) повністю збігається із переданою F/(x) = F(x) = х6 + х5 + х3+ 1 і повинна ділитися на утворюючий багаточлен Р(x) без залишку:
У результаті цій операції одержимо частку С(x) = х3 + х2 + х + 1 та залишок R(x) = 0, що відповідає нашім очікуванням.
х6 + х5 + х3 + 1 х3 + х + 1
х6 + х4 + х3 х3 + х2 + х + 1
х5 + х4 + 1
х5 + х3 + х2
х4 + х3 + х2 + 1
х4 + х2 + х
х3 + х + 1
х3 + х + 1
R(x) = 0
Приклад реалізації другого способу кодування.Дано: n = 7, m = 4, k = = 3 і Р(x) = х3 + х + 1= 1011. Потрібно закодувати повідомлення х3 + х2 + х0 =
= 1101.
Для кодування даного повідомлення 1101, відповідного багаточлену
G(х) = х3 + х2 + 1, помножимо Р(х) на G(х):
х3 + х + 1
х3 + х2 + 1
х3 + х + 1
х5 + х3 + х2
х6 + х4+ х3
х6 + х5 + х4 + х3 + х2 + х + 1
У двійковому коді цьому багаточлену відповідає кодова комбінація
F(x) = G(х) · Р(x) = х6 + х5 + х4 + х3 + х2 + х + 1 = 1111111,
яку слід передавати каналом зв’язку і в якій контрольні символи не відокремлені один від одного. Отже маємо нероздільний систематичний код (надлишкові символи не мають чітко визначених позицій і є лінійними комбінаціями інформаційних).
В разі відсутності спотворень ця кодова комбінація повинна ділитися на утворюючий багаточлен Р(x) без залишку:
х6 + х5 + х4 + х3 + х2+ х + 1 х3 + х + 1
х6 + х4 + х3 х3 + х2 + 1
х5 + х2 + х + 1
х5 + х3 + х2
х3 + х + 1
х3 + х + 1
R(x) = 0
У результаті цій операції одержимо частку С(x) = х3 + х2 + 1 та залишок R(x) = 0, що відповідає нашім очікуванням. Звернемо увагу, що частка С(x) є тим повідомленням, яке кодувалося циклічним кодом.
Розглянуті міркування надають можливість стверджувати наступне. В разі наявності спотворень прийняте повідомлення, яке позначимо F/(x), можна представити у вигляді суми двох доданків: багаточлена, сформованого на передаючій стороні F(x), і багаточлена спотворення Е(х): F/(x) = F(x) + Е(х). Цей багаточлен слід розділити на Р(х).
F/(x) = (F(x) + Е(х))/ Р(х) = F(x) / Р(х) + Е(х)/ Р(х).
Якщо ділення здійснюється без залишку, що є можливим лише при
Е(х) = 0, оскільки F(x) / Р(х) = 0 за визначенням коду, то ухвалюється рішення, що інформація не спотворена. В іншому випадку слід ухвалити рішення, що інформація має спотворення.
Отже, процедура декодування, при застосуванні циклічного коду в режимі виявлення спотворень, полягає, перш за все, у визначенні факту відсутності чи наявності спотворень. Із цією метою, незалежно від процедури кодування, здійснюється розподіл прийнятого повідомлення F/(x) на утворюючий поліном Р(х) та аналіз одержаного при цьому залишку.
Якщо ділення здійснюється без залишку, то ухвалюється рішення, що інформація не спотворена. Тоді, в разі використання першого способу кодування, прийнятим вважається повідомлення, одержане шляхом відкидання від прийнятого поліному F/(x) усіх членів, ступінь яких є меншою за k. У разі ж використання другого способу кодування, прийнятим вважається повідомлення, яке є часткою від розподілу прийнятого повідомлення F/(x) на утворюючий поліном Р(х), тобто поліном С(x).
Якщо ділення здійснюється із залишком, то прийнята інформація має спотворення, не може бути використаною для подальших операцій над нею і ухвалюється рішення, щодо подальших кроків.
У разі застосування циклічного коду, як коду з виправленням спотворень, процедура декодування включає аналіз залишку, що одержано після ділення прийнятої кодової комбінація на утворюючий багаточлен, визначення місця спотворення та його усунення. Ця процедура розглядається нижче.
Одна з основних задач, що стоять перед розробниками захисних пристроїв від помилок при передачі дискретних повідомлень по каналах зв’язку є вибір породжуючого багаточлена Р(x) для побудови циклічного коду, що забезпечує необхідну мінімальну кодову відстань для гарантійного виявлення та виправлення t-кратних спотворень.
Існують спеціальні таблиці з вибору Р(x) в залежності від пропонованих вимог до корегуючих можливостям коду. Приклад такої таблиці (табл. 1) наведено. Однак у кожного циклічного коду є свої особливості формування Р(x). Тому при вивченні конкретних циклічних кодів розглядаються відповідні способи побудови Р(x).
Таблица 1k-ступінь поліному G(х) | Породжуючий поліном G(х) | Запис поліному по mod 2 | Запис поліному по mod 8 | n | m | Примітка |
x+1 | 11 | 3 | 3 | 2 | Код с перевіркою на парність | |
x 2+ x +1 | 111 | 7 | 3 | 1 | Код с повторенням | |
x 3+ x 2+1 | 1101 | 13 | 7 | 4 | Класичний код | |
x 3+ x +1 | 1011 | 15 | 7 | 4 | Код Хеммінга | |
x4+ x3+1 | 11001 | 31 | 15 | 11 | Класичний код | |
x4+ x+1 | 10011 | 23 | 15 | 11 | Код Хеммінга | |
x4+ x2+ x+1 | 10111 | 27 | 7 | 3 | Коди Файра- Абрамсона | |
x4+ x3+ x2+1 | 11101 | 35 | 7 | 3 | ||
x5+ x2+1 | 100101 | 45 | 31 | 26 | Класичний код | |
x5+ x3+1 | 101001 | 51 | 31 | 26 | Код Хеммінга | |
… | … | … | … | … | ||
x6+ x5+ x4+ + x3+ x2+ x1+1 | 1111111 | 177 | 7 | 1 | Код с повторенням | |
... | ... | ... |