ГОСТ Р 53556.7—2013
Чтобы гарантировать, что фильтр IIR может достигнуть достаточно устойчивого состояния, ис
пользуется фаза запуска:
startup = - numNoisePara
Если производится декодирование с изменением шага (то есть pitchPactor! = 1.0) или с другой
частотой дискретизации, чем у кодера (то есть synthSamploRate! =sampleRate). к сигналу xf[m] должна
быть применена операция передискретизации с использованием коэффициента передискретизации
resamploFactor = (sampleRate ’ pitchFactor)/synthSamploRate:
где. например. pitchFactor2 указывает, что этот сигнал синтезируется при его удвоенном исходном
шаге. Иначе resampleFactor устанавливается в 1.0. На базе resamploFactor перед передискретизацией
определяется длина фрейма М:
М = N *resampleFactor.
Передискретизация может быть реализована, применяя две операции фильтра нижних частот FIR
к сигналу xf(m] и линейно интерполируя между этими двумя значениями, чтобы получить заключитель
ный сигнал шума хп [п].
if (resampleFactor <t)
fc = 1;
else
fc = 1/resamploFactor.
Следующая функция вычисляет временную характеристику hlp[0.. 31) соответствующего фильтра
нижних частот FIR с 16 отводами и коэффициентом передискретизации 4. Частота среза будет fc.
void GonLPFilter (float, ’hip. double fc).
{
double x. f:
inti:
hip [0] = (float) fc;
for (i = 1;i <32: i +♦)
{
x = i’pi/4,0;
1
hip 1J = (float) ((0.54+0,46’cos (0.t25’x)) ‘sin (fc‘x)/x);
)
}
Чтобы выполнить работу фильтра FIR. может использоваться следующая функция С. Параметра
ми являются сигнал, временная характеристика (как результат функции выше) и позиция точки выбор
ки. Позиция дается как разница между ближайшей позицией выборки до требующейся позиции выборки
(х [7]) и требующейся позицией выборки. Поэтому 0 <= pos <1. Интерполяция выполняется между х[7] и
х{8], полученное значение представляет позицию выборки 7*pos.
float LPInterpolate (float ’x. float ’hip. double fc).
{
longj;
double s. t:
pos * = 4.0;
j = (long) pos:
pos - = (double) j:
s = t = 0.0.
j = 32-j:
if (j == 32)
{
t = h [31] * (’x);
x +♦;
/ - = <’
45