Автор работы: Пользователь скрыл имя, 15 Декабря 2010 в 13:39, курсовая работа
Цель исследования: на основе теоретического анализа изучить механизм действия помехоустойчивого кодирования.
Объект исследования: код Шеннона – Фано.
В соответствии с целью работы были определены следующие задачи исследования:
1. Изучить основные типы кодов помехоустойчивого кодирования;
2. Исследовать один из выбранных кодов (код Шеннона - Фано)
3. Реализовать код Шеннона – Фано на языке программирования Pascal.
Введение……………………………………………………………………………3
Глава 1.
1.1 Основные принципы. Типы кодов …………………………………………...5
1.2 Линейные блочные коды………………………………………………..7
1.2.1 Код с проверкой на четность……………………………………….9
1.2.2 Порождающая матрица линейного блочного кода …………………12
1.2.3 Синдром и обнаружение ошибок ……………………………………16
1.2.4 Синдромное декодирование линейных блочных кодов …………18
1.2.5 Вес и расстояние Хемминга. Способность кодов обнаруживать и исправлять ошибки ………………………………………………………………21
1.3 Циклические коды……………………………………………………..26
1.3.1 Кодирование с использованием циклических кодов……………..27
1.3.2 Вычисление синдрома и исправление ошибок в циклических кодах………………………………………………………………………………32
1.3.3 Неалгебраические методы декодирования циклических кодов …..34
1.4 Сверточные коды……………………………………………………..38
1.4.1 Кодирование с использованием сверточных кодов ………………..39
1.4.2 Синдромное декодирование сверточных кодов………………….43
1.4.3 Декодирование сверточных кодов. Алгоритм Витерби …………46
Глава 2
2.1 Коды Шеннона – Фано (Теоритическая часть)……………………..50
2.2 Описание Кода Шеннона – Фано……………………………………55
Заключение ……………………………………………………………………….56
Литература………………………………………………………………………..57
Приложение1……………………………………………………………………..58
Среднее значение длины кодового обозначения здесь равно 2,686, т.е. на одну букву текста приходится в среднем 0,895 двоичных знаков, что всего на 1,5% больше значения дв.зн./букву.
В случае еще большей
разницы в вероятностях букв А
и Б приближение к минимально возможному
значению Н дв.зн./букву может несколько
менее быстрым, но оно проявляется не менее
наглядно. Так, при р(А) = 0,89 и р(Б)
= 0,11 это значение равно – 0,89 log0,89 – 0,11
log0,11 ≈ 0,5 дв.зн./букву, а равномерный код
(равносильный применению кода Шеннона
– Фано к совокупности двух имеющихся
букв) требует затраты одного двоичного
знака на каждую букву – в два раза больше.
Нетрудно проверить, что применение кода
Шеннона – Фано к всевозможным двухбуквенным
комбинациям здесь приводит к коду, в котором
на каждую букву приходится в среднем
0,66 двоичных знаков, применение к трехбуквенным
комбинациям - 0,55, а к четырехбуквенным
блокам - в среднем 0,52 двоичных знаков
– всего на 4% больше минимального значения
0,50 дв.зн./букву.[2]
2.2 Описание Кода Шеннона – Фано.
Программа состоит из 6 частей.
Более подробно описание программы смотри Приложение 1.
Части программы:
1)Раздел описании переменных, массивов.
2)Описание файлов, связывание файла с переменной и обращение к файлу. Ввод строки
3)
Отделение символов и их
4) Сортировка по количеству вхождений в строку.
5) Сам код. На против верхней части проставляем 0, напротив нижней части 1.С последующим проделыванием с остальными частями то же самое. Складываем первые части со второй. Сортируем, меняя местами.
6)
Вывод файла. Закрытие файла.
Заключение
До появления работ Шеннона и Фано, кодирование символов алфавита при передаче сообщения по каналам связи осуществлялось одинаковым количеством бит, получаемым по формуле Хартли. С появлением этих работ начали появляться способы, кодирующие символы разным числом бит в зависимости от вероятности появления их в тексте, то есть более вероятные символы кодируются короткими кодами, а редко встречающиеся символы - длинными (длиннее среднего).
Так как развитие кодов, контролирующих ошибки, первоначально стимулировалось задачами связи, терминология теории кодирования проистекает из теории связи. Коды используются для защиты данных в памяти вычислительных устройств и на цифровых лентах и дисках, а также для защиты от неправильного функционирования или шумов в цифровых логических цепях. Коды используются также для сжатия данных, и теория кодирования тесно связана с теорией планирования статистических экспериментов.
Во многих системах связи имеется ограничение на передаваемую мощность. Коды, контролирующие ошибки, являются замечательным средством снижения необходимой мощности, так как с их помощью можно правильно восстановить полученные ослабленные сообщения. Передача в вычислительных системах обычно чувствительна даже к очень малой доле ошибок, так как одиночная ошибка может нарушить программу вычисления. Кодирование, контролирующее ошибки, становится в этих приложениях весьма важным. Для некоторых носителей вычислительной памяти использование кодов, контролирующих ошибки, позволяет добиться более плотной упаковки битов. Другим типом систем связи является система с многими пользователями и разделением по времени, в которой каждому из данного числа пользователей заранее предписаны некоторые временные окна (интервалы), в которых ему разрешается передача. Длинные двоичные сообщения разделяются на пакеты, и один пакет передается в отведенное временное окно. Из-за нарушения синхронизации или дисциплины обслуживания некоторые пакеты могут быть утеряны. Подходящие коды, контролирующие ошибки, защищают от таких потерь, так как утерянные пакеты можно восстановить по известным пакетам.
Список литературы
Приложение 1
uses crt;
var {Раздел описания переменных и массивов}
c:char;
s,s1,s2:string;
i,n,j,j1:byte;
a:array [1..255] of byte;
str:array [1..255] of string[9];
st:array [1..255] of string[100];
f,f1,f2:text;
begin clrscr;
assign(f,’Cod.txt’); assign(f1,’Bukv.txt’); assign(f2,’1&0.txt’);
rewrite(f);rewrite(f1);
writeln('Введите строку');readln(s);{Ввод строки}
s2:=s; {присвоение s2 =s}
while length(s) <> 0 do {цикл до конца строки}
begin
s1:=s1+s[1];
for i:=1 to length(s) do {Идем до конца строки}
if (s1[length(s1)] = s[i])and(pos(s1[length(s1)],s) <> 0) then
begin
inc(n);delete(s,pos(s1[length(
end;
a[length(s1)]:=n;n:=0;{
end;
for j:=1 to 10 do {Сортировка массива}
for i:=1 to length(s1) do
begin
if (a[i] > a[i-1])and(i<>1) then
begin {меняем местами символы по количеству вхождений}
n:=a[i];a[i]:=a[i-1];a[i-1]:=
c:=s1[i];s1[i]:=s1[i-1];s1[i-
end;
if (a[i] < a[i+1])and(i<>0) then
begin
n:=a[i];a[i]:=a[i+1];a[i+1]:=
c:=s1[i];s1[i]:=s1[i+1];s1[i+
end;
end;{составляем собственно код}
for i:=1 to length(s1) do {Идем до конца строки}
st[i]:=s1[i]; {st присваиваем s1}
i:=length(s1); {I количество символов в строке}
while length(s1) <> length(st[1]) do {Пока количество символов s1 не равно st1 будем выполнять}
begin
for n:=1 to length(st[i]) do {n=1 идем до конца строки}
begin
j:=pos(st[i][n],s1); {j присваивается sti n в строке s1}
if a[i] > a[i-1] then str[j]:='1'+str[j] {Первому символу присваеваем 1 а остальным 0}
else str[j]:='0'+str[j];
end;
for n:=1 to length(st[i-1]) do
begin
j:=pos(st[i-1][n],s1);
if a[i] > a[i-1] then str[j]:='0'+str[j]
else str[j]:='1'+str[j];
end;
a[i-1]:=a[i]+a[i-1];a[i]:=0; {Складываем первичную часть со второй}
st[i-1]:=st[i-1]+st[i];st[i]:=
for j1:=i downto 1 do
begin
if (a[j1] > a[j1-1])and((j1-1) <> 0) then
begin
n:=a[j1];a[j1]:=a[j1-1];a[j1-
s:=st[j1];st[j1]:=st[j1-1];st[
end;
end;
end;
for i:=1 to length(s2) do
begin
write(f2,str[pos(s2[i],s1)],' ');{Вывод в файл}
write(str[pos(s2[i],s1)],' ');
end;
for i:=1 to length(s1) do
begin
write(f1,s1[i],' ');
write(f,str[i],' ');
end;
close(f);close(f1);close(
end.
Информация о работе Программная модель помехоустойчивого кодирования