📄 mp3enc_psychoacoustic_fp.cpp
字号:
pa_next_frame_PE[ch] = 0; for (b = 0; b < pa_num_ptt_long; b++) { Ipp32f *tmp_ptr = (Ipp32f*)pa_sprdngf_long + b * pa_num_ptt_long; ippsDotProd_32f(e_b, tmp_ptr, pa_num_ptt_long, &ecb[b]); ippsDotProd_32f(c_b, tmp_ptr, pa_num_ptt_long, &ct[b]); } ippsMulC_32f(ecb, (Ipp32f)0.00964116, tmp_ecb, pa_num_ptt_long); ippsMulC_32f(ct, (Ipp32f)0.52280978, tmp_ct, pa_num_ptt_long); ippsAdd_32f(tmp_ct, tmp_ecb, cb, pa_num_ptt_long); ippsMulC_32f(ecb, (Ipp32f)0.25118864, ecb_h_limit, pa_num_ptt_long); ippsMulC_32f(ecb, (Ipp32f)0.0158489, ecb_l_limit, pa_num_ptt_long); ippsMaxEvery_32f_I(ecb_l_limit, cb, pa_num_ptt_long); ippsMinEvery_32f_I(ecb_h_limit, cb, pa_num_ptt_long); ippsMul_32f((Ipp32f*)pa_rnorm_long, cb, (Ipp32f*)nb, pa_num_ptt_long); /* instead of nb[b] = MAX( pow(10.0,pBlock->qsthr_long[b]/10.0)/32767.0, */ /* MIN(nb[b],2.0*nb_l[b])); */ /* we use only nb[b] = MIN(nb[b],2.0*nb_l[b]) yet */ ippsMulC_32f_I(2, (Ipp32f*)nb_l, pa_num_ptt_long); ippsMinEvery_32f_I((Ipp32f*)nb_l, (Ipp32f*)nb, pa_num_ptt_long); for (b = 0; b < pa_num_ptt_long; b++) { if (nb[b] < e_b[b]) pa_next_frame_PE[ch] -= mp3enc_pa_numlines_l[header.samplingFreq][b] * log((nb[b]) / (e_b[b])); }}/****************************************************************************/void MP3Encoder::psy_short_window(float *input_data, Ipp32f *s_en, Ipp32f* rsqr_short, int ch){ VM_ALIGN16_DECL(float) sw_short[3][256]; VM_ALIGN16_DECL(Ipp32f) fft_line[2*128+2]; Ipp32f *ptr_input_data; float *r; int win_counter; ptr_input_data = (Ipp32f*)input_data; for (win_counter = 0; win_counter < 3; win_counter++) { ptr_input_data += 192; ippsMul_32f(ptr_input_data, pa_hann_window_short, (Ipp32f*)sw_short[win_counter], 2 * pa_iblen_short); } for (win_counter = 0; win_counter < 3; win_counter++) { ippsFFTFwd_RToCCS_32f(sw_short[win_counter], fft_line, pa_pFFTSpecShort, pa_pBufferShort); r = pa_r_short[ch][pa_current_f_r_index[ch]][win_counter]; ippsMagnitude_32fc((Ipp32fc *)fft_line, r, pa_iblen_short); ippsThreshold_LT_32f_I(r, pa_iblen_short, 1); ippsDotProd_32f(&r[32], &r[32], 96, &s_en[win_counter]); }}/****************************************************************************/void MP3Encoder::PsychoacousticInit(){ int i, j, ch; int size; int num_ptt, b, bb; const int num_ptt_long_tbl[3] = {63,62,59};/* const int num_ptt_short_tbl[3] = {39,38,42}; */ pa_iblen_long = 512; pa_iblen_short = 128; pa_current_f_r_index[0] = pa_current_f_r_index[1] = 2; pa_block_type[0] = pa_block_type[1] = NORM_TYPE; pa_desired_block_type[0] = pa_desired_block_type[1] = NORM_TYPE; pa_num_ptt_long = num_ptt = num_ptt_long_tbl[header.samplingFreq]; for (b = 0; b < num_ptt; b++) { float *tmp_ptr = pa_sprdngf_long + b * num_ptt; float tmp = 0; for (bb = 0; bb < num_ptt; bb++) { tmp_ptr[bb] = sprdngf(mp3enc_bval_l[header.samplingFreq][bb], mp3enc_bval_l[header.samplingFreq][b]); tmp += tmp_ptr[bb]; } pa_rnorm_long[b] = 1/tmp; } /* filling Hann windows */ for (i = 0; i < pa_iblen_long * 2; i++) pa_hann_window_long[i] = (float)(0.5f * (1 - cos(PI * (i + 0.5f) / pa_iblen_long))); for (i = 0; i < pa_iblen_short * 2; i++) pa_hann_window_short[i] = (float)(0.5f * (1 - cos(PI * (i + 0.5f) / pa_iblen_short))); pa_nb_curr_index[0] = pa_nb_curr_index[1] = 1; pa_nb_prev_index[0] = pa_nb_prev_index[1] = 0; ippsFFTInitAlloc_R_32f(&(pa_pFFTSpecLong), 10, IPP_FFT_NODIV_BY_ANY, ippAlgHintFast); ippsFFTGetBufSize_R_32f(pa_pFFTSpecLong, &size); pa_pBufferLong = ippsMalloc_8u(size); ippsFFTInitAlloc_R_32f(&(pa_pFFTSpecShort), 8, IPP_FFT_NODIV_BY_ANY, ippAlgHintFast); ippsFFTGetBufSize_R_32f(pa_pFFTSpecShort, &size); pa_pBufferShort = ippsMalloc_8u(size); for (i = 0; i < MAX_PPT_LONG; i++) { pa_nb_long[0][0][i] = pa_nb_long[0][1][i] = (float)1.0e30; pa_nb_long[1][0][i] = pa_nb_long[1][1][i] = (float)1.0e30; } for (ch = 0; ch < 2; ch++) for (i = 0; i < 512; i++) { pa_r[ch][0][i] = pa_r[ch][1][i] = pa_r[ch][2][i] = 1; pa_re[ch][0][i] = pa_re[ch][1][i] = pa_re[ch][2][i] = 1; pa_im[ch][0][i] = pa_im[ch][1][i] = pa_im[ch][2][i] = 0; } for (ch = 0; ch < 2; ch++) for (j = 0; j < 3; j++) { for (i = 0; i < 128; i++) { pa_r_short[ch][0][j][i] = pa_r_short[ch][1][j][i] = pa_r_short[ch][2][j][i] = 1; pa_re_short[ch][0][j][i] = pa_re_short[ch][1][j][i] = pa_re_short[ch][2][j][i] = 1; pa_im_short[ch][0][j][i] = pa_im_short[ch][1][j][i] = pa_im_short[ch][2][j][i] = 0; } for (i = 0; i < MAX_PPT_SHORT; i++) { pa_nb_short[ch][0][j][i] = pa_nb_short[ch][1][j][i] = (float)1.0e30; } } pa_next_frame_PE[0] = pa_next_frame_PE[1] = 0;}/****************************************************************************/void MP3Encoder::PsychoacousticFree(){ ippsFFTFree_R_32f( pa_pFFTSpecShort ); ippsFFTFree_R_32f( pa_pFFTSpecLong ); ippsFree(pa_pBufferShort); ippsFree(pa_pBufferLong);}/****************************************************************************/void MP3Encoder::Psychoacoustic(float *pa_buffer, int gr, int ch){ VM_ALIGN16_DECL(Ipp32f) rsqr_long[1024];// VM_ALIGN16_DECL(Ipp32f) rsqr_short[1024]; Ipp32f s_en[3]; Ipp32f min, max; int next_desired_block_type; pa_curr_frame_PE_st[gr][ch] = pa_curr_frame_PE[ch] = pa_next_frame_PE[ch]; psy_long_window(pa_buffer, rsqr_long, ch); psy_short_window(pa_buffer, s_en, NULL, ch); ippsMinMax_32f(s_en, 3, &min, &max); /* part 1 */ if (pa_next_frame_PE[ch] > 2900) { next_desired_block_type = SHORT_TYPE; } else if (max > 20 * min) { next_desired_block_type = SHORT_TYPE; } else if ((max > 10 * min) && (pa_next_frame_PE[ch] > 1500)) { next_desired_block_type = SHORT_TYPE; } else { next_desired_block_type = NORM_TYPE; } /* part 2 */ if (next_desired_block_type == NORM_TYPE && pa_desired_block_type[ch] == START_TYPE) VM_ASSERT(0); if (next_desired_block_type == NORM_TYPE) { if (pa_desired_block_type[ch] == SHORT_TYPE) next_desired_block_type = STOP_TYPE; } else { if (pa_desired_block_type[ch] == NORM_TYPE ) pa_desired_block_type[ch] = START_TYPE; if ( pa_desired_block_type[ch] == STOP_TYPE ) { pa_desired_block_type[ch] = SHORT_TYPE; } } pa_block_type[ch] = pa_desired_block_type[ch]; pa_desired_block_type[ch] = next_desired_block_type; pa_current_f_r_index[ch]++; if (pa_current_f_r_index[ch] >= 3) pa_current_f_r_index[ch] = 0; pa_nb_curr_index[ch] ^= 1; pa_nb_prev_index[ch] ^= 1; si_blockType[gr][ch] = pa_block_type[ch]; if (si_blockType[gr][ch] == NORM_TYPE) si_winSwitch[gr][ch] = 0; else si_winSwitch[gr][ch] = 1; si_mixedBlock[gr][ch] = 0;}/****************************************************************************/};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -