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