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

📄 aac_enc_psychoacoustic_fp.c

📁 audio-video-codecs.rar语音编解码器
💻 C
📖 第 1 页 / 共 2 页
字号:
      ippsMinEvery_32f_I(ecb, nb_s, num_ptt);
    } else {
      ippsCopy_32f(nb, nb_s, num_ptt);
    }

    ippsMaxEvery_32f_I(pBlockCom->shortWindow->qsthr, nb, num_ptt);
    ippsMaxEvery_32f_I(pBlockCom->shortWindow->qsthr, nb_s, num_ptt>>1);

    noiseThr = &pBlockCom->noiseThr[ch][MAX_SFB_SHORT * win_counter];

    for (sb = 0; sb < pBlockCom->num_sfb_short; sb++) {
      Ipp32s start = pBlockCom->aacenc_p2sb_s[sb].bu;
      Ipp32s end = pBlockCom->aacenc_p2sb_s[sb].bo;

      noiseThr[sb] = pBlockCom->aacenc_p2sb_s[sb].w1 * nb_s[start] +
                      pBlockCom->aacenc_p2sb_s[sb].w2 * nb_s[end];

      for (b = start + 1; b < end; b++) {
        noiseThr[sb] += nb_s[b];
      }

      /* pre-echo control */
      if (win_counter == pBlock->attackIndex) {
        noiseThr[sb] *= 0.01f;
        if (noiseThr[sb] > MAX_TRH_SHORT)
          noiseThr[sb] = MAX_TRH_SHORT;
      }

      if ((noiseThr[sb] > 1.0e9f) && (sb < 2)) {
        noiseThr[sb] = 1.0e9f;
      }
    }
  }
}

/****************************************************************************/

AACStatus InitPsychoacousticCom(sPsychoacousticBlockCom* pBlock,
                                Ipp8u* mem,
                                Ipp32s sf_index,
                                Ipp32s ns_mode,
                                Ipp32s *size_all)
{
  Ipp8u  *pBufInit;
  Ipp32s num_ptt, b, bb;
  Ipp32s sizeSpecLong, sizeInit, sizeWork;
  Ipp32s sizeSpecShort, sizeInitShort, sizeWorkShort;
  Ipp32f *bval;

  if (pBlock) {
    ippsZero_8u((Ipp8u*)pBlock, sizeof(sPsychoacousticBlockCom));

    pBlock->iblen_long  = 1024;
    pBlock->iblen_short = 128;

    pBlock->nb_curr_index = 1;
    pBlock->nb_prev_index = 0;

    pBlock->aacenc_p2sb_l = aacenc_p2sb_l[sf_index];
    pBlock->aacenc_p2sb_s = aacenc_p2sb_s[sf_index];
    pBlock->sfb_offset_long  = sfb_tables[sf_index].sfb_offset_long_window;
    pBlock->sfb_offset_short = sfb_tables[sf_index].sfb_offset_short_window;

    pBlock->longWindow    = &psy_partition_tables_long[sf_index];
    pBlock->shortWindow   = &psy_partition_tables_short[sf_index];

    num_ptt = pBlock->longWindow->num_ptt;
    bval = pBlock->longWindow->bval;

    for (b = 0; b < num_ptt; b++) {
      Ipp32f *tmp_ptr = pBlock->sprdngf_long + b * num_ptt;
      Ipp32f tmp = 0;

      for (bb = 0; bb < num_ptt; bb++) {
        tmp_ptr[bb] = sprdngf(bval[bb], bval[b]);
        tmp += tmp_ptr[bb];
      }
      pBlock->rnorm_long[b] = 1/tmp;
    }

    num_ptt = pBlock->shortWindow->num_ptt;
    bval = pBlock->shortWindow->bval;

    for (b = 0; b < num_ptt; b++) {
      Ipp32f *tmp_ptr = pBlock->sprdngf_short + b * num_ptt;
      Ipp32f tmp = 0;

      for (bb = 0; bb < num_ptt; bb++) {
        tmp_ptr[bb] = sprdngf(bval[bb], bval[b]);
        tmp += tmp_ptr[bb];
      }
      pBlock->rnorm_short[b] = 1/tmp;
    }
  }

  if (ippsFFTGetSize_R_32f(11, IPP_FFT_NODIV_BY_ANY, ippAlgHintFast,
                           &sizeSpecLong, &sizeInit, &sizeWork) != ippStsOk) {
    return AAC_ALLOC;
  }

  if (ippsFFTGetSize_R_32f(8, IPP_FFT_NODIV_BY_ANY, ippAlgHintFast,
                           &sizeSpecShort, &sizeInitShort, &sizeWorkShort) != ippStsOk) {
    return AAC_ALLOC;
  }

  if (sizeInit < sizeInitShort)
    sizeInit = sizeInitShort;

  if (sizeWork < sizeWorkShort)
    sizeWork = sizeWorkShort;

  *size_all = sizeSpecLong + sizeSpecShort + sizeWork + sizeInit;

  if (pBlock) {
    pBlock->pBuffer = mem + sizeSpecLong + sizeSpecShort;
    pBufInit = pBlock->pBuffer + sizeWork;

    if (ippsFFTInit_R_32f(&(pBlock->pFFTSpecLong), 11, IPP_FFT_NODIV_BY_ANY,
                          ippAlgHintFast, mem, pBufInit) != ippStsOk) {
      return AAC_ALLOC;
    }

    if (ippsFFTInit_R_32f(&(pBlock->pFFTSpecShort), 8, IPP_FFT_NODIV_BY_ANY,
                          ippAlgHintFast, mem + sizeSpecLong, pBufInit) != ippStsOk) {
      return AAC_ALLOC;
    }

    pBlock->ns_mode = ns_mode;
  }

  return AAC_OK;
}

/****************************************************************************/

void InitPsychoacoustic(sPsychoacousticBlockCom* pBlockCom,
                        sPsychoacousticBlock* pBlock)
{
  Ipp32s k;
  Ipp32f iirTap[4];

  pBlock->block_type = ONLY_LONG_SEQUENCE;
  pBlock->desired_block_type = ONLY_LONG_SEQUENCE;
  pBlock->bitsToPECoeff = 0.35f;
  pBlock->scalefactorDataBits = 100;
  pBlock->PEtoNeededPECoeff = 1;

  for (k = 0; k < 2; k++) {
    ippsSet_32f(1, pBlock->r[k], 1024);
  }

  ippsCopy_32f(pBlockCom->longWindow->qsthr, pBlock->nb_long[0],
               pBlockCom->longWindow->num_ptt);

  ippsCopy_32f(pBlockCom->longWindow->qsthr, pBlock->nb_long[1],
               pBlockCom->longWindow->num_ptt);

  pBlock->avWinEnergy = 0;
  pBlock->attackIndex = 0;
  pBlock->lastAttackIndex = 0;

  iirTap[0] = hiPassCoeff[0];
  iirTap[1] = -hiPassCoeff[0];
  iirTap[2] = 1;
  iirTap[3] = hiPassCoeff[1];

  ippsIIRInitAlloc_32f(&pBlock->IIRfilterState, iirTap, 1, NULL);
}

/****************************************************************************/

void Psychoacoustic(sPsychoacousticBlock** pBlock,
                    sPsychoacousticBlockCom* pBlockCom,
                    Ipp32f **mdct_line,
                    Ipp32s *window_shape,
                    Ipp32s *prev_window_shape,
                    Ipp32s stereo_mode,
                    Ipp32s numCh)
{
  Ipp32s lastBlockType[2];
  Ipp32s ch;

  for (ch = 0; ch < numCh; ch++) {
    BlockSwitching(pBlock[ch], pBlockCom, ch);
  }

  if (numCh == 2) {
    if (stereo_mode != AAC_LR_STEREO) {
      if (pBlock[0]->next_desired_block_type !=
          pBlock[1]->next_desired_block_type) {
        pBlock[0]->next_desired_block_type =
        pBlock[1]->next_desired_block_type = EIGHT_SHORT_SEQUENCE;
      }
    }
  }

  for (ch = 0; ch < numCh; ch++) {
    lastBlockType[ch] = pBlock[ch]->block_type;
    if ((pBlock[ch]->block_type == EIGHT_SHORT_SEQUENCE) ||
        (pBlock[ch]->block_type == LONG_START_SEQUENCE)) {
      if ((pBlock[ch]->desired_block_type == ONLY_LONG_SEQUENCE) &&
          (pBlock[ch]->next_desired_block_type == ONLY_LONG_SEQUENCE)) {
        pBlock[ch]->block_type = LONG_STOP_SEQUENCE;
      } else {
        pBlock[ch]->block_type = EIGHT_SHORT_SEQUENCE;
      }
    } else if (pBlock[ch]->next_desired_block_type == EIGHT_SHORT_SEQUENCE) {
      pBlock[ch]->block_type = LONG_START_SEQUENCE;
    } else {
      pBlock[ch]->block_type = ONLY_LONG_SEQUENCE;
    }
    pBlock[ch]->desired_block_type = pBlock[ch]->next_desired_block_type;
  }

  for (ch = 0; ch < numCh; ch++) {
    window_shape[ch] = 1;

    if ((pBlock[ch]->block_type == LONG_START_SEQUENCE) ||
        (pBlock[ch]->block_type == EIGHT_SHORT_SEQUENCE))
      window_shape[ch] = 0;

    FilterbankEnc(pBlockCom->filterbank_block,
                  (Ipp32f*)pBlockCom->input_data[ch][0],
                  (Ipp32f*)pBlockCom->input_data[ch][1],
                  pBlock[ch]->block_type, window_shape[ch],
                  prev_window_shape[ch],
                  (Ipp32f*)pBlock[ch]->r[0], 0);

     mdct_line[ch] = (Ipp32f*)pBlock[ch]->r[0];
  }

  for (ch = 0; ch < numCh; ch++) {
    if (pBlock[ch]->block_type == EIGHT_SHORT_SEQUENCE) {
      psy_short_window(pBlock[ch], pBlockCom, ch, lastBlockType[ch]);
    } else {
      psy_long_window(pBlock[ch], pBlockCom, ch);
    }
  }
}

/****************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -