Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Экзамен,чтоб тебя

.pdf
Скачиваний:
31
Добавлен:
13.03.2015
Размер:
2.31 Mб
Скачать

59. Способы контроля правильности передачи информации. Метод четности. Метод Хэмминга.

Управление правильностью (помехозащищенностью) передачи информации выполняется с помощью помехоустойчивого кодирования. Различают коды, обнаруживающие ошибки, и корректирующие коды, которые дополнительно к обнаружению еще и исправляют ошибки. Помехозащищенность достигается с помощью введения избыточности. Устранение ошибок с помощьюкорректирующих кодов (такое управление называют ForwardErrorControl) реализуют в симплексных каналах связи. В дуплексных каналах достаточно применения кодов, обнаруживающих ошибки (FeedbackorBackwardErrorControl), так как сигнализация об ошибке вызывает повторную передачу от источника. Это основные методы, используемые в информационных сетях.

Простейшими способами обнаружения ошибок являются контрольное суммирование, проверка на нечетность. Однако они недостаточно надежны, особенно при появлении пачек ошибок. Поэтому в качестве надежных обнаруживающих кодов применяют циклические коды. Примером корректирующего кода является код Хемминга.

Метод четности.

Метод контроля четности (BitInterleavedParity - В1Р) - метод контроля параметров ошибки без отключения канала. Этот метод, также как и CRC, является оценочным, но он дает хорошие результаты при анализе систем передачи SDH. Алгоритм контроля четности достаточно прост (рис.1). Контроль четности выполняется для конкретного блока данных цикла в пределах групп данных по 2, 8 и 24 бита (BIP-2, BIP-8 и В1Р-24 соответственно). Эти группы данных организуются в столбцы, затем для каждого столбца рассчитывается его четность, т.е. четное или нечетное количество единиц в столбце. Результат подсчета передается в виде кодового слова на приемную сторону. На приемной стороне делается аналогичный расчет, сравнивается с результатом и делается вывод о количестве ошибок четности. Результат сравнения передается в направлении, обратном передаче потока.

Рис.1.Алгоритм контроля чётности.

Метод контроля четности является оценочным, поскольку несколько ошибок могут компенсировать друг друга в смысле контроля четности, однако этот метод дает приемлемый уровень оценки качества цифровой системы передачи.

Код Хемминга

В коде Хемминга вводится понятие кодового расстояния d (расстояния между двумя кодами), равного числу разрядов с неодинаковыми значениями. Возможности исправления ошибок связаны с минимальным кодовым расстоянием dmin. Исправляются ошибки кратности r = ent (dmin-1)/2 и обнаруживаются ошибки кратности dmin-1 (здесь ent означает “целая часть”). Так, при контроле на нечетность dmin = 2 и обнаруживаются одиночные ошибки. В коде Хемминга dmin = 3. Дополнительно к информационным разрядам вводится L = log2K избыточных контролирующих разрядов, где K - число информационных разрядов,L округляется до ближайшего большего целого значения. L-разрядный контролирующий код есть инвертированный результат поразрядного сложения (т.е. сложения по модулю 2) номеров тех информационных разрядов, значения которых равны 1.

П р и м е р 1. Пусть имеем основной код 100110, т.е. К = 6. Следовательно, L = 3 и дополнительный код равен

010 # 011 # 110 = 111,

где # - символ операции поразрядного сложения, и после инвертирования имеем 000. Теперь вместе с основным кодом будет передан и дополнительный. На приемном конце вновь рассчитывается дополнительный код и сравнивается с переданным. Фиксируется код сравнения (поразрядная операция отрицания равнозначности), и если он отличен от нуля, то его значение есть номер ошибочно принятого разряда основного кода. Так, если принят код 100010, то рассчитанный в приемнике дополнительный код равен инверсии от 010 # 110 = 100, т.е. 011, что означает ошибку в 3-м разряде.

П р и м е р 2. Основной код 1100000, дополнительный код 110 (результат инверсии кода 110 # 111 = 001). Пусть принятый код 1101000, его дополнительный код 010, код сравнения 100, т.е. ошибка в четвертом разряде.

60.Алгоритмы сжатия данных. Сжатие с потерями и без потерь. Метод Хаффмана. Сжатие заголовков. Алгоритм Лемпеля-Зива

Сжатие данных — алгоритмическое преобразование данных, производимое с целью уменьшения их объёма. Применяется для более рационального использования устройств хранения и передачи данных.

Все методы сжатия данных делятся на два основных класса:

Сжатие без потерь

Сжатие с потерями

При использовании сжатия без потерь возможно полное восстановление исходных данных, сжатие с потерями позволяет восстановить данные с искажениями, обычно несущественными с точки зрения дальнейшего использования восстановленных данных. Сжатие без потерь обычно используется для передачи и хранения текстовых данных, компьютерных программ, реже — для сокращения объёма аудио- и видеоданных, цифровых фотографийи т. п., в случаях, когда искажения недопустимы или нежелательны. Сжатие с потерями, обладающее значительно большей, чем сжатие без потерь, эффективностью, обычно применяется для сокращения объёма аудио- и видеоданных и цифровых фотографий в тех случаях, когда такое сокращение является приоритетным, а полное соответствие исходных и восстановленных данных не требуется.

Метод Хаффмана

Сжимая файл по алгоритму Хаффмана первое что мы должны сделать - это необходимо прочитать файл полностью и подсчитать сколько раз встречается каждый символ из расширенного набора ASCII. Если мы будем учитывать все 256 символов, то для нас не будет разницы в сжатии текстового и EXE файла.

После подсчета частоты вхождения каждого символа, необходимо просмотреть таблицу кодов ASCII и сформировать мнимую компоновку между кодами по убыванию. То есть, не меняя местонахождение каждого символа из таблицы в памяти отсортировать таблицу ссылок на них по убыванию. Каждую ссылку из последней таблицы назовем "узлом". В дальнейшем ( в дереве ) мы будем размещать указатели которые будут указывать на этот "узел". Для ясности давайте рассмотрим пример:

Мы имеем файл длиной в 100 байт и имеющий 6 различных символов в себе. Мы подсчитали вхождение каждого из

символов в файл и получили следующее :

 

|-----------------

|-----

|-----

|-----

|-----

|-----

|-----

|

| cимвол

| A

|

B |

C | D | E

|

F |

|-----------------

|-----

|-----

|-----

|-----

|-----

|-----

|

| число вхождений |

10 |

20 |

30 | 5

|

25 | 10 |

|-----------------

|-----

|-----

|-----

|-----

|-----

|-----

|

Теперь мы берем эти числа и называем их частотой вхождения для каждого символа. Разместим таблицу:

|-----------------

|-----

|-----

|-----

|-----

|-----

|-----

|

| cимвол

| C

|

E |

B |

F | A

| D

|

|-----------------

|-----

|-----

|-----

|-----

|-----

|-----

|

| число вхождений |

30 |

25 |

20 | 10 | 10 | 5 |

|-----------------

|-----

|-----

|-----

|-----

|-----

|-----

|

Мы возьмем из последней таблицы символы с наименьшей частотой. В нашем случае это D (5) и какой либо символ из F или A (10), можно взять любой из них, например A.

Сформируем из "узлов" D и A новый "узел", частота вхождения для которого будет равна сумме частот D и A:

Частота

30

10

5

10

20

25

Символа

C

A

D

F

B

E

 

|

|

 

 

 

 

 

|--|--

|

 

 

 

 

 

||-|

 

 

 

 

 

|15| = 5 + 10

 

 

 

 

|--

|

 

 

 

 

Номер в рамке - сумма частот символов D и A. Теперь мы снова ищем два символа с самыми низкими частотами вхождения, исключаяиз просмотра D и A и рассматривая вместо них новый "узел" с суммарной частотой вхождения. Самая низкая частота теперь у F и нового "узла". Снова сделаем операцию слияния узлов :

Частота

30

10

5

10

20

25

Символа

 

C

 

A

D

F

B

E

 

|

|

 

 

|

 

 

 

 

|

|

 

 

|

 

 

 

 

|

|--||

 

 

|

 

 

 

 

|-|15||

 

|

 

 

 

 

 

||-|

 

 

|

 

 

 

 

 

|

 

 

|

 

 

 

 

 

|

|--

|

|

 

 

 

 

 

|----

 

|25|-| = 10 + 15

 

 

 

 

|--

|

 

 

 

 

Рассматриваем таблицу для следующих двух символов ( B и E ). Мы продолжаем аналогично, пока все "дерево" не

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

Частота

30

10

5

10

20

25

Символа

 

C

 

A

D

F

B E

|

|

 

|

|

|

|

 

|

|

 

|

|

|

|

 

|

|

|--

||

|

|

|

 

|

|-|15||

|

|

|

 

|

 

||-|

|

|

|

 

|

 

|

 

|

|

|

 

|

 

|

|

--| |

| |--

| |

 

|

 

|----

 

|25|-|

 

|-|45|-|

|

 

 

||-|

||-|

 

|

|--

|

 

|

 

|

 

|----

|55|------

|

 

|

 

 

|-||

 

 

 

|

 

 

 

|

|------------

 

|

|

 

 

 

|---

| Root (100) |----

|

 

 

 

|------------

 

|

 

 

Теперь когда наше дерево создано, мы можем кодировать файл. Мы должны всегданачинать из корня ( Root ). Кодируя первый символ (лист дерева С) Мы прослеживаем вверх по дереву все повороты ветвей и если мы делаем левый поворот, то запоминаем 0-й бит, и аналогично 1-й бит для правого поворота. Так для C, мы будем идти влево к 55 ( и запомним 0 ), затем снова влево (0) к самому символу. Код Хаффмана для нашего символа C - 00. Для следующего символа ( А ) у нас получается - лево,право,лево,лево , что создает последовательность 0100. Выполнив выше сказанное для всех символов получим

C = 00 ( 2 бита )

A = 0100 ( 4 бита )

D = 0101 ( 4 бита )

F = 011 ( 3 бита )

B = 10 ( 2 бита )

E = 11 ( 2 бита )

Каждый символ изначально представлялся 8-ю битами ( один байт ), и так как мы уменьшили число битов необходимых для представления каждого символа, мы следовательно уменьшили размер выходного файла. Сжатие складывается

следующим образом :

 

 

 

 

 

 

|----------

|----------------

|-------------------

 

|--------------

 

 

|

| Частота | первоначально | уплотненные биты | уменьшено на |

|----------

|----------------

|-------------------

 

|--------------

 

 

|

| C 30

| 30 x 8 = 240 |

30 x 2 = 60

|

180

|

| A 10

| 10 x 8 =

80

|

10 x 3 = 30

|

50

|

| D 5 | 5 x 8 = 40 | 5 x 4 = 20 |

 

20 |

 

| F 10

| 10 x 8 =

80

|

10 x 4 = 40

|

40

|

| B 20

| 20 x 8 = 160 |

20 x 2 = 40

|

120

|

| E 25

| 25 x 8 = 200

|

25 x 2 = 50

|

150

|

|----------

|----------------

|-------------------

 

|--------------

 

 

|

Первоначальный размер файла : 100 байт - 800 бит; Размер сжатого файла : 30 байт - 240 бит;

240 - 30% из 800 , так что мы сжали этот файл на 70%.

Все это довольно хорошо, но неприятность находится в том факте, что для восстановления первоначального файла, мы должны иметь декодирующее дерево, так как деревья будут различны для разных файлов. Следовательно, мы должны сохранять дерево вместе с файлом. Это превращается в итоге в увеличение размеров выходного файла.

В нашей методике сжатия и каждом узле находятся 4 байта указателя, по этому, полная таблица для 256 байт будет приблизительно 1 Кбайт длинной.

Таблица в нашем примере имеет 5 узлов плюс 6 вершин ( где и находятся наши символы ), всего 11. 4 байта 11 раз - 44. Если мы добавим после небольшое количество байтов для сохранения места узла и некоторую другую статистику - наша таблица будет приблизительно 50 байтов длинны.

Добавив к 30 байтам сжатой информации, 50 байтов таблицы получаем, что общая длина архивного файла вырастет до 80 байт. Учитывая , что первоначальная длинна файла в рассматриваемом примере была 100 байт - мы получили 20% сжатие информации.

Неплохо. То что мы действительно выполнили - трансляция символьного ASCII набора в наш новый набор требующий меньшее количество знаков по сравнению с стандартным.

Что мы можем получить на этом пути?

Рассмотрим максимум,который мы можем получить для различных разрядных комбинаций в оптимальном дереве, которое является несимметричным.

Мы получим что можно иметь только : 4 - 2 разрядных кода; 8 - 3 разрядных кодов; 16 - 4 разрядных кодов; 32 - 5 разрядных кодов; 64 - 6 разрядных кодов;

128 - 7 разрядных кодов;

Необходимо еще два 8 разрядных кода.

4 - 2 разрядных кода;

8 - 3 разрядных кодов;

16 - 4 разрядных кодов;

32 - 5 разрядных кодов;

64 - 6 разрядных кодов;

128 - 7 разрядных кодов;

--------

254

Итак, мы имеем итог из 256 различных комбинаций, которыми можно кодировать байт. Из этих комбинаций лишь 2 по длинеравны 8 битам. Если мы сложим число битов, которые это представляет, то в итоге получим 1554 бит или 195 байтов. Так в максимуме, мы сжали 256 байт к 195 или 33%, таким образом,максимально идеализированный Huffman

может достигать сжатия в 33%, когда используется на уровне байта.

Все эти подсчеты производились для не префиксных кодов Хаффмана, т.е. кодов, которые нельзя идентифицировать однозначно. Например, код A - 01011 и код B - 0101. Если мы будем получать эти коды побитно, то получив биты 0101 мы не сможем сказать какой код мы получили A или B , так как следующий бит может быть как началом следующего кода, так и продолжением предыдущего.

Необходимо добавить, что ключом к построению префиксных кодов служит обычное бинарное дерево и если внимательно рассмотреть предыдущий пример с построением дерева , можно убедится, что все получаемые коды - префиксные.

Одно последнее примечание - алгоритм Хаффмана требует читать входной файл дважды, один раз считая частоты вхождения символов , другой раз производя непосредственно кодирование.

Метод LZW-сжатия данных

Собственно исходный Lempel/Ziv подход к сжатию данных был впервые обнародован в 1977г., а усовершенствованный (TerryWelch) вариант был опубликован в 1984г.

Данный алгоритм при сжатии (кодировании) динамически создаёт таблицу преобразования строк: определённым последовательностям символов (словам) ставятся в соответствие группы бит фиксированной длины (обычно 12-битные). Таблица инициализируется всеми 1-символьными строками (в случае 8-битных символов — это 256 записей). По мере кодирования, алгоритм просматривает текст символ за символом, и сохраняет каждую новую, уникальную 2-символьную строку в таблицу в виде пары код/символ, где код ссылается на соответствующий первый символ. После того как новая 2- символьная строка сохранена в таблице, на выход передаётся код первого символа. Когда на входе читается очередной символ, для него по таблице находится уже встречавшаяся строка максимальной длины, после чего в таблице сохраняется код этой строки со следующим символом на входе; на выход выдаётся код этой строки, а следующий символ используется в качестве начала следующей строки.

Алгоритму декодирования на входе требуется только закодированный текст, поскольку он может воссоздать соответствующую таблицу преобразования непосредственно по закодированному тексту.

Алгоритм

1.Инициализация словаря всеми возможными односимвольными фразами. Инициализация входной фразы w

первым символом сообщения.

2.Считать очередной символ K из кодируемого сообщения.

3.Если КОНЕЦ_СООБЩЕНИЯ, то выдать код для w, иначе

4.Если фраза wK уже есть в словаре, присвоить входной фразе значение wK и перейти к Шагу 2, иначе выдать код w, добавить wK в словарь, присвоить входной фразе значение K и перейти к Шагу 2.

Конец

Сжатие заголовков TCP/IP-пакетов

Способ сжатия заголовков TCP/IP-пакетов был предложен Van-Jacobson в RFC 1144 и 1332. Суть его состоит в следующем. В каждом TCP/IP-пакете IP- и TCP-заголовки составляют в сумме 40 байт, и половина из них в пределах одного TCP/IP-соединения меняется достаточно редко. При низкоскоростном соединении число одновременных TCP/IPсоединений невелико и обычно не превышает двух десятков. Поэтому для каждого TCP/IP-соединения можно выделить слот, который будет содержать всю информацию о состоянии соединения. Это позволяет заменить 20 неизменных байт одним байтом, равным номеру слота. При использовании такой схемы ещё 2 поля по 2 байта каждое становятся избыточными и их можно убрать без потери функциональности. Оставшиеся поля обычно меняются незначительно и для кодирования их изменения требуется меньше байт, чем для кодирования значений этих полей. Кроме того, эти поля обычно меняются не одновременно. Всё это в результате позволяет уменьшить размеры заголовка более половины пакетов до размеров от 3 до 16 байт. Единственное поле, передаваемое всегда в неизменном виде, — это 2 байта контрольной суммы, находящейся в заголовке TCP.