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

📄 mp3enc_psychoacoustic_fp.cpp

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
  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 + -