86283

Дослідження простого перешкодостійкого коду Ріда-Малера

Курсовая

Информатика, кибернетика и программирование

Символи, за допомогою яких створюються повідомлення, утворюють первинний алфавіт, при цьому кожен символ характеризується ймовірністю його появи в повідомленні. Кожному повідомленням однозначно відповідає сигнал, який представляє певну послідовність елементарних дискретних символів, званих кодовими комбінаціями.

Украинкский

2015-04-05

223.5 KB

3 чел.

ЗМІСТ


ВСТУП

Кодування. Основні поняття та визначення

Розглянемо основні поняття, пов'язані з кодуванням інформації. Для передачі в канал зв'язку повідомлення перетворюються на сигнали. Символи, за допомогою яких створюються повідомлення, утворюють первинний алфавіт, при цьому кожен символ характеризується ймовірністю його появи в повідомленні. Кожному повідомленням однозначно відповідає сигнал, який представляє певну послідовність елементарних дискретних символів, званих кодовими комбінаціями. Кодування - це перетворення повідомлень в сигнал, тобто перетворення повідомлень в кодові комбінації. Код - система відповідності між елементами повідомлень і кодовими комбінаціями. Кодер - пристрій, що здійснює кодування. Декодер - пристрій, що здійснює зворотну операцію, тобто перетворення кодової комбінації в повідомлення. Алфавіт - безліч можливих елементів коду, тобто елементарних символів (кодових символів) X = {x i}, де i = 1, 2 ,..., m. Кількість елементів коду - m називається його основою. Для двійкового коду i = {0, 1} і m = 2. Кінцева послідовність символів даного алфавіту називається кодовою комбінацією (кодовим словом). Число елементів в кодової комбінації - n називається довжиною комбінації. Число різних кодових комбінацій (N = m n) називається об'ємом або потужністю коду.

Якщо 0 - число повідомлень джерела, то N ³ N 0. Безліч станів коду повинна покривати безліч станів об'єкта. Повний рівномірний n - значний код з основою m містить N = m n кодових комбінацій. Такий код називається примітивним.

Класифікація кодів

Коди можна класифікувати за різними ознаками:

- По підставі (кількості символів в алфавіті): бінарні (виконавчі m = 2) і не бінарні (m ≠ 2).

- По довжині кодових комбінацій (слів): рівномірні - якщо всі кодові комбінації мають однакову довжину; нерівномірні - якщо довжина кодової комбінації не постійна.

- За способом передачі: послідовні і паралельні; блокові - дані спочатку вкладаються у буфер, а потім передаються в канал і бінарні безперервні.

- За завадостійкості: прості (примітивні, повні) - для передачі інформації використовують всі можливі кодові комбінації (без надмірності);
коригувальні (перешкодозахисних) - для передачі повідомлень використовують не всі, а тільки частина (дозволених) кодових комбінацій.

-  У залежності від призначення і застосування умовно можна виділити наступні типи кодів:

Внутрішні коди - це коди, що використовуються усередині пристроїв. Це машинні коди, а також коди, що базуються на використанні позиційних систем числення (двійковий, десятковий, двійково-десятковий, вісімковий, шістнадцятковий та ін.) Найбільш поширеним кодом в ЕОМ є двійковий код, який дозволяє просто реалізувати апаратно пристрої для зберігання, обробки і передачі даних в двійковому коді. Він забезпечує високу надійність пристроїв і простоту виконання операцій над даними в двійковому коді. Двійкові дані, об'єднані в групи по 4, утворюють шістнадцятковий код, який добре узгоджується з архітектурою ЕОМ, що працює з даними кратними байту (8 біт).
Коди для обміну даними та їх передачі по каналах зв'язку. Широке поширення в ПК отримав код ASCII (American Standard Code for Information Interchange). ASCII - це 7-бітний код буквено-цифрових та інших символів. Оскільки ЕОМ працюють з байтами, то 8-й розряд використовується для синхронізації або перевірки на парність, або розширення коду. У ЕОМ фірми IBM використовується розширений двійково-десятковий код для обміну інформацією EBCDIC (Extended Binary Coded Decimal Interchange Code).

У каналах зв'язку широко використовується телетайпних код МККТТ (міжнародний консультативний комітет з телефонії та телеграфії) і його модифікації (МТК та ін.)

При кодуванні інформації для передачі по каналах зв'язку, в тому числі всередині апаратним трактах, використовуються коди, що забезпечують максимальну швидкість передачі інформації, за рахунок її стиснення та усунення надмірності (наприклад: коди Хаффмана і Шеннона-Фано), і коди забезпечують вірогідність передачі даних, за рахунок введення надмірності в передані повідомлення (наприклад: групові коди, Хеммінга, циклічні та їх різновиди).
Коди для спеціальних застосувань - це коди, призначені для вирішення спеціальних завдань передачі і обробки даних. Прикладами таких кодів є циклічний код Грея, який широко використовується в АЦП кутових і лінійних переміщень. Коди Фібоначчі використовуються для побудови швидкодіючих і завадостійких АЦП. Основна 
увага в курсі приділено кодами для обміну даними та їх передачі по каналах зв'язку.

Цілі кодування

а) Підвищення ефективності передачі даних, за рахунок досягнення максимальної швидкості передачі даних.

б) Підвищення завадостійкості при передачі даних.

У відповідності з цими цілями теорія кодування розвивається у двох основних напрямках: 

а) Теорія економічного (ефективного, оптимального) кодування займається пошуком кодів, що дозволяють в каналах без перешкод підвищити ефективність передачі інформації за рахунок усунення надмірності джерела і найкращого узгодження швидкості передачі даних з пропускною спроможністю каналу зв'язку.

б) Теорія завадостійкого кодування займається пошуком кодів, що підвищують вірогідність передачі інформації в каналах з перешкодами. 

Способи подання кодів

Залежно від застосовуваних методів кодування, використовують різні математичні моделі кодів, при цьому найбільш часто застосовується подання кодів у вигляді: кодових матриць; кодових дерев; многочленів; геометричних фігур і т.д. 


РОЗДІЛ 1
КОДИ РІДА-МАЛЕРА

Коди Ріда-Малера відносяться до лінійних двійкових кодів, що мають великі кодові відстані і виправляють завдяки цьому багато помилок. Вони придатні для каналів з малим відношенням сигнал/перешкода. Цей клас кодів цікавий тому, що з ним пов'язані багато інших сигнали, що застосовуються в радіотехнічних системах: ортогональні і біортогональні сигнали, симплексні коди, послідовності та коди Хеммінга.

Будемо розглядати найпростіші коди Ріда-Малера, слова яких є лінійними комбінаціями деяких двійкових функцій володіючих корисними для практики властивостями. Відразу зазначимо, що ці функції обрані такими, що їх відображення в полі дійсних чисел дає систему ортогональних функцій. Ця властивість використовується при декодуванні.

Дане обмеження означає, що в базис коди не входять вирішення двійкових функцій, тобто розглядається код Ріда-Малера 1-го порядку.

Кодове слово довжини n зазвичай розглядається як булева функція (або її інверсія), задана в 2m точках, тобто на наборах з m двійкових елементів. Можна багатьма способами нумерувати позиції кодового слова m-розрядними двійковими векторами. Будемо нумерувати позиції кодового слова числами в двійковій системі числення , де для . Зважаючи лінійності кодів Ріда-Малера кожен символ кодового слова представимо лінійно. комбінацією , або її інверсією , де - відомі інформаційні символи.

У таб. 1 наведені всі 16 кодованих інформаційних послідовностей і відповідні їм кодові слова. Звернемо увагу, що кодові слова правої половини таблиці є інверсією слів лівої половини.

Таблиця 1 – Кодові слова коду Ріда-Малера

Інформаційні символи

Кодове слово

Інформаційні символи

Кодове слово

0000

00000000

1000

11111111

0001

01010101

1001

10101010

0010

00110011

1010

11001100

0011

01100110

1011

10011001

0100

00001111

1100

11110000

0101

01011010

1101

10100101

0110

00111100

1110

11000011

0111

01101001

1111

10010110


РОЗДІЛ 2
НАДЛИШКОВІ КОДИ

Надлишкові коди - одне з найбільш ефективних засобів забезпечення високої достовірності переданих і прийнятих повідомлень.

Надлишкові коди можуть застосовуватися з метою тільки виявлення можливих помилок, або виправлення виявлених помилок. У всіх випадках бажано досягти максимальної корегуючої здібності. Але в залежності від конкретного побудови коду його здатність до виправлення тих чи інших помилок може змінюватися в широких межах.

При деяких значеннях n і k може бути знайдене така вдала побудова коду, при якій вага всіх дозволених ненульових комбінацій мало відрізняються один від одного і від половини максимально можливої ваги. При інших значеннях n і k може виявитися, що для деякої малої частини кодових комбінацій з їх загального числа відстань виявляється істотно меншою, ніж для більшості інших. Тому при розгляді характеристик кодів можна виявити, що близькі за надмірності і числу розрядів коди різко відрізняються один від одного за своїми корегуючими здібностями.

У кодах з однією перевіркою на парність міститься всього один перевірочний символ. Цей символ вибирається таким, щоб його сума за модулем два з усіма інформаційними символами дорівнювала нулю. Завдяки такому способу вибору перевірочного символу кодова комбінація містить парне число одиниць. І отже ознакою спотворення кодової комбінації є непарність одиниць у прийнятій комбінації. Даний код дозволяє тільки виявляти однократні помилки і всі помилки непарної кратності.

У кодах з простим повторенням положення метод повторення вихідної кодової комбінації. На приймальному боці комбінація складається з вихідної і при нульовій сумі комбінація приймається. Цей код дозволяє виявляти помилки, за винятком помилок в парних елементах.

Кореляційний код. Подвоюються символи, при цьому якщо в розряді інформаційної частини стоїть 0, то він замінюється на 01, а 1 - на 10. Сигналом помилки є поява 00 або 11.

У інверсному коді використовується повторення вихідної комбінації наступним чином: якщо комбінація містить непарне число одиниць, то замість 1 ставиться 0, а замість 0 - 1. Якщо парне число одиниць, то вона подвоюється без інверсії. На приймальному боці підраховується число одиниць і, якщо воно парне, то друга половинка інвертується і складається з першою. Якщо ж число одиниць парне, то друга складається з першої і повинен вийти 0.



РОЗДІЛ 3
АЛГОРИТМ КОДУВАННЯ РІДА-МАЛЕРА

Алгоритм кодування Ріда-Малера

Коди Ріда-Малера - це блокові коди, які будуються таким чином:
(1) (2) (3),

n-довжина блоку

K-число інформаційних символів

d-мінімальна кодова відстань

m-позитивне, умовне число не менше 3

s-порядок коду, який завжди менший, ніж m.

Тобто в залежності від порядку при одному і тому ж m можна отримати різні коди.

m = 4; s = 1,2,3; n = 2 4 = 16.

Побудова кодів Ріда-Малера зводиться до наступного.

На початку будується матриця G, перший рядок якої містить n одиниць. Далі слідують m рядків, сукупність яких зручно розглядати як (m * n)-матрицю, в якості стовпців якої обрані двійкові числа (починаючи з нуля). Номери розрядів двійкових чисел зручно вважати зверху вниз. Ці m рядків визначають вектори першого порядку d. Далі йдуть рядки векторів другого порядку, які виходять з усіх результатів двох рядків першого порядку, потім - рядки третього порядку, що є усіма результатами трьох рядків першого порядку і т д.

Приклад:т=3s=2п=2т=23=8

Для кодування визначається загальна кількість символів в блоці через інформаційні символи, підсумовуючи ненульові позиції відповідного стовпчика, що утворює матриці. Одиниці в стовпцях матриці G показують, які саме інформаційні символи Uk визначають значення символів Ui кодового слова.

Нехай прийшла послідовність:

Отримуємо: 11101011

Декодування здійснюється за мажоритарним принципом або принципом більшості.

Декодування здійснюється спочатку для всіх інформаційних символів (крім 1-го) на основі так званих парних компонентів. Починати запис таких рівнянь треба з векторів максимального порядку. У нашому прикладі s = 2 => перший виписується U k 5. 

0 0 0 1 0 0 0 1

Для векторів 2-го порядку парними вважаються компоненти:

00 ® 0

01 ® 1

На другому рівні поєднань кожен 0 з'єднується з кожної 1 попарно. Тепер у перевіряється рівність виписуються всі об'єднані позиції 1-го і 2-го рівнів.


Обчислюємо символ U
k6 

0 0 0 0 0 1 0 1


Для U k7: 

При декодуванні за допомогою векторів 1-го порядку ми також точно користуємося парними компонентами, але оскільки тут 1-ий рівень, то ми об'єднуємо просто 0 і 1, що стоїть на відповідних позиціях, і, по-друге, при декодуванні в отриманих рівняннях використовують не вихідне, а перетворене рівняння, яке виходить шляхом додавання за модулем два вихідного рівняння і векторів 2-го порядку, (тому що матриця має другу порядок),

0 1 0 1 0 1 0 1

0 0 1 1 0 0 1 1


0 0 0 0 1 1 1 1



Після цього ще раз перетворять вихідне вираз: до отриманого перетвореному висловом додаємо вектори 1-го порядку, які містять одиницю у відповідному інформаційному розряді.

Якщо в отриманому виразі отримали всі 1, то значить U k 1 = 1, а якщо все 0, то U k 1 = 0.

Якщо при передачі відбулися спотворення, то обчислюваний символ по кожній системі перевірок вибирається за мажоритарним принципом, в тому числі і для символу Uk1.

3.1 Розшифровка кодів Ріда-Малера

Основна ідея більшості логіки декодування побудувати кілька контрольних сум за кожний отриманий елемент кодового слова. Оскільки кожен з різних контрольних сум повинні мати те ж саме значення (тобто значення елемента вага слово повідомлення), то можна використовувати більшість логіку декодування, щоб розшифрувати значення елемента слово повідомлення. Після кожної порядок полінома декодується, отримав слово відповідним чином змінюється, видаливши відповідні кодові слова, зважених за внесками декодованого повідомлення, аж до сучасного етапу. Таким чином, для R Код замовлення RM-й, у нас є для декодування ітеративно R +1, раз, перш ніж ми прийдемо до остаточної отримала кодове слово. Крім того, значення бітів повідомлення обчислюється за допомогою цієї схеми, і, нарешті, можна обчислити кодового слова шляхом множення повідомлення слово (тільки декодувати) з допомогою породжує матриці.

Один ключ якщо декодування успішно, повинен мати всі нулі модифікований отримав повідомлення, в кінці ( р  + 1) етап декодування через більшість логіки декодування. Цей метод був запропонований Ірвінг С. Рід, і є більш загальним, при нанесенні на інші коди геометрії кінцевої.

3.2 Приклад кодера

Шляхом розподілу по частинах побудувати кодер для циклічного (15,11) - коду, заданого многочленом G (x) = х4 + х +1.

Тут n = 15; k = 11. Вибираємо ℓ = 4. Тоді s = 3, m0 = 3. Всього маємо 2 ℓ різних конфігурацій ℓ-відрізків. Залишки, що відповідають цим відрізкам, обчислені відповідно до алгоритму розподілу по частинах, наведено в табл. 2.

Нехай вхідна (інформаційна) послідовність, розділена на відрізки, має вигляд: 1101 1000 110

Вибираємо перший ℓ-відрізок 1101 і вибираємо з таблиці відповідний залишок 0100. Складаємо по mod2 з наступним відрізком 0100 +1000 = 1100. Отриманою сумі відповідає залишок 0111. Оскільки зроблено вже (s 1) кроків, додамо цей залишок до решти трьом бітам 0111 +110 = 1011. На цей результат знадобиться посилання, тому присвоїмо йому найменування Ys-1. З отриманої суми виділимо m0 лівих біт і доповнимо їх зліва нулями до розмірності ℓ (в даному випадку - одним нулем). Отримаємо 0101. З таблиці знайдемо залишок - 1111. Виконується s-й крок поділу. Залишилася «1» (праворуч) від Ys-1, з якого виділяли m0 лівих біт, складемо з боку старших розрядів з тільки - що отриманим залишком 1111 +1 = 0111. Це і є контрольні біти до інформаційної послідовності 1101 1000 110.

Результат можна перевірити традиційним розподілом послідовності А (х) х (nk) на G (x) (у нашому випадку 1101 1000 110 0000 на 10011).

Таблиця 2 – Залишки для ℓ-відрізків інформаційної послідовності

ℓ-відрізок

Залишок

ℓ-відрізок

Залишок

0000

0001

0010

0011

0100

0101

0110

0111

0000

0011

0110

0101

1100

1111

1010

1001

1000

1001

1010

1011

1100

1101

1110

1111

1011

1000

1101

1110

0111

0100

0001

0010



РОЗДІЛ 4
ТЕСТОВИЙ ПРИКЛАД

В якості тестового прикладу використовувалася комбінація 11001010000. У завданні до курсового проекту зазначено, що n = 16, а k = 11. Таким чином отримали твірну матрицю, яка має наступний вигляд:

Побудова матриці реалізовано програмно для заданих n і k.
Після кодування вихідної комбінації 11001010000 за отриманою утворюючої матриці отримали комбінацію1010111101010000. При цьому ми підсумовуємо ті розряди вихідної комбінації, на відповідних позиціях яких, в розглянутому стовпці твірної матриці, стоять одиниці. Наприклад, візьмемо четвертий стовпець. Одиниці є в розрядах 1,2,3,6. При підсумовуванні цих розрядів отримаємо 0. Тобто в закодованій комбінації в четвертому розряді отримали 0.

Декодування здійснюється за мажоритарним ознакою, тобто при декодуванні кожен розряд комбінації перевіряється кількома рівняннями. Завдяки цьому можна уникнути помилок при передачі. Навіть якщо в будь-якому розряді помилка, вона поміняє результат тільки одного рівняння. А в решті результат залишиться той самий.

 РОЗДІЛ 5

ПРОГРАМА MAGIC CODER

 5.1 Керівництво для користувача

Magic Coder - це тестова програма для реалізованих кодів: БЧХ і RM.

Після запуску програми з'являється вікно. У ньому ви можете вибрати, який Вас код. Всі функції, надані програмою, будуть використовувати його у своїй роботі.

Натиснувши на кнопку "Додатково", ви відкриєте вікно, в якому можна вводити інформаційне слово, а у відповідь отримувати його кодований варіант (кодове слово). Повторне натискання кнопки «Додатково» закриває вікно.

5.2 Меню «Файл»

Воно складається з наступних пунктів:

а) Кодувати

б) Декодувати

в) Вихід

При виборі пункту «Кодувати», програма попросить вказати файл, який ви хочете кодувати. Потім буде запитано ім'я файлу, в який програма запише кодований варіант вихідного файлу. Типово, кодовані файли мають розширення «. Enc». Кодування проводиться кодом, який обраний у списку головного вікна.

Для того щоб декодувати файл, виберіть пункт меню «Декодувати». Програма попросить вказати кодований файл, а також ім'я файлу, в який буде записаний декодований варіант файлу. Декодування проводиться тим кодом, яким він був кодований (інформація про код береться зі спеціального заголовка у файлі), незалежно від того, який код на даний момент вибрано в головному вікні.

Якщо ж ви хочете завершити роботу з програмою, то виберіть пункт "Вихід".

5.3 Меню «Код»

Воно складається з наступних пунктів:

а) Аналіз коду

б) Демонстрація

Пункт «Аналіз коду» при активації відкриває вікно, в якому проводиться аналіз наступного роду: скільки помилок і якого ваги здатний виправити код. Даний аналіз дозволяє визначити поведінку коду при помилках в кодових словах, виправлення яких не закладено в нього. Наприклад, БЧХ (5, 15, 7) з побудови здатний виправити будь-які помилки, вага яких не перевищує 3-ох.

Однак, після аналізу стає видно, що він здатний виправляти деякі помилки ваги 4 і 5. Пару слів про те, як інтерпретувати результати. У колонці «Виправлено» виводиться число пар {кодове слово, вектор помилки} таких, що код зумів правильно декодувати слово, отримане накладенням вектора помилки на кодове слово (операція xor). У колонці «Не виправлено» - число інших пар.

При виборі пункту «Демонстрація», програма попросить вас вказати файл із зображенням (bmp або jpg). Після цього з'явиться вікно, в якому можна візуально порівняти різницю між передачею інформації з зашумленого каналу без кодування і з кодуванням. У центрі відображається оригінальне зображення, ліворуч - зображення, передане через канал, а праворуч - зображення, кодоване перед передачею, і декодувати після.

Типово, шумів немає. Відповідно немає і різниці між виведеними зображеннями. Рівень шумів задається бігунком у верхній частині вікна. Під рівнем шумів розуміється рівномірно-розподілена ймовірність помилки при передачі одного біта інформації. При установці мінімального рівня, ймовірність помилки дорівнює 0, а при установці максимального рівня - 1, що призводить до інвертування всіх переданих біт.

Зображення, що не поміщаються у відведеному ділянці вікна повністю, можна прокручувати мишею, попередньо затиснувши кнопку миші на зображенні.

5.4 Додавання нових кодів

Якщо ви хочете додати підтримку нового коду, то ви повинні зробити наступне:

• Додати новий модуль до проектом MagicCoder.dpr.

• В отриманому модулі створити спадкоємця класу TCode, наприклад, TMyCode.

• Перекрити методи:

GetK

GetN

GetName

Encode

Decode

• При бажанні перекрити методи:

GetD

GetDescription

GetFullName

• Додати до модуль секції initialization і finalization такого змісту:

initialization

  RegisterCode (TMyCode)

finalization

  UnRegisterCode (TMyCode)

Цього буде достатньо для того, щоб додати повну підтримку нового коду.

Модуль «RM.pas», що реалізує код Ріда-Малера наведений в додатку Б.


ВИСНОВКИ

В ході курсової роботи було досліджено простий перешкодостійкий код, а саме код Ріда-Малера. Даний код виявляє помилки, але не виправляє їх. Розглядався випадок, коли n = 16, k = 11, тому в матриці присутні тільки вектора першого і другого порядку. Проте якщо з'явиться необхідність використовувати також вектора третього порядку, то утворює матриця стане значно більше, що не вигідно з точки зору економії пам'яті. При цьому також збільшиться довжина закодованої комбінації, що збільшить час передачі повідомлення по каналу зв'язку.



СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ

  1.  Березюк М.Т. «Кодування Інформації» - 1978.
  2.  Конопелько В. К., Липницький В. А., Дворніков В. Д. та ін Теорія прикладного кодування: Учеб. Посібник. У 2 т. Т. 2. - Мн.: БДУІР, 2004. - 398 с.: Іл.
  3.  Блейхут Р. Теорія і практика кодів, контролюючих помилки. Москва: Мир, 1986 г.
  4.  Корольов А. І. Коди й пристрої завадостійкого кодування інформації. Мінськ, 2010.
  5.  Мак-Вільямс Ф. Дж., Слоен Н. Дж. А. Теорія кодів, що виправляють помилки. М.: Зв’язок, 1979 г.
  6.  http://en.wikipedia.org/wiki/Reed%E2%80%93Muller_code


ДОДАТКИ


Додаток А

Текст програми

//------------------------------------------------ ---------------------------
# Include <vcl.h>
# Pragma hdrstop
# Include "Unit1.h"
//------------------------------------------------ ---------------------------
# Pragma package (smart_init)
# Pragma resource "*. dfm"
TForm1 * Form1;
const N = 16;
const K = 11;
char * s;
int f, l [11], l1 [16];
//------------------------------------------------ ---------------------------
__fastcall TForm1:: TForm1 (TComponent * Owner)
: TForm (Owner)
{Int i, j;
for (i = 0; i <N; i + +)
{StringGrid1-> Cells [i] [0] = 1;}
for (i = 0; i <N; i + +)
{StringGrid1-> Cells [i] [1] = 0;
i + +; StringGrid1-> Cells [i] [1] = 1;}
for (i = 0; i <N; i + +)
{StringGrid1-> Cells [i] [2] = 0;
i + +; StringGrid1-> Cells [i] [2] = 0;
i + +; StringGrid1-> Cells [i] [2] = 1;
i + +; StringGrid1-> Cells [i] [2] = 1;}
for (i = 0; i <N; i + +)
{If (i <N / 2)
{StringGrid1-> Cells [i] [4] = 0;}
else
{StringGrid1-> Cells [i] [4] = 1;}
}
for (i = 0; i <N; i + +)
{If (7 <i & & i <12 | | 4> i & & i <8)
{StringGrid1-> Cells [i] [3] = 0;}
else {StringGrid1-> Cells [i] [3] = 1;}
}
int b;
int k1, k2, a = 5;
j = 1; b = 1;
for (j; j <4; j + +)
{For (i = 0; i <N; i + +)
{K1 = StringGrid1-> Cells [i] [b]. ToInt ();
j + +; k2 = StringGrid1-> Cells [i] [j]. ToInt (); j -;
if (k1 == 1 & & k2 == 1)
{StringGrid1-> Cells [i] [a] = 1;}
else
{StringGrid1-> Cells [i] [a] = 0;}
}
a + +;}
b = 2; j = 2;
for (j; j <4; j + +)
{For (i = 0; i <N; i + +)
{K1 = StringGrid1-> Cells [i] [b]. ToInt (); j + +;
k2 = StringGrid1-> Cells [i] [j]. ToInt (); j -;
if (k1 == 1 & & k2 == 1)
{StringGrid1-> Cells [i] [a] = 1;}
else
{StringGrid1-> Cells [i] [a] = 0;}
}
a + +;
}
b = 3; j = 3;
for (j; j <4; j + +)
{For (i = 0; i <N; i + +)
{K1 = StringGrid1-> Cells [i] [b]. ToInt (); j + +;
k2 = StringGrid1-> Cells [i] [j]. ToInt (); j -;
if (k1 == 1 & & k2 == 1)
{StringGrid1-> Cells [i] [a] = 1;}
else
{StringGrid1-> Cells [i] [a] = 0;}
}
}
s = ""; Edit1-> Text = s;
Edit1-> MaxLength = 12;
Memo1-> Text = s;
Memo1-> Lines-> Add ("U1 = Uk1");
Memo1-> Lines-> Add ("U2 = Uk1 + Uk2");
Memo1-> Lines-> Add ("U3 = Uk1 + Uk3");
Memo1-> Lines-> Add ("U4 = Uk1 + Uk2 + Uk3 + Uk6");
Memo1-> Lines-> Add ("U5 = Uk1 + Uk4");
Memo1-> Lines-> Add ("U6 = Uk1 + Uk2 + Uk4 + Uk7");
Memo1-> Lines-> Add ("U7 = Uk1 + Uk3 + Uk4 + Uk9");
Memo1-> Lines-> Add ("U8 = Uk1 + Uk2 + Uk3 + Uk4 + Uk6 + Uk7 + Uk9");
Memo1-> Lines-> Add ("U9 = Uk1 + Uk5");
Memo1-> Lines-> Add ("U10 = Uk1 + Uk2 + Uk5 + Uk8");
Memo1-> Lines-> Add ("U11 = Uk1 + Uk3 + Uk5 + Uk10");
Memo1-> Lines-> Add ("U12 = Uk1 + Uk2 + Uk3 + Uk5 + Uk6 + Uk8 + Uk10");
Memo1-> Lines-> Add ("U13 = Uk1 + Uk4 + Uk5 + Uk11");
Memo1-> Lines-> Add ("U14 = Uk1 + Uk2 + Uk4 + Uk5 + Uk7 + Uk8 + Uk11");
Memo1-> Lines-> Add ("U15 = Uk1 + Uk3 + Uk4 + Uk5 + Uk9 + Uk10 + Uk11");
Memo1-> Lines-> Add ("U16 = Uk1 + Uk2 + Uk3 + Uk4 + Uk5 + Uk6 + Uk7 + Uk8 + Uk9 + Uk10 + Uk11");}
//------------------------------------------------ ---------------------------
void __fastcall TForm1:: BitBtn1Click (TObject * Sender)
{S = Edit1-> Text.c_str ();
for (int i = 1; i <K +1; i + +)
{L [i-1] = StrToInt (s [i]);}
for (int i = 0; i <N; i + +)
{F = 0;
for (int j = 0; j <K; j + +)
{If (StringGrid1-> Cells [i] [j] == 1)
{F = l [j] + f; if (f == 2) f = 0;
}
l1 [i] = f;
}
}
for (int i = 0; i <N; i + +)
{StringGrid2-> Cells [i] [0] = l1 [i];
}
}
//------------------------------------------------ ---------------------------
void __fastcall TForm1:: Button2Click (TObject * Sender)
{Int ed, nul, i, j, perem [4];
int l2 [16]; int edin1 = 0, edin2 = 0, edin3 = 0, edin4 = 0, edin5 = 0, edin6 = 0;
ed = 0; nul = 0;
for (int i = 0; i <N; i + +)
{L1 [i] = StringGrid2-> Cells [i] [0]. ToInt ();}
for (i = 0; i <N; i + +)
{L2 [i] = l1 [i];}
perem [0] = l1 [0] + l1 [4] + l1 [8] + l1 [12]; perem [1] = l1 [1] + l1 [5] + l1 [9] + l1 [13];
perem [2] = l1 [2] + l1 [6] + l1 [10] + l1 [14]; perem [3] = l1 [3] + l1 [7] + l1 [11] + l1 [15];
for (i = 0; i <4; i + +)
{If (perem [i] == 1 | | perem [i] == 3)
{Perem [i] = 1; + + ed;}
else
{Perem [i] = 0; + + nul;}
}
if (nul <ed)
{StringGrid3-> Cells [10] [0] = 1; edin1 = 10;}
else
{StringGrid3-> Cells [10] [0] = 0;}
//------------------------------
ed = 0; nul = 0;
perem [0] = l1 [0] + l1 [2] + l1 [8] + l1 [10]; perem [1] = l1 [1] + l1 [3] + l1 [9] + l1 [11];
perem [2] = l1 [4] + l1 [6] + l1 [12] + l1 [14]; perem [3] = l1 [5] + l1 [7] + l1 [13] + l1 [15];
for (i = 0; i <4; i + +)
{If (perem [i] == 1 | | perem [i] == 3)
{Perem [i] = 1; + + ed;}
else
{Perem [i] = 0; + + nul;}
}
if (nul <ed)
{StringGrid3-> Cells [9] [0] = 1; edin2 = 9;}
else
{StringGrid3-> Cells [9] [0] = 0;}
//----------------------------
ed = 0; nul = 0;
perem [0] = l1 [0] + l1 [2] + l1 [4] + l1 [6]; perem [1] = l1 [1] + l1 [3] + l1 [5] + l1 [7];
perem [2] = l1 [8] + l1 [10] + l1 [12] + l1 [14]; perem [3] = l1 [9] + l1 [11] + l1 [13] + l1 [15];
for (i = 0; i <4; i + +)
{If (perem [i] == 1 | | perem [i] == 3)
{Perem [i] = 1; + + ed;}
else
{Perem [i] = 0; + + nul;}
}
if (nul <ed)
{StringGrid3-> Cells [8] [0] = 1; edin3 = 8;}
else
{StringGrid3-> Cells [8] [0] = 0;}
//----------------------------
ed = 0; nul = 0;
perem [0] = l1 [0] + l1 [1] + l1 [8] + l1 [9]; perem [1] = l1 [2] + l1 [3] + l1 [10] + l1 [11];
perem [2] = l1 [4] + l1 [5] + l1 [12] + l1 [13]; perem [3] = l1 [6] + l1 [7] + l1 [14] + l1 [15];
for (i = 0; i <4; i + +)
{If (perem [i] == 1 | | perem [i] == 3)
{Perem [i] = 1; + + ed;}
else
{Perem [i] = 0; + + nul;}
}
if (nul <ed)
{StringGrid3-> Cells [7] [0] = 1; edin4 = 7;}
else
{StringGrid3-> Cells [7] [0] = 0;}
//---------------------------
ed = 0; nul = 0;
perem [0] = l1 [0] + l1 [1] + l1 [4] + l1 [5]; perem [1] = l1 [2] + l1 [3] + l1 [6] + l1 [7];
perem [2] = l1 [8] + l1 [9] + l1 [12] + l1 [13]; perem [3] = l1 [10] + l1 [11] + l1 [14] + l1 [15];
for (i = 0; i <4; i + +)
{If (perem [i] == 1 | | perem [i] == 3)
{Perem [i] = 1; + + ed;}
else
{Perem [i] = 0; + + nul;}
}
if (nul <ed)
{StringGrid3-> Cells [6] [0] = 1; edin5 = 6;}
else
{StringGrid3-> Cells [6] [0] = 0;}
//----------------------------
ed = 0; nul = 0;
perem [0] = l1 [0] + l1 [1] + l1 [2] + l1 [3]; perem [1] = l1 [4] + l1 [5] + l1 [6] + l1 [7];
perem [2] = l1 [8] + l1 [9] + l1 [10] + l1 [11]; perem [3] = l1 [12] + l1 [13] + l1 [14] + l1 [15];
for (i = 0; i <4; i + +)
{If (perem [i] == 1 | | perem [i] == 3)
{Perem [i] = 1; + + ed;}
else
{Perem [i] = 0; + + nul;}
}
if (nul <ed)
{StringGrid3-> Cells [5] [0] = 1; edin6 = 5;}
else
{StringGrid3-> Cells [5] [0] = 0;}
/ / ПОВІДОМЛЕННЯ
if (edin1! = 0)
for (i = 0; i <N; i + +)
{L1 [i] = l1 [i] + StringGrid1-> Cells [i] [10]. ToInt ();}
if (edin2! = 0)
for (i = 0; i <N; i + +)
{L1 [i] = l1 [i] + StringGrid1-> Cells [i] [9]. ToInt ();}
if (edin3! = 0)
for (i = 0; i <N; i + +)
{L1 [i] = l1 [i] + StringGrid1-> Cells [i] [8]. ToInt ();}
if (edin4! = 0)
for (i = 0; i <N; i + +)
{L1 [i] = l1 [i] + StringGrid1-> Cells [i] [7]. ToInt ();}
if (edin5! = 0)
for (i = 0; i <N; i + +)
{L1 [i] = l1 [i] + StringGrid1-> Cells [i] [6]. ToInt ();}
if (edin6! = 0)
for (i = 0; i <N; i + +)
{L1 [i] = l1 [i] + StringGrid1-> Cells [i] [5]. ToInt ();}
for (i = 0; i <N; i + +)
{If (l1 [i] == 1 | | l1 [i] == 3 | | l1 [i] == 5 | | l1 [i] == 7)
{L1 [i] = 1;}
else
{L1 [i] = 0;}
}
//-----------------------------------
int edin7 = 0, edin8 = 0, edin9 = 0, edin10 = 0;
ed = 0; nul = 0;
int perem1 [8];
perem1 [0] = l1 [0] + l1 [8]; perem1 [1] = l1 [1] + l1 [9];
perem1 [2] = l1 [2] + l1 [10]; perem1 [3] = l1 [3] + l1 [11];
perem1 [4] = l1 [4] + l1 [12]; perem1 [5] = l1 [5] + l1 [13];
perem1 [6] = l1 [6] + l1 [14]; perem1 [7] = l1 [7] + l1 [15];
for (i = 0; i <4; i + +)
{If (perem1 [i] == 1 | | perem1 [i] == 3 | | perem1 [i] == 5 | | perem1 [i] == 7)
{Perem1 [i] = 1; + + ed;}
else
{Perem1 [i] = 0; + + nul;}
}
if (nul <ed)
{StringGrid3-> Cells [4] [0] = 1; edin7 = 6;}
else
{StringGrid3-> Cells [4] [0] = 0;}
//------------------------------
ed = 0; nul = 0;
perem1 [0] = l1 [0] + l1 [4]; perem1 [1] = l1 [1] + l1 [5];
perem1 [2] = l1 [2] + l1 [6]; perem1 [3] = l1 [3] + l1 [7];
perem1 [4] = l1 [8] + l1 [12]; perem1 [5] = l1 [9] + l1 [13];
perem1 [6] = l1 [10] + l1 [14]; perem1 [7] = l1 [11] + l1 [15];
for (i = 0; i <4; i + +)
{If (perem1 [i] == 1 | | perem1 [i] == 3 | | perem1 [i] == 5 | | perem1 [i] == 7)
{Perem1 [i] = 1; + + ed;}
else
{Perem1 [i] = 0; + + nul;}
}
if (nul <ed)
{StringGrid3-> Cells [3] [0] = 1; edin8 = 7;}
else
{StringGrid3-> Cells [3] [0] = 0;}
//----------------------------------
ed = 0; nul = 0;
perem1 [0] = l1 [0] + l1 [2]; perem1 [1] = l1 [1] + l1 [3];
perem1 [2] = l1 [4] + l1 [6]; perem1 [3] = l1 [5] + l1 [7];
perem1 [4] = l1 [8] + l1 [10]; perem1 [5] = l1 [9] + l1 [11];
perem1 [6] = l1 [12] + l1 [14]; perem1 [7] = l1 [13] + l1 [15];
for (i = 0; i <4; i + +)
{If (perem1 [i] == 1 | | perem1 [i] == 3 | | perem1 [i] == 5 | | perem1 [i] == 7)
{Perem1 [i] = 1; + + ed;}
else
{Perem1 [i] = 0; + + nul;}
}
if (nul <ed)
{StringGrid3-> Cells [2] [0] = 1; edin9 = 8;}
else
{StringGrid3-> Cells [2] [0] = 0;}
//----------------------------
ed = 0; nul = 0;
perem1 [0] = l1 [0] + l1 [1]; perem1 [1] = l1 [2] + l1 [3];
perem1 [2] = l1 [4] + l1 [5]; perem1 [3] = l1 [6] + l1 [7];
perem1 [4] = l1 [8] + l1 [9]; perem1 [5] = l1 [10] + l1 [11];
perem1 [6] = l1 [12] + l1 [13]; perem1 [7] = l1 [14] + l1 [15];
for (i = 0; i <4; i + +)
{If (perem1 [i] == 1 | | perem1 [i] == 3 | | perem1 [i] == 5 | | perem1 [i] == 7)
{Perem1 [i] = 1; + + ed;}
else
{Perem1 [i] = 0; + + nul;}
}
if (nul <ed)
{StringGrid3-> Cells [1] [0] = 1; edin10 = 9;}
else
{StringGrid3-> Cells [1] [0] = 0;}
/ / 2-e перетворення
int l3 [11];
if (edin7! = 0)
for (i = 0; i <N; i + +)
{L1 [i] = l1 [i] + StringGrid1-> Cells [i] [4]. ToInt ();}
if (edin8! = 0)
for (i = 0; i <N; i + +)
{L1 [i] = l1 [i] + StringGrid1-> Cells [i] [3]. ToInt ();}
if (edin9! = 0)
for (i = 0; i <N; i + +)
{L1 [i] = l1 [i] + StringGrid1-> Cells [i] [2]. ToInt ();}
if (edin10! = 0)
for (i = 0; i <N; i + +)
{L1 [i] = l1 [i] + StringGrid1-> Cells [i] [1]. ToInt ();}
for (i = 0; i <N; i + +)
{If (l1 [i] == 1 | | l1 [i] == 3 | | l1 [i] == 5)
{L1 [i] = 1;}
else
{L1 [i] = 0;}
}
//-------------------------------
int perem2 = 0;
for (i = 0; i <N; i + +)
{If (l1 [i] == 1)
{+ + Ed;}
else
{+ + Nul;}
}
if (nul <ed)
{StringGrid3-> Cells [0] [0] = 1;}
else
{StringGrid3-> Cells [0] [0] = 0;}
}
//------------------------------------------------ ---------------------------

 Додаток Б

Модуль «RM.pas»

unit RM

interface

uses

  BitsUtils, Code, MathUtils, Windows, SysUtils, Classes;

{Параметри коду Ріда-Малера за замовчуванням}

const

  DEF_RM_M = 5;

  DEF_RM_R = 2;

type

  ERMCode = class (ECode);

  TRMCode = class (TCode)

  private

  {Параметри коду Ріда-Малера}

    FM: Integer;

    FR: Integer;

  {Нові параметри коду Ріда-Малера. Ці поля використовуються

    set-методами властивостей R, M. Коли обидва поля приймають ненульові

    значення, перевіряється допустимість цих параметрів. Якщо

    вони допустимі, то відбувається створення нової породжує матриці

    і т.п. }

    FNewM: Integer;

    FNewR: Integer;

    FGkRows: array of Integer;

      {Масив числа рядків в мінорі G_k породжує матриці.

        Використовується при декодуванні для збільшення продуктивності}

    procedure FreeCode;

      {Звільняє пам'ять зайняту матрицею, характеристичними

        векторами і FGkRows}

    procedure FreeCharacterVectors;

      {Звільняє пам'ять зайняту характеристичними векторами}

    procedure FreeGeneratorMatrix;

      {Звільняє пам'ять зайняту матрицею}

  protected

    FK: Integer;

      {Розмір інформаційної властивості}

    FN: Integer;

      {Розмір кодового слова}

    FG: array of TWord;

      {Матриця}

    FCharacterVectors: array of array of TWord;

      {Характеристичні вектори для рядків матриці}

    procedure BuildGeneratorMatrix;

      {Будує матрицю}

    procedure BuildCharacterVectors;

      {Будує характеристичні вектори для рядків матриці.

        Використовується для прискорення процесу декодування}

    procedure GenerateCode;

      {Перевіряє допустимість FNewR і FNewM. Якщо все гаразд,

        викликає FreeCode, а потім BuildGeneratorMatrix і

        BuildCharacterVectors.

        FNewR, FNewM скидаються в 0}

    procedure FillE (var E: array of Integer; Monomial: array of Integer);

      {Заповнює безліч E, що складається з індексів змінних від 1 до M

        не входять в моном Monomial. Використовується при генерації

        характеристичних векторів.

        Приклад: M = 3. Monomial = [1]. Тоді E = [2, 3]}

    procedure NextIndexes (var Indexes: array of Integer);

      {Генерує всілякі перестановки на M елементах довжини

        Length (Indexes).

        Використовується при генерації рядків матриці}

  {Set-методи властивостей}

    procedure SetM (Value: Integer);

    procedure SetR (Value: Integer);

  {Перекриті методи, успадковані від TCode}

    function GetK: Integer; override;

    function GetN: Integer; override;

    function GetFullName: String; override;

    class function GetName: String; override;

  public

    constructor Create (AOwner: TComponent); override;

    destructor Destroy; override;

  {Перекриті методи, успадковані від TCode}

    procedure Encode (Word: TWord; CodeWord: TCodeWord); override;

    procedure Decode (RecievedWord: TCodeWord; Word: TWord); override;

  {Властивості класу}

    property K: Integer read GetK;

    property N: Integer read GetN;

  published

  {Published властивості автоматично зберігаються при записі класу в

    потік, і відновлюються при створенні класу з потоку.

    При декодуванні це дозволяє створити код Ріда-Малера

    з тими параметрпми, які використовувалися при кодуванні}

    property M: Integer read FM write SetM default DEF_RM_M;

    property R: Integer read FR write SetR default DEF_RM_R;

  end; {TRMCode}



 

А также другие работы, которые могут Вас заинтересовать

12648. Символьні обчислення в документі Mathcad 1.29 MB
  Лабораторна робота №3 Символьні обчислення в документі Mathcad. Мета роботи: навчитися працювати з символьним процесором системи Mathcad. Завдання : опрацювати наведені приклади скласти звіт. Символьні обчислення в документі Mathcad. Команди що відносяться до робо
12649. Вирішення систем рівнянь за допомогою блоку Given-Find 67 KB
  Лабораторна робота №4 Вирішення систем рівнянь за допомогою блоку GivenFind. Мета роботи: навчитись вирішувати системи рівнянь в аналітичному вигляді. Завдання: вирішити за допомогою наведені MATHCAD приклади. Вирішення систем рівнянь MATHCAD здійснює чисельними методам
12650. Вирішення оптимізаційних завдань в пакеті MATHCAD 127 KB
  Лабораторна робота №5 Вирішення оптимізаційних завдань в пакеті MATHCAD Мета роботи: навчитись вирішувати оптимізаційні завдання в пакеті MATHCAD Завдання: опрацювати наведені приклади скласти звіт. Оптимізаційні завдання можна розділити на два класи: завдання без...
12651. Чисельне вирішення одного диференціального рівняння 37.5 KB
  Лабораторна робота №6 Чисельне вирішення одного диференціального рівняння. Мета роботи: Навчитися вирішувати диференційні рівняння в пакеті MATHCAD. Завдання: відтворити наведені приклади скласти звіт. MATHCAD 2000 дозволяє без додаткових перетворень чисельно вирішити д
12652. Чисельне рішення систем диференціальних рівнянь 79 KB
  Лабораторна робота №7 Чисельне рішення систем диференціальних рівнянь. Мета роботи: навчитися вирішувати системи диференціальних рівнянь за допомогою пакету С. Завдання: відтворити в пакеті MATHCAD вирішення наведених прикладів. Диференціальні рівняння що входять...
12653. Странный аттрактор 105.5 KB
  Лабораторна робота № Странный аттрактор Одна из самых знаменитых динамических систем предложена в 1963 г. Лоренцом в качестве упрощенной модели конвективных турбулентных движений жидкости в нагреваемом сосуде тороидальной формы. Система состоит из трех ОДУ и имеет тр...
12654. Модели динамики биологических популяций 73.5 KB
  Лабораторная работа №9 Модели динамики биологических популяций Модель взаимодействия хищник жертва независимо предложили в 1925-1927 гг. Лотка и Вольтерра. Два дифференциальных уравнения листинг 9 моделируют временную динамику численности двух биологических популяц
12655. ОРГАНИЗАЦИЯ МЕДИЦИНСКОГО СНАБЖЕНИЯ ФОРМИРОВАНИЙ И УЧРЕЖДЕНИЙ МС ГО 64 KB
  В то же время выход из строя производственных мощностей и гибель части имущества в очагах поражения будут в значительной степени ограничивать возможности формирований и учреждений МС ГО в оказании медицинской помощи.
12656. ИЗУЧЕНИЕ МЕТОДИКИ ЭКСПЕРИМЕНТАЛЬНОГО ИССЛЕДОВАНИЯ ЭЛЕКТРОННЫХ СХЕМ 71.5 KB
  ЛАБОРАТОРНАЯ РАБОТА № 1 ИЗУЧЕНИЕ МЕТОДИКИ ЭКСПЕРИМЕНТАЛЬНОГО ИССЛЕДОВАНИЯ ЭЛЕКТРОННЫХ СХЕМ Цель работы: Изучение измерительных приборов лаборатории полупроводниковых устройств. Освоение основных приемов измерения электрических парамет