⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sbr_dec_hf_adjust_int.c

📁 audio-video-codecs.rar语音编解码器
💻 C
📖 第 1 页 / 共 3 页
字号:
        } 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 + -