Before calling ippsAnalysis/Synthesis/SynthesisDown, initialize the filter specification structure by calling corresponding functions.
The following code example demonstrates how ippsAnalysisFilter and ippsSynthesisDownFilter can be used. This example illustrates the typical filter usage and is applicable to all QMF functions.
int filter_SBR_sample( void )
{
IppStatus status = ippStsNoErr;
int sizeSpec[2], sizeWorkBuf[2], sizeInitBuf[2];
/************************************************************************/
/* [0] - index for analysisFilter, [1] - index for synthesisDownFilter */
/************************************************************************/
IppsFilterSpec_SBR_R_32f* pFilterSpec[2];
Ipp8u* pMemSpec;
Ipp8u* pInitBuf;
Ipp8u* pWorkBuf;
Ipp32f bufSrc[1024];
Ipp32f bufDst[1024];
Ipp32f bufMem[2*1024];
Ipp32f* pSbr[32];
Ipp32f* pWinTab = SBR_TABLE_QMF_WINDOW_320;
/************************************************************************/
/* pWinTab[i] = c[2*i], */
/* where coefficients c[i] are coefficients of the QMF bank window */
/* from [ISO14496]. */
/************************************************************************/
int delay = 289; // delay of signal after analysis and synthesis
int i;
int nBand = 32;// numLoop
int offset = 0;
int kx = 32; // wo SBR range
/* init process */
ippsZero_32f(bufSrc, 1024);
ippsZero_32f(bufDst, 1024);
ippsZero_32f(bufMem, 2*1024);
status = ippsAnalysisFilterGetSize_SBR_RToR_32f(&sizeSpec[0],
&sizeInitBuf[0], &sizeWorkBuf[0]);
status = ippsSynthesisDownFilterGetSize_SBR_RToR_32f(&sizeSpec[1],
&sizeInitBuf[1], &sizeWorkBuf[1]);
sizeInitBuf[0] = MAX(sizeInitBuf[0], sizeInitBuf[1]);
sizeWorkBuf[0] = MAX(sizeWorkBuf[0], sizeWorkBuf[1]);
sizeWorkBuf[0] = MAX(sizeWorkBuf[0], 10);
pMemSpec = ippsMalloc_8u(sizeSpec[0] + sizeSpec[1]);
pWorkBuf = ippsMalloc_8u(sizeWorkBuf[0]);
pInitBuf = ippsMalloc_8u(sizeInitBuf[0]);
status = ippsAnalysisFilterInit_SBR_RToR_32f(&pFilterSpec[0], pMemSpec,
pInitBuf);
status = ippsSynthesisDownFilterInit_SBR_RToR_32f(&pFilterSpec[1], pMemSpec
+ sizeSpec[0], pInitBuf);
/* generation data */
srand( 0 );
for(i=0; i<1024; i++) bufSrc[i] = rand() / 1000.f;
for(i=0; i<32; i++) pSbr[i] = bufMem + 64*i;
/* main process */
status = ippsAnalysisFilter_SBR_RToR_32f_D2L(bufSrc, pSbr, pWinTab, nBand,
offset, kx, pFilterSpec[0], pWorkBuf);
status = ippsSynthesisDownFilter_SBR_RToR_32f_D2L(pSbr, bufDst, pWinTab,
nBand, pFilterSpec[1], pWorkBuf);
for(i=0; i<734; i++){
printf("orig = %15.10f, dst = %15.10f, diff = %15.10f\n", bufSrc[i],
bufDst[delay+i], bufSrc[i] - bufDst[delay+i] );
}
/* free memory */
ippsFree(pMemSpec);
ippsFree(pWorkBuf);
ippsFree(pInitBuf);
return 0;
}
Copyright © 2000 - 2010, Intel Corporation. All rights reserved.