При квантовании одно из значений будет отводится под маркер конца цепочки сэмплов - например при указании 2 бит на сэмпл у нас получаются 4 разных значения:Shaos wrote:Прикинул тут 2 варанта (ELAINE02 и ELAINE04) с RLE и без RLE и чото получается, что просто кодирование символов по частоте (голый Хаффман) даёт результаты лучше, чем Хаффман поверх RLE (когда нули собраны с спец.символы по количеству подряд идущих и замешаны с сэмплами в общем алфавите как в примерах выше) - наверное надо добавить как опцию возможность делать и так, и эдак (и потом в адаптивном алгоритме реализовать всё с выбором лучшего):Shaos wrote:(таблица Хаффмана в WHI смешивает в месте квантованные отсчёты и метки последовательностей нулей разной длины, представляя их как разные литералы)(последний вариант это голые квантованные данные чисто чтобы было)Code: Select all
11 - Huffman after RLE 10 - Huffman only 01 - RLE only 00 - Raw data
Но отбрасывание хвостовых нулей я оставлю для всех вариантов т.к. их наличие уж точно ничего не даёт, а просто расходует попусту пространство (хотя с другой стороны, в случае отбрасывания нулей приходится заводить отдельный символ, означающий конец последовательности).
Code: Select all
00 кодирует 0
01 кодирует +1
10 кодирует спецсимвол
11 кодирует -1
10 xxxxxx где
xxxxxx=000000 кодирует 64 нуля
xxxxxx=000001 кодирует маркер конца
xxxxxx=000010 кодирует 2 нуля (если оно короче, чем 2 нуля по отдельности)
xxxxxx=000011 кодирует 3 нуля
...
xxxxxx=111111 кодирует 63 нуля
В случае голого Хаффмана спецсимвол будет использоваться сам по себе как маркер конца
В случае Хаффмана после RLE весь диапазон будет сдвигаться, чтобы включить в себя разные последовательности нулей как отдельные символы - для этого будет использоваться максимальное значение при кодировании без учёта знака - для 2 битов это 1, для 3 битов это 3, для 4 битов - 7 и т.д. Вот так раскидываем для "2 битов":
00..00 - сдвинутое значение -1
00..01 - маркер конца (т.к. ноль сам по себе не может попасться)
00..10 - сдвинутое значение +1
00..11 - отсюда и далее идут последовательности нулей от 1 до N (битность символов выбирается исходя из максимального значения N)
...
11..11 - теоретический предел
N можно также ограничить сверху, чтобы битность символов в таблице не уходило сильно в сторону - скажем теми же 64-мя (либо ближайшим к ним смещённым значением)...