📄 gain_util.c
字号:
* Function: ownUpdateUnQntPred_M475()
*************************************************************************/
void ownUpdateUnQntPred_M475(short *a_PastQntEnergy, short *a_PastQntEnergy_M122, short expGainCodeCB,
short fracGainCodeCB, short codGainExp, short codGainFrac)
{
int i;
short tmp, exp, frac;
short qntEnergyErr, qntEnergyErr_M122;
int TmpQnt;
if (codGainFrac <= 0) {
qntEnergyErr = MIN_QUA_ENER;
qntEnergyErr_M122 = MIN_QUA_ENER_MR122;
} else {
fracGainCodeCB = (short)(ownPow2_GSMAMR (14, fracGainCodeCB));
if(codGainFrac >= fracGainCodeCB) {
codGainFrac >>= 1;
codGainExp++;
}
frac = (codGainFrac << 15)/fracGainCodeCB;
tmp = codGainExp - expGainCodeCB - 1;
ownLog2_GSMAMR (frac, &exp, &frac);
exp += tmp;
qntEnergyErr_M122 = (frac >> 5) + (exp << 10);
if (qntEnergyErr_M122 < MIN_QUA_ENER_MR122) {
qntEnergyErr = MIN_QUA_ENER;
qntEnergyErr_M122 = MIN_QUA_ENER_MR122;
} else if (qntEnergyErr_M122 > MAX_QUA_ENER_MR122) {
qntEnergyErr = MAX_QUA_ENER;
qntEnergyErr_M122 = MAX_QUA_ENER_MR122;
} else {
TmpQnt = Mul16s_32s(exp, frac, 24660);
qntEnergyErr = Cnvrt_NR_32s16s(ShiftL_32s(TmpQnt, 13));
}
}
for (i = 3; i > 0; i--) {
a_PastQntEnergy[i] = a_PastQntEnergy[i - 1];
a_PastQntEnergy_M122[i] = a_PastQntEnergy_M122[i - 1];
}
a_PastQntEnergy_M122[0] = qntEnergyErr_M122;
a_PastQntEnergy[0] = qntEnergyErr;
}
/*************************************************************************
* Function: ownGainQnt_M475()
*************************************************************************/
short ownGainQnt_M475(short *a_PastQntEnergy, short *a_PastQntEnergy_M122, short vExpPredCBGain,
short vFracPredCBGain, short *a_ExpEnCoeff, short *a_FracEnCoeff,
short vExpTargetEnergy, short vFracTargetEnergy, short *codeNoSharpSF1,
short expGainCodeSF1, short fracGainCodeSF1, short *expCoeffSF1, short *fracCoeffSF1,
short expTargetEnergySF1, short fracTargetEnergySF1, short gainPitchLimit,
short *gainPitSF0, short *gainCodeSF0, short *gainPitSF1, short *gainCodeSF1)
{
const short *p;
short i, index = 0;
short tmp;
short exp;
short sf0_gcode0, sf1_gcode0;
short g_pitch, g2_pitch, g_code, g2_code, g_pit_cod;
short coeff[10], coeff_lo[10], exp_max[10]; /* 0..4: sf0; 5..9: sf1 */
int TmpVal, dist_min;
sf0_gcode0 = (short)(ownPow2_GSMAMR(14, vFracPredCBGain));
sf1_gcode0 = (short)(ownPow2_GSMAMR(14, fracGainCodeSF1));
exp = vExpPredCBGain - 11;
exp_max[0] = a_ExpEnCoeff[0] - 13;
exp_max[1] = a_ExpEnCoeff[1] - 14;
exp_max[2] = a_ExpEnCoeff[2] + 15 + (exp << 1);
exp_max[3] = a_ExpEnCoeff[3] + exp;
exp_max[4] = a_ExpEnCoeff[4] + 1 + exp;
exp = expGainCodeSF1 - 11;
exp_max[5] = expCoeffSF1[0] - 13;
exp_max[6] = expCoeffSF1[1] - 14;
exp_max[7] = expCoeffSF1[2] +15 + (exp << 1);
exp_max[8] = expCoeffSF1[3] + exp;
exp_max[9] = expCoeffSF1[4] + 1 + exp;
exp = vExpTargetEnergy - expTargetEnergySF1;
if (exp > 0) fracTargetEnergySF1 >>= exp;
else vFracTargetEnergy >>= -exp;
exp = 0;
tmp = fracTargetEnergySF1 >> 1;
if (fracTargetEnergySF1 & 1) tmp++;
if (tmp > vFracTargetEnergy) exp = 1;
else {
tmp = (vFracTargetEnergy + 3) >> 2;
if(tmp > fracTargetEnergySF1) exp = -1;
}
for (i = 0; i < 5; i++)
exp_max[i] += exp;
exp = exp_max[0];
for (i = 1; i < 10; i++) {
if(exp_max[i] > exp) exp = exp_max[i];
}
exp += 1;
p = &a_FracEnCoeff[0];
for (i = 0; i < 5; i++) {
tmp = exp - exp_max[i];
TmpVal = *p++ << 16;
if (tmp >= (short)31) TmpVal = (TmpVal < 0) ? -1 : 0;
else TmpVal >>= tmp;
L_Extract(TmpVal, &coeff[i], &coeff_lo[i]);
}
p = &fracCoeffSF1[0];
for (; i < 10; i++) {
tmp = exp - exp_max[i];
TmpVal = *p++ << 16;
if (tmp >= (short)31) TmpVal = (TmpVal < 0) ? -1 : 0;
else TmpVal >>= tmp;
L_Extract(TmpVal, &coeff[i], &coeff_lo[i]);
}
/* start with "infinite" MSE */
dist_min = IPP_MAX_32S;
p = &table_gain_MR475[0];
for (i = 0; i < VEC_QNT_M475_SIZE; i++) {
g_pitch = *p++;
g_code = *p++;
g_code = (short)((g_code * sf0_gcode0) >> 15);
g2_pitch = (short)((g_pitch * g_pitch) >> 15);
g2_code = (short)((g_code * g_code) >> 15);
g_pit_cod = (short)((g_code * g_pitch) >> 15);
TmpVal = Mul16s_32s( coeff[0], coeff_lo[0], g2_pitch);
TmpVal = AddProduct16s_32s(TmpVal, coeff[1], coeff_lo[1], g_pitch);
TmpVal = AddProduct16s_32s(TmpVal, coeff[2], coeff_lo[2], g2_code);
TmpVal = AddProduct16s_32s(TmpVal, coeff[3], coeff_lo[3], g_code);
TmpVal = AddProduct16s_32s(TmpVal, coeff[4], coeff_lo[4], g_pit_cod);
tmp = g_pitch - gainPitchLimit;
g_pitch = *p++;
g_code = *p++;
if(tmp <= 0 && g_pitch <= gainPitchLimit) {
g_code = (short)((g_code * sf1_gcode0) >> 15);
g2_pitch = (short)((g_pitch * g_pitch) >> 15);
g2_code = (short)((g_code * g_code) >> 15);
g_pit_cod = (short)((g_code * g_pitch) >> 15);
TmpVal = AddProduct16s_32s(TmpVal, coeff[5], coeff_lo[5], g2_pitch);
TmpVal = AddProduct16s_32s(TmpVal, coeff[6], coeff_lo[6], g_pitch);
TmpVal = AddProduct16s_32s(TmpVal, coeff[7], coeff_lo[7], g2_code);
TmpVal = AddProduct16s_32s(TmpVal, coeff[8], coeff_lo[8], g_code);
TmpVal = AddProduct16s_32s(TmpVal, coeff[9], coeff_lo[9], g_pit_cod);
if(TmpVal < dist_min) {
dist_min = TmpVal;
index = i;
}
}
}
tmp = index << 2;
ownQntStoreResults_M475(a_PastQntEnergy, a_PastQntEnergy_M122, &table_gain_MR475[tmp],
sf0_gcode0, vExpPredCBGain, gainPitSF0, gainCodeSF0);
ownPredEnergyMA_GSMAMR(a_PastQntEnergy,a_PastQntEnergy_M122, IPP_SPCHBR_4750, codeNoSharpSF1,
&expGainCodeSF1, &fracGainCodeSF1, &vExpPredCBGain, &sf0_gcode0);
sf1_gcode0 = (short)(ownPow2_GSMAMR(14, fracGainCodeSF1));
tmp += 2;
ownQntStoreResults_M475(a_PastQntEnergy, a_PastQntEnergy_M122, &table_gain_MR475[tmp],
sf1_gcode0, expGainCodeSF1, gainPitSF1, gainCodeSF1);
return index;
}
/*************************************************************************
* Function: ownPreQnt3CodebookGain_M795
*************************************************************************/
static void ownPreQnt3CodebookGain_M795(short expGainCodeCB, short predGainCB, short *pitchGainCand,
short *pitchGainCandIdx, short *fracCoeff, short *expCoeff,
short *pitchGainVar, short *pitchGainIdx, short *codeGainVar,
short *codeGainIdx, short *qntEnergyErr_M122, short *qntEnergyErr)
{
const short *p;
short i, j, cod_ind, pit_ind;
short e_max, exp_code;
short g_pitch, g2_pitch, g_code, g2_code_h, g2_code_l;
short g_pit_cod_h, g_pit_cod_l;
short coeff[5], coeff_lo[5];
short exp_max[5];
int TmpVal, TmpVal0, dist_min;
exp_code = expGainCodeCB - 10;
exp_max[0] = expCoeff[0] - 13;
exp_max[1] = expCoeff[1] - 14;
exp_max[2] = expCoeff[2] + 15 + (exp_code << 1);
exp_max[3] = expCoeff[3] + exp_code;
exp_max[4] = expCoeff[4] + exp_code + 1;
e_max = exp_max[0];
for(i = 1; i < 5; i++) {
if (exp_max[i] > e_max) e_max = exp_max[i];
}
e_max++;
for (i = 0; i < 5; i++) {
j = e_max - exp_max[i];
TmpVal = fracCoeff[i] << 16;
if (j >= (short)31) TmpVal = (TmpVal < 0) ? -1 : 0;
else TmpVal >>= j;
L_Extract(TmpVal, &coeff[i], &coeff_lo[i]);
}
dist_min = IPP_MAX_32S;
cod_ind = 0;
pit_ind = 0;
for (j = 0; j < 3; j++) {
g_pitch = pitchGainCand[j];
g2_pitch = (short)((g_pitch * g_pitch) >> 15);
TmpVal0 = Mul16s_32s(coeff[0], coeff_lo[0], g2_pitch);
TmpVal0 = AddProduct16s_32s(TmpVal0, coeff[1], coeff_lo[1], g_pitch);
p = &pTblQntGainCode[0];
for (i = 0; i < LEN_QNT_GAIN; i++) {
g_code = *p++;
p++;
p++;
g_code = (short)((g_code * predGainCB) >> 15);
TmpVal = 2 * g_code * g_code;
L_Extract (TmpVal, &g2_code_h, &g2_code_l);
TmpVal = 2 * g_code * g_pitch;
L_Extract (TmpVal, &g_pit_cod_h, &g_pit_cod_l);
TmpVal = AddProduct_32s(TmpVal0, coeff[2], coeff_lo[2], g2_code_h, g2_code_l);
TmpVal = AddProduct16s_32s(TmpVal, coeff[3], coeff_lo[3], g_code);
TmpVal = AddProduct_32s(TmpVal, coeff[4], coeff_lo[4], g_pit_cod_h, g_pit_cod_l);
if (TmpVal < dist_min) {
dist_min = TmpVal;
cod_ind = i;
pit_ind = j;
}
}
}
p = &pTblQntGainCode[3* cod_ind];
g_code = *p++;
*qntEnergyErr_M122 = *p++;
*qntEnergyErr = *p;
TmpVal = 2 * g_code * predGainCB;
if (expGainCodeCB > 9) TmpVal <<= (expGainCodeCB - 9);
else TmpVal >>= (9 - expGainCodeCB);
*codeGainVar = (short)(TmpVal >> 16);
*codeGainIdx = cod_ind;
*pitchGainVar = pitchGainCand[pit_ind];
*pitchGainIdx = pitchGainCandIdx[pit_ind];
}
/*************************************************************************
* Function: ownGainCodebookQnt_M795
*************************************************************************/
static short ownGainCodebookQnt_M795(short pitchGainVar, short expGainCodeCB, short predGainCB,
short *fracEnergyCoeff, short *expEnergyCoeff, short alpha,
short gainCodeUnQnt, short *codeGainVar, short *qntEnergyErr_M122,
short *qntEnergyErr)
{
const short *p;
short i, index, tmp;
short one_alpha;
short exp, e_max;
short g2_pitch, g_code;
short g2_code_h, g2_code_l;
short d2_code_h, d2_code_l;
short coeff[5], coeff_lo[5], expCoeff[5];
int TmpVal, Time0, Time1, dist_min;
short decGainCode;
/* calculate scalings of the constant terms */
if (expGainCodeCB > 10)
decGainCode = Cnvrt_32s16s(*codeGainVar >> (expGainCodeCB - 10));
else
decGainCode = Cnvrt_32s16s(*codeGainVar << (10 - expGainCodeCB));
g2_pitch = (short)((pitchGainVar * pitchGainVar) >> 15);
one_alpha = 32767 - alpha + 1;
tmp = (short)((alpha * fracEnergyCoeff[1]) >> 14);
Time1 = 2 * tmp * g2_pitch;
expCoeff[1] = expEnergyCoeff[1] - 15;
tmp = (short)((alpha * fracEnergyCoeff[2]) >> 14);
coeff[2] = (short)((tmp * pitchGainVar) >> 15);
exp = expGainCodeCB - 10;
expCoeff[2] = expEnergyCoeff[2] + exp;
coeff[3] = (short)((alpha * fracEnergyCoeff[3]) >> 14);
exp = (expGainCodeCB << 1) - 7;
expCoeff[3] = expEnergyCoeff[3] + exp;
coeff[4] = (short)((one_alpha * fracEnergyCoeff[3]) >> 15);
expCoeff[4] = expCoeff[3] + 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -