📄 sbr_enc_qmf_fp.c
字号:
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 + -