Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по ТИПиС 2013.doc
Скачиваний:
0
Добавлен:
09.01.2020
Размер:
5.97 Mб
Скачать
    1. . Задача кодирования сообщений. Код Шеннона-Фено

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

Вообще кодированием называется отображение состояния одной физической системы с помощью состояния некоторой другой. Например, при телефонном разговоре звуковые сигналы кодируются в виде электромагнитных колебаний, а затем снова декодируются, превращаясь в звуковой сигнал на другом конце линии. Наиболее простым случаем кодирования является случай, когда обе системы Х и Y (отображаемая и отображающая) имеют конечное число возможных состояний.

Рассмотрим простейшие случаи кодирования. Пусть имеется некоторая система Х (например, буква русского алфавита), которая может случайным образом принять одно из состояний . Мы хотим отобразить ее (закодировать) с помощью другой системы Y, возможные состояния которой . Если m<n (число состояний системы Y меньше числа состояний системы Х), то нельзя каждое состояние системы Х закодировать с помощью одного единственного состояния системы Y. В таких случаях одно состояние системы Х приходится отображать с помощью определенной комбинации (последовательности) состояний системы Y. Так, в азбуке Морзе буквы отображаются различными комбинациями символов точка и тире.

Коды различаются по числу элементарных символов (сигналов). Так, код с двумя элементарными символами (0 и 1) называется двоичным.

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

Рассмотрим задачу: закодировать двоичным кодом буквы русского алфавита (с помощью комбинации элементарных символов 0 и 1), чтобы среднее число этих символов на букву текста было минимальным.

Рассмотрим 32 буквы русской азбуки: а, б, …, э, ю, я плюс промежуток между словами, который будем обозначать « - ». если, как принято в телеграфии, не различать буквы и ъ, ь (это не приводит к разночтениям), то получится 32 буквы: а, б, …, ш, щ, (ъ,ь), ы, …, я, «-».

Если эти 32 символа априори равновероятны, то информация, приходящая на одну букву составит

а 00000

б 00001

…………

я 11110

«-» 11111

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

Действительно, в нашем коде на изображение каждой буквы - часто встречающихся «а», «е», «о» или редко встречающихся «щ», «э», «ф» - тратится одно и то же число элементарных символов. Очевидно, разумнее было бы, чтобы часто встречающиеся буквы были закодированы меньшим количеством символов, а реже встречающиеся – большим.

Чтобы составить такой код нужно знать частоты букв в русском тексте. Эти частоты приведены в табл.11.1 в порядке убывания частот.

Таблица 11.1

Вероятности р для букв русского языка

Буква

Вероят-

ность

Буква

Вероят-

ность

Буква

Вероят-

ность

Буква

Вероят-

ность

« –»

0,145

р

0,041

я

0,019

х

0,009

о

0,095

в

0,039

ы

0,016

ж

0,008

е

0,074

л

0,036

з

0,015

ю

0,007

а

0,064

к

0,029

ъ, ь

0,015

ш

0,006

и

0,064

м

0,026

б

0,015

ц

0,004

т

0,056

д

0,026

г

0,014

щ

0,003

н

0,056

п

0,024

ч

0,013

э

0,003

с

0,047

у

0,021

й

0,01

ф

0,002


Пользуясь этой таблицей можно составить наиболее экономичный код, известный под названием «кода Шеннона-Фено». Идея его состоит в том, что кодируемые символы разделяются на две приблизительно равновероятное группы: для первой группы символов на первом месте ставим 0, для второй группы 1. далее каждая группа снова делится на две приблизительно равновероятные подгруппы: для символов первой подгруппы на втором месте ставится 0; для второй подгруппы 1 и т.д.

Для первых шести букв от «-» до «т» сумма частот равна 0,498. Для всех остальных букв от «н» до «ф» приходится приблизительно такая же вероятность 0,502. Первые шесть букв (от «-» до «т») будут иметь на первом месте 0. остальные буквы (от «н» до «ф») будут иметь на первом месте 1. Далее снова разделим первую группу на две приблизительно равновероятные подгруппы:

от «-» до «о» (0,240)

и от «е» до «т» (0,258).

Для всех букв первой подгруппы на втором месте поставим 0, а второй подгруппы - 1.

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

Механизм построения кода представлен в табл.11.2, а сам код в табл.11.3.

Таблица 11.2

Механизм построения кода

Таблица 11.3

Возможный двоичный код для букв

русского языка

Буква

Двоичное число

Буква

Двоичное число

Буква

Двоичное число

«-»

000

к

10111

ч

111100

о

001

м

11000

й

1111010

е

0100

д

110010

х

1111011

а

0101

п

110011

ж

1111100

и

0110

у

110100

ю

1111101

т

0111

я

110110

ш

11111100

н

1000

ы

110111

ц

11111101

с

1001

з

111000

щ

11111110

р

10100

ъ, ь

111001

э

111111110

в

10101

б

111010

ф

111111111

л

10110

г

111011

 

 

С помощью последней таблицы можно закодировать и декодировать любое сообщение.

Пример. Запишем двоичным кодом фразу: «Теория»

0110100001101000110110110.

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

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

, - любая буква

где - вероятность того, что буква примет определенное состояние

«-», о, е, …, ф.

(дв. ед. на букву текста).

По таблицам 11.1 и 11.3 определяем среднее число элементарных символов на одну букву

.

Деля на , получим информацию на один элементарный символ

(дв. ед.).

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

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

Если кодировать слова двумя буквами: аа, аб, ав, … , яя, то всего может быть закодировано

,

что даст

.

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

,

т.е. очень большой словарь, дающий

.

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

В ряде случаев оказывается разумным кодировать даже не блоки, а целые осмысленные куски текста. Например, для разгрузки телеграфа в предпраздничные дни целесообразно кодировать условными номерами целые стандартные тексты, например: «Поздравляю новым годом желаю здоровья».

+