w_re = W_re[g]; w_im = W_im[g];
w_re = W_re3[g]; w_im = W_im3[g];
  public void init(final int D, final int N, final float W_re[], final float W_im[])   {    /* the length of a butterfly group in terms of points */     final int grplen = D + D;      /* the number of bfly groups and bflies per group */     final int numgrps = N/grplen;     final int numbflies = D;     float w_re, w_im;     /* The splitjoin routes the complex points "grplen" each to/from the constituent bflygrps. */    this.setSplitter(ROUND_ROBIN(2*grplen));     /* for each butterfly group in this stage */    for (int g=0; g<numgrps; g++)     {       /* each butterfly group uses only one root of unity. actually, it is the bitrev of this group's number g.       * BUT 'bitrev' it as a logn-1 bit number because we are using a lookup array of nth root of unity and       * using cancellation lemma to scale nth root to n/2, n/4,... th root.       *       * Basically, it turns out like the foll.       *   w_re = W_re[bitrev(g, logn-1)];       *   w_im = W_im[bitrev(g, logn-1)];       * Still, we just use g, because the lookup array itself is bit-reversal permuted.       */      w_re = W_re[g];        w_im = W_im[g];       this.add(new ButterflyGroup(w_re, w_im, numbflies));    }      this.setJoiner(ROUND_ROBIN(2*grplen));   }  