public static final void qmf_decomp(final float[] xx,
                                      final float[] aa,
                                      final float[] y1,
                                      final float[] y2,
                                      final int N,
                                      final int M,
                                      final float[] mem)
  {
    int i,j,k,M2;
    float[] a;
    float[] x;
    int x2;
    
    a = new float[M];
    x = new float[N+M-1];
    x2=M-1;
    M2=M>>1;
    for (i=0; i<M; i++)
      a[M-i-1]=aa[i];
    for (i=0; i<M-1; i++)
      x[i]=mem[M-i-2];
    for (i=0; i<N; i++)
      x[i+M-1]=xx[i];
    for (i=0, k=0; i<N; i+=2, k++) {
      y1[k]=0;
      y2[k]=0;
      for (j=0; j<M2; j++) {
        y1[k]+=a[j]*(x[i+j]+x[x2+i-j]);
        y2[k]-=a[j]*(x[i+j]-x[x2+i-j]);
        j++;
        y1[k]+=a[j]*(x[i+j]+x[x2+i-j]);
        y2[k]+=a[j]*(x[i+j]-x[x2+i-j]);
      }
    }
    for (i=0;i<M-1;i++)
      mem[i]=xx[N-i-1];
  }