Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 3, КТ.doc
Скачиваний:
8
Добавлен:
24.11.2019
Размер:
18.19 Mб
Скачать

Вычисления были проведены для четырех значений вероятности появления единицы p.

Величины Р выбраны так, чтобы иметь возможность увидеть поведение избыточности кодирования для разных источников. В случае Р = 0,5 избыточность в потоке двоичных отсутствует и поэтому применение кодирования к исходной последовательности может привести лишь к увеличению объема передаваемых данных. В случае Р = 0,001 на каждые 1000 бит исходной последовательности приходится в среднем одна единица, т.е. имеет место избыточность. Вычисления показали, что если в выражение для средней длины кодового слова (7) подставить Р=0, то отличие величины избыточности от случая Р = 0,001 будет наблюдаться в четвертом знаке после запятой. Таким образом, для любого Р ≤ 0,001 величина избыточности (с точностью до трех знаков) будет совпадать с избыточностью при Р = 0,001, и в этом смысле случай Р = 0,001 наиболее «благоприятен» для применения кодирования.

Случаи р = 0,1 и р = 0,01 занимают промежуточное положение.

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

Поскольку Rn(p) является дискретной функцией, определенной на множестве натуральных чисел, графики представляют собой отдельные точки, соответствующие целым n. На Рис. 2 они соединены прямыми линиями, что сделано исключительно с целью наглядности.

Видно, что для фиксированного n избыточность тем больше, чем больше отличается р от 0,5. В целом избыточность стремится к нулю с ростом n, но не монотонно и не равномерно по Р.

Из определения кодирования следует его симметричность относительно Р, т.е. кривые избыточности для Р будут совпадать с кривыми для 1-Р. Иными словами, исходная последовательность при Р=0.1 будет сжата за счет применения кодирования до такой же степени, как при Р = 0,9; при Р = 0,01 так же, как при Р =0,99 и т.д.

Вернемся к выражению для длины кодового слова (4).

L=]log 2 (n+1)[+ ]log 2 (n(n+1)/2+1 [+]log 2 r(n,k,s)[ (4).

Второе слагаемое, входящее в это выражение определяет количество разрядов необходимое для записи параметра S. Причем, это количество постоянно для данного значения n и рассчитано на максимальное значение S.

С другой стороны, для фиксированного значения k, существуют вполне определенные величины smin(k) и smax(k), вычисляемые по формулам (6).

S min(k) = k(k+1)/2;

S max(k) =kn - k(k+1)/2 (6)

Поскольку, для записи параметра k используется постоянное (для данного значения n) количество разрядов - первое слагаемое в (4), то k это первый параметр, который будет определен при декодировании (префикс). Но определив k, можно по формулам (6) вычислить соответствующие значения S, а следовательно можно заменить второе слагаемое в (4) на выражение:] log2 (smax(k) - smin(k) + 1) [,

что позволит сократить длину кодового слова L.

Выражение для L будет иметь вид:

L=]log 2 (n+1)[+ ]log 2 (к(n-к)+1)[+]log 2 r(n,k,s)[ (9)

Выражение для nср так же изменится: (10)

n n smax(k)

nср =]log2 (n+1)[+ Cknpkqn-k ]log 2 (к(n-к)+1)[+∑∑ η(n,k,s) ]log2 r(n,k,s)[

K=0 K=0 s=smin(k)

На Рис. 3 представлены зависимости избыточности для модифицированного метода КТ.

Сравнивая эти графики с графиками на Рис. 2 можно убедиться, что значения избыточности при фиксированном n уменьшились в разы. Кроме того, стремление Rn(p) к 0 для разных p стало более равномерным, в том смысле, что «коридор» значений Rn(p) для разных р сузился. Вычисления показали, что значения избыточности для p = 0,5; 0,1 совпадают с точностью до 3 знаков после запятой. Для p = 0,01 отличие от случая p = 0,5 меньше 0,004. Поэтому кривые при p =0,1 и 0,01 на рисунке не показаны. Для p = 0,001, начиная с n = 75, это отличие не превышает 0,008.

Таким образом, модификация КТ обеспечивает не только экономию двоичных разрядов кодового слова, но и существенно более равномерное (с точностью до 3 - го знака после запятой) стремление Rn(p) к 0 для разных p. Это важно в случае неизвестной статистики при практической реализации сжатия.

Для того чтобы оценить во сколько раз снижается объем данных за счет применения модифицированного кодирования (КТ) были построены зависимости коэффициентов сжатия от n при различных p (Рис. 4).

Рис. 4. Зависимости коэффициентов сжатия от n для различных p

Коэффициенты сжатия вычислялись на ЭВМ по формуле

К сж = n/ nср (11).

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

На рисунках показаны так же верхняя граница для К сж, при заданном Р (1/Н(Р)) и нижняя граница, вычисляемая по формуле (11), где вместо выражения для nср используется выражение для верхней границы избыточности (8).

Основные выводы по графикам :

  1. Значения К сж модифицированного КТ больше, чем исходного. Например, при n = 63, К сж соответственно равны: 0,94; 1,85; 6,80; 10,00 и 0,92; 1,75; 3,40; 3,60; при n = 127; 0,96; 1,95; 9,20; 18,00 и 0,94; 1,90; 5,60; 7,40.

  2. Заметно, что чем ближе Р к 0,5, тем при меньших значениях n приближается к максимуму.

  3. Заметны выбросы кривых в точках n = 2m – 1,

где m = 1, 2, 3,........

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

Таким обрезом, если не зная ничего о величине Р применить КТ, то даже при небольших значениях n (порядка 101 - 102), можно подобрать такое n‚ что при Р = 0,5 (наихудший для сжатия случай, когда надо просто передавать прямым кодом) потери от кодирования будут невелики (К сж ≈1), во всех других случаях будет выигрыш, тем больший, чем больше Р отличается от 0,5.

Для того, чтобы реализовать КТ, оценить его эффективность и трудоемкость, необходимо уметь вычислять значения коэффициентов r(n,k,s). В ходе анализа литературы по комбинаторике не удалось найти упоминания о коэффициентах, имеющих аналогичный смысл.

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

Так же, явное выражение для числа разбиений, но без ограничения на величину слагаемых.

В связи с этим сформулированы и доказаны теоремы и соотношения для вычисления коэффициентов r(n,k,s), которые являются математическим аппаратом практической реализации кодирования. Доказательства и промежуточные выражения при выводе формул в статье не приведены, в виду их громоздкости.

Теорема 2. Для r(n,k,s) имеет место рекуррентное соотношение:

r(n,k,s) = r(n-1,k,s)+ r(n-1,k-1,s-n) (12).

Следствие 1:

n-1

r(n,k,s) = r(j, k-1, s-(j+1)) + r(0, k, s) (13).

j=0

Следствие 2:

k

r(n,k,s) = r(n-(j+1), k-j, s- jn +j(j+1)/2) (14).

j=0

Теорема 3. Для любых значений n,k,s справедливо:

r(n,k,s) = r(n, n-k, n(n+1)/2-s) (15).

Теорема 4. Для любых значений n,k,s справедливо:

r(n,k,s) = r(n, k, k(n+1)-s) (16).

Теорема 5. Для четных значений n и любых k,s справедливо:

r(n,k,s) = ∑∑ r(n/2, k1, s1) r(n/2,k-k1, s-s1-(k-k1)n/2),

K1 s1

где 0 ≤ k1 ≤ k , s1min s1 ≤s1max , при этом: (17).

s1min=max{k1(k1+1)/2, s-(k-k1)(2n-(k-k1-1))/2}

s1max=min{nk1/2-k1(k1-1)/2, s-(k-k1)(n+k-k1+1)/2}

Замечание. Для нечетных n, а так же для любых неравных разбиений n-блока на подблоки (n1,n2), формула (17) преобразуется к виду: (18)

r(n,k,s) = ∑∑ r(n1, k1, s1) r(n2, k-k1, s-s1-(k-k1)n1),

K1 s1

в формуле для s1max n/2 заменяется на n1, а n на 2n1.

Теорема 6. Для любых значений n,k,s справедливо:

n-(k-1)

r(n,k,s) = r(n-i, k-1, s-ik) (19).

i=1

Следствие 3: Для любых значений r(n,k,s) имеет место рекуррентное соотношение:

r(n,k,s) = r(n-1,k-1,s-k)+ r(n-1,k,s-k) (20).

В ходе работы были предприняты попытки получить явные выражения для r(n,k,s). Оказалось, что в общем виде, без использования специальных функций такие выражения получить невозможно. В случае использования, например, функций Гаусса, выражения становятся настолько громоздкими и труднореализуемыми, что не представляют практического интереса.

Тем, не менее, удалось получить явные выражения для частных случаев (k=2, k=3, k=4). Они могут использоваться для вычисления исходных значений r(n,k,s) c последующим применением рекуррентных соотношений.

r(n,2,s)=min{s-2;n-1}-max{ ](s-1)/2[;1}+1 (21).

r(n,3,s)=(2]s/3[+1-s)x + x2+(s-]s/3[-5/2)ξ- (22)

2/2-y(4](s-]s/3[)/2[-y-φ-7)/4-ψ, где:

x=[s/2-]s/3[], y=s-]s/3[-4,

ψ={y-1-[(y-1)/2], если (s-]s/3[)/2) целое,

0 в других случаях.

φ=y-1-2[(y-1)/2],

ξ=min{s-4;n-1}-max{]s/3[;2}+1

Явное выражение для k=4 приводить не будем из за его громоздкости, но оно вполне реализуемо.

Для того, что бы иметь возможность оценить объем памяти и вычислений, требуемых для реализации кодирования, необходимо знать при каких k и s, коэффициенты r(n,k,s) принимают наибольшие значения.

В связи с этим, сформулированы и доказаны следующие теоремы.

Теорема 7. Для любого kn, r(n,k,s) примет наибольшее значение при s = ]k(n+1)/2[.

Теорема 8. Для любого n, r(n,k,s) примет наибольшее значение при k =]n/2[, s =]]n/2[(n+1)/2[.

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

Выражения (12), (13) использовались для вычисления Rn(p), К сж для рассмотренных выше графиков.

Формула (14) использована для построения алгоритма нумерации.

Соотношения (15) и (16) устанавливают свойства симметрии для коэффициентов. Учет симметрии позволит экономить память, требующуюся для хранения коэффициентов при реализации кодирования, по крайней море, в 4 раза.

Теоремы 7 и 8 устанавливают величину объема памяти, требуемую для реализации КТ. Остальные соотношения будут использоваться для вычисления значений коэффициентов в различных вариантах реализации кодирования.

Совокупность рассмотренных соотношений представляют собой математический аппарат, необходимый и достаточный для реализации КТ.

Перейдем к построению нумерации.

Ранее было определено, что кодовое слово w, соответствующее n - блоку, это упорядоченная тройка двоичных наборов (k, s, b(n,k,s)). Следовательно, в ходе кодирования необходимо каждому элементу множества Rk,s поставить в соответствие номер b(n,k,s), причем 0 ≤ b(n,k,s) ≤ r(n,k,s) – 1.

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

Очевидно, что эффективная реализация кодирования с такой трудоемкостью весьма затруднительна, даже с учетом достижений современной микроэлектроники и флэш-памяти.

Альтернативой является использование алгоритмов нумерации, когда b(n,k,s) определяется как целочисленная функция таких параметров блока, как раз разрядность, число единиц в блоке, номера их позиций.

Перейдем к построению алгоритма нумерации. Будем рассуждать следующим образом. Возьмем некоторый n-блок и зафиксируем номер k ой единицы ik.

В этом случае остальные номера от 1 до (ik 1) будут размещаться в (ik – 1) разрядной сетке и количество всех возможных комбинаций k номеров с суммой s , будет равно r (ik 1, k, s).

Далее, зафиксируем номер ik-1. Остальные номера от 1 до ik-2 будут размещаться в (ik-1 1) разрядной сетке. В этом случае, количество всех возможных комбинаций (k - 1) номеров в (ik-1 1) разрядной сетке, c суммой s - ik будет равно r(ik-1 1, k - 1, s - ik). Аналогичные рассуждения проведем для всех прочих номеров до i1 включительно. В результате получим для каждого ij соответствующее значение r(ij 1, j, s - ik- ik-1-…- ij+1).

Представляется логичным предположить, что:

b(n,k,s)=r(ik1,k,s)+r(ik-11,k-1,s-ik)+ + r(ik-21,k-2,s-ik-ik-1)+...+ r(i2 1, 2, s - ik- ik-1-...- i3)+ + r(i1 1, 1, s - ik- ik-1-...- i2)

Учтем, что s - ik- ik-1-...- i2 = i1, следовательно, r(i1 1, 1, s - ik- ik-1-...- i2) Ξ 0.

Кроме того, учтем, что s - ik- ik-1-...- i3 = i2+ i1, s - ik- ik-1-...- i4 = i3+ i2+ i1 и т.д.

Запишем нашу гипотезу следующим образом:

b(n,k,s) = r(ik 1,k, ik+ ik-1+...+ i1)+ + r(ik-1 1,k-1, ik-1+ ik-2...+i1)+ ...+ r(i2 1, 2, i2+ i1 ) =

k j

= r ( ij 1, j , im ) (22)

j=2 m=1

В ходе работы над методом были сформулированы и доказаны две теоремы подтверждающие справедливость гипотезы (22).

Теорема 9. Любой номер b(n,k,s), вычисленный по формуле (22) удовлетворяет неравенству: 0 ≤ b (n, k, s) ≤ r (n, k, s) – 1

Теорема 10. Между n-блоками и упорядоченными тройками чисел (k, s, b(n,k,s)) , где b(n,k,s) определяется по формуле (22), существует взаимо однозначное соответствие.

В качестве примера рассмотрим нумерацию при n=11, k=4, s=25. В этом случае формула (22) преобразуется к виду:

b(11,4,25)=r(i4-1,4,25)+r(i3-1,3,25- i4)+ r(i2-1,2,25-i4- i3)

Запишем все возможные комбинации 4-х номеров позиций единиц, дающих в сумме 25 в 11-разрядной сетке (Таблица 1). Видно, что каждой комбинации соответствует свой собственный номер, отличный от всех остальных.

Таблица 1. Пример нумерации

I4

I3

I2

I1

Слагаемые формулы (22)

b(n,k,s)

11

10

3

1

r(10,4,25)+r(9,3,14)+r(2,2,4)=14+8+0

22

11

9

4

1

r(10,4,25)+r(8,3,14)+r(3,2,5)=14+6+1

21

11

9

3

2

r(10,4,25)+r(8,3,14)+r(2,2,5)=14+6+0

20

11

8

5

1

r(10,4,25)+r(7,3,14)+r(4,2,6)=14+4+1

19

11

8

4

2

r(10,4,25)+r(7,3,14)+r(3,2,6)=14+4+0

18

11

7

6

1

r(10,4,25)+r(6,3,14)+r(5,2,7)=14+1+2

17

11

7

5

2

r(10,4,25)+r(6,3,14)+r(4,2,7)=14+1+1

16

11

7

4

3

r(10,4,25)+r(6,3,14)+r(3,2,7)=14+1+0

15

11

6

5

3

r(10,4,25)+r(5,3,14)+r(4,2,8)=14+0+0

14

10

9

5

1

r(9,4,25)+ r(8,3,15)+r(4,2,6)= 6+6+1

13

10

9

4

2

r(9,4,25)+ r(8,3,15)+r(3,2,6)= 6+6+0

12

10

8

6

1

r(9,4,25)+ r(7,3,15)+r(5,2,7)= 6+3+2

11

10

8

5

2

r(9,4,25)+ r(7,3,15)+r(4,2,7)= 6+3+1

10

10

8

4

3

r(9,4,25)+ r(7,3,15)+r(3,2,7)= 6+3+0

9

10

7

6

2

r(9,4,25)+ r(6,3,15)+r(5,2,8)= 6+1+1

8

10

7

5

3

r(9,4,25)+ r(6,3,15)+r(4,2,8)= 6+1+0

7

10

6

5

4

r(9,4,25)+ r(5,3,15)+r(4,2,9)= 6+0+0

6

9

8

7

1

r(8,4,25)+ r(7,3,16)+r(6,2,8)= 1+2+2

5

9

8

6

2

r(8,4,25)+ r(7,3,16)+r(5,2,8)= 1+2+1

4

9

8

5

3

r(8,4,25)+ r(7,3,16)+r(4,2,8)= 1+2+0

3

9

7

6

3

r(8,4,25)+ r(6,3,16)+r(5,2,9)= 1+0+1

2

9

7

5

4

r(8,4,25)+ r(6,3,16)+r(4,2,9)= 1+0+0

1

8

7

6

4

r(7,4,25)+ r(6,3,17)+r(5,2,10)=0+0+0

0

Таким образом, сформулирован метод кодирования тройками (КТ), доказана его универсальность, разработан математический аппарат.

Для практической реализации КТ средствами вычислительной техники (программно или аппаратно) необходимо представить процессы кодирования и декодирования в виде вычислительных алгоритмов.

На Рис. 5 представлен алгоритм кодирования в соответствии со структурой кодового слова (9) и методом нумерации по формуле (22).

А В

1

K = K + 1

2

S = S + I

I = 0

K = 0

3

S = 0

b = b + r

4

b = 0

5

да

Прием бита

6

S=S-S min (k) + 1

I = I + 1

7

Выдача K, S, b

нет

8

N = I – 1

да

9 да

Рис. 5. Алгоритм кодирования

Считается заданным n - длина блоков, на которые разбивается исходная последовательность двоичных символов (блок А1). Под I понимается номер обрабатываемого разряда текущего n-блока, k -текущее значение количества единиц в блоке, S - сумма номеров их позиций, b номер, вычисляемый по формуле (22) , А(I) – содержимое I-го разряда n-блока.

В блоках А2, 3, 4, 5 значениям параметров кодового слова присваиваются исходные значения.

Пусть с выхода канала поступают последовательно двоичные данные. В блоке А6 осуществляется прием очередного бита этой последовательности. В блоке А7 значение I увеличивается на единицу.

В блоке А8 выясняется равно ли содержимое I-го разряда n -блока единице, и если «Да», то происходит вычисление соответствующего слагаемого формулы (22) (блоки А9, В1,2,3). В блоке В4 вычисленное слагаемое прибавляется к текущему значению номера b.

Если в блоке А8 выясняется, что содержимое I-го разряда n-блока равно нулю, то происходит переход на блок В5. Здесь выясняется все ли разряды n-блока проверены и если «нет», то осуществляется пёреход на блок А6. Если «да», то в блоке В6 происходит преобразование, в соответствия со вторым слагаемым выражения для длины кодового слова (22). То есть осуществляется передача не исходного S, а его номера.

В блоке В7 вычисляется коэффициент, необходимый для определения величины третьего слагаемого выражения для длины кодового слова(22). В блоке В8 происходят выдача сформированного кодового слова. Передается L бит. Если по завершению передачи очередного кодового слова, из канала продолжают поступать данные, осуществляется переход на блок А2.

На Рис. 6 представлен алгоритм декодирования.

А В

1

i = n1 + 1

Прием кодового слова

B (i) = 1

2

Определение K

k1= k1 - 1

3

Определение S

4 да

Определение b

b = b - b1

5

B = 0

S1 = S1 - i

6

k1 = k; S1 = S

n = n - 1

7