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

📄 sbr_enc_qmf_fp.c

📁 audio-video-codecs.rar语音编解码器
💻 C
📖 第 1 页 / 共 2 页
字号:
SBR_TAB2_QMF_ENC_FP[] = {
  0.99998117528260111000f, -0.00613588464915447530f, 0.99952941750109314000f, -0.03067480317663662600f,
    0.99847558057329477000f, -0.05519524434968993400f, 0.99682029929116567000f, -0.07968243797143012600f,
    0.99456457073425542000f, -0.10412163387205459000f, 0.99170975366909953000f, -0.12849811079379317000f,
    0.98825756773074946000f, -0.15279718525844344000f, 0.98421009238692903000f, -0.17700422041214875000f,
    0.97956976568544052000f, -0.20110463484209190000f, 0.97433938278557586000f, -0.22508391135979283000f,
    0.96852209427441738000f, -0.24892760574572015000f, 0.96212140426904158000f, -0.27262135544994898000f,
    0.95514116830577078000f, -0.29615088824362379000f, 0.94758559101774109000f, -0.31950203081601569000f,
    0.93945922360218992000f, -0.34266071731199438000f, 0.93076696107898371000f, -0.36561299780477385000f,
    0.92151403934204201000f, -0.38834504669882625000f, 0.91170603200542988000f, -0.41084317105790391000f,
    0.90134884704602203000f, -0.43309381885315196000f, 0.89044872324475788000f, -0.45508358712634384000f,
    0.87901222642863353000f, -0.47679923006332209000f, 0.86704624551569265000f, -0.49822766697278187000f,
    0.85455798836540053000f, -0.51935599016558964000f, 0.84155497743689844000f, -0.54017147272989285000f,
    0.82804504525775580000f, -0.56066157619733603000f, 0.81403632970594841000f, -0.58081395809576453000f,
    0.79953726910790501000f, -0.60061647938386897000f, 0.78455659715557524000f, -0.62005721176328910000f,
    0.76910333764557970000f, -0.63912444486377573000f, 0.75318679904361252000f, -0.65780669329707864000f,
    0.73681656887736990000f, -0.67609270357531592000f, 0.72000250796138165000f, -0.69397146088965400000f,
    0.70275474445722530000f, -0.71143219574521643000f, 0.68508366777270036000f, -0.72846439044822520000f,
    0.66699992230363747000f, -0.74505778544146595000f, 0.64851440102211255000f, -0.76120238548426178000f,
    0.62963823891492710000f, -0.77688846567323244000f, 0.61038280627630948000f, -0.79210657730021239000f,
    0.59075970185887428000f, -0.80684755354379922000f, 0.57078074588696737000f, -0.82110251499110465000f,
    0.55045797293660481000f, -0.83486287498638001000f, 0.52980362468629483000f, -0.84812034480329712000f,
    0.50883014254310699000f, -0.86086693863776731000f, 0.48755016014843605000f, -0.87309497841829009000f,
    0.46597649576796613000f, -0.88479709843093779000f, 0.44412214457042926000f, -0.89596624975618511000f,
    0.42200027079979979000f, -0.90659570451491533000f, 0.39962419984564679000f, -0.91667905992104270000f,
    0.37700741021641831000f, -0.92621024213831127000f, 0.35416352542049051000f, -0.93518350993894750000f,
    0.33110630575987643000f, -0.94359345816196039000f, 0.30784964004153498000f, -0.95143502096900834000f,
    0.28440753721127182000f, -0.95870347489587160000f, 0.26079411791527557000f, -0.96539444169768940000f,
    0.23702360599436734000f, -0.97150389098625178000f, 0.21311031991609136000f, -0.97702814265775439000f,
    0.18906866414980628000f, -0.98196386910955524000f, 0.16491312048997009000f, -0.98630809724459867000f,
    0.14065823933284924000f, -0.99005821026229712000f, 0.11631863091190488000f, -0.99321194923479450000f,
    0.09190895649713269600f, -0.99576741446765982000f, 0.06744391956366410600f, -0.99772306664419164000f,
    0.04293825693494095900f, -0.99907772775264536000f, 0.01840672990580482000f, -0.99983058179582340000f
};

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

AACStatus ownAnalysisFilterInitAlloc_SBREnc_RToC_32f32fc(ownFilterSpec_SBR_C_32fc* pQMFSpec,
                                                         Ipp32s *sizeAll)
{
  IppStatus status = ippStsNoErr;
  Ipp32s flag  = IPP_FFT_NODIV_BY_ANY;
  Ipp32s order = 6; //64 point
  IppHintAlgorithm hint = ippAlgHintAccurate;
  Ipp32s sizeSpec, sizeInit, sizeWork, sizeQMFSpec;
  Ipp8u* pBufInit = NULL;

  status = ippsFFTGetSize_C_32fc(order, flag, hint,
                                 &sizeSpec, &sizeInit, &sizeWork);

  if (ippStsNoErr != status){
    return AAC_ALLOC;
  }

  sizeQMFSpec = sizeof( ownFilterSpec_SBR_C_32fc );

  *sizeAll = sizeSpec + sizeWork + sizeQMFSpec + sizeInit;

  if (pQMFSpec) {
    pQMFSpec->pMemSpec = ((Ipp8u*)pQMFSpec + sizeQMFSpec);
    pQMFSpec->pWorkBuf = ((Ipp8u*)pQMFSpec->pMemSpec + sizeQMFSpec + sizeSpec);
    pBufInit = (Ipp8u*)pQMFSpec->pWorkBuf + sizeQMFSpec;

    status = ippsFFTInit_C_32fc( &(pQMFSpec->pFFTSpec), order, flag, hint, pQMFSpec->pMemSpec, pBufInit);
    if (ippStsNoErr != status){
      return AAC_ALLOC;
    }
  }
  return AAC_OK;
}

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

static void ownsWindowing_SBREnc_fp(Ipp32f* pSrc, Ipp32f* pDst, Ipp32f* pTabWin)
{
  Ipp32s n, j;
  Ipp32f sum;

  for(n=0; n<128; n++){
    sum = 0.0f;
    for(j=0; j<5; j++){
      sum += pSrc[639 - n - j*128] * pTabWin[n+j*128];
    }

    pDst[n] = sum;
  }

  return;
}

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

static Ipp32s ref_ownsAnalysisFilter_SBREnc_FT_fp(Ipp32f* pSrc, Ipp32fc* pDst)
{
  Ipp32s n = 0, k = 0;
  Ipp64f sumRe = 0.0, sumIm = 0.0;
  Ipp64f arg = 0.0;

  for(k = 0; k < 64; k++)
  {
    sumRe = sumIm = 0.f;
    for(n = 0; n < 128; n++)
    {
      arg = (k + 0.5) * (2*n +1.0 ) * M_PI / (128.0);
      sumRe += pSrc[n] * cos(arg);
      sumIm += pSrc[n] * sin(arg);
    }

    pDst[k].re = (Ipp32f)sumRe;
    pDst[k].im = (Ipp32f)sumIm;
  }

  return 0;
}

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

static Ipp32s ippsDCT4_32f(Ipp32f* pSrc, Ipp32f* pDst, Ipp32s len)
{
  Ipp32s j = 0, k = 0;
  Ipp64f sum = 0.f;
  Ipp64f arg = 0.f;

  for(k = 0; k < len; k++)
  {
    sum = 0.0;
    for(j = 0; j < len; j++)
    {
      arg = (2*j + 1) * (2*k + 1) * M_PI / (4*len);
      sum += pSrc[j] * cos(arg);
    }

    pDst[k] = (Ipp32f)sum;
  }

  return 0;//OK
}

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

static Ipp32s ownsPreProc_AQMF_DCT4_fp(Ipp32f* pSrc, Ipp32f* pDst)
{
  Ipp32s i;

  pDst[0] = pSrc[0];
  pDst[1] = pSrc[1];

  for(i=1; i<63; i++){
    pDst[2*i]   = -pSrc[128-i];
    pDst[2*i+1] = pSrc[i+1];
  }

  pDst[127] = pSrc[64];
  pDst[126] = -pSrc[65];

  return 0;
}

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

static Ipp32s ownsPostProc_AQMF_DCT4_fp(Ipp32f* pSrc, Ipp32fc* pDst)
{
  Ipp32s i;
  Ipp64f a, b, c, s;

  for(i = 0; i < 64; i++)
  {
    a = pDst[i].re = pSrc[i];
    b = pDst[i].im = -pSrc[127 - i];

    /* auxiliary */
    c = SBR_TAB4_QMF_ENC_FP[2*i];
    s = SBR_TAB4_QMF_ENC_FP[2*i+1];

    pDst[i].re = (Ipp32f)(a*c - b*s);
    pDst[i].im = (Ipp32f)(b*c + a*s);

  }

  return 0;
}

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

static Ipp32s ownsPreProc_DCT4_FFT_fp(Ipp32f* pSrc, Ipp32fc* pDst, Ipp32s len)
{
  Ipp32s j;
  Ipp64f a, b, c, s;

  for(j=0; j < len/2; j++)
  {
    c = SBR_TAB2_QMF_ENC_FP[2*j]; //cos(arg);
    s = SBR_TAB2_QMF_ENC_FP[2*j+1]; //sin(arg);

    a = pSrc[2*j];
    b = pSrc[len - 1 - 2*j];

    pDst[j].re = (Ipp32f)(a*c - b*s);
    pDst[j].im = (Ipp32f)(a*s + b*c);
  }

  return 0;
}

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

static Ipp32s ownsPostProc_DCT4_FFT_fp(Ipp32fc* pSrc, Ipp32f* pDst, Ipp32s len)
{
  Ipp32s u;
  Ipp64f a, b, c, s;

  for(u=0; u<len/2; u++) {
    c = SBR_TAB3_QMF_ENC_FP[2*u];
    s = SBR_TAB3_QMF_ENC_FP[2*u+1];

    a = pSrc[ u ].re;
    b = pSrc[ u ].im;

    pDst[2*u] = (Ipp32f)(a*c - b*s);
    pDst[len - 1 - 2*u] = - (Ipp32f)(a*s + b*c);
  }

  return 0;
}

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

static Ipp32s ownsDCT4_FFT_fp(Ipp32f* pSrc, Ipp32f* pDst, Ipp32s len, const IppsFFTSpec_C_32fc* pFFTSpec, Ipp8u* pBuffer)
{

  __ALIGN  Ipp32fc bufPre[64];

  __ALIGN  Ipp32fc bufFFT[64];

  ownsPreProc_DCT4_FFT_fp(pSrc, bufPre, len);

  ippsFFTFwd_CToC_32fc( (const Ipp32fc*)bufPre, bufFFT, pFFTSpec, pBuffer);

  ownsPostProc_DCT4_FFT_fp(bufFFT, pDst, len);

  return 0;
}

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

Ipp32s ownsAnalysisFilter_SBREnc_FT_fp(Ipp32f* pSrc, Ipp32fc* pDst, const IppsFFTSpec_C_32fc* pFFTSpec, Ipp8u* pBuffer)
{
  __ALIGN Ipp32f inDCT4_128_32f[128];
  __ALIGN Ipp32f outDCT4_128_32f[128];

   /* opt AQMF */
  ownsPreProc_AQMF_DCT4_fp(pSrc, inDCT4_128_32f);
  ownsDCT4_FFT_fp(inDCT4_128_32f, outDCT4_128_32f, 128, pFFTSpec, pBuffer);
  ownsPostProc_AQMF_DCT4_fp(outDCT4_128_32f, pDst);

  return 0;
}

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

AACStatus ownAnalysisFilter_SBREnc_RToC_32f32fc(Ipp32f* pSrc, Ipp32fc* pDst, ownFilterSpec_SBR_C_32fc* pSpec)
{
  __ALIGN Ipp32f  bufU[1024];

  ownsWindowing_SBREnc_fp(pSrc, bufU, (Ipp32f*)SBR_TAB_QMF_WINDOW_640_FP);

  ownsAnalysisFilter_SBREnc_FT_fp(bufU, pDst, pSpec->pFFTSpec, pSpec->pWorkBuf);
  //ref_ownsAnalysisFilter_SBREnc_FT_fp(bufU, pDst);

  return AAC_OK;
}

⌨️ 快捷键说明

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