Example of Using the Filter Functions

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.

Usihg of Analysis and SynthesisDown Filters

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;
}

Submit feedback on this help topic

Copyright © 2000 - 2010, Intel Corporation. All rights reserved.