ГОСТ Р 53556.11—2014
Инверсный процесс (декодирование), восстанавливающий исходные остаточные выборки (res pj)
на основе их MSB. LSB или хвостовых частей, может быть описан следующим образом:
for (if * 1;/ <= N; fr+)
{
if (msbpj == tail_code[sx][delta]) {
if (tailp] >= 0)//positive tail
respj = tailp] ♦ (abs_max_x) « fc
else//negative tan
resp] = tailp] -(abs_max_x -^) « k;
} else {
int msbi = msbp],
if (msbi > tail_code[sx][deltaJ)
msbi// skip tail code
if (msbi & 1)
msbi = (-msbi-1)/2: //remove sign
else
msbi = msbi/2:
resp] = (msbi« k) \ lsb[i]://add Isbs
)
}
6.6.2.3 Кодирование и декодирование MSB
Отсеченные MSB остаточных выборок блочно кодируются, используя коды Гильберта-Мура, соз
данные для распределения (кумулятивная таблица частот), индексированного параметром sx.
Процесс кодирования состоит из инициализации состояния (арифметического) кодера блока
Гильберта-Мура, последовательного кодирования всех значений MSB во всех подблоках, и сбрасыва
ния состояния кодера.
Спецификации на языке С соответствующих функций кодера даются ниже.
Udeftne FREQ_BITS 14II It bits used by freq. counters
ttdefme VALUE_BITS 18II # bits used to describe code range
ttdefme TOP_VALUE 0x3FFFF Иlargest code value
tidefine FIRST_QTR 0x10000 II first quarter
ttdefme HALF0x20000 // first half
ttdefme THIRD_QTR 0x30000 II third quartor
// encoderstate variables:
static unsigned long high. low. bits_to_follow.
//start encoding:
voidbgmc_start_oncoding (void)
{
high = TOPVALUE:
lov/ = 0;
bits tojollow
=
0
;
}
//sends a bit followed by a sequence ofopposite bits:
voidput_bitjplusjollow (unsignedlong bit)
{
put_bit (bit):
while (bits_to_fotlow) {
put_bit (bitA1):
bitsjojollow
}
)
43