private static void sbrQmfSynthesis(FFT mdct,float out[],float X[][][],float mdctBuf[],float v0[],int vOff[],final int div){
  final float sbrQmfWindow[]=div != 0 ? sbr_qmf_window_ds : sbr_qmf_window_us;
  final int step=128 >> div;
  int v;
  int outOffset=0;
  for (int i=0; i < 32; i++) {
    if (vOff[0] < step) {
      int saved_samples=(1280 - 128) >> div;
      System.arraycopy(v0,0,v0,SBR_SYNTHESIS_BUF_SIZE - saved_samples,saved_samples);
      vOff[0]=SBR_SYNTHESIS_BUF_SIZE - saved_samples - step;
    }
 else {
      vOff[0]-=step;
    }
    v=vOff[0];
    if (div != 0) {
      for (int n=0; n < 32; n++) {
        X[0][i][n]=-X[0][i][n];
        X[0][i][32 + n]=X[1][i][31 - n];
      }
      mdct.imdctHalf(mdctBuf,0,X[0][i],0);
      SBRDSP.qmfDeintNeg(v0,v,mdctBuf,0);
    }
 else {
      SBRDSP.negOdd64(X[1][i],0);
      mdct.imdctHalf(mdctBuf,0,X[0][i],0);
      mdct.imdctHalf(mdctBuf,64,X[1][i],0);
      SBRDSP.qmfDeintBfly(v0,v,mdctBuf,64,mdctBuf,0);
    }
    FloatDSP.vectorFmul(out,outOffset,v0,v,sbrQmfWindow,(0),64 >> div);
    FloatDSP.vectorFmulAdd(out,outOffset,v0,v + (192 >> div),sbrQmfWindow,(64 >> div),out,outOffset,64 >> div);
    FloatDSP.vectorFmulAdd(out,outOffset,v0,v + (256 >> div),sbrQmfWindow,(128 >> div),out,outOffset,64 >> div);
    FloatDSP.vectorFmulAdd(out,outOffset,v0,v + (448 >> div),sbrQmfWindow,(192 >> div),out,outOffset,64 >> div);
    FloatDSP.vectorFmulAdd(out,outOffset,v0,v + (512 >> div),sbrQmfWindow,(256 >> div),out,outOffset,64 >> div);
    FloatDSP.vectorFmulAdd(out,outOffset,v0,v + (704 >> div),sbrQmfWindow,(320 >> div),out,outOffset,64 >> div);
    FloatDSP.vectorFmulAdd(out,outOffset,v0,v + (768 >> div),sbrQmfWindow,(384 >> div),out,outOffset,64 >> div);
    FloatDSP.vectorFmulAdd(out,outOffset,v0,v + (960 >> div),sbrQmfWindow,(448 >> div),out,outOffset,64 >> div);
    FloatDSP.vectorFmulAdd(out,outOffset,v0,v + (1024 >> div),sbrQmfWindow,(512 >> div),out,outOffset,64 >> div);
    FloatDSP.vectorFmulAdd(out,outOffset,v0,v + (1216 >> div),sbrQmfWindow,(576 >> div),out,outOffset,64 >> div);
    outOffset+=64 >> div;
  }
}

private static void sbrQmfSynthesis ( FFT mdct , float out [ ] , float X [ ] [ ] [ ] , float mdctBuf [ ] , float v0 [ ] , int vOff [ ] , final int div ) { final float sbrQmfWindow [ ] = div != 0 ? sbr_qmf_window_ds : sbr_qmf_window_us ; final int step = 128 > > div ; int v ; int outOffset = 0 ; for ( int i = 0 ; i < 32 ; i ++ ) { if ( vOff [ 0 ] < step ) { int saved_samples = ( 1280 - 128 ) > > div ; System . arraycopy ( v0 , 0 , v0 , SBR_SYNTHESIS_BUF_SIZE - saved_samples , saved_samples ) ; vOff [ 0 ] = SBR_SYNTHESIS_BUF_SIZE - saved_samples - step ; } else { vOff [ 0 ] -= step ; } v = vOff [ 0 ] ; if ( div != 0 ) { for ( int n = 0 ; n < 32 ; n ++ ) { X [ 0 ] [ i ] [ n ] = - X [ 0 ] [ i ] [ n ] ; X [ 0 ] [ i ] [ 32 + n ] = X [ 1 ] [ i ] [ 31 - n ] ; } mdct . imdctHalf ( mdctBuf , 0 , X [ 0 ] [ i ] , 0 ) ; SBRDSP . qmfDeintNeg ( v0 , v , mdctBuf , 0 ) ; } else { SBRDSP . negOdd64 ( X [ 1 ] [ i ] , 0 ) ; mdct . imdctHalf ( mdctBuf , 0 , X [ 0 ] [ i ] , 0 ) ; mdct . imdctHalf ( mdctBuf , 64 , X [ 1 ] [ i ] , 0 ) ; SBRDSP . qmfDeintBfly ( v0 , v , mdctBuf , 64 , mdctBuf , 0 ) ; } FloatDSP . vectorFmul ( out , outOffset , v0 , v , sbrQmfWindow , ( 0 ) , 64 > > div ) ; FloatDSP . vectorFmulAdd ( out , outOffset , v0 , v + ( 192 > > div ) , sbrQmfWindow , ( 64 > > div ) , out , outOffset , 64 > > div ) ; FloatDSP . vectorFmulAdd ( out , outOffset , v0 , v + ( 256 > > div ) , sbrQmfWindow , ( 128 > > div ) , out , outOffset , 64 > > div ) ; FloatDSP . vectorFmulAdd ( out , outOffset , v0 , v + ( 448 > > div ) , sbrQmfWindow , ( 192 > > div ) , out , outOffset , 64 > > div ) ; FloatDSP . vectorFmulAdd ( out , outOffset , v0 , v + ( 512 > > div ) , sbrQmfWindow , ( 256 > > div ) , out , outOffset , 64 > > div ) ; FloatDSP . vectorFmulAdd ( out , outOffset , v0 , v + ( 704 > > div ) , sbrQmfWindow , ( 320 > > div ) , out , outOffset , 64 > > div ) ; FloatDSP . vectorFmulAdd ( out , outOffset , v0 , v + ( 768 > > div ) , sbrQmfWindow , ( 384 > > div ) , out , outOffset , 64 > > div ) ; FloatDSP . vectorFmulAdd ( out , outOffset , v0 , v + ( 960 > > div ) , sbrQmfWindow , ( 448 > > div ) , out , outOffset , 64 > > div ) ; FloatDSP . vectorFmulAdd ( out , outOffset , v0 , v + ( 1024 > > div ) , sbrQmfWindow , ( 512 > > div ) , out , outOffset , 64 > > div ) ; FloatDSP . vectorFmulAdd ( out , outOffset , v0 , v + ( 1216 > > div ) , sbrQmfWindow , ( 576 > > div ) , out , outOffset , 64 > > div ) ; outOffset += 64 > > div ; } }
synthesis qmf bank ( 14496 - 3 sp04 p206 ) and downsampled synthesis qmf bank ( 14496 - 3 sp04 p206 )
