Арифметическое кодирование

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

arithenco и arithdeco функции поддерживают арифметическое кодирование и декодирование.

Представляйте параметры кодирования арифметики

Арифметическое кодирование запрашивает статистическую информацию об источнике закодированных данных. В частности, counts входной параметр в arithenco и arithdeco функции перечисляют частоту, с которой источник производит каждый символ в своем алфавите. Можно определить частоты путем изучения набора тестовых данных из источника. Набор тестовых данных может иметь любой размер, который вы выбираете, пока каждый символ в алфавите имеет ненулевую частоту.

Например, прежде, чем закодировать данные из источника, который производит 10 x's, 10 лет и 80 z's в типичном 100 наборах символов тестовых данных, задают

counts = [10 10 80];

В качестве альтернативы, если больший набор тестовых данных из источника содержит 22 x's, 23 года и 185 z's, то задают

counts = [22 23 185];

Создайте и декодируйте арифметический код

Закодируйте и декодируйте последовательность из источника, имеющего три символа.

Создайте вектор последовательности, содержащий символы от набора {1,2,3}.

seq = [3 3 1 3 3 3 3 3 2 3];

Установите counts вектор, чтобы задать энкодер, который производит 10 единиц, 20 пар и 70 троек от типичного 100 наборов символов тестовых данных.

counts = [10 20 70];

Примените арифметические функции энкодера и декодера.

code = arithenco(seq,counts);
dseq = arithdeco(code,counts,length(seq));

Проверьте, что декодер выводил соответствия исходная входная последовательность.

isequal(seq,dseq)
ans = logical
   1