📄 sbr_dec_hf_adjust_int.c
字号:
} else if (!delta) {
bufG[k] = MUL32_SBR_32S(bufG[k], mulQ) << 1;
}
// --------------------
if (bufECurr[k]) {
denum = sbriInvWrap_32s_Sf(bufECurr[k], &sfTmp);
bufG[k] = MUL32_SBR_32S(bufG[k], denum);
sfsGain[k] = 28 - sfTmp - sfsECurr[k] + sfsEOrig[l];
}
// --------------------
bufQM[k] = MUL32_SBR_32S(bufEOrig[k], mulQQ) << 1;
} // end for (k = pos - (kh - kl); k < pos; k++)
} // end for( p = 0;
/* -------------------------------- Calculation of gain ---------------------------- */
ippsMin_32s(sfsECurr, pos, &sfECurrMax);
for (k = 0; k < pFTState->nLimBand; k++) {
sumEOrig = 0;
sumECurr = 0;
for (i = pFTState->fLimBandTab[k] - kx; i < pFTState->fLimBandTab[k + 1] - kx;
i++) {
sumEOrig += (bufEOrig[i] >> SCALE_FACTOR_SUM64);
sumECurr += (bufECurr[i] >> -(sfECurrMax - sfsECurr[i]));
if (sumECurr >> 30) {
sumECurr >>= 1;
sfECurrMax--;
}
} // end for(i=...
sfGainMax = 30; // default scaleFactor
gainMax = iLimiterGains; // default values
if ((sumECurr == 0) && (sumEOrig)) {
gainMax = THRESHOLD_GAIN;
} else if (sumEOrig == 0) {
gainMax = 0;
} else if (gainMax != THRESHOLD_GAIN) {
data = MUL32_SBR_32S(sumEOrig, gainMax);
/*
* Q[ sfsEOrig[l] - SCALE_FACTOR_SUM64 - 2 ], gainMax = Q30
*/
denum = sbriInvWrap_32s_Sf(sumECurr, &sfTmp);
gainMax = MUL32_SBR_32S(data, denum);
sfGainMax = 26 - sfTmp - sfECurrMax + (sfsEOrig[l] - SCALE_FACTOR_SUM64);
}
sumECurrGLim = 0;
sumQM = 0;
sumSM = 0;
for (i = pFTState->fLimBandTab[k] - kx; i < pFTState->fLimBandTab[k + 1] - kx; i++) {
if ((gainMax != THRESHOLD_GAIN) && sbriCheckUpDate(gainMax, sfGainMax, bufG[i], sfsGain[i])) {
// QM[i] = QM[i] * (g_max / vGain[i]);
// --------------
// denum = ...Q[60 - (sfsGain[i] + sfTmp)]
denum = sbriInvWrap_32s_Sf(bufG[i], &sfTmp);
// data = ...Q[ sfGainMax - (sfsGain[i] + sfTmp) + 28 ]
data = MUL32_SBR_32S(denum, gainMax);
sfTmp = sfGainMax + 28 - (sfsGain[i] + sfTmp);
data = sbriChangeScaleFactor(data, sfTmp, 30);
bufQM[i] = MUL32_SBR_32S(bufQM[i], data) << 2;
// --------------
// G[i] = g_max;
sfsGain[i] = sfGainMax;
bufG[i] = gainMax;
} // end if
{
Ipp32s sum, shift;
shift = sfsEOrig[l] - (sfsGain[i] + sfsECurr[i]);
if (shift > 0)
sum = (Ipp32s)( MUL64_SBR_64S(bufG[i], bufECurr[i]) << shift);
else
sum = (Ipp32s)( MUL64_SBR_64S(bufG[i], bufECurr[i]) >> -shift);
sumECurrGLim += (sum >> SCALE_FACTOR_SUM64);
}
sumSM += (bufSM[i] >> SCALE_FACTOR_SUM64);
if (!(bufSM[i] != 0 || delta)) {
sumQM += (bufQM[i] >> SCALE_FACTOR_SUM64);
}
//--------------------
} // for (i = ...; i <
// compensation //
denum = (sumECurrGLim >> 1) + (sumSM >> 1) + (sumQM >> 1);
// ------------------------------------------//
sfGainBoost = 0; // default values
gainBoost = THRESHOLD_GAIN_BOOST;
sfTmp = 0;
if ((denum == 0) && (sumEOrig == 0)) {
gainBoost = 1 << 28;
} else if (sumEOrig == 0) {
gainBoost = 0;
} else {
denum = sbriInvWrap_32s_Sf(denum, &sfTmp);
gainBoost = MUL32_SBR_32S(denum, sumEOrig) >> 1;
}
/* gainBoost = Q(28 - sfTmp) */
if (gainBoost > (THRESHOLD_GAIN_BOOST >> sfTmp)) {
gainBoost = THRESHOLD_GAIN_BOOST;
sfTmp = 0;
}
gainBoost <<= sfTmp; /* (Q28 - sfTmp) + sfTmp = Q28 */
//maxSfGain = 0;
/*
{
Ipp32s len = comState->f_TableLim[k + 1] - comState->f_TableLim[k];
ippsMax_32s(&sfsGain[i], len, &maxSfGain);
}
*/
// ------------------------------------------//
for (i = pFTState->fLimBandTab[k] - kx; i < pFTState->fLimBandTab[k + 1] - kx;
i++) {
// GainLimBoost
/* Q(sfsGain[i]) + Q28 - Q32 + 2 = Q(sfsGain[i]) - Q2 */
bufG[i] = MUL32_SBR_32S(bufG[i], gainBoost) << 2;
bufG2[i] = bufG[i];
bufG[i] = sbriSqrtWrap_64s_Sfs(bufG[i], sfsGain[i] - 2, &sfTmp);
bufG[i] = sbriChangeScaleFactor(bufG[i], sfTmp, SCALE_FACTOR_G_LIM_BOOST);
// QMLimBoost
bufQM[i] = MUL32_SBR_32S(bufQM[i], gainBoost) << 2;
bufQM[i] = sbriSqrtWrap_64s_Sfs(bufQM[i], sfsEOrig[l] - 2, &sfTmp);
bufQM[i] = sbriChangeScaleFactor(bufQM[i], sfTmp, SCALE_FACTOR_QM_LIM_BOOST);
// SMBoost
bufSM[i] = MUL32_SBR_32S(bufSM[i], gainBoost) << 2;
bufSM[i] = sbriSqrtWrap_64s_Sfs(bufSM[i], sfsEOrig[l] - 2, &sfTmp);
bufSM[i] = sbriChangeScaleFactor(bufSM[i], sfTmp, SCALE_FACTOR_SM_BOOST);
}
} // end for(k=0; k<
if (decode_mode == HEAAC_LP_MODE) {
#if 1
{
Ipp32s b;
for(b=0; b<64; b++)
{
bufG2[b] = (Ipp32s)( MUL64_SBR_64S(bufG[b], bufG[b] ) >> 26 ) ;
}
}
#endif
{
Ipp32s t;
minSfECurr = 0;
ippsMin_32s(sfsECurr, pos, &minSfECurr);
for(t=0; t<pos; t++)
{
bufECurr[t] = bufECurr[t] >> -(minSfECurr - sfsECurr[t]);
}
}
sbrAliasReduction_32s(degPatched,
bufECurr, minSfECurr,
bufG, SCALE_FACTOR_G_LIM_BOOST,
bufG2, 22,
s_mapped, kx, M);
}// if(HE_AAC_LP_MODE
/* -------------------------------- Assembling ---------------------------- */
if (comState->FlagUpdate[ch]) {
for (n = 0; n < 4; n++) {
ippsCopy_32s(bufG, iBufGain[n], M);
ippsCopy_32s(bufQM, iBufNoise[n], M);
}
comState->FlagUpdate[ch] = 0;
}
for (i = iStart; i < iEnd; i++) {
for (m = 0; m < M; m++) {
iBufGain[4][m] = bufG[m];
iBufNoise[4][m] = bufQM[m];
if (decode_mode == HEAAC_LP_MODE) {
num_sinusoids = 0;
}
gainFilt = noiseFilt = 0;
if (hSmoothLen) {
for (n = 0; n <= 4; n++) {
gainFilt += MUL32_SBR_32S(iBufGain[n][m], ihSmoothFilter[n]);
noiseFilt += MUL32_SBR_32S(iBufNoise[n][m], ihSmoothFilter[n]);
}
gainFilt <<= 1;
noiseFilt <<= 1;
} else {
gainFilt = iBufGain[4][m];
noiseFilt = iBufNoise[4][m];
}
if (bufSM[m] != 0 || delta) {
noiseFilt = 0;
}
fIndexNoise = (comState->indexNoise[ch] + (i - RATE * pFIState->bordersEnv[0]) * M + m + 1) & 511;
fIndexSine = (comState->indexSine[ch] + i - RATE * pFIState->bordersEnv[0]) & 3;
{
Ipp32s yRe, yIm;
Ipp32s noiseRe, noiseIm;
// Ipp32f f1, f2, f3;
if( decode_mode == HEAAC_LP_MODE ) {
yRe = pYre[i][m + kx];
noiseRe = MUL32_SBR_32S(noiseFilt, SBR_TABLE_V_INT_Q30[0][fIndexNoise]);
noiseRe >>= (SCALE_FACTOR_QM_LIM_BOOST - 2 - SCALE_FACTOR_QMFA_OUT);
//--------------------------------------------------
yRe = MUL32_SBR_32S(yRe, gainFilt);
yRe <<= (32 - SCALE_FACTOR_G_LIM_BOOST);
yRe = (yRe >> 1) + (noiseRe >> 1) + (bufSM[m] * SIN_FI_RE[fIndexSine] >> 1);
// patch
if (yRe >= (IPP_MAX_32S ) )
yRe = IPP_MAX_32S;
else if (yRe <= (IPP_MIN_32S))
yRe = IPP_MIN_32S;
else
yRe <<= 1;
/* */
pYre[i][m + kx] = yRe;
//
}else {//if (decode_mode == HEAAC_HQ_MODE) {
yRe = pYcmp[i][m + kx].re;
noiseRe = MUL32_SBR_32S(noiseFilt, SBR_TABLE_V_INT_Q30[0][fIndexNoise]);
noiseRe >>= (SCALE_FACTOR_QM_LIM_BOOST - 2 - SCALE_FACTOR_QMFA_OUT);
//--------------------------------------------------
yRe = MUL32_SBR_32S(yRe, gainFilt);
yRe <<= (32 - SCALE_FACTOR_G_LIM_BOOST);
yRe = (yRe >> 1) + (noiseRe >> 1) + (bufSM[m] * SIN_FI_RE[fIndexSine] >> 1);
// patch
if (yRe >= (IPP_MAX_32S ) )
yRe = IPP_MAX_32S;
else if (yRe <= (IPP_MIN_32S))
yRe = IPP_MIN_32S;
else
yRe <<= 1;
/* */
pYcmp[i][m + kx].re = yRe;
yIm = pYcmp[i][m + kx].im;
noiseIm = MUL32_SBR_32S(noiseFilt, SBR_TABLE_V_INT_Q30[1][fIndexNoise]);
noiseIm >>= (SCALE_FACTOR_QM_LIM_BOOST - 2 - SCALE_FACTOR_QMFA_OUT);
yIm = MUL32_SBR_32S(yIm, gainFilt);
yIm <<= (32 - SCALE_FACTOR_G_LIM_BOOST);
yIm = (yIm >> 1) + (noiseIm >> 1) + (bufSM[m] * POW_MINUS_UNIT[m + kx] * SIN_FI_IM[fIndexSine] >> 1);
if (yIm >= IPP_MAX_32S)
yIm = IPP_MAX_32S;
else if (yIm <= IPP_MIN_32S)
yIm = IPP_MIN_32S;
else
yIm <<= 1;
pYcmp[i][m + kx].im = yIm;
}
if (decode_mode == HEAAC_LP_MODE) {
sbrSinAdd_LP_32s(pYre[i], comState->indexSine[ch], pFIState->bordersEnv[0], m, kx, i,
bufSM, M, &num_sinusoids ) ;
}
//-----------------------------------------------------
}
} // end for ( m = 0; m < M; m++ )
for (n = 0; n < 4; n++) {
ippsCopy_32s(iBufGain[n + 1], iBufGain[n], 64);
ippsCopy_32s(iBufNoise[n + 1], iBufNoise[n], 64);
}
} // end for (i = iStart; i < iEnd; i++)
} /* end main loop */
/* -------------------------------- update ---------------------------- */
ippsCopy_32s(sineIndxMap, &(comState->S_index_mapped_prev[ch][kx]), (64 - kx));
if (lA == nEnv)
comState->lA_prev[ch] = 0;
else
comState->lA_prev[ch] = -1;
pFIState->nEnvPrev = pFIState->nEnv;
pFIState->nNoiseEnvPrev = pFIState->nNoiseEnv;
comState->indexNoise[ch] = fIndexNoise;
comState->indexSine[ch] = (fIndexSine + 1) & 3;
}
/********************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -