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

📄 aac_filterbank_fp.c

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 C
字号:
/*////                  INTEL CORPORATION PROPRIETARY INFORMATION//     This software is supplied under the terms of a license agreement or//     nondisclosure agreement with Intel Corporation and may not be copied//     or disclosed except in accordance with the terms of that agreement.//          Copyright(c) 2003-2005 Intel Corporation. All Rights Reserved.////     Intel(R) Integrated Performance Primitives AAC Decode Sample for Windows*////  By downloading and installing this sample, you hereby agree that the//  accompanying Materials are being provided to you under the terms and//  conditions of the End User License Agreement for the Intel(R) Integrated//  Performance Primitives product previously accepted by you. Please refer//  to the file ipplic.htm located in the root directory of your Intel(R) IPP//  product installation for more information.////  MPEG-4 and AAC are international standards promoted by ISO, IEC, ITU, ETSI//    and other organizations. Implementations of these standards, or the standard//    enabled platforms may require licenses from various entities, including//  Intel Corporation.//*//********************************************************************/#include <stdlib.h>#include <math.h>#include "aac_filterbank_fp.h"#include "aac_wnd_tables_fp.h"/********************************************************************/AACStatus InitFilterbank(sFilterbank* pBlock,                         int mode){  int i;  int j;  int size, size_short, size_long;  ippsZero_8u((Ipp8u*)pBlock, sizeof(sFilterbank));  if (pBlock == NULL)    return AAC_ALLOC;  size = 0;  if (mode & FB_DECODER) {    if (ippsMDCTInvInitAlloc_32f(&pBlock->p_mdct_inv_long, N_LONG) != ippStsOk)      return AAC_ALLOC;    if (ippsMDCTInvInitAlloc_32f(&pBlock->p_mdct_inv_short, N_SHORT) != ippStsOk)      return AAC_ALLOC;    if (ippsMDCTInvGetBufSize_32f(pBlock->p_mdct_inv_long, &size) != ippStsOk)      return AAC_ALLOC;    if (ippsMDCTInvGetBufSize_32f(pBlock->p_mdct_inv_short, &size_short) != ippStsOk)      return AAC_ALLOC;    if (size < size_short) size = size_short;  }  if (mode & FB_ENCODER) {    if (ippsMDCTFwdInitAlloc_32f(&pBlock->p_mdct_fwd_long, N_LONG) != ippStsOk)      return AAC_ALLOC;    if (ippsMDCTFwdInitAlloc_32f(&pBlock->p_mdct_fwd_short, N_SHORT) != ippStsOk)      return AAC_ALLOC;    if (ippsMDCTFwdGetBufSize_32f(pBlock->p_mdct_fwd_long, &size_long) != ippStsOk)      return AAC_ALLOC;    if (ippsMDCTFwdGetBufSize_32f(pBlock->p_mdct_fwd_short, &size_short) != ippStsOk)      return AAC_ALLOC;    if (size < size_long) size = size_long;    if (size < size_short) size = size_short;  }  if (size != 0) {    pBlock->p_buffer_inv = ippsMalloc_8u(size);    pBlock->p_buffer_fwd = pBlock->p_buffer_inv;  }  for (i = 0; i < N_SHORT; i++) {    pBlock->sin_short_wnd_table[i] =        (float)sin(PI/(2.0f * N_SHORT/2) * (i + 0.5));  }  for (i = 0; i < N_LONG; i++) {    pBlock->sin_long_wnd_table[i] =        (float)sin(PI/(2.0f * N_LONG/2) * (i + 0.5));  }  for (i = 0, j = (N_SHORT)-1; i < N_SHORT /2; i++, j--) {    pBlock->KBD_short_wnd_table[j] =        pBlock->KBD_short_wnd_table[i] = KBD_short[i];  }  for (i = 0, j = (N_LONG)-1; i < N_LONG/2; i++, j--) {    pBlock->KBD_long_wnd_table[j] =        pBlock->KBD_long_wnd_table[i] = KBD_long[i];  }  return AAC_OK;}/********************************************************************/void FreeFilterbank(sFilterbank* pBlock){  if (pBlock->p_mdct_inv_long)      ippsMDCTInvFree_32f(pBlock->p_mdct_inv_long);  if (pBlock->p_mdct_inv_short)      ippsMDCTInvFree_32f(pBlock->p_mdct_inv_short);  if (pBlock->p_mdct_fwd_long)      ippsMDCTFwdFree_32f(pBlock->p_mdct_fwd_long);  if (pBlock->p_mdct_fwd_short)      ippsMDCTFwdFree_32f(pBlock->p_mdct_fwd_short);  if (pBlock->p_buffer_inv)    ippsFree(pBlock->p_buffer_inv);}/********************************************************************/void FilterbankDec(sFilterbank* p_data,                   float* p_in_spectrum,                   float* p_in_prev_samples,                   int window_sequence,                   int window_shape,                   int prev_window_shape,                   float* p_out_samples_1st_part,                   float* p_out_samples_2nd_part){  Ipp32f samples[N_LONG];  Ipp32f* p_samples;  Ipp32f* p_spectrum;  Ipp32f *window_table_long, *prev_window_table_long;  Ipp32f *window_table_short, *prev_window_table_short;  Ipp32f mdct_out_short[N_SHORT];  int 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, samples, p_data->p_mdct_inv_long,                    p_data->p_buffer_inv);    ippsMul_32f(prev_window_table_long, samples,                p_out_samples_1st_part, N_LONG/2);    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 LONG_START_SEQUENCE:    ippsMDCTInv_32f(p_in_spectrum, samples, p_data->p_mdct_inv_long,                    p_data->p_buffer_inv);    ippsMul_32f(prev_window_table_long, samples,                p_out_samples_1st_part, N_LONG/2);    ippsAdd_32f_I(p_in_prev_samples, p_out_samples_1st_part, N_LONG/2);    ippsCopy_32f(&samples[N_LONG / 2], p_out_samples_2nd_part,                ((3*N_LONG-N_SHORT)/4-N_LONG/2));    ippsMul_32f(&window_table_short[N_SHORT / 2],                &samples[(3*N_LONG-N_SHORT)/4],                &p_out_samples_2nd_part[((3*N_LONG-N_SHORT)/4-N_LONG/2)],                N_SHORT/2);    ippsZero_32f(&p_out_samples_2nd_part[(3*N_LONG+N_SHORT)/4-N_LONG/2],                  N_LONG-(3*N_LONG+N_SHORT)/4);    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 FilterbankEnc(sFilterbank* p_data,                   float* p_in_samples_1st_part,                   float* p_in_samples_2nd_part,                   int window_sequence,                   int window_shape,                   int prev_window_shape,                   float* p_out_spectrum,                   int ltp){  float   mdct_in[N_LONG];  Ipp32f  *window_table_long, *prev_window_table_long;  Ipp32f  *window_table_short, *prev_window_table_short;  int     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 + -