📄 aac_enc_psychoacoustic_fp.c
字号:
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 + -