ГОСТ Р 53556.12-2014
Все операции основаны на вычислениях. Используются следующие форматы:
IN732
для ввода, вывода и промежуточных значений, предопределенных коэффициентов с
фиксированной точкой;
/ЛТ64 для умножения с коэффициентами с фиксированной точкой, результаты смещаются
и сохраняются в 1ЛТ32 сразу после каждого умножения.
Основные определения для
IntMDCT:
S!NE_DATA_SIZE
=8192
SHIFT
= 30
SHIFT_FOR_ERROR_FEEDBAСК
= 6
Все операции с плавающей запятой в алгоритме выполняются способом с фиксированной
точкой. Число дробных битов дается с помощью
SHIFT.
Необходимые коэффициенты с плавающей точкой для умножения в шагах подъема и для
промежуточных вычислений с фиксированной точкой сохраняются как значения с фиксирован
ной точкой в
IN732:
INT 32_coeff- nearestint ((l «SH IFT) *FLOAT_coeff).
Следующие плавающие коэффициенты сохраняются таким образом:
sineData /*] = sin (к*pi/ (2*SINE_DATA_SIZE)), k=0.... S1NE_DATA_S1ZEZ
>,
определенными в
sineData ISINE_DATA_SIZE/2+l].
sineData_cs Ik]
=
<1-
cos
(k*pi/ (2*SINE_DAТА_SIZE)))
/ sin
(k*pi/ (2*SINE_DATA_SIZE)).
k=0
....
SINEJM TAJSIZEJ1.
определенными в
sineData_cs fSINE_DATA_SIZE/l+l
].
Соответствующиезначениядляокна
KBD
предопределяютсяв
KBDWindow
(SINE_DATA_SIZE/1
/ соответственно
KBDWindow_cs [SINE_DATA_SIZE/1].
Основные функции для
IntMDCT
:
IN732 midtShiftINT32HNT32 x. 1NT32
y,
int shift) f
return ( (INT22)(((lNTM)x*y)»shift)):
I
IN732 midtShiftRoundIN732(IN732 x. INT32
y.
int shift) (
)
return ({ niultShiftlNT32(x,x.shift-
1 + 1
) >>
1
);
I
IN732 shiftRound/NT32(IN732
y,
INT32 shift) f
1
return (((y»(shift
-1))+1
)>> );
I
41