Лекція 10. Кодування із захистом від помилок при послідовній передачі даних
Курс “Теорія інформації та кодування”

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

Циклічні коди
Потокові (згорткові) коди
Інші популярні напрямки кодування
Огляд класифікації та застосування

10.1 Циклічні коди

Загальна характеристика циклічного коду
Нагадаємо, що назва "циклічних" кодів пов'язана з особливістю побудови їх утворючої матриці: всі її рядки утворюються циклічним зсувом першого рядка. Ці коди також часто позначаються абревіатурою CRC (Cyclic redundancy check - циклічна надлишкова перевірка). Вимоги до CRC-кодів зважаючи на сферу їх застосування ілюструє рис.10.1:

Рисунок 10.1 Вимоги до циклічного коду

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

- для передачі по лініях зв'язку характерно виникнення "пачок" помилок в сусідніх розрядах. Наприклад, при спотворенні сигналу, який несе кілька біт інформації. Ключовою вимогою до коду є виявлення таких випадків. При цьому виправлення виявлених помилок виконується методом перезапиту. Виходячи зі згаданих вимог оптимальним математичним інструментом кодування є операції з поліномами;

- ми уже знаємо, що будь-яка кодова послідовність може бути представлена у вигляді поліному f(x). Зокрема, ознакою правильності коду може бути зокрема його подільність без остачі на певний утворюючий поліном g(x) (як серед чисел виділяються ті, що діляться, наприклад, на десяткове 11). Щоб забезпечити таку подільність, при кодуванні до числа (полінома), що передається, слід додати остачу r(x), а при декодувані перевірити збереження подільності;

- структура утворючого поліному коду відображує структуру першого рядка утворюючої матриці, а отже — задає всі властивості коду. Наприклад, десятковому числу 11 відповідає двійкове 1011, а отже й поліном g(x)=x3+x+1 (порівняймо із прикладом утворюючої матриці на рис.10.3). Вочевидь, чим більше ділитель, ти вищою буде здатність коду виявляти помилки. В сучасних рішеннях використовується старша ступінь поліному m від 8 до 32.

Математичний апарат циклічних кодів
Особливості математичного апарату циклічних кодів ілюструє рис.10.2:

Рисунок 10.2 До огляду математичного апарату циклічних кодів

- нагадаємо, що вихідного k-розрядному значенням інформаційного коду відповідає можна поставити у відповідність певний, який позначимо b(x). Щоб перейти до повного n-розрядному формату доповнимо вихідний код m нулями. Це відповідає множенню полінома на xm;

- результуючий n-розрядний поліном f(x) за умовами кодування повинен без залишку ділитися на утворючий поліном g (x) зі старшим ступенем m. Щоб це забезпечити, поділимо b(x)*xm і залишок r(x), який «заважає» поділу без залишку, додамо власно до b(x)*xm. Результат, який тепер напевно поділиться на g(x), і буде шуканим f(x). Таким чином, кодування виконано;

- декодування зводиться до розілення отриманого многочлена f*(x) на g(x). Якщо помилок не було, то він поділиться без залишку. Ненульовий залишок від ділення говорить про помилки передачі. Важливо, що CRC-код дозволяє виявити будь-які поєднання помилок на відрізку коду довжиною m розрядів. Наприклад, якщо ми використовуємо 8 контрольних розрядів (m = 8), то код зможе виявити будь-яке поєднання помилок в сусідніх 8 розрядах;

- окреме питання - вибір утворючого поліному коду. Він повинен відповідати ряду математичних умов (рис.10.2). Однак на практиці такі поліноми обирають з готових таблиць. Найбільш зручні їх варіанти стандартизовані. Крім прикладів, показаних на рис.10.2, існують стандарти для 4-, 12- і 32-розрядних поліномів. У сучасній практиці CRC-коди з утворюють поліномами g16(x) широко використовуються в глобальних комп'ютерних мережах і дискових контролерах, а g32 (x) - в контролерах мережевих карт ПК (для локальних мереж).

Приклад циклічного коду 7,4
Розглянемо приклад кодування і декодування циклічним кодом 7,4. Для даного коду кількість контрольних розрядів становить m = 3. Зазначеним вище вимогам відповідають лише два варіанти утворюючого поліному: g (x) = x3 + x +1 та g (x) = x3 + x2 + 1. Надалі в прикладі використовується перший з цих двох поліномів (рис.10.3).

Рисунок 10.3 Приклад кодування та декодування для коду 7,4

Нехай k = 4 інформаційних розряду мають значення 1010. На верхній частині рис.10.3 показана послідовність виконання кодування і декодування згідно з описаною вище процедурою:
- інформаційному блоку 1010 відповідає поліном b(x) = x3 + x. Відповідно b (x)*x3 = x6 + x4;
- контрольні розряди 011 відображають поліном r(x) = x + 1 - залишок від ділення b (x)*x3 на g (x) =x3 + x2 + 1. В результаті кодовий поліном має вигляд f (x) = x6 + x4 + x + 1;
- при передачі без помилок отриманий кодовий поліном f*(x) збігається з переданим і тому залишок від його розділення на утворюючий дорівнює 0 (це ознака правильної передачі); при виникненні помилок залишок від ділення f*(x) на g(x) відмінний від 0, що є ознакою неправильної передачі. У прикладі видно, що таким чином виявляються не тільки одноразова помилка в розряді 3, але і послідовність з трьох помилок в розрядах 1-3.

На нижній частині рис.10.3 відображені детальні процедури кодування та декодування за допомогою ділення поліномів. Нагадаємо, що в якості операції підсумовування використовується сума по модулю 2. При цьому на кожному кроці ділення старша ступінь поінома-залишку підбирається так, щоб "погасити" старший елемент діленого. Старша ступінь залишку повинна бути меншою за m (інакше поділ можна продовжувати).

10.2 Потокові (згорткові) коди

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

Рисунок 10.4 Властивості потокових (згорткових) кодів

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

- платою за таку можливість є значне зростання надмірності. Якщо, наприклад, в коді CRC надмірність може становити менше одного відсотка (для g16 це два контрольних байта на блок з декількох сотень байтів даних), то для потокових кодів вона може досягати 50% і навіть вище;

- принципова слабкість таких кодів полягає в невмінні справлятися з довгими "пачками" помилок, які можуть з'являтися при передачі. Рішенням тут є використання дворівневої "каскадної" схеми кодування, яку ми розглянемо в подальшому. Така схема поєднує переваги блокових і потокових кодів;

- математичний апарат, як і в разі циклічного коду, ґрунтується на операціях з поліномами. Вхідній послідовності ставиться у відповідність поліном А(X). Структура кодера визначається утворюючим поліномом G(Х). Вихідній послідовності відповідає поліном B(X), який одержується в результаті операції «згортки» А(X) і G(Х), тому такі коди часто називають саме "згортковими".

Потоковий код Фінка-Хегельбергера
Ми познайомимося з реалізацією потокового кодування на прикладі простого коду, запропонований радянським інженером і вченим Фінком і згодом незалежно "перевідкритим" американцем Хегельбергером. Крім того, що цей код став першим в даному класі, при його розгляді нам не знадобиться складний математичний апарат (рис.10.5):

Рисунок 10.5 Приклади кодування за кодом Фінка

- в даному коді контрольні розряди b(i) (на рисунку показані червоним кольором) чергуються з інформаційними a(i). У найпростішому випадку при кодуванні контрольні розряди вичіслются як b(i) = a(i) + a(i+1) (додавання по mod2). При декодуванні вони розраховуються знову b(i)* = a(i)* + a(i+1)* та порівнюються з отриманими в результаті передачі;

- на рис.10.5 помилка виявляється, якщо отримане при передачі значення контрольного розряду не збігається з розрахунковим. При цьому враховується закономірність: якщо спотвореним виявився інформаційний розряд а(i), то розбіжність проявиться для двох контрольних розрядах, що його "обрамляють"; якщо ж при передачі був спотворений контрольний розряд, то розбіжність буде тільки в ньому самому. Це дозволяють гарантовано виправляти поодинокі помилки, проте вже при появі пари помилок (в інформаційному і сусідньому контрольному розрядах) такий варіант коду не може з ними впоратися;

- можливість виправлення коротких пачок помилок дає модифікація коду, яка передбачає інтервал між інформаційними розрядами, які беруть участь у визначенні контрольних: b(i) = a(i-s) + a(i+1+s), де s = 1, 2, .. . при s = 1 між розрядами, які беруть участь в контролі знаходитиметься ще пара "проміжних", при s = 2 їх буде чотири (при s = 0 формула виродиться в раніше розглянутий варіант). Зі збільшенням s зростає довжина «пачки» помилок, що виправляється кодом;

- на рис.10.5б показано виправлення пачки з трьох помилок (включаючи 2 інформаційних розряду) для випадку, коли s=1. При цьому оскільки в формуванні контрольного розряду b(i) повинен брати участь не просто попередній йому інформаційний розряд а(i), а й попередній по відношенню до нього а(i-1), на початку кодування доводиться використовувати умовне значення a(0) на рисунку показано зеленим кольором.

Можливості сучасних потокових кодеров
У сучасній практиці застосовуються потокові коди з різним рівнем надмірності і коректуючої здібності. Ці характеристики тісно пов'язані з логічною структурою кодеров (рис.10.6):

Рисунок 10.6 Можливості сучасних потокових кодерів

- у всіх випадках кодери включають регістри зсуву з суматора за модулем 2, які формують вихідну послідовність розрядів. Такі розряди надходять на вихід по декількох каналах, для кожного з яких виділяється власний час підключення. Перетворення даних по кожному каналу задається відповідним утворюючим поліномом Gi(х) (на схемі його структура відображається розташуванням зв'язків). Основні характеристики коду включають кількість вхідних і вихідних розрядів, оброблюваних схемою за один такт (відповідно k та n), відносну швидкість кодування R = k/n (вона також характеризує величину надмірності), а також значення dmin, яке визначає кратність виправлених помилок;

- на рис. 10.6 а і 10.6 б показані схеми кодерів з одним вхідним і двома вихідними каналами (k=1, n=2, R = 1/2). При цьому кодер на рис.10.6 а, який реалізує вже знайомий нам код Фінка, є систематичним (тут інформаційні розряди надходять на вихід незмінними і лише доповнюються контрольними розрядами). Кодер на рис.10.6 б є несистематичним. Тут інформаційні розряди також змінюють значення з урахуванням контрольних співвідношень. Такий підхід дозволяє без збільшення надмірності значно посилити коригувальну здатність (значення dmin зростає з 3 до 5, що дозволяє виправляти не тільки одноразові, а й подвійні помилки). Декодування несистематических кодів вимагає досить складних математичних методів і ми не будемо його розглядати;

- на рис. 10.6 в та 10.6 г відображені схеми з трьома вихідними каналами (в кожному такті на виході формується три розряди коду). Як видно, це дозволяє додатково наростити dmin до 7 (при цьому можна виправляти вже триразові помилки). Платою є зменшення швидкості кодування (рис. 10.6 в). Однак, це може бути компенсовано розпаралелюванням вхідного потоку (рис. 10.6 г);

- в практиці застосовуються стандартизовані варіанти згортальних кодів. Так, у мобільному зв'язку в рамках стандарту GSM, застосовуються кодери з dmin = 7 (G1(х)=1+x3+x4, G2(х)=1+x+x3+x4). У системах супутникової передачі даних використовуються кодери з dmin = 10 (G1(х)=1+x2+x3+x5+x6, G2(х)=1+x+x2+x3+x6). Обидва ці коди є двоканальними (відносна швидкість кодування становить 1/2) і несистематичними (останнє, як ми вже знаємо, дозволяє при заданому рівні надмірності отримати максимум коректуючої здатності).

10.3 Інші популярні напрямки кодування

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

Рисунок 10.7 Ітеративні коди

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

- в загальному випадку блок інформаційних розрядів ai,j включає k1 стовпців і k2 рядків. Загальна кількість стовпців і рядків з урахуванням контрольних розрядів bi,j складає відповідно n1 і n2. Кодова відстань по рядку d1min, а по стовпцю d2min. При цьому для рядків і стовпців можуть використовуватися різні способи кодування (умовно код X і код Y);

- принципово важливо, що мінімальна кодова відстань для всього блоку дорівнює добутку відстаней по рядку і стовпцю (це доведено математично). У разі найпростішого матричного коду з перевіркою парності, як ми пам'ятаємо, dmin=2х2=4 (код може виправляти поодинокі помилки). Якщо, наприклад, по рядку буде застосовуватися код Хеммінга, а по стовпцю - перевірка парності, то dmin = 3х2 = 6 (виправляються також помилки кратності 2). А при використанні для кожної з координат коду Хеммінга значення dmin = 3х3 = 9, що дозволяє виправляти вже всі помилки кратності до 4;

- вибір коду для рядка і стовпця матриці може визначатися не тільки вимогами до dmin. Наприклад, для стрічкових накопичувачів широко застосовувався варіант, в якому за стовпцями виконувалося циклічне кодування з поліномом g(x) ступеня 8 в поєднанні з контролем парності по рядках. Цей код, запропонований фірмою IBM, дозволяє виявляти пачки помилок, поява яких характерно для доріжок магнітного запису. При цьому перевірка парності по рядку дозволяє виправляти помилки, оскільки одночасний збій на двох і більше доріжках малоймовірний;

- додаткове збільшення коректуючої здатності матричних кодів можливо за рахунок використання «третього виміру», коли в єдиний блок об'єднується пакет з декількох матриць. На рис.10.7б показано найпростіше подібне рішення, коли N матриць містять інформаційні розряди і біти контролю парності по рядках (вісь Y) і стовпцями (вісь X). Додаткова матриця N + 1 включає тільки контрольні біти, значення яких підтримують контроль парності по осі Z. Зрозуміло, такий підхід може бути узагальнений на випадок використання різних кодів по кожній з координат. Більш того, теоретично можуть бути введені і додаткові координати. При цьому, як і раніше, діє правило, коли мінімальна кодова відстань для всього блоку коду визначається як добуток dmin за всіма його координатами.

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

БЧХ-коди та коди Ріда-Соломона
Розглянуті вище коди орієнтовані на конкретні сфери застосування. Більш узагальнений підхід - виправлення помилок будь-якої заданої кратності - забезпечують коди, створені за методом Боуза, Чоудхурі і Хоквінгема (так звані БЧХ-коди). До даного класу належить також популярний код Ріда-Соломона (РС), для якого замість двійкових елементів можуть використовуватися наприклад алфавіти більшої довжини. Ці коди отримали широке практичне застосування. Однак їх математичний апарат є досить складним, тому ми розглянемо їх лише на рівні принципів (рис.10.8):

Рисунок 10.8 До кодів БЧХ та РС

- коди БЧХ є підкласом циклічних кодів і звідси їх властивості визначаються утворюючим поліномом g(x). При цьому сам такий поліном будується спеціальним способом - виходячи із заданого dmin (з урахуванням кратності виправляє помилок s) і заданої довжини кодового слова n. При цьому така довжина повинна відповідати умові n = 2m-1, де m - ціле число. Властивості коду визначаються трійкою значень (n, k, dmin). Наприклад, позначення (15, 7, 5) відповідає коду з довжиною блоку 15 розрядів, з яких 7 інформаційні, при цьому його мінімальна кодова відстань 5 дозволяє виправляти всі помилки з кратністю s=1 та s=2. Популярним є код (255, 231, 7), який використовують для виявлення помилок з кратністю до 6 включно;

- процедура побудови g(x) є досить громіздкою. Тут лише зазначимо, що утворюючий поліном будується виходячи із заданих значень s, n на базі набору неприводимих поліномів fi(x), які обираються з довідкових таблиць. Наприклад, для згаданого коду (15, 7, 5) утворюючий поліном утворюється як g (x) = f1 (x)*f2 (x) = (x4 + x + 1) ( x4 + x3 + x2 + x + 1) = x8 + x7 + x6 + x4 + 1;

- кодування за заданим g (x) може виконуватися по тій самій процедурі, що і для будь-якого циклічного коду: «хвостовик» блоку будується за поліномом r(x) - залишком від ділення вихідного кодового полінома f(x) на утворюючий g (x). Декодування також починається з обчислення залишку отриманого в результаті передачі полінома f*(x) на утворюючий. Однак надалі для визначення позицій всіх помилок доводиться використовувати досить складні процедури (зокрема за так званим алгоритмом Вітербі);

- важливим окремим випадком БЧХ-кодів є недвійковий код Ріда-Соломона (РС). Тут замість двійкової змінної, значення якої відповідає одному біту, можуть застосовуватися змінні значно більшої розмірності. Наприклад, використовуються коди з 16-річної змінної, значення якої кодується напівбайтів. Популярні коди з 256-річної підставою (значення представляється байтом). При тому, що всі процедури для РС-кодів відповідають правилам БЧХ-кодів, їх коригувальна здатність значно вища. Такі коди використовуються, наприклад для відновлення даних, що постарждали через подряпини на оптичних дисках.

Каскадні коди
Каскадні коди використовуються для надійної передачі повідомлень в складних умовах. Прикладом може бути передача мови в мобільному зв'язку, де відносно низька надійність радіоканалу поєднується з вимогою безперервності потоку даних, який приймається. Використання каскадного кодування передбачено, зокрема, стандартом GSM. Тут система кодування включає три рівні (рис.10.9):

Рисунок 10.9 Схема каскадного кодування

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

- на "верхньому" рівні (зовнішній контур) за рахунок використання блочного коду усуваються довгі пачки помилок, що відносно рідко зустрічаються. У зовнішньому контурі використовується потужний блоковий код. Зокрема, тут застосовується код Ріда-Соломона (РС), елементами якого можуть бути байти;

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

- найпростіший спосіб перемежінням - «блоковий» (рис.10.9). Тут вихідна послідовність записується після кодування за стовпцями, а видається для передачі по рядках. Після відновлення сусідні спотворені розряди, що утворюють в каналі «пачку» помилок, виявляються рознесеними в різні рядки матриці. У прикладі на рис.10.9 довга пачка помилок в 6 розрядів розбивається на 4 коротких фрагмента по 1-2 помилки, які можуть бути усунені потоковим кодом.

В цілому спосіб каскадного кодування відрізняється гнучкістю, оскільки тут коди з різними властивостями беруть на себе характерні для них функції. Розвитком цього підходу явлются так звані "турбо-коди", в яких використовується одночасно кілька каналів перемежіння. Застосування подібних удосконалень дозволяє наблизити ефективність кодування до теоретичної межі, визначеної теоремою Шеннона.

10.4 Огляд класифікації та застосування

Класифікація кодів із захистом від помилок
Підведемо підсумки розгляду завадозахисні кодів їх коротким оглядом. Наведена на рис.10.10 класифікація дозволить нам не тільки впорядкувати вже отримані уявлення, а й дещо їх розширити:

Рисунок 10.10 До класифікації кодів

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

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

- за кількістю рівнів кодування виділяються однорівневі коди (до них належить більшість нами вивчених), а також багаторівневі - в тому числі ітеративні і каскадні. Як ми вже знаємо, збільшення кількості рівнів кодування значно підвищує коригувальну здатність, однак дається ціною збільшення надмірності і втрати швидкості. На практиці в більшості випадків використовуються коди з кількістю рівнів не більше двох;

- за рівнем оптимальності (в сенсі близькості до теоретичної межі Шеннона) виділяються звичайні коди (сюди відносяться всі розглянуті нами вище) і квазіоптимальні. В останню категорію потрапляють, зокрема, так звані «турбо-коди» коди LDPC із «низькою щільністю перевірок на парність". Перші максимально пристосовані до високої ймовірності помилок і дозволяють використовувати довгі блоки даних. Другі краще працюють на більш "чистих" каналах. Квазіоптимальний коди були створені відносно нещодавно і характеризуються високою складністю, але зараз активно застосовуються в системах мобільного та супутникового зв'язку.

Напрями застосування
На завершення ще раз систематизуємо уявлення про сфери практичного використання кодів із захистом від помилок передачі (рис.10.11):

Рисунок 10.11 Огляд застосування кодів із захистом від помилок

- блокові коди з виявленням помилок широко застосовуються як для забезпечення передачі в просторі (комп'ютерні мережі), так і в часі (зберігання інформації на зовнішніх носіях). При цьому, оскільки в обох випадках можливе зберігання копій переданих повідомлень або їх блоків, для виправлення помилок застосовується метод перезапиту. Найбільш широко використовуються циклічні CRC-коди. Знаходять застосування також коди БЧХ та Ріда-Соломона. Менш поширені ітеративні коди;

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

- потокові і каскадні коди застосовуються в системах мобільного та супутникового зв'язку. Вони забезпечують виправлення помилок без значних затримок, пов'язаних з очікуванням повної передачі блоків. Найбільш сучасними і надійними рішеннями є використання квазіоптимальних турбо-кодів і кодів LDPC.

Таким чином, в сучасних умовах для забезпечення вірності передачі повідомлень застосовується широкий спектр кодів із захистом від помилок, які максимально адаптовані до вимог конкретних умов передачі. Розвиток завадозахисні кодів йде в напрямку все більш складних алгоритмів кодування, які в даний час наближаються за ефективністю до теоретичної межі Шеннона.
О дисциплине ТИК
Почему «Теория информации и кодирования» - одна из самых интересных дисциплин, которые изучают будущие системщики и защитники информации?

В ней сочетаются золотая классика и самая актуальная современность computer-science.

продолжение
О сайте
Здесь вы найдете материалы, которые помогут в изучении дисциплины “Теория информации и кодирования” (ТИК) в том виде, как она преподается на кафедре ЭВМ ДИИТа.

На сайте размещены методические материалы:
  • электронный конспект лекций;
  • методическое обеспечение к лабораторным работам;
  • полезные ссылки.

продолжение
© 2008-2019 • Теория информации и кодирования
UP