Помехоустойчивое кодирование: различия между версиями
Содержимое удалено Содержимое добавлено
Yaleks (обсуждение | вклад) мНет описания правки |
|||
Строка 1:
{{Википедия|Коды, исправляющие ошибки}}
==Аннотация==▼
▲== Аннотация ==
Здесь мы рассмотрим основные принципы и методы надёжной и
эффективной передачи данных между двумя машинами, соединёнными
Строка 10:
в какой они были переданы.
== Канальный уровень ==
На уровне канала данных решается ряд проблем, присущих
только этому уровню:
Строка 17 ⟶ 16 :
* разбиение потока бит на кадры,
* управление потоком кадров,
* обработка ошибок передачи.
Основная задача канального уровня
а это значит помочь передать данные с сетевого уровня одной машины на
сетевой уровень другой машины.
=== Разбиение на кадры ===
Сервис, создаваемый канальным уровнем для сетевого, опирается на
сервис, создаваемый физическим уровнем. На физическом уровне
Строка 31 ⟶ 30 :
канальном уровне по обнаружению и исправлению ошибок.
Типовой подход к решению этой проблемы
на кадры и подсчёт
посылке данных.
содержательной части кадра (слова длины <math>m</math>), область
значений которой
Эти
контрольная сумма вычисляется заново и сравнивается с той, что
хранится в кадре. Если они различаются, то это признак ошибки
Строка 45 ⟶ 44 :
ошибки, например, сбросить плохой кадр, послать сообщение об
ошибке тому кто прислал этот кадр. Разбиение потока битов на
кадры
временную паузу между битами разных кадров. Однако, в сети, где
нет единого таймера, нет гарантии, что эта пауза сохранится или,
Строка 51 ⟶ 50 :
то применяются другие. Здесь мы рассмотрим три основных:
* счетчик символов;
* вставка специальных стартовых и конечных символов или
* специальная кодировка на физическом уровне.
Строка 57 ⟶ 56 :
символов в кадре. При приёме число принятых символов
подсчитывается опять. Однако, этот метод имеет существенный
недостаток
Тогда принимающая сторона не сможет обнаружить границы кадра.
Даже обнаружив несовпадение контрольных сумм, принимающая
Строка 66 ⟶ 65 :
Обычно для этого используют управляющие последовательности:
последовательность <math>DLE STX</math> для начала кадра и <math>DLE ETX</math>
для конца кадра. <math>DLE</math>
TeXt, <math>ETX</math>
потеряна граница текущего кадра, надо просто искать
ближайшую последовательность <math>DLE</math> <math>STX</math> или <math>DLE</math> <math>ETX</math>. Но
Строка 78 ⟶ 77 :
По мере развития сетей эта связь становилась все более и более
обременительной и был предложен новый очевидный кодонезависимый
метод
бит-ориентированными. В частности, в протоколе <math>HDLC</math> каждый кадр
начинается и заканчивается со специального флаг-байта: 01111110.
Строка 84 ⟶ 83 :
кадра, обязательно вставит 0. Принимающая сторона, приняв 5
последовательных единиц обязательно удалит следующий за ними 0,
если таковой будет. Это называется
принято шесть и за ними следует ноль, то это управляющий сигнал:
начало или конец кадра, а в случае, когда подряд идут более шести
единиц,
(а) 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1
Строка 96 ⟶ 95 :
Таким образом, кадр легко может быть распознан по
флаг-байту. Если граница очередного кадра по какой-то
причине была потеряна, то все что надо делать
ближайший флаг-байт.
Строка 102 ⟶ 101 :
физическая среда. Например, в случае проводной связи для передачи
одного бита используется два импульса. 1 кодируется как переход
высокое-низкое, 0
или высокое-высокое не используются для передачи данных, и их
используют для границ кадра.
Строка 111 ⟶ 110 :
считается переданным правильно.
=== Контроль ошибок ===
Решив проблему разбиения на кадры, мы приходим к следующей
проблеме: как обеспечить, чтобы кадры, пройдя по физическому
Строка 145 ⟶ 144 :
{\slshape Итак, таймеры, нумерация кадров, флаг-байты,
кодирование и обратная связь
обеспечивающие надёжную доставку каждого кадра до сетевого
уровня в единственном экземпляре. Но и с помощью этих
Строка 151 ⟶ 150 :
передачи.}
=== Управление потоком ===
Другая важная проблема, которая решается на канальном уровне
— управление потоком. Вполне может
Строка 165 ⟶ 164 :
кадров тот может принять. Получатель сообщает ему определённое
число кадров. Отправитель после того, как передаст это число
кадров, должен приостановить передачу и снова спросить получателя,
как много кадров тот может принять, и т.д.
== Помехоустойчивое кодирование ==
=== Характеристики ошибок ===
Физическая среда, по которой передаются данные не может быть
абсолютно надёжной. Более того, уровень шума бывает очень
высоким, например в беспроводных системах связи и телефонных
системах. Ошибки при передаче
надо обязательно учитывать.
В разных средах ''характер помех'' разный. Ошибки могут быть
одиночные, а могут возникать группами, сразу по несколько. В
результате помех могут исчезать биты или наоборот
лишние.
Основной характеристикой ''интенсивности помех'' в канале
является параметр шума
вероятности инвертирования бита, при условии что, он был
передан по каналу и получен на другом конце.
Следующий параметр
события, но при условии, что предыдущий бит также был
инвертирован.
Строка 193 ⟶ 192 :
теории. Но, в принципе, можно было бы учитывать аналогичные
вероятности для исчезновения бита, а также ипользовать полную
информацию о пространственной корреляции ошибок,
корреляции соседних ошибок, разделённых одним, двумя или более
битами.
Строка 200 ⟶ 199 :
заключаются в следующем. Пусть данные передаются блоками по
1000 бит, а уровень ошибки 0,001 на бит. Если ошибки
изолированные и независимые, то 63 % (<math>0.63\approx
1-0.999^{1000}</math>) блоков будут содержать ошибки. Если же они
возникают группами по 100 сразу, то ошибки будут содержать
1 % (<math>0.01\approx 1-0.999^{10}</math>) блоков.
Зато, если ошибки не группируются, то в каждом кадре они невелики,
и есть возможность их исправить. Групповые ошибки портят
кадр безвозвратно. Требуется его повторная пересылка, но в
некоторых системах это в принципе невозможно,
в телефонных системах, использующие цифровое кодирование,
возникает эффект пропадания слов/слогов.
Строка 214 ⟶ 213 :
Для надёжной передачи кодов было предложено два основных метода.
''Первый''
полученный блок, можно было бы сказать есть в переданном
блоке ошибки или нет. Это, так называемые, '''коды с обнаружением ошибок'''.
''Второй''
анализируя полученные данные, можно не только замечать
ошибки, но и указать, где именно возникли искажения. Это
'''коды, исправляющие ошибки'''.
Такое деление условно. Более общий вариант
обнаруживающие
<math>l \le k</math>.
=== * Элементы теории передачи информации ===
''Информационным каналом'' называется пара ''зависимых''
случайных величин <math>\{\xi_{in},\,\xi_{out}\}</math>, одна из них
Строка 233 ⟶ 232 :
дискретны и конечны, то есть имеют конечные множества событий:
: <math>\Omega_{in}=\{x_1,\dots, x_a\},\;\Omega_{out}=\{y_1,\dots, y_b\},</math>
то канал определяется матрицей условных вероятностей
<math>\|r_{ij}\|</math>, <math>r_{ij}</math>
будет значение <math>y_i</math> при условии, что на входе измерено
значение <math>x_j</math>.
<math>\{p_1,\dots,p_a\}</math> на <math>\Omega_{in}</math>, а распределение на
выходе вычисляется по формуле
: <math>q_i=\sum_{j=1}^{a}r_{ij}p_j.</math>
Объединённое распределение на
<math>\Omega_{in}\times\Omega_{out}</math> равно
: <math>P_{ij}=r_{ij}p_j.</math>
Информация <math>I(\{\xi_{in},\,\xi_{out}\})</math>, передаваемая через
канал, есть взаимная информация входа и выхода:
: <math>
I(\{\xi_{in}\,\xi_{out}\})=H(\xi_{in})+H(\xi_{out})-H(\{\xi{in},\xi_{out}\}),
</math>
где
: <math>H(\xi_{in})=-\sum_{i=1}^ap_i\log_2 p_i,</math>
: <math>H(\xi_{out})=-\sum_{i=1}^aq_i\log_2 q_i,</math>
: <math>H(\{\xi_{in},\,\xi_{out}\})=-\sum_{i,j}P_{ij}\log_2 P_{ij}.</math>
Если случайные величины <math>\xi_{in}</math> и <math>\xi_{out}</math> независимы (то
Строка 270 ⟶ 269 :
<math>\{\xi_{in},\,\xi_{out}\}</math> невозможно передавать информацию и
<math>I(\{\xi_{in},\,\xi_{out}\})=0</math>. Понять суть формулы
(
величины равна информации, которую мы получаем при одном её
измерении. <math>H(\xi_{in})</math> и <math>H(\xi_{out})</math>
содержится по отдельности во входе и в выходе. Но часть этой
информации общая, её нам и нужно найти. <math>H(\{\xi{in},\xi_{out}\})</math>
равна величине объединённой информации. В теории
меры{{ref|note1}} есть выражение
аналогичное (
: <math>\mu(A\wedge B)=\mu(A)+\mu(B)-\mu(A\vee B).</math>
Распределение входной случайной величины <math>\xi_{in}</math> мы можем
варьировать и получать различные значения
называется пропускной способностью канала
: <math>
C(\|r_{ij}\|)=\max_{p_i}I(\{\xi_{in}\,\xi_{out}\}).
</math>
Эта функция есть решение задачи
<div class="task">
которое можно передать с одним битом по каналу
<math>\{\xi_{in},\,\xi_{out}\}</math>?
{\slshape Итак, пропускная способность есть функция на
Строка 305 ⟶ 304 :
Стандартный информационный канал это
: <math>\Omega_{in}=\Omega_{out}=\{0,1\}.</math>
: <math>
\|r_{ij}\|=\begin{array}{||cc||} 1-p &p\\ p& 1-p
\end{array}\;.
</math>
То есть канал с бинарным алфавитом и вероятностью помехи
(
инвертирован). Его пропускная способность равна
: <math>C= 1-H(p)=1+p\log_2p+(1-p)\log_2{(1-p)}.</math>
Эта функция является решением задачи на максимум (
для матрицы (
<div align="center">
Строка 327 ⟶ 326 :
width=0.75\textwidth]{pictures/cideal.eps} \caption{ <math>C(p)</math> —
Пропускная способность канала как функция вероятности
инвертирования бита.}
\end{figure}
</div>
Эта функция <math>C(p)</math> (рис.
помехоустойчивого кодирования
надёжностью передать по каналу с пропускной способностью
сообщение длиной
нужно будет передать <math>n\geqslant m/C</math>. А точнее, всякое
помехоустойчивое кодирование, обеспечивающее вероятность
Строка 340 ⟶ 339 :
раздувает данные в <math>k_{\varepsilon}(m,p)</math> раз и
: <math>\lim_{\varepsilon\to 0}\lim_{m\to\infty}k_{\varepsilon}(m,p)\geqslant {1/C(p)}.</math>
Кодирование, при котором в этом пределе достигается
Строка 348 ⟶ 347 :
<math>k_0(m,p)=\infty.</math>
Задача дуальная
образом
<div class="task">
Мы хотим передавать информацию со скоростью
пропускной способностью
ошибочной передачи одного бита?
Решением будет функция заданная неявно
<math>C/V=1+p\log_2p+(1-p)\log_2(1-p)</math>,
<math>p(V/C)=0</math>,
Оказывается, вероятность ошибки растет не так уж и быстро.
Строка 373 ⟶ 372 :
<div align="center">
\begin{figure}[t!]
\psfrag{v}{
\centering\includegraphics[clip=true,
width=0.75\textwidth]{pictures/pv.eps} \caption{ <math>p(v)</math> —
минимальная вероятность ошибки в одном бите как функция от
отношения скорости передачи и пропускной способности <math>v=V/C</math>.}
\end{figure}
</div>
Строка 386 ⟶ 385 :
сложная математическая задача.
=== Метод «чётности» и общая идея ===
Простым примером
кода с обнаружением одной ошибки является код с битом чётности.
Конструкция его такова: к исходному слову добавляется бит
чётности. Если в исходном слове число единичек чётно, то значение
этого бита 0, если нечётно
этого кода имеют чётное количество единичек. Если получено слово
с нечётным количеством единичек, то при передаче произошла ошибка.
В случае вероятных групповых ошибок эту технику можно
скорректировать. Разобъём передаваемые данные на
бит и расположим их в виде матрицы <math>n\cdot k</math> (
каждого столбца вычислим бит чётности и разместим его в
дополнительной строке. Матрица затем передается по строкам. По
Строка 404 ⟶ 403 :
позволяет обнаружить групповые ошибки длины <math>\leq n</math>.
<div class="task">
Слово длиной
уровнем шума
передаче произошли ошибки и мы их не заметили равна
: <math>P_{miss}(2,n,p)=C^2_np^2(1-p)^{n-2}+C^4_np^4(1-p)^{n-4}+\dots+C^{2k}_np^{2k}(1-p)^{n-2k}+\dots
</math>
Что можно привести к виду
: <math>
P_{miss}(2,n,p)={{((1-p)+p)^n+((1-p)-p)^n -2(1-p)^n}\over 2}={{1-2(1-p)^n+(1-2p)^n}\over 2}.
</math>
Строка 420 ⟶ 419 :
Например, при <math>n=1000</math> и <math>p=10^{-6}</math> получаем <math>P_{miss}\approx 4.99\cdot 10^{-7}</math>
Следующая задача повышенной сложности.
<div class="task">
сумму единичек по модулю
ошибок в слове длиной
равна <math>P_{miss}(d,n,p)</math>:
: <math>
P_{miss}(2,n,p)={1+(1-2p)^n-2(1-p)^n \over 2},
</math>
: <math>
P_{miss}(3,n,p)={1+(1-p+e^{\frac{2\pi}{3}\mathbf{i}} p)^n+(1-p+e^{-\frac{2\pi}{3}\mathbf{i}} p)^n-3(1-p)^n\over 3},
</math>
: <math>
P_{miss}(4,n,p)={1+(1-p+e^{\frac{\pi}{2}\mathbf{i}} p)^n+(1-p+e^{\frac{2\pi}{2}\mathbf{i}} p)^n+1-p+e^{\frac{3\pi}{2}\mathbf{i}} p)^n-4(1-p)^n \over 4}=
</math>
: <math>
={1+(1-2p)^n + 2((1-p)^2+p^2)^{n \over 2}\cos(n\arctan{p\over (1-p)})-4(1-p)^n \over 4}.
</math>
Строка 447 ⟶ 446 :
заданная функция <math>n(d,P_{miss},p)</math>, а точнее даже коэффициент
содержания полезной информации
<math>KPS(n,P_{miss},p)={n-\log_2 d \over n}</math> в переданных
бит как функция от величины шума и вероятности незамеченных
ошибок. Чем выше желаемая надёжность передачи, то есть чем меньше
Строка 453 ⟶ 452 :
полезной информации.
Итак, с помощью одного бита чётности мы повышаем надёжность
передачи, и вероятность незамеченной ошибки равна
<math>P_{miss}(2,n,p)</math>. Это вероятность уменьшается с уменьшением
При <math>n=2</math> получаем <math>P_{miss}(2,2,p)=p^2</math>, это соответствует
дублированию каждого бита. Рассмотрим общую идею того, как с
Строка 463 ⟶ 462 :
высокой надёжности передачи.
''Общая идея'' На множестве слов длины
метрика Хемминга: расстояние Хемминга между двумя словами
равно количеству несовпадающих бит. Например,
: <math>\rho_H(10001001,10110001)=3.</math>
<div class="task">
Докажите, что <math>\rho_H</math> метрика.
Если два слова находятся на расстоянии
это значит, что надо инвертировать ровно
преобразовать одно слово в другое. В описанном ниже
кодировании Хемминга любые два различных допустимых слова
находятся на расстоянии <math>\rho_H\geq 3</math>. Если мы хотим
обнаруживать
от друга на расстояние <math>\geq d+1</math>. Если мы хотим
исправлять ошибки, то надо чтобы кодослова отстояли друг от
друга на <math>\geq 2d+1</math>. Действительно, даже если
переданное слово содержит
неравенства треугольника, все равно ближе к правильному
слову, чем к какому-либо еще, и следовательно можно
Строка 491 ⟶ 490 :
называется ''расстоянием Хемминга данного кода''.
Элементарный пример помехоустойчивого кода
которого есть только четыре ''допустимых кодовых слова'':
: <math>0000000000,\; 0000011111,\; 1111100000,\; 1111111111.</math>
Расстояние по Хеммингу у этого кода 5, следовательно он может
исправлять двойные ошибки и замечать 4 ошибки. Если получатель
получит слово
вид
исходное слово длины
Отметим что имеет смысл говорить о двух коэффициентах:
* <math>KPS(n)=\frac{m(n)}{n}</math>
* <math>k(m)=\frac{n(m)}{m}</math>
Первый есть функция от переменной
ему,
Здесь мы подошли к довольно трудной задаче —
минимизировать коэффициент раздувания для требуемой
надёжности передачи. Она рассматривается в разделе
=== Циклические коды ===
На практике активно применяются полиномиальные коды
или циклические избыточные коды ('''Cyclic Redundancy Code
—
строки коэффициентов полинома.
соответствует полиному степени <math>k-1</math>. Самый левый бит строки
— коэффициент при старшей степени. Например, строка
представляет полином <math>x^5+x^4+x^0</math>. Коэффициенты полинома
принадлежат полю <math>G\mathbb{F}(2)</math>
Основная идея заключена в том, чтобы пересылать только такие
Строка 535 ⟶ 534 :
Есть два очевидных способа кодирования сообщения в полином,
который делится на <math>G(x)</math>
сообщения на <math>G(x)</math>, либо добавить к нашему сообщению некоторое
количество бит так, чтобы результирующий полином делился на
<math>G(x)</math>. В
Отправитель и получатель заранее договариваются
о конкретном ''полиноме-генераторе'' <math>G(x)</math>. Пусть степень
<math>G(x)</math> равна
равна
Мы добавляем контрольные
блоку так, чтобы получился полином кратный генератору
<math>G(x)</math>. Когда получатель получает блок с контрольной суммой,
он проверяет его делимость на
0</math>, то были ошибки при передаче.
''Алгоритм кодирования
''Дано слово
# ''Добавить
# ''Разделить
# ''Вычесть остаток (вычитание в <math>\mathbb{F}_2</math> то же самое, что и
Рис.
\begin{figure}[h!]
Строка 569 ⟶ 568 :
\end{tabular}}
\centering\includegraphics[clip=true,
width=0.75\textwidth]{pictures/crc2.eps}
\caption{CRC
\end{figure}
Строка 581 ⟶ 580 :
* <math>CRC-12 = x^{12} + x^{11}+x^3+x^2+x+1</math>
* <math>CRC-16 =x^{16}+x^{15}+x^2+1</math>
* <math>CRC-CCITT = x^{16}+x^{12}+x^5+1</math>
<math>CRC-12</math> используется для передачи символов из
Два остальных
одиночные, двойные ошибки, групповые ошибки длины не более 16 и
нечётное число изолированных ошибок с вероятностью
=== * Теоретический предел ===
к задаче
значение коэффициента содержания полезной информации (КПС) на
один бит, если передавать данные по каналу с шумом
длиной
ошибки была меньше <math>P_{miss}</math>.
Строка 606 ⟶ 605 :
абсолютной точностью.
<div class="task">
Мы хотим передавать информацию блоками, которые содержали
бы
вероятность ошибки в одном бите равнялась
правильность передачи «фиксировалось контрольной суммой». Найти
минимальный размер блока <math>n(m,p)</math> и коэффициент раздувания
<math>k=\frac{n(m)}{m}</math>.
''Решение.''
Для передачи
(см. задачу
об ошибке в передаче. Её вероятность равна <math>(1-p)^m</math>, а
значит информация, заложенная в этом сообщении,
<math>H((1-p)^m)</math>. В итоге получаем <math>n=mC(p)+H((1-p)^m)</math> и
: <math>k(m,p)=C(p)+\frac{H((1-p)^m)}{m}.</math>
''Конец решения.''
Заметим, что <math>k(1,p)=1</math>
сообщение об ошибке в нём равносильно передаче самого бита.
Если передавать эти сообщения по каналу с уровнем помех
количество бит на одно сообщение равно <math>m k(m,p)/C(p)</math>, то есть
теоретическая оценка для количества лишних бит равна
: <math>\frac{H((1-p)^m)}{C(p)}</math>
Понятно, что данная теоретическая оценка занижена.
=== Коды Хемминга ===
Элементарный пример кода исправляющего ошибки был показан на
странице \pageref{simplecode}. Его обобщение очевидно. Для
Строка 647 ⟶ 646 :
3</math>. Оказывается это число можно сделать сколь угодно близким к
единице с помощью кодов Хемминга. В частности, при кодировании
<math>KPS=\frac{11}{15}</math>.
Оценим минимальное количество контрольных
разрядов, необходимое для исправления одиночных ошибок. Пусть
содержательная часть составляет
контрольных. Каждое из <math>2^m</math> правильных сообщений имеет <math>n=m+r</math>
его неправильных вариантов с ошибкой в одном бите. Такими
Строка 659 ⟶ 658 :
слов <math>2^n</math>, то
: <math>
\begin{array}{c}
(n+1)2^m \leqslant 2^n\\ (m+r+1)\leqslant 2^r.
Строка 667 ⟶ 666 :
Этот теоретический предел достижим при использовании
метода, предложенного Хеммингом. Идея его в следующем: все
биты, номера которых есть степень
остальные
отвечает за чётность суммы некоторой группы бит. Один и тот
же бит может относиться к разным группам. Чтобы определить
какие контрольные биты контролируют бит в позиции
разложить
бит относится к трём группам
подсчитывается в 1-ом бите, к группе 2-ого и к группе 8-ого
бита. Другими словами в контрольный бит с номером <math>2^k</math>
Строка 679 ⟶ 678 :
в разложении по степеням двойки степень <math>2^k</math>:
: <math>
\begin{array}{l}
Строка 687 ⟶ 686 :
b_8=b_9+b_{10}+b_{11}+b_{12}+b_{13}+b_{14}+b_{15}\dots \\
\end{array}
</math>
Код Хемминга оптимален при <math>n=2^r-1</math> и <math>m=n-r</math>. В общем случае
<math>m=n-[\log_2(n+1)]</math>, где <math>[x]</math>
<math>\leqslant x</math>. Код Хемминга мы будем обозначать <math>Hem(n,m)</math> (хотя
Пример для <math>Hem(15,11)</math>:
: <math>
\fbox{10110100111}\to
\fbox{\fbox{0}\fbox{0}1\fbox{1}011\fbox{0}0100111}
</math>
: <math>
\hphantom{\fbox{10110100111}\to}\;\;
\lefteqn{\,b_1}\hphantom{\fbox{0}}
Строка 714 ⟶ 713 :
получатель проверяет каждый контрольный бит на предмет
правильности чётности и складывая номера контрольных бит, в
которых нарушена чётность. Полученное число, есть
бит, где произошла ошибка. Если ошибка одна, то это число есть
просто номер ошибочного бита.
Строка 727 ⟶ 726 :
\centering\includegraphics[clip=true,
width=0.65\textwidth]{pictures/hem.eps} \caption{Кодирование
Хемминга}
\end{figure}
<div class="task">
Покажите, что <math>KPS_{Hem(n,m)}\to 1</math> при <math>n\to
\infty</math>.
Код Хемминга может исправлять только единичные ошибки. Однако,
есть приём, который позволяет распространить этот код на случай
групповых ошибок. Пусть нам надо передать
Расположим их в виде матрицы одно слово
передают слово за словом. Но мы поступим иначе, передадим слово
длины
приёме всех слов матрица восстанавливается. Если мы хотим
обнаруживать групповые ошибки размера
восстановленной матрицы будет не более одной ошибки. А с
одиночными ошибками код Хемминга справится.
=== Анализ эффективности ===
Начнём c небольшого примера. Пусть у нас есть канал с уровнем
ошибок <math>p=10^{-6}</math>. Если мы хотим исправлять единичные ошибки при
передаче блоками по <math>1023=2^{10}-1</math> бит, то среди них потребуется
приходится
таких блоков потребуется <math>\Delta=10\,000</math> контрольных бит.
В тоже время для обнаружения единичной ошибки достаточно одного
бита чётности. И если мы применим технику повторной передачи, то
на передачу
дополнительно и примерно <math>0.001\approx
p_{1014}=1-(1-10^{-6})^{1014}</math> из них придется пересылать
повторно. То есть на
дополнительная нагрузка линии составляет <math>\Delta\approx
1000+1001</math>, что меньше <math>10\,000</math>. Но это не значит, что код
Хемминга плох для такого канала. Надо правильно выбрать длину
блока
Рассмотрим этот вопрос подробнее. Пусть нам нужно передать
информацию
и будем передавать двумя способами
— с помощью кодов Хемминга и без них. При этом будем
Строка 779 ⟶ 778 :
<math>m'=k_\varepsilon(m)m</math>
1) '''Без кода Хемминга.'''
Если пересылать информацию
блоками по <math>m'</math> бит с повторной пересылкой в случае
обнаружения ошибки, то получим, что в среднем нам придётся
переслать
: <math>D=L m'{1 \over 1-P_{r}}</math>
Где <math>P_{r}=(1-(1-p)^{m'})(1-\varepsilon)</math>
повторной передачи равная вероятности ошибки умноженной на
вероятность того, что мы её заметим. Коэффициент раздувания
равен
: <math>k(m,p,\varepsilon)=\frac{D}{M}=\frac{k_{\varepsilon}(m)}{\varepsilon+(1-\varepsilon)(1-p)^{k_{\varepsilon}(m)m}}</math>
2) '''С кодом Хемминга.'''
При кодировании методом Хемминга слова длины <math>m'</math> получается слово длины
: <math>
2^n=2^{m'}(n+1), \;\; k_{\varepsilon}(m)m= n-\log_2(n+1)
</math>
Для отдельного блока вероятность
Строка 808 ⟶ 807 :
что произошло более чем одна ошибка, и мы это заметили
: <math>P_{r}={(1-P_0-P_1)}{(1-\varepsilon)}={1-\varepsilon-(1-\varepsilon)(1-p)^{n-1}(np+1-p)}</math>
— в этом случае требуется повторная передача кадра.
Количество передаваемых данных:
: <math>D_{H}=L n{1 \over 1-P_{r}}={L n \over \varepsilon+(1-\varepsilon)(1-p)^{n-1}(np+1-p)}</math>
И коэффициент раздувания
: <math>k_H(m,p,\varepsilon)={ n
\over m\bigl(\varepsilon+(1-\varepsilon)(1-p)^{n-1}(np+1-p)\bigr)},</math>
где <math>n(m)</math> неявно определённая с помощью (
функция. Удобно записать соответствующие коэффициенты
полезного содержания:
: <math>
KPS= KPS_{\varepsilon}\bigl(n\bigr)\bigl(\varepsilon+(1-\varepsilon)(1-p)^n\bigr)
</math>
: <math>
KPS_H={KPS_{\varepsilon}\bigl(m'\bigr)\frac{m'}{n}\bigl(\varepsilon+(1-p)^{n-1}(np+1-p)(1-\varepsilon)\bigr)},
</math>, <math>m'=n-\log_2(n+1)</math>
Легко обнаружить что при <math> n > 3444 </math> и <math>p=10^{-6}</math> код Хемминга
Строка 836 ⟶ 835 :
<div align="center">
\begin{figure}[h!]
\psfrag{knc}{кпс} \psfrag{n}{
\centering\includegraphics[clip=true,
width=0.48\textwidth]{pictures/kps.eps}
\centering\includegraphics[clip=true,
width=0.48\textwidth]{pictures/kps2.eps} \caption{
<math>KPS(n,p,\varepsilon)</math>
\parbox{0.85\textwidth}{\small Светлый график
Темный график
\\Параметры: <math>\varepsilon=10^{-6}\;</math>; <math>p=10^{-6}.</math>}
\end{figure}
</div>
Строка 852 ⟶ 851 :
<div align="center">
\begin{figure}[h!]
\psfrag{C}{
\centering\includegraphics[clip=true,
width=0.75\textwidth]{pictures/kpseff.eps}
\caption{<math>C(p,\varepsilon)</math>
содержания в канале с помехами как функция уровня помех.}
\parbox{0.97\textwidth}{ \small Светлый график
предел, задаваемый функцией <math>C(p)</math>\\Параметры:
<math>\varepsilon=10^{-6}</math>.}
\end{figure}
</div>
Значение <math>KPS_{\varepsilon}(n)</math> используемое в
формулах (
: <math>KPS_{\varepsilon}(n)={\log_2{\left(1-\varepsilon(2^n-1)\right)} \over n}</math>
Напомним, что <math>\varepsilon</math> есть параметр желаемой
надёжности передачи
— чем меньше <math>\varepsilon</math>, тем надёжнее передача.
По определению <math>\varepsilon=P_{miss}/(1-P_{0})</math>
ошибочной передачи блока при условии, что «контрольная сумма
сошлась» и кадр засчитан правильно переданным.
Строка 877 ⟶ 876 :
получается из формулы
: <math>\varepsilon=\frac{2^m-1}{2^n-1}</math>
Но это безусловно лишь оценочная формула. Оптимальное
значение <math>KPS_{\varepsilon}</math> значительно сложнее и
зависит от
Из графика на рисунке
больших
Но зависимость КПС от
кода. Эффективность кода определяется функцией
: <math>C(p,\varepsilon)=\min_{n}{KPS(p,n,\varepsilon)}</math>
На рисунке
него ясно, что код Хемминга можно использовать с пользой
всегда
возможность выбирать подходящее
=== Коды как линейные операторы ===
То, что на множестве {0,1} есть структура числового поля,
позволяет осуществлять алгебраические интерпретации кодирования.
Заметим, в частности, что как коды Хемминга, так и циклические
коды ''линейны'':\\ 1) отношения (
с. \pageref{eq:hem}, связывающие контрольные биты кода Хемминга с
другими линейны,\\ 2) остаток от деления суммы многочленов на
Строка 907 ⟶ 906 :
<math>G\mathbb{F}(2)^n</math>. Поясним на примерах. Ниже представлена
матрица кода Хемминга <math>Hem(7,4)</math> (см.
соотношения (
<math>{\mathbf{w}_{in}=\overline{b_3b_5b_6b_7}}</math>, а результирующее
<math>{\mathbf{w}_{out}=\overline{b_1b_2b_3b_4b_5b_6b_7}=\mathbf{A}_{Hem(7,4)}\mathbf{w}_{in}}</math>
(слова соответствуют столбцам).
: <math>
\mathbf{A}_{Hem(7,4)}=\begin{Vmatrix}
1&1&0&1\\ 1&0&1&1\\ 1&0&0&0\\ 0&1&1&1\\ 0&1&0&1\\ 0&0&1&0\\
Строка 923 ⟶ 922 :
<math>\mathbf{s}=\overline{s_1s_2s_3}=\mathbf{H}\mathbf{w'}_{out}</math> в
случае правильной передачи должно быть равно 000. Значение
<math>\mathbf{s}</math> называется ''синдромом ошибки''.
слова <math>\mathbf{s}</math> контролирует
(
бит в которых произошла ошибка, как векторов в <math>G\mathbb{F}(2)^3</math>.
: <math>\mathbf{H}_{Hem(7,4)}=
\begin{Vmatrix}
1&0&1&0&1&0&1\\ 0&1&1&0&0&1&1\\0&0&0&1&1&1&1
Строка 939 ⟶ 938 :
Вычиcление рабочей матрицы для циклических кодов
основывается на значениях <math>G_n(x)=x^n\; \mathop{mod}\; G(x)</math>. Верхняя
её часть равна единичной, так
без изменения в начало слова, а нижние
столбцов высоты
<math>G_n</math>, <math>G_{n-1}</math>,
\dots, <math>G_{n-r}</math>. Например, для <math>G(x)=x^3+x+1</math> и <math>m=4</math> имеем
<math>r=3</math>, <math>n=7</math> и
: <math>
\begin{vmatrix}
G_0&G_1&G_2&G_3&G_4&G_5&G_6&G_7\\
Строка 956 ⟶ 955 :
Рабочая и проверочная матрицы равны
: <math>\mathbf{A}=\left\|\begin{array}{c} E_4\\G_6
G_5 G_4 G_3
\end{array}\right\| , \quad \mathbf{H}=\|G_6G_5G_4G_3E_3\|,</math>
то есть
: <math>
\mathbf{A}=\begin{Vmatrix}
1&0&0&0\\ 0&1&0&0\\ 0&0&1&0\\ 0&0&0&1\\ 1&1&1&0\\
Строка 979 ⟶ 978 :
порождающей. В частности, рабочая матрица является порождающей.
Способность обнаруживать и исправлять ошибки однозначно
определяется подпространством
проверочных матриц соответствующих
Действительно, в порождающей и рабочей матрицах можно осуществлять
элементарные операции со столбцами, а в проверочной
строчками. Матрицы <math>\mathbf{A}</math>, <math>\mathbf{H}</math> и <math>\mathbf{G}</math>
всегда удовлетворяют отношениям
: <math>\mathbf{H}\cdot \mathbf{A}=\mathbf{0}_{rm},\; \mathbf{H}\cdot \mathbf{G}=\mathbf{0}_{rm},</math>
где
<math>\mathbf{0}_{rm}</math>
Любая порождающая матрица может использоваться как
Строка 999 ⟶ 998 :
матриц определяется рабочей матрицей:
: <math>\mathbf{D}\cdot \mathbf{A}=\mathbf{E}_m,</math>
где <math>\mathbf{E}_m</math>
подпространстве
Они отличаются на подпространстве ортогональном
декодирующую матрицу для <math>Hem(7,4)</math> и <math>CRC_{n=7,\;m=7}</math>:
: <math>
\mathbf{D}_{H_{7,4}}=
\begin{Vmatrix}
Строка 1030 ⟶ 1029 :
Сформулируем теперь основные моменты, касающиеся линейных кодов.
# Процесс кодирования и декодирования
# Обнаружение ошибок равносильно проверке принадлежности полученного слова подпространству
# В случае, когда векторы подпространства
# Комбинация (композиция) линейных кодов есть снова линейный код.
Практические методы помехоустойчивого кодирования все основаны на
линейных кодах. В основном это модифицированные
Хемминга и их композиции. Например <math>Hem(7,4)</math> плюс проверка на
чётность. Такой код может исправлять уже две ошибки. Построение
Строка 1047 ⟶ 1046 :
уровня групповые ошибки.
<div class="task">
Для данной проверочной матрицы постройте рабочую
матрицу. Докажите, что кодовое расстояние равно 4.
: <math>\mathbf{H}=\begin{Vmatrix}
1&0&1&0&1&0&1&0\\
0&1&1&0&0&1&1&0\\
Строка 1062 ⟶ 1061 :
# Кодовое расстояние равно минимальному количеству линейно зависимых столбцов в <math>\mathbf{H}</math>.
<div class="task">
Посторойте декодирующую и проверочную матрицу для циклического
Строка 1070 ⟶ 1069 :
рабочей матрицы использовалась матрица
: <math>\mathbf{A}=
\begin{Vmatrix}
0&0&0&1\\0&0&1&0\\0&1&0&1\\1&0&1&1\\0&1&1&0\\1&1&0&0\\1&0&0&0
\end{Vmatrix}.</math>
=== *Коды Рида-Соломона ===
После перехода на язык линейной алгебры естественно возникает
желание изучить свойства линейных кодов над другими конечными
Строка 1091 ⟶ 1090 :
найдётся единственное с точностью до изоморфности конечное поле с
таким числом элементов, которое обозначается как
<math>G\mathbb{F}(n)</math>. Простейшая реализация этого поля
многочленов по модулю неприводимого{{ref|note3}} многочлена <math>p(x)</math> степени
полем <math>\mathbb{F}_{q}</math> вычетов по модулю
многочленов с действительными коэффициентами неприводимыми
многочленами являются только квадратные многочлены с
отрицательным дискриминантом. Поэтому существует только
квадратичное расширение действительного поля
числа. А над конечным полем существуют неприводимые многочлены
любой степени. В частности, над <math>\mathbb{F}_{2}</math> многочлен
Строка 1103 ⟶ 1102 :
модулю <math>g(z)</math> образуют поле из <math>2^{3}=8</math> элементов.
== Примеры протоколов канала данных ==
===
Здесь мы познакомимся с группой протоколов давно известных, но
по-прежнему широко используемых. Все они имеют одного
предшественника —
протокол управления синхронным каналом, предложенным фирмой
в рамках
под названием
модифицировала
Link Access Procedure. Позднее он был модифицирован в
Все эти протоколы построены на одних и тех же принципах. Все
Строка 1122:
\centering\includegraphics[clip=true,
width=0.88\textwidth]{pictures/frame.eps} \caption{Типовая
структура кадра}
\end{figure}
</div>
На рис.
Поле адреса используется для адресации терминала, если их
несколько на линии. Для линий точка-точка это поле
используется для различия команды от ответа.
* Поле
* Поле
* Поле
Флаговые последовательности
разделения кадров и постоянно передаются по незанятой линии
в ожидании кадра. Существуют три вида кадров: <math>Information</math>,
<math>Supervisory</math>,
Организация поля
рис.
отправителя может быть до
передаваемым кадром. Подтверждение может быть в форме номера
последнего правильно переданного кадра, а может быть в форме
Строка 1153:
\centering\includegraphics[clip=true,
width=0.88\textwidth]{pictures/cfield.eps} \caption{Cтруктура поля
\parbox{0.66\textwidth}{\small (а) Информационный кадр (<math>Information</math>)\\
(б) Управляющий кадр (<math>Supervisory</math>)\\(в) Ненумерованный
кадр (
\end{figure}
</div>
Строка 1163:
Разряд <math>P/F</math> использует при работе с группой терминалов.
Когда компьютер приглашает терминал к передаче он
устанавливает этот разряд в
терминалами имеют здесь
посылаемый терминалом, то здесь стоит
<math>Supervisory</math> кадры имеют четыре типа кадров.
* Тип 0
* Тип 1
* Тип 2
* Тип 3
Третий класс кадров
используются для целей управления, но чаще для передачи данных
при ненадёжной передаче без соединения.
Все протоколы имеют команду DISConnect для указания о разрыве
соединения, SNRM и SABM
сброса соединения в начальное состояние, установки
соподчинённости на линии. Команда FRMR
повреждение управляющего кадра.
# {{note|note1}} Идея рассмотрения информации как меры на множестве ещё не до конца исчерпала себя
# {{note|note2}} Матрица называется ''стохастической'', если все её элементы неотрицательны и сумма элементов в каждом столбце равна единице.
# {{note|note3}} Многочлен называется ''неприводимым'', если он не разлагается в произведение многочленов меньшей степени.
|