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

📄 aac_filterbank_fp.c

📁 audio-video-codecs.rar语音编解码器
💻 C
📖 第 1 页 / 共 2 页
字号:
    break;
  case LONG_STOP_SEQUENCE:
    ippsMDCTInv_32f(p_in_spectrum, samples, p_data->p_mdct_inv_long,
                    p_data->p_buffer_inv);

    ippsZero_32f(p_out_samples_1st_part, (N_LONG-N_SHORT)/4);

    ippsMul_32f(prev_window_table_short, &samples[(N_LONG-N_SHORT)/4],
                &p_out_samples_1st_part[(N_LONG-N_SHORT)/4], N_SHORT/2);

    ippsCopy_32f(&samples[(N_LONG+N_SHORT)/4],
                  &p_out_samples_1st_part[(N_LONG + N_SHORT)/4],
                  ((N_LONG/2)-((N_LONG+N_SHORT)/4)));

    ippsAdd_32f_I(p_in_prev_samples, p_out_samples_1st_part, N_LONG/2);

    ippsMul_32f(&window_table_long[N_LONG/2],
                &samples[N_LONG/2], p_out_samples_2nd_part, N_LONG/2);
    break;
  case EIGHT_SHORT_SEQUENCE:
    p_samples = samples;
    p_spectrum = p_in_spectrum;

    ippsZero_32f(p_samples, N_LONG);
    p_samples += (N_LONG - N_SHORT) / 4;
    ippsMDCTInv_32f(p_spectrum, (Ipp32f*)mdct_out_short,
                    p_data->p_mdct_inv_short, p_data->p_buffer_inv);

    ippsMul_32f(prev_window_table_short, mdct_out_short, p_samples, N_SHORT/2);
    ippsMul_32f(&window_table_short[N_SHORT/2], &mdct_out_short[N_SHORT/2],
                &p_samples[N_SHORT/2],N_SHORT/2);

    p_samples  += N_SHORT/2;
    p_spectrum += N_SHORT/2;

    for (j = 1; j < 8; j++) {
      ippsMDCTInv_32f(p_spectrum, (Ipp32f*)mdct_out_short,
                      p_data->p_mdct_inv_short, p_data->p_buffer_inv);
      ippsMul_32f_I(window_table_short,(Ipp32f*)mdct_out_short, N_SHORT);
      ippsAdd_32f_I((Ipp32f*)mdct_out_short, p_samples, N_SHORT);
      p_samples  += N_SHORT/2;
      p_spectrum += N_SHORT/2;
    }

    ippsAdd_32f(p_in_prev_samples, samples,
                p_out_samples_1st_part, N_LONG/2);
    ippsCopy_32f(&samples[N_LONG/2], p_out_samples_2nd_part, N_LONG/2);
    break;
  }
}

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

void FilterbankDecSSR(sFilterbank* p_data,
                      Ipp32f* p_in_spectrum,
                      Ipp32s  window_sequence,
                      Ipp32s  window_shape,
                      Ipp32s  prev_window_shape,
                      Ipp32f* p_out_samples)
{
  Ipp32f* p_in;
  Ipp32f* p_out;
  Ipp32f *window_table_long, *prev_window_table_long;
  Ipp32f *window_table_short, *prev_window_table_short;
  Ipp32s j;

  if (0 == window_shape) {
    window_table_long  = p_data->sin_long_wnd_table;
    window_table_short = p_data->sin_short_wnd_table;
  } else {
    window_table_long  = p_data->KBD_long_wnd_table;
    window_table_short = p_data->KBD_short_wnd_table;
  }

  if (0 == prev_window_shape) {
    prev_window_table_long  = p_data->sin_long_wnd_table;
    prev_window_table_short = p_data->sin_short_wnd_table;
  } else {
    prev_window_table_long  = p_data->KBD_long_wnd_table;
    prev_window_table_short = p_data->KBD_short_wnd_table;
  }

  switch(window_sequence)
  {
  case ONLY_LONG_SEQUENCE:
    ippsMDCTInv_32f(p_in_spectrum, p_out_samples,
                    p_data->p_mdct_inv_long, p_data->p_buffer_inv);

    ippsMul_32f_I(prev_window_table_long, p_out_samples, N_LONG/8);

    ippsMul_32f_I(&window_table_long[N_LONG/8],
                  &p_out_samples[N_LONG/8], N_LONG/8);
    break;
  case LONG_START_SEQUENCE:
    ippsMDCTInv_32f(p_in_spectrum, p_out_samples,
                    p_data->p_mdct_inv_long, p_data->p_buffer_inv);

    ippsMul_32f_I(prev_window_table_long, p_out_samples, N_LONG/8);

    ippsMul_32f_I(&window_table_short[N_SHORT/8],
                  &p_out_samples[(3*N_LONG-N_SHORT)/16], N_SHORT/8);

    ippsZero_32f(&p_out_samples[(3*N_LONG+N_SHORT)/16],
                 (N_LONG-N_SHORT)/16);
    break;
  case LONG_STOP_SEQUENCE:
    ippsMDCTInv_32f(p_in_spectrum, p_out_samples,
                    p_data->p_mdct_inv_long, p_data->p_buffer_inv);

    ippsZero_32f(p_out_samples, (N_LONG-N_SHORT)/16);

    ippsMul_32f_I(prev_window_table_short,
                  &p_out_samples[(N_LONG-N_SHORT)/16], N_SHORT/8);

    ippsMul_32f_I(&window_table_long[N_LONG/8],
                  &p_out_samples[N_LONG/8], N_LONG/8);
    break;
  case EIGHT_SHORT_SEQUENCE:
    p_in = p_in_spectrum;
    p_out = p_out_samples;

    ippsMDCTInv_32f(p_in, p_out, p_data->p_mdct_inv_short,
                    p_data->p_buffer_inv);

    ippsMul_32f_I(prev_window_table_short, p_out, N_SHORT/8);

    ippsMul_32f_I(&window_table_short[N_SHORT/8],
                  &p_out[N_SHORT/8], N_SHORT/8);

    p_in += N_SHORT/8;
    p_out += N_SHORT/4;

    for (j = 1; j < 8; j++) {
      ippsMDCTInv_32f(p_in, p_out, p_data->p_mdct_inv_short,
                      p_data->p_buffer_inv);

      ippsMul_32f_I(window_table_short, p_out, N_SHORT/4);

      p_in += N_SHORT/8;
      p_out += N_SHORT/4;
    }
    break;
  }
}

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

void FilterbankEnc(sFilterbank* p_data,
                   Ipp32f* p_in_samples_1st_part,
                   Ipp32f* p_in_samples_2nd_part,
                   Ipp32s  window_sequence,
                   Ipp32s  window_shape,
                   Ipp32s  prev_window_shape,
                   Ipp32f* p_out_spectrum,
                   Ipp32s ltp)
{
  Ipp32f mdct_in[N_LONG];
  Ipp32f *window_table_long, *prev_window_table_long;
  Ipp32f *window_table_short, *prev_window_table_short;
  Ipp32s i;

  if (0 == window_shape) {
    window_table_long  = p_data->sin_long_wnd_table;
    window_table_short = p_data->sin_short_wnd_table;
  } else {
      window_table_long  = p_data->KBD_long_wnd_table;
      window_table_short = p_data->KBD_short_wnd_table;
  }

  if (0 == prev_window_shape) {
      prev_window_table_long  = p_data->sin_long_wnd_table;
      prev_window_table_short = p_data->sin_short_wnd_table;
  } else {
      prev_window_table_long  = p_data->KBD_long_wnd_table;
      prev_window_table_short = p_data->KBD_short_wnd_table;
  }

  switch(window_sequence)
  {
  case ONLY_LONG_SEQUENCE:
    ippsMul_32f(p_in_samples_1st_part, prev_window_table_long,
                mdct_in, N_LONG/2);

    ippsMul_32f(p_in_samples_2nd_part,
                &window_table_long[N_LONG/2],
                &mdct_in[N_LONG/2], N_LONG/2);

    ippsMDCTFwd_32f(mdct_in, p_out_spectrum, p_data->p_mdct_fwd_long,
                    p_data->p_buffer_fwd);
    break;
  case LONG_START_SEQUENCE:
    ippsMul_32f(p_in_samples_1st_part, prev_window_table_long,
                mdct_in, N_LONG/2);

    ippsCopy_32f(p_in_samples_2nd_part, &mdct_in[1024], 1472-1024);

    ippsMul_32f(&p_in_samples_2nd_part[1472-1024],
                &window_table_short[N_SHORT/2],
                &mdct_in[1472], 1600-1472);

    ippsZero_32f(&mdct_in[1600], (2048-1600));

    ippsMDCTFwd_32f(mdct_in, p_out_spectrum,p_data->p_mdct_fwd_long,
                    p_data->p_buffer_fwd);
    break;
  case LONG_STOP_SEQUENCE:
    ippsZero_32f(mdct_in, 448);

    ippsMul_32f(&p_in_samples_1st_part[448], prev_window_table_short,
                &mdct_in[448], 576-448);

    ippsCopy_32f(&p_in_samples_1st_part[576], &mdct_in[576], 1024-576);

    ippsMul_32f(p_in_samples_2nd_part,
                &window_table_long[N_LONG/2],
                &mdct_in[N_LONG/2], N_LONG/2);

    ippsMDCTFwd_32f(mdct_in, p_out_spectrum, p_data->p_mdct_fwd_long,
                    p_data->p_buffer_fwd);
    break;
  case EIGHT_SHORT_SEQUENCE:
    if (ltp) {
      ippsMul_32f(&p_in_samples_1st_part[0],
                    prev_window_table_short, &mdct_in[0], N_SHORT/2);
      ippsMul_32f(&p_in_samples_1st_part[128],
                  &window_table_short[N_SHORT/2], &mdct_in[N_SHORT/2], N_SHORT/2);

      ippsMDCTFwd_32f(mdct_in,
                      p_out_spectrum,
                      p_data->p_mdct_fwd_short,
                      p_data->p_buffer_fwd);
    } else {
      /// W0
      ippsMul_32f(&p_in_samples_1st_part[448],
                  prev_window_table_short, &mdct_in[0], N_SHORT/2);
      ippsMul_32f(&p_in_samples_1st_part[448+128],
                  &window_table_short[N_SHORT/2], &mdct_in[N_SHORT/2], N_SHORT/2);
      /// W1
      ippsMul_32f(&p_in_samples_1st_part[576],
                  window_table_short, &mdct_in[N_SHORT], N_SHORT);
      /// W2
      ippsMul_32f(&p_in_samples_1st_part[704],
                  window_table_short, &mdct_in[2*N_SHORT], N_SHORT);
      /// W3
      ippsMul_32f(&p_in_samples_1st_part[832],
                  window_table_short, &mdct_in[3*N_SHORT], (3*N_SHORT)/4);
      ippsMul_32f(p_in_samples_2nd_part,
                  &window_table_short[192], &mdct_in[3*N_SHORT+192], N_SHORT/4);

      /// W4
      ippsMul_32f(&p_in_samples_1st_part[960],
                  window_table_short, &mdct_in[4*N_SHORT], N_SHORT/4);
      ippsMul_32f(p_in_samples_2nd_part,
                  &window_table_short[64], &mdct_in[4*N_SHORT+64], (3*N_SHORT)/4);

      /// W5
      ippsMul_32f(&p_in_samples_2nd_part[64],
                  window_table_short, &mdct_in[5*N_SHORT], N_SHORT);
      /// W6
      ippsMul_32f(&p_in_samples_2nd_part[64+1*128],
                  window_table_short, &mdct_in[6*N_SHORT], N_SHORT);
      /// W7
      ippsMul_32f(&p_in_samples_2nd_part[64+2*128],
                  window_table_short, &mdct_in[7*N_SHORT], N_SHORT);

      for (i = 0; i < 8; i ++) {
        ippsMDCTFwd_32f(&mdct_in[N_SHORT*i],
                        p_out_spectrum+i*(N_SHORT/2),
                        p_data->p_mdct_fwd_short,
                        p_data->p_buffer_fwd);
      }
    }

    break;
  default:
    break;
  }
}

⌨️ 快捷键说明

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