Кафедра Автоматики и ИнформационныхТехнологий
Лабораторнаяработа
«ПРОГРАММНЫЙКОДЕР-ДЕКОДЕР ДЛЯ ЦИКЛИЧЕСКИХ (n, k) – КОДОВ»
1. Преследуемые цели
Проведение лабораторных работ по данной тематике преследует следующиецели:
- закрепление теоретического материала, касающегосяосновных положений математической теории линейных (n, k) – кодов;
- осознание механизма кодирования пакетов данных припередаче файлов;
- практическое освоение алгоритмов кодирования идекодирования применительно к циклическим (n, k) – кодам.
2. Необходимые сведения из теории
Известно, что циклические коды из всех помехоустойчивых кодов находятнаибольшее применение на практике.
Циклические коды представляют собой подкласс (подмножество) линейных (n,k) – кодов. Это значит, что все положения теории, которые справедливыдля нециклических линейных (n, k) – кодов, справедливы и для кодовциклических. Но циклические коды обладают рядом дополнительных положительныхсвойств, в частности, они «остро реагируют» на близко расположенные в кодовомслове ошибки, так называемые «пачки ошибок». Кроме того, для них найденычрезвычайно простые алгоритмы кодирования и декодирования. Все это и обеспечилоим широкое применение на практике. Их применение оговорено многими международнымистандартами, регламентирующими работу каналов передачи.
Для описания циклических кодов параллельно используется представлениекодовых слов и двоичным вектором, и многочленом от некоторой формальнойпеременной x. Постоянно приходитсяпереходить от одной формы представления к другой. Одну и ту же двоичнуюпоследовательность обозначим V, если она рассматривается каквектор, или V(x), если она интерпретируется как многочлен.
2.1 Конструктивное определение циклического (n, k) –кода
Циклическим (n, k) – кодом называется множество многочленов степенине больше (n‑1),каждый из которых нацело делится на (специально подобранный) порождающиймногочлен G(x) степени (n-k), являющийся делителем бинома xn+1.
Циклический код со словами длины n и с порождающим многочленом G(x)существует тогда и только тогда, когда G(x) делит xn+1[1].В лекционном курсе было показано, что это требование делимости бинома xn+1на G(x) вытекает из специфики определения операциисимволического умножения многочленов (по модулю бинома xn+1).Для того, чтобы максимизировать множество слов порождаемого кода прификсированных значениях длины слов n и кодового расстояния d0,многочлен G(x) должен быть неприводимым делителем степени(n-k).
2.2 Алгоритм кодирования
На практике чаще всего применяется алгоритм кодирования, которыйформирует систематический разделимый код. В основу такого алгоритмаположена операция деления на G(x). Систематическиеразделимые коды привлекательны тем, что процедуру кодирования, т.е.преобразования информационного вектора A (длины k) ввектор кода V (длины n>k) удается свести лишь кформированию (n-k) контрольных бит.
Шаг 1. Предварительновектор A «отнормируем по формату» под длину n, воспользовавшисьоперацией умножения многочленов A(x)×xn-k.Как было показано в лекционном курсе – это эквивалентно сдвигу вектора Aна (n-k) позиций влево. Произведение многочленов на языке векторов имеетдлину n. Существенно для последующего, что правые (n-k) позицийоказываются непременно нулевыми.
Шаг 2. ПроизведениеA(x)×xn-k разделим на G(x). Ясно, что в общем случае оно не обязаноделиться на G(x) нацело. Поэтому следует записать
A(x)×xn-k=Q(x)×G(x)+R(x),
где Q(x) — частное от деления;
R(x) — остаток. Это многочлен степени не больше (n-k‑1), т. к. делитель имеетстепень (n-k) по определению. Как вектор он имеет длину (n-k).
Шаг 3. Перенесёмостаток R(x) в левую часть равенства. Получим:
A(x)×xn-k+R(x)=Q(x)×G(x).
Теперь в левой части мы получаем многочлен, который нацело делится на G(x),а это по определению – многочлен, принадлежащий циклическому (n, k) –коду. В этой последней операции остаток R складывается с нулями(см. шаг1 алгоритма). Следовательно, конечный итог эквивалентенконкатенированию R к вектору А.
2.3 Алгоритм декодирования
Известно несколько алгоритмов декодирования циклических (n, k) –кодов. В данной лабораторной работе исследуется «декодирование по синдрому»,роль которого (синдрома) играет остаток от деления декодируемого многочлена F(x) на G(x).Декодирование может производиться с целью только обнаруживать ошибки или сцелью исправлять ошибки кратности до tвключительно. В любом случае цель достигается в несколько шагов алгоритма.
2.3.1 Декодирование с обнаружением ошибок
Шаг 1. Вычислениеостатка R(x);
Шаг 2. Анализостатка «на ноль». Нулевой остаток означает, что ошибки не обнаружены;
2.3.2 Декодирование с исправлением ошибок
Шаг 1. Вычислениеостатка R(x);
Шаг 2. Вычислениепо найденному остатку предполагаемого (наиболее вероятного) многочлена ошибки Е(х);
Шаг 3. Исправлениедекодируемого вектора Fпутем суммирования F+E=V;
3. Параметры исследуемых кодов
Чтобы трудоемкостьлабораторных работ согласовать с отпущенным временем, исследуются короткие (померкам практики) коды. Параметры кодов приведены в таблицах 1 – 3.
Согласуйте спреподавателем номер варианта, с которым Вы будете работать. Программы CODER и DECODER следует писать для одноговарианта кода.
Таблица №1. Вариантызаданий для (n,k) – кодов с длинойслова n=15Вари-анты
Параметры n, k
Расстояние кода d0
Порождающий многочлен G(x)
G(x) в двоичном и HEX‑форматах 1 2 3 4 5 1.1 (15,11) 3
G1(x)=x4+x+1 1 0011«13h 1.2 (15,7) 5
G2(x)=x8+x7+x6+x4+1 1 1101 0001«1D1h 1.3 (15,5) 7
G3(x)=x10+x8+x5+x4+x2+x+1 101 0011 0111«537h
Таблица №2. Вариантызаданий для (n,k) – кодов с длинойслова n=31Вари-анты
Параметры n, k
Расстояние кода d0
Порождающий многочлен G(x) G(x) в двоичном и HEX‑форматах 1 2 3 4 5 2.1 (31,26) 3
G1(x)=x5+x2+1 10 0101«25h 2.2
G2(x)=x5+x4+x2+x+1 11 0111«37h 2.3
G3(x)=x5+x4+x3+x+1 11 1011«3Bh 2.4
G4(x)=x5+x3+1 10 1001«29h 2.5 (31,21) 5
G5(x)=x10+x9+x8+x6+x5+x3+1 111 0110 1001«769h 2.6
G6(x)=x10+x7+x5+x4+x2+x+1 100 1011 0111«4B7h 2.7 (31,16) 7
G7(x)=x15+x11+x10+x9+x8+x7++x5+
+x3+x2+x+1 1000 1111 1010 1111«8FAFh 2.8
G8(x)=x15+x14+x13+x12+x11+
+x10+x9+x8+x7+x6+1 1111 1111 1100 0001«FFC1h
Таблица №3. Вариантызаданий для (n,k) – кодов с длинойслова n=63Вари-анты
Параметры n, k
Расстояние кода d0
Порождающий многочлен G(x)
G(x) в двоичном и HEX‑форматах 1 2 3 4 5 3.1 (63,57) 3
G1(x)=x6+x+1 100 0011«43h 3.2 (63,51) 5
G2(x)=Ååхi, i=12,10,8,5,4,3,0 1 0101 0011 1001«1539h 3.3 (63,45) 7
G3(x)=Ååхi, i=18,17,16,15,9,7,6,3,2,1,0 111 1000 0010 1100 1111« «782СFh 3.4 (63,39) 9
G4(x)=Ååхi, i=24,23,22,20,19,17,16,13,
10,9,8,6,5,4,2,1,0 1 1101 1011 0010 0111 0111 0111« «1DB2777h 3.5 (63,36) 11
G5(x)=Ååхi, i=27,22,21,19,18,17,15,
8,4,1,0 1 000 0110 1110 1000 0001 0001 0011«86Е8113h 3.6 (63,30) 13
G6(x)=Ååхi, i=33,32,30,29,28,27,26,23,22,
20,15,14,13,11,9,8,6,5,1,0
11 0111 1100 1101 0000 1110 1011 0110 0011«
«37СD0EB63h 3.7 (63,24) 15
G7(x)=Ååхi, i=39,38,37,36,34,33,31,28,27,
25,22,19,17,11,6,3,0 111 1011 0100 1101 0010 0101 0000 0100 0100 1001 « «7B4D250449h
4. Порядок выполнения лабораторной работы CODER
Конечной задачей является написание и отладка программы CODER, способнойпреобразовать предлагаемый файл. Программа должна рассматривать файл (необязательно двоичный) как последовательность двоичных векторов Аjдлины k и преобразовать его в другой файл – файл, состоящий изслов Vjдлины nизбыточного кода заданных параметров.
Легко просматривается промежуточная, технологическая задача: нужно иметьсредства, с помощью которых можно было бы убедить себя и оппонентов в том, чтопрограмма CODER выполняет преобразование требуемым образом. Назовем этупрограмму отладочной.
4.1 Интерфейс отладочной программы
Необходимо иметь (хотя бы) два «окна»:
- одно для ввода вручную кодируемого вектора Аjзаданных параметров;
- другое – для показа выходного вектора Vj(или только контрольных бит этого вектора).
Необходимо заранее вручную вычислить несколько выходных векторов Vj,соответствующих известным Аj. У преподавателядолжны быть заготовлены свои тестовые слова кода. Таким образом можно будетобеспечить определенный уровень доверия к кодирующей программе[2].
4.2 Интерфейс основной кодирующей программы CODER[3]
Необходимо предусмотреть возможность выбора исходного (кодируемого) файлаиз каталогов Windows (или писать вручную вкакой-либо «командной строке» путь к этому файлу). Необходимо предусмотретьвозможность запоминания выходного файла программы CODER на диске и возможностьмногократного возвращения к анализу этого файла.
Выходной файл (файлы) программы CODER понадобятся при выполнении лабораторнойработы, связанной с декодированием.
4.3 Отчет по лабораторной работе, защита результатов
Отчет должен содержать:
q краткое изложение постановки задачи;
q требуемые параметры выходного кода и граф-схему алгоритмаработы основного кодирующего модуля с комментариями;
q характер и результаты тестового кодирования:
· (5…6) «пар» входных и выходных векторов кодера;
· проверка свойства замкнутости множества кодовых векторовотносительно операции суммирования по mod2;
· проверка расстояний между кодовыми векторами насоответствие исходным требованиям.
Результаты работы программы CODER должны быть продемонстрированыпреподавателю.
5. Условия и порядок выполнения лабораторной работы DECODER
Конечной задачей в данной работе является не только практическое изучениеалгоритма декодирования по синдрому (остатку) и отладка декодирующей программы,но и изучение структуры (конфигураций) обнаруживаемых и / илиисправляемых ошибок, т.е. косвенная оценка помехоустойчивости кода сконкретными заданными параметрами. Программа – DECODER должна уметьдекодировать предлагаемый файл.
Исходными данными, предметом преобразований для программы DECODER долженявиться выходной файл программы CODER. Но как и в лабораторной работе CODER,здесь также понадобится определенная технология отладки основного модуля, спомощью которой можно убедиться в правильности работы программы DECODER ипроанализировать спецификации обнаруживаемых / исправляемых ошибок.
5.1 Интерфейс отладочного модуля
Интерфейс может быть построен по принципу двух окон – «входное» и«выходное». Необходимо иметь возможность вручную вводить декодируемую двоичнуюпоследовательность (неискаженное слово кода, искаженное слово, вектор ошибки) иполучать в выходном окне результат декодирования (вид синдрома[4],структуру вычисленной (предполагаемой) ошибки или исправленное слово кода, взависимости от конкретного варианта задания и Вашего решения).
5.2 Элементарный план отладки декодирующего модуля
1) Взять 3–4 вектора кода V1, V2,V3, V4 и убедиться, чтоони дают нулевой остаток;
2) Подействовать на эти векторы ошибками.
Имея в виду, что искажение многочлена Vj(х)моделируется операцией Fjℓ(х)=Vj(х)+Eℓ(х),где многочлен Eℓ(х) символизирует ℓ-туюконфигурацию ошибок, результат вычисления синдрома (остатка) Rjℓ(x)=Fjℓ(х)/G(x)можно представить как Rℓ(x)=Eℓ(х)/G(x)[5]Следовательно, при правильном функционировании программы DECODER должны получитьсяостатки, подчиняющиеся следующей схеме (табл. 4).
Таблица 4
E1
Rℓ
E2
Rm
Vi
Fi1(х)=Vi(х)+E1(х)
R1
Fi2(х)=Vi(х)+E2(х)
R2
Vj
Fj1(х)=Vj(х)+E1(х)
R1
Fj2(х)=Vj(х)+E2(х)
R2
Если поведение DECODER`а подчиняется таблице 4, его можно принять для дальнейшейработы в соответствии с индивидуальным заданием.
5.3 Вариант DECODER`а с обнаружением ошибок
Исходя из характеристик G(x) и величины d0,предложить конфигурации ошибок, которые программа непременно должна обнаруживатьи которые не обязана обнаруживать. Особое внимание следует обратить наконфигурации ошибок типа «пачка», вес которых находится в пределах (n-k)³w(E)>(d0-1).
Найти конфигурации необнаруживаемых ошибок, сформулировать свойства(признаки) таких ошибок;
Результаты исследования свести в таблицу и снабдить комментариями.
5.4 Вариант DECODER`а с исправлением ошибок
Исходя из характеристик G(x) и величины d0,предложить конфигурации ошибок, которые иллюстрируют свойства кода в отношенииисправления ошибок. Подобрать конфигурации, ведущие к «неправильномуисправлению», т.е. к вручению получателю кодового слова с незамеченнымиошибками, которые остаются после формально выполненной процедуры исправления.
6. Защита результатов, отчет по лабораторной работе
Результаты работы программы DECODERдолжны быть продемонстрированы преподавателю. Отчет должен содержать краткоеизложение постановки задачи, требуемые параметры выходного кода, граф-схемуалгоритма работы основного декодирующего модуля с комментариями, объем ирезультаты тестового декодирования (например, в табличной форме) с подробнымикомментариями.
7. Быстрыйкодер / декодер для циклических кодов
Применениебыстрого алгоритма в лабораторной работе не является обязательным для всех. Онможет быть использован по желанию студентов или по прямому указанию преподавателя.
Вышеговорилось, что при циклическом кодировании основной операцией алгоритмовкодирования входной последовательности А(х) и декодированиявыходной является операция деления выражения А(х) х(n-k)на порождающий многочлен с целью нахождения остатка, который суммируется с А(х)х(n-k) по mod2.
Трудностьпрограммной реализации кодирующих и декодирующих модулей для циклических кодов состоитв том, что алгоритмы, обычно, предусматривают процедуру многократноповторяемого «битового деления». Время кодирования /декодирования часто оказываетсянеприемлемым. Далее излагается математическая суть алгоритма деления двоичныхпоследовательностей, позволяющего выполнять деление по частям. «Крупностью»частей в известных пределах можно варьировать, добиваясь оптимизации процедурыв конкретных условиях.7.1 Алгоритм деления по частям
Разобьем k‑битовуюпоследовательность А, выраженную многочленом А(х),на ℓ‑битовые отрезки (блоки). Так как в общем случае k не обязано быть кратным ℓ,входная последовательность будет поделена на s блоков, из которыхпоследний имеет длину m. Выполняется условие: k=ℓ (s‑1)+m.Шаг 1
Выделим впоследовательности А левые ℓ бит. Пусть в символикемногочленов они выражаются многочленом А1(х), аоставшуюся (справа) часть обозначим А`1(х).
Тогда входнуюпоследовательность А(х) можно представить в форме:
А(х)=А1(х)х(k-ℓ) +А`1(х). (1)
(Здесь идалее суммирование двоичных многочленов и векторов ведется по mod2).
Делимое А(х)х(n-k) в алгоритме кодирования запишем как
А(х) х(n-k) =(А1(х)х(k-ℓ) +А`1(х)) х(n-k) (2)
Векторнаяиллюстрация к шагу 1.
При ℓ=4,k=11 (одиннадцать) пусть А=11011000 110. Здесь m=3, А1=1101.
А1(х) х(k-ℓ) в векторной формевыглядит как 1101 0000000, так как умножение на х(k-ℓ)эквивалентно приписыванию справа (k-ℓ) нулей. А`1=1000110. Сумма А1(х) х(k-ℓ) +А`1=А(х) выглядит как
1101 0000000
1000110Å
/>
1101 1000110
В выражении(2) первый член суммы в круглых скобках умножим и разделим на порождающиймногочлен и произведем умножение обоих членов на х(n-k). Получим:
/> (3)
Дробь /> представим какменьшую целую часть (частное) Q1(х), которое в конечномитоге нас не интересует, плюс остаток от деления R1(х). С учетом этогоперепишем (3).
Получим:
А(х) х(n-k) =Q1(х) G(x) х(k-ℓ) +R1(x) х(k-ℓ)+А`1(х)х(n-k) (4)
Старшаястепень многочлена /> не превосходит (ℓ-1),т. к. такую степень по соглашению имеет А1(х),а G(x) имеет фиксированную степень (n-k) поопределению (вывернутые полускобки символизируют ближайшее меньшее целое отдроби, т.е. частное). Тогда получается, что первое слагаемое в (4) имеетстаршую возможную степень (n‑1), что соответствует вектору длины n.
Старшаястепень остатка R1(x) не превосходит величины (n-k‑1),а всего второго слагаемого в (4) – величины (n-ℓ-1). Такую жестепень имеет и третье слагаемое А`1(х) х(n-k).Сложим эти два последних члена, сумму обозначим F1(х).Перепишем (4) в следующем виде:
А(х) х(n-k) =Q1(х) G(x) х(k-ℓ) +F1(х) (5)
Рис. 1иллюстрирует формирование последовательности F1ввекторной интерпретации всех участвующих величин. Обратим внимание на длинупоследовательности F1, на то обстоятельство,что при суммировании векторы R1 и A`1«выровнены» со стороны старших разрядов, а F1имеетсправа (n-k) нулевых бит.
/>
Рис. 1.Формирование последовательности F1при векторномпредставлении величин
На этомпервый шаг алгоритма деления по частям закончен. Получен F1(х),куда вошел первый промежуточный остаток R1(x),контролирующий деление первого блока из ℓ левых бит входной последовательностиА(х).
Шаг 2
Очередной шагалгоритма заключается в том, что в F1(х)выделяем ℓ левых бит. Этот отрезок должен быть обозначен А2(х).Оставшаяся правая часть F1(х) – это А`2(х).В соответствии с (3), (4) находим выражение остатка R2(x)и последовательности F2(х).
/>
Рис. 2. Формированиепоследовательности F2при векторномпредставлении величин
На рис. 2проиллюстрировано получение F2. Предпринятапопытка масштабно отобразить изменение участвующих в деле векторов. Здесьпоказано, что после второго шага F2все ещеимеет справа (n-k) нулей. Это эквивалентно допущению, что делениевходного вектора А на отрезки длины ℓ двумя шагамине исчерпывается.
Делимое (вего стартовом понимании) после второго шага имеет вид:
/> (6)
В общемслучае, пока (k-iℓ)≥(n-k) вектор Fiдолжен будет иметь справа (n-k) нулей. Это, как известно, местоконтрольных бит в словах циклического кодового слова. Они пока не сформированы.
Шаг s‑1
В процессевыполнения (s‑1) – го шага мы оперируем векторами длины (n-k+m) (см. рис. 3). Кэтому времени все отрезки длины ℓ в составе входного вектора будутисчерпаны и (если в общем случае k не делится нацело на ℓ)у нас остаётся от входной последовательности вычисленный остаток Rs-1 и «правый» отрезок A`s-1длины m0
Всоответствии с выражениями (4) и (5) получим «выходной продукт» данного шага – многочленFs-1(х) = Rs-1(x) x(k-(s-1)ℓ) + A`s-1(х) х(n-k) =Rs-1(x) x(m0) + A`s-1(х) х(n-k), т. к. k=(s‑1)ℓ+mпо определению этихвеличин.
/>
Рис. 3.Формирование последовательности Fs-1при векторномпредставлении величин
Обозначимпоследние формирующиеся (n-k) бит Y(х). Как мы видели до (s‑1) –го шага Y(х)=0. Следовательно, Y(х) можно ввести в (6) какнулевое слагаемое, если пределы суммирования ограничить величиной (s-u‑1).После шага sможно записать
/> (7)
Здесь /> т.е. являетсяпроверочными битами кодового слова.
7.2 Алгоритмкодирования
Известно настарте:
– длинавыходных кодовых слов n;
– длинавходной последовательности k;
– числоконтрольных бит (n-k)=r;
– порождающиймногочлен G(x);
Назначаетсявеличина ℓ≤ r. Вычисляются параметры s и m0.В памяти машины организуется 2ℓ строк («мест»). Вкаждую строку для каждой конфигурации двоичного отрезка длины ℓпишется остаток, вычисленный заранее по изложенному выше алгоритму. Впроцессе кодирования процедура деления заменяется считыванием из памяти остаткадля очередного ℓ-отрезка кодируемой последовательности. Этосущественно повышает быстродействие программного кодера при (обычно) приемлемомрасходе памяти. Желательно так писать программу, чтобы ℓ-отрезокмог выступать в роли «смещения» по адресному пространству списка остатков.
Алгоритмкодирования сводится к следующему.
1. Изисходной k‑битовой информационной последовательности со сторонылевых («старших») разрядов выделяется отрезок длины ℓ и из таблицывыбирается соответствующий ему остаток.
2. Полученныйостаток суммируется по mod2 с левыми разрядами оставшейся части блокадлиной (k-ℓ) бит.
3. Изполученной суммы со стороны левых разрядов выделяется очередной ℓ-отрезок,для которого из таблицы считывается соответствующий остаток и т.д.
4. Через(s‑1) таких шагов из полученной суммы выделяются m0старшихразрядов ℓ-m0и для сформированной ℓ-разряднойкомбинации выбирается соответствующий остаток из таблицы.
5. Полученныйостаток суммируется по mod2 с оставшимися (после выделения m0разрядов) битами. Эта сумма является комбинацией проверочных разрядовциклического кода.
8. Содержательныйпример [3]
Методомделения по частям построить кодер для циклического (15,11) – кода,заданного порождающим многочленом G(x)=х4+х+1.
Здесь n=15;k=11. Выбираем ℓ=4. Тогда s=3, m0=3.Всего имеем 2ℓ различных конфигураций ℓ-отрезков.Остатки, соответствующие этим отрезкам, вычисленные в соответствии с алгоритмомделения по частям, приведены в табл. 1.
Пусть входная(информационная) последовательность, разделенная на отрезки, имеет вид: 11011000 110
Выбираемпервый ℓ-отрезок 1101 и выбираем из таблицы соответствующийостаток 0100. Складываем по mod2 со следующим отрезком 0100+1000=1100.Полученной сумме соответствует остаток 0111. Поскольку сделано уже (s‑1)шагов, прибавим этот остаток к оставшимся трем битам 0111+110=1011. На этотрезультат понадобится ссылка, поэтому присвоим ему наименование Us-1. Из полученной суммывыделим m0 левых бит и дополним их слева нулями доразмерности ℓ (в данном случае – одним нулем). Получим 0101. Изтаблицы найдем остаток – 1111. Выполняется s‑й шаг деления.Оставшуюся «1» (справа) от Us-1, из которого выделяли m0левых бит, сложим со стороны старших разрядов с только – что полученнымостатком 1111+1=0111. Это и есть контрольные биты к информационной последовательности1101 1000 110.
Результатможно проверить традиционным делением последовательности А(х) х(n-k) на G(x) (в нашем случае 11011000 110 0000 на 10011).
Табл. 1. Остаткидля ℓ-отрезков информационной последовательности
ℓ-отрезок Остаток
ℓ-отрезок Остаток
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
Использованная литература
1. М.Н. Аршинов, Л.Е. Садовский Коды и математика(рассказы о кодировании).-М.: Наука, Главная редакция физико-математическойлитературы, 1983. – 144 с.
2. Блейхут Р. Теория и практика кодов, контролирующихошибки: Пер. с англ. ‑ М.: Мир, 1986. – 576 с.
3. Гончаров Е.А, Слепаков В.Б.Об одном методе кодирования информации циклическими кодами на универсальнойЭВМ. – В кн.: Сб научных трудов ЦНИИС. М., 1970, вып. 3, с. 58–65.
4. В.С. Чернега, В.А. Василенко,В.Н. Бондарев Расчет и проектирование технических средств обмена ипередачи информации: Учебное пособие для вузов. – М.: Высш. шк., 1990. –224 с.