private float[] getComputedWindow() {
        int ix = (blockFlag ? 4 : 0) + (previousWindowFlag ? 2 : 0) + (nextWindowFlag ? 1 : 0);
        float[] w = windows[ix];
        if (w == null) {
            w = new float[n];

            for (int i = 0; i < leftN; i++) {
                float x = (float) ((i + .5) / leftN * Math.PI / 2.);
                x = (float) Math.sin(x);
                x *= x;
                x *= (float) Math.PI / 2.;
                x = (float) Math.sin(x);
                w[i + leftWindowStart] = x;
            }

            int i = leftWindowEnd;
            while (i < rightWindowStart) {
                w[i++] = 1F;
            }

            for (i = 0; i < rightN; i++) {
                float x = (float) ((rightN - i - .5) / rightN * Math.PI / 2.);
                x = (float) Math.sin(x);
                x *= x;
                x *= (float) Math.PI / 2.;
                x = (float) Math.sin(x);
                w[i + rightWindowStart] = x;
            }

            windows[ix] = w;
        }
        return w;
    }