Этот код может использоваться для кодирования различных сообщений. При кодировании двухградационных факсимильных изображений в качестве символов сообщений принимаются длины белых и чёрных серий. При построении кода учитывается статистика исходной последовательности: наиболее вероятные символы кодируются наиболее короткими кодовыми комбинациями, а наименее вероятные символы кодируются наиболее длинными кодовыми комбинациями.
Характерная особенность кодовых комбинаций состоит в том, что никакое кодовое слово не является началом другого более длинного кодового слова. Это обеспечивает однозначность процедуры декодирования.
Недостатком ОНК является его чувствительность к изменению статических характеристик источника и низкая помехоустойчивость.
Выполнение задачи.
Описание алгоритма программы сжатия и восстановления изображения по методу АПК ( алгоритмы приведены за текстом ).
1. Описание алгоритма программы сжатия.
1. Начало.
2. Задаём число вводимых цифр NumberDigits ( 7 ) и устанавливаем флаг переполнения.
3. На экран выводится надпись «Введите 7 цифр количества длин серий, начиная с белого».
4. Происходит заполнение массива а [ ].
5. Сброс переменной sum в ноль и очистка переменной strArch, содержащей информацию на передачу.
6. Задаётся цикл от 1 до 7 для обработки массива исходных данных.
7. Определяется координата нового значения.
8. Переход в процедуру to_binary для перевода в двоичную форму и добавления к strArch - переменной на передачу.
9. Проверка на переполнение.
10. Переход к метке Ех.
11. К содержимому переменной strArch добавляется служебная комбинация ( окончание строки ).
12. На дисплей выводится информация о содержимом переменной strArch ( буфера ), которая используется для хранения закодированной строки. На этом алгоритм программы сжатия одной строки заканчивается.
13. Конец.
2. Описание алгоритма подпрограммы to_binary.
Процедура to binary переводит значения переменных в двоичную форму, которые добавляются к переменной strArch на передачу данных.
1. Начало.
2. Устанавливаем переменную к = 2 в 8 степени.
3. Производим проверку на переполнение.
4. Если переполнения нет, то s = sum.
5. Если переполнение есть, то надпись о переполнении и программа заканчивает работу.
6. Переход по флагу.
7. Задаётся цикл i = от 1 до 9.
8. Сравнивается переменная S и переменная K, соответствующая 2 в степени n, где n изменяется от 8 до 0. При условии, если S < K выполняется 9 блок, в противном случае выполняется 10 блок.
9. Осуществляется добавление 0 к переменной strArch на передачу данных.
10. Добавляется 1 к переменной strArch и изменяется содержимое переменной S.
11. Деление на 2 переменной K, то есть переход к следующей степени. При выполнении условия i = 10, происходит завершение подпрограммы.
12. Конец.
3. Описание алгоритма программы восстановления изображения при АПК.
1. Начало.
2. Выполняются начальные установки, необходимые для корректного восстановления закодированных данных, здесь переменная i – счётчик массива b для хранения восстановленных значений.
3. Копируются i - тые 9 символов из strArch.
4. Установка к = 2 в 8 степени, степень = 0.
5. Задаётся цикл j = от 1 до 9.
6. Проверка параметра strCurRes[j] на равенство 1, если да, то 7 блок, если нет, то 8 блок.
7. К степени прибавляется значение к.
8. Переход к следующей степени. При j = 10 переходи к 9 блоку.
9. Переход к следующему значению счётчика массива.
10. Проверка на неравенство n <> 511. В 11 и 12 блоке записываются полученные десятичные значения в массив b.
11. Записывается последняя серия.
12. Происходит запись серий с первой по предпоследнюю.
13. Проверяется на соответствие признак конца строки, если десятичная цифра соответствует 511 ( 111111111 ), то строка закончена.
14. Выводятся на экран длины серий, соответствующих раскодированной строке, что при правильной реализации программы должно совпадать с введёнными данными.
15. Конец.
Program Cod_Dec;
Uses Crt;
Const NumberDigits=7;
Var strArch, strCurRes : string;
cAgain : char;
i, j, sum, k, n : integer;
flag:boolean;
b,a:array[1..NumberDigits] of integer;
label ex, w;
Procedure to_binary;
Var k,i,s:integer;
Begin
k:=256;
if((sum > 510) or (sum < 0)) then
begin
Writeln('Переполнение!!!');
flag:=true;
end
else
s:=sum;
for i:=1 to 9 do
Begin
if ((s-k)>=0) then
Begin
strArch:=strArch+'1';
s:=s-k;
End
else strArch:=strArch+'0';
k:=Round (k/2);
End;
End;
BEGIN
w:
clrscr;
flag:=false;
{------------Сжатие-----------}
Writeln('Введите ', NumberDigits,' цифр количества длин серий');
Readln(a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
strArch:=' ';
sum:=0;
for i:=1 to NumberDigits do
Begin
sum:=sum+a[i];
to_binary;
if(flag) then
goto ex;
End;
strArch:=strArch+'111111111';
Writeln('Содержимое буфера',strArch);
{--------Востановление--------}
i:=1;
b[i]:=0;
Repeat
strCurRes:=Copy(strArch,(i-1)*9+1,9);
k:=256;
n:=0;
For j:=1 to 9 do
Begin
if strCurRes[j]='1' then n:=n+k;
k:=round(k/2);
end;
i:=i+1;
if n<>511 then
Begin
b[i-1]:=n-b[i-1];
b[i]:=n;
End
else
b[i-1]:=n-510;
Until n=511;
for i:=1 to NumberDigits do
Writeln ('b=',b[i]);
ex:
writeln('Спасибо за использование программы.');
writeln('Для продолжения сеанса введите - 1 , для выхода - 2');
readln(cAgain);
if cAgain='1' then goto w;
END.
Заключение.
По полученным данным, имеем:
№№ |
Серия |
|||||||
варианта |
строки |
белая |
чёрная |
белая |
чёрная |
белая |
чёрная |
белая |
1 |
1 |
137 |
33 |
148 |
22 |
159 |
11 |
0 |
2 |
0 |
34 |
136 |
23 |
147 |
12 |
158 |
Код первой строки:
010001001_010101010_100111110_101010100_111110011_111111110_
111111110_111111111
Код второй строки:
000000000_000100010_010101010_011000001_101010100_101100000_
111111110_111111111
Комбинация из девяти единиц следует в конце каждой строки
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.