eaglercraft-1.8/sources/teavm/java/com/jcraft/jorbis/Drft.java

1320 lines
27 KiB
Java
Raw Permalink Normal View History

/* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */
/* JOrbis
* Copyright (C) 2000 ymnk, JCraft,Inc.
*
* Written by: 2000 ymnk<ymnk@jcraft.com>
*
* Many thanks to
* Monty <monty@xiph.org> and
* The XIPHOPHORUS Company http://www.xiph.org/ .
* JOrbis has been based on their awesome works, Vorbis codec.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public License
* as published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package com.jcraft.jorbis;
class Drft {
int n;
float[] trigcache;
int[] splitcache;
void backward(float[] data) {
if (n == 1)
return;
drftb1(n, data, trigcache, trigcache, n, splitcache);
}
void init(int n) {
this.n = n;
trigcache = new float[3 * n];
splitcache = new int[32];
fdrffti(n, trigcache, splitcache);
}
void clear() {
if (trigcache != null)
trigcache = null;
if (splitcache != null)
splitcache = null;
}
static int[] ntryh = { 4, 2, 3, 5 };
static float tpi = 6.28318530717958647692528676655900577f;
static float hsqt2 = .70710678118654752440084436210485f;
static float taui = .86602540378443864676372317075293618f;
static float taur = -.5f;
static float sqrt2 = 1.4142135623730950488016887242097f;
static void drfti1(int n, float[] wa, int index, int[] ifac) {
float arg, argh, argld, fi;
int ntry = 0, i, j = -1;
int k1, l1, l2, ib;
int ld, ii, ip, is, nq, nr;
int ido, ipm, nfm1;
int nl = n;
int nf = 0;
int state = 101;
loop: while (true) {
switch (state) {
case 101:
j++;
if (j < 4)
ntry = ntryh[j];
else
ntry += 2;
case 104:
nq = nl / ntry;
nr = nl - ntry * nq;
if (nr != 0) {
state = 101;
break;
}
nf++;
ifac[nf + 1] = ntry;
nl = nq;
if (ntry != 2) {
state = 107;
break;
}
if (nf == 1) {
state = 107;
break;
}
for (i = 1; i < nf; i++) {
ib = nf - i + 1;
ifac[ib + 1] = ifac[ib];
}
ifac[2] = 2;
case 107:
if (nl != 1) {
state = 104;
break;
}
ifac[0] = n;
ifac[1] = nf;
argh = tpi / n;
is = 0;
nfm1 = nf - 1;
l1 = 1;
if (nfm1 == 0)
return;
for (k1 = 0; k1 < nfm1; k1++) {
ip = ifac[k1 + 2];
ld = 0;
l2 = l1 * ip;
ido = n / l2;
ipm = ip - 1;
for (j = 0; j < ipm; j++) {
ld += l1;
i = is;
argld = (float) ld * argh;
fi = 0.f;
for (ii = 2; ii < ido; ii += 2) {
fi += 1.f;
arg = fi * argld;
wa[index + i++] = (float) Math.cos(arg);
wa[index + i++] = (float) Math.sin(arg);
}
is += ido;
}
l1 = l2;
}
break loop;
}
}
}
static void fdrffti(int n, float[] wsave, int[] ifac) {
if (n == 1)
return;
drfti1(n, wsave, n, ifac);
}
static void dradf2(int ido, int l1, float[] cc, float[] ch, float[] wa1, int index) {
int i, k;
float ti2, tr2;
int t0, t1, t2, t3, t4, t5, t6;
t1 = 0;
t0 = (t2 = l1 * ido);
t3 = ido << 1;
for (k = 0; k < l1; k++) {
ch[t1 << 1] = cc[t1] + cc[t2];
ch[(t1 << 1) + t3 - 1] = cc[t1] - cc[t2];
t1 += ido;
t2 += ido;
}
if (ido < 2)
return;
if (ido != 2) {
t1 = 0;
t2 = t0;
for (k = 0; k < l1; k++) {
t3 = t2;
t4 = (t1 << 1) + (ido << 1);
t5 = t1;
t6 = t1 + t1;
for (i = 2; i < ido; i += 2) {
t3 += 2;
t4 -= 2;
t5 += 2;
t6 += 2;
tr2 = wa1[index + i - 2] * cc[t3 - 1] + wa1[index + i - 1] * cc[t3];
ti2 = wa1[index + i - 2] * cc[t3] - wa1[index + i - 1] * cc[t3 - 1];
ch[t6] = cc[t5] + ti2;
ch[t4] = ti2 - cc[t5];
ch[t6 - 1] = cc[t5 - 1] + tr2;
ch[t4 - 1] = cc[t5 - 1] - tr2;
}
t1 += ido;
t2 += ido;
}
if (ido % 2 == 1)
return;
}
t3 = (t2 = (t1 = ido) - 1);
t2 += t0;
for (k = 0; k < l1; k++) {
ch[t1] = -cc[t2];
ch[t1 - 1] = cc[t3];
t1 += ido << 1;
t2 += ido;
t3 += ido;
}
}
static void dradf4(int ido, int l1, float[] cc, float[] ch, float[] wa1, int index1, float[] wa2, int index2,
float[] wa3, int index3) {
int i, k, t0, t1, t2, t3, t4, t5, t6;
float ci2, ci3, ci4, cr2, cr3, cr4, ti1, ti2, ti3, ti4, tr1, tr2, tr3, tr4;
t0 = l1 * ido;
t1 = t0;
t4 = t1 << 1;
t2 = t1 + (t1 << 1);
t3 = 0;
for (k = 0; k < l1; k++) {
tr1 = cc[t1] + cc[t2];
tr2 = cc[t3] + cc[t4];
ch[t5 = t3 << 2] = tr1 + tr2;
ch[(ido << 2) + t5 - 1] = tr2 - tr1;
ch[(t5 += (ido << 1)) - 1] = cc[t3] - cc[t4];
ch[t5] = cc[t2] - cc[t1];
t1 += ido;
t2 += ido;
t3 += ido;
t4 += ido;
}
if (ido < 2)
return;
if (ido != 2) {
t1 = 0;
for (k = 0; k < l1; k++) {
t2 = t1;
t4 = t1 << 2;
t5 = (t6 = ido << 1) + t4;
for (i = 2; i < ido; i += 2) {
t3 = (t2 += 2);
t4 += 2;
t5 -= 2;
t3 += t0;
cr2 = wa1[index1 + i - 2] * cc[t3 - 1] + wa1[index1 + i - 1] * cc[t3];
ci2 = wa1[index1 + i - 2] * cc[t3] - wa1[index1 + i - 1] * cc[t3 - 1];
t3 += t0;
cr3 = wa2[index2 + i - 2] * cc[t3 - 1] + wa2[index2 + i - 1] * cc[t3];
ci3 = wa2[index2 + i - 2] * cc[t3] - wa2[index2 + i - 1] * cc[t3 - 1];
t3 += t0;
cr4 = wa3[index3 + i - 2] * cc[t3 - 1] + wa3[index3 + i - 1] * cc[t3];
ci4 = wa3[index3 + i - 2] * cc[t3] - wa3[index3 + i - 1] * cc[t3 - 1];
tr1 = cr2 + cr4;
tr4 = cr4 - cr2;
ti1 = ci2 + ci4;
ti4 = ci2 - ci4;
ti2 = cc[t2] + ci3;
ti3 = cc[t2] - ci3;
tr2 = cc[t2 - 1] + cr3;
tr3 = cc[t2 - 1] - cr3;
ch[t4 - 1] = tr1 + tr2;
ch[t4] = ti1 + ti2;
ch[t5 - 1] = tr3 - ti4;
ch[t5] = tr4 - ti3;
ch[t4 + t6 - 1] = ti4 + tr3;
ch[t4 + t6] = tr4 + ti3;
ch[t5 + t6 - 1] = tr2 - tr1;
ch[t5 + t6] = ti1 - ti2;
}
t1 += ido;
}
if ((ido & 1) != 0)
return;
}
t2 = (t1 = t0 + ido - 1) + (t0 << 1);
t3 = ido << 2;
t4 = ido;
t5 = ido << 1;
t6 = ido;
for (k = 0; k < l1; k++) {
ti1 = -hsqt2 * (cc[t1] + cc[t2]);
tr1 = hsqt2 * (cc[t1] - cc[t2]);
ch[t4 - 1] = tr1 + cc[t6 - 1];
ch[t4 + t5 - 1] = cc[t6 - 1] - tr1;
ch[t4] = ti1 - cc[t1 + t0];
ch[t4 + t5] = ti1 + cc[t1 + t0];
t1 += ido;
t2 += ido;
t4 += t3;
t6 += ido;
}
}
static void dradfg(int ido, int ip, int l1, int idl1, float[] cc, float[] c1, float[] c2, float[] ch, float[] ch2,
float[] wa, int index) {
int idij, ipph, i, j, k, l, ic, ik, is;
int t0, t1, t2 = 0, t3, t4, t5, t6, t7, t8, t9, t10;
float dc2, ai1, ai2, ar1, ar2, ds2;
int nbd;
float dcp = 0, arg, dsp = 0, ar1h, ar2h;
int idp2, ipp2;
arg = tpi / (float) ip;
dcp = (float) Math.cos(arg);
dsp = (float) Math.sin(arg);
ipph = (ip + 1) >> 1;
ipp2 = ip;
idp2 = ido;
nbd = (ido - 1) >> 1;
t0 = l1 * ido;
t10 = ip * ido;
int state = 100;
loop: while (true) {
switch (state) {
case 101:
if (ido == 1) {
state = 119;
break;
}
for (ik = 0; ik < idl1; ik++)
ch2[ik] = c2[ik];
t1 = 0;
for (j = 1; j < ip; j++) {
t1 += t0;
t2 = t1;
for (k = 0; k < l1; k++) {
ch[t2] = c1[t2];
t2 += ido;
}
}
is = -ido;
t1 = 0;
if (nbd > l1) {
for (j = 1; j < ip; j++) {
t1 += t0;
is += ido;
t2 = -ido + t1;
for (k = 0; k < l1; k++) {
idij = is - 1;
t2 += ido;
t3 = t2;
for (i = 2; i < ido; i += 2) {
idij += 2;
t3 += 2;
ch[t3 - 1] = wa[index + idij - 1] * c1[t3 - 1] + wa[index + idij] * c1[t3];
ch[t3] = wa[index + idij - 1] * c1[t3] - wa[index + idij] * c1[t3 - 1];
}
}
}
} else {
for (j = 1; j < ip; j++) {
is += ido;
idij = is - 1;
t1 += t0;
t2 = t1;
for (i = 2; i < ido; i += 2) {
idij += 2;
t2 += 2;
t3 = t2;
for (k = 0; k < l1; k++) {
ch[t3 - 1] = wa[index + idij - 1] * c1[t3 - 1] + wa[index + idij] * c1[t3];
ch[t3] = wa[index + idij - 1] * c1[t3] - wa[index + idij] * c1[t3 - 1];
t3 += ido;
}
}
}
}
t1 = 0;
t2 = ipp2 * t0;
if (nbd < l1) {
for (j = 1; j < ipph; j++) {
t1 += t0;
t2 -= t0;
t3 = t1;
t4 = t2;
for (i = 2; i < ido; i += 2) {
t3 += 2;
t4 += 2;
t5 = t3 - ido;
t6 = t4 - ido;
for (k = 0; k < l1; k++) {
t5 += ido;
t6 += ido;
c1[t5 - 1] = ch[t5 - 1] + ch[t6 - 1];
c1[t6 - 1] = ch[t5] - ch[t6];
c1[t5] = ch[t5] + ch[t6];
c1[t6] = ch[t6 - 1] - ch[t5 - 1];
}
}
}
} else {
for (j = 1; j < ipph; j++) {
t1 += t0;
t2 -= t0;
t3 = t1;
t4 = t2;
for (k = 0; k < l1; k++) {
t5 = t3;
t6 = t4;
for (i = 2; i < ido; i += 2) {
t5 += 2;
t6 += 2;
c1[t5 - 1] = ch[t5 - 1] + ch[t6 - 1];
c1[t6 - 1] = ch[t5] - ch[t6];
c1[t5] = ch[t5] + ch[t6];
c1[t6] = ch[t6 - 1] - ch[t5 - 1];
}
t3 += ido;
t4 += ido;
}
}
}
case 119:
for (ik = 0; ik < idl1; ik++)
c2[ik] = ch2[ik];
t1 = 0;
t2 = ipp2 * idl1;
for (j = 1; j < ipph; j++) {
t1 += t0;
t2 -= t0;
t3 = t1 - ido;
t4 = t2 - ido;
for (k = 0; k < l1; k++) {
t3 += ido;
t4 += ido;
c1[t3] = ch[t3] + ch[t4];
c1[t4] = ch[t4] - ch[t3];
}
}
ar1 = 1.f;
ai1 = 0.f;
t1 = 0;
t2 = ipp2 * idl1;
t3 = (ip - 1) * idl1;
for (l = 1; l < ipph; l++) {
t1 += idl1;
t2 -= idl1;
ar1h = dcp * ar1 - dsp * ai1;
ai1 = dcp * ai1 + dsp * ar1;
ar1 = ar1h;
t4 = t1;
t5 = t2;
t6 = t3;
t7 = idl1;
for (ik = 0; ik < idl1; ik++) {
ch2[t4++] = c2[ik] + ar1 * c2[t7++];
ch2[t5++] = ai1 * c2[t6++];
}
dc2 = ar1;
ds2 = ai1;
ar2 = ar1;
ai2 = ai1;
t4 = idl1;
t5 = (ipp2 - 1) * idl1;
for (j = 2; j < ipph; j++) {
t4 += idl1;
t5 -= idl1;
ar2h = dc2 * ar2 - ds2 * ai2;
ai2 = dc2 * ai2 + ds2 * ar2;
ar2 = ar2h;
t6 = t1;
t7 = t2;
t8 = t4;
t9 = t5;
for (ik = 0; ik < idl1; ik++) {
ch2[t6++] += ar2 * c2[t8++];
ch2[t7++] += ai2 * c2[t9++];
}
}
}
t1 = 0;
for (j = 1; j < ipph; j++) {
t1 += idl1;
t2 = t1;
for (ik = 0; ik < idl1; ik++)
ch2[ik] += c2[t2++];
}
if (ido < l1) {
state = 132;
break;
}
t1 = 0;
t2 = 0;
for (k = 0; k < l1; k++) {
t3 = t1;
t4 = t2;
for (i = 0; i < ido; i++)
cc[t4++] = ch[t3++];
t1 += ido;
t2 += t10;
}
state = 135;
break;
case 132:
for (i = 0; i < ido; i++) {
t1 = i;
t2 = i;
for (k = 0; k < l1; k++) {
cc[t2] = ch[t1];
t1 += ido;
t2 += t10;
}
}
case 135:
t1 = 0;
t2 = ido << 1;
t3 = 0;
t4 = ipp2 * t0;
for (j = 1; j < ipph; j++) {
t1 += t2;
t3 += t0;
t4 -= t0;
t5 = t1;
t6 = t3;
t7 = t4;
for (k = 0; k < l1; k++) {
cc[t5 - 1] = ch[t6];
cc[t5] = ch[t7];
t5 += t10;
t6 += ido;
t7 += ido;
}
}
if (ido == 1)
return;
if (nbd < l1) {
state = 141;
break;
}
t1 = -ido;
t3 = 0;
t4 = 0;
t5 = ipp2 * t0;
for (j = 1; j < ipph; j++) {
t1 += t2;
t3 += t2;
t4 += t0;
t5 -= t0;
t6 = t1;
t7 = t3;
t8 = t4;
t9 = t5;
for (k = 0; k < l1; k++) {
for (i = 2; i < ido; i += 2) {
ic = idp2 - i;
cc[i + t7 - 1] = ch[i + t8 - 1] + ch[i + t9 - 1];
cc[ic + t6 - 1] = ch[i + t8 - 1] - ch[i + t9 - 1];
cc[i + t7] = ch[i + t8] + ch[i + t9];
cc[ic + t6] = ch[i + t9] - ch[i + t8];
}
t6 += t10;
t7 += t10;
t8 += ido;
t9 += ido;
}
}
return;
case 141:
t1 = -ido;
t3 = 0;
t4 = 0;
t5 = ipp2 * t0;
for (j = 1; j < ipph; j++) {
t1 += t2;
t3 += t2;
t4 += t0;
t5 -= t0;
for (i = 2; i < ido; i += 2) {
t6 = idp2 + t1 - i;
t7 = i + t3;
t8 = i + t4;
t9 = i + t5;
for (k = 0; k < l1; k++) {
cc[t7 - 1] = ch[t8 - 1] + ch[t9 - 1];
cc[t6 - 1] = ch[t8 - 1] - ch[t9 - 1];
cc[t7] = ch[t8] + ch[t9];
cc[t6] = ch[t9] - ch[t8];
t6 += t10;
t7 += t10;
t8 += ido;
t9 += ido;
}
}
}
break loop;
}
}
}
static void drftf1(int n, float[] c, float[] ch, float[] wa, int[] ifac) {
int i, k1, l1, l2;
int na, kh, nf;
int ip, iw, ido, idl1, ix2, ix3;
nf = ifac[1];
na = 1;
l2 = n;
iw = n;
for (k1 = 0; k1 < nf; k1++) {
kh = nf - k1;
ip = ifac[kh + 1];
l1 = l2 / ip;
ido = n / l2;
idl1 = ido * l1;
iw -= (ip - 1) * ido;
na = 1 - na;
int state = 100;
loop: while (true) {
switch (state) {
case 100:
if (ip != 4) {
state = 102;
break;
}
ix2 = iw + ido;
ix3 = ix2 + ido;
if (na != 0)
dradf4(ido, l1, ch, c, wa, iw - 1, wa, ix2 - 1, wa, ix3 - 1);
else
dradf4(ido, l1, c, ch, wa, iw - 1, wa, ix2 - 1, wa, ix3 - 1);
state = 110;
break;
case 102:
if (ip != 2) {
state = 104;
break;
}
if (na != 0) {
state = 103;
break;
}
dradf2(ido, l1, c, ch, wa, iw - 1);
state = 110;
break;
case 103:
dradf2(ido, l1, ch, c, wa, iw - 1);
case 104:
if (ido == 1)
na = 1 - na;
if (na != 0) {
state = 109;
break;
}
dradfg(ido, ip, l1, idl1, c, c, c, ch, ch, wa, iw - 1);
na = 1;
state = 110;
break;
case 109:
dradfg(ido, ip, l1, idl1, ch, ch, ch, c, c, wa, iw - 1);
na = 0;
case 110:
l2 = l1;
break loop;
}
}
}
if (na == 1)
return;
for (i = 0; i < n; i++)
c[i] = ch[i];
}
static void dradb2(int ido, int l1, float[] cc, float[] ch, float[] wa1, int index) {
int i, k, t0, t1, t2, t3, t4, t5, t6;
float ti2, tr2;
t0 = l1 * ido;
t1 = 0;
t2 = 0;
t3 = (ido << 1) - 1;
for (k = 0; k < l1; k++) {
ch[t1] = cc[t2] + cc[t3 + t2];
ch[t1 + t0] = cc[t2] - cc[t3 + t2];
t2 = (t1 += ido) << 1;
}
if (ido < 2)
return;
if (ido != 2) {
t1 = 0;
t2 = 0;
for (k = 0; k < l1; k++) {
t3 = t1;
t5 = (t4 = t2) + (ido << 1);
t6 = t0 + t1;
for (i = 2; i < ido; i += 2) {
t3 += 2;
t4 += 2;
t5 -= 2;
t6 += 2;
ch[t3 - 1] = cc[t4 - 1] + cc[t5 - 1];
tr2 = cc[t4 - 1] - cc[t5 - 1];
ch[t3] = cc[t4] - cc[t5];
ti2 = cc[t4] + cc[t5];
ch[t6 - 1] = wa1[index + i - 2] * tr2 - wa1[index + i - 1] * ti2;
ch[t6] = wa1[index + i - 2] * ti2 + wa1[index + i - 1] * tr2;
}
t2 = (t1 += ido) << 1;
}
if ((ido % 2) == 1)
return;
}
t1 = ido - 1;
t2 = ido - 1;
for (k = 0; k < l1; k++) {
ch[t1] = cc[t2] + cc[t2];
ch[t1 + t0] = -(cc[t2 + 1] + cc[t2 + 1]);
t1 += ido;
t2 += ido << 1;
}
}
static void dradb3(int ido, int l1, float[] cc, float[] ch, float[] wa1, int index1, float[] wa2, int index2) {
int i, k, t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10;
float ci2, ci3, di2, di3, cr2, cr3, dr2, dr3, ti2, tr2;
t0 = l1 * ido;
t1 = 0;
t2 = t0 << 1;
t3 = ido << 1;
t4 = ido + (ido << 1);
t5 = 0;
for (k = 0; k < l1; k++) {
tr2 = cc[t3 - 1] + cc[t3 - 1];
cr2 = cc[t5] + (taur * tr2);
ch[t1] = cc[t5] + tr2;
ci3 = taui * (cc[t3] + cc[t3]);
ch[t1 + t0] = cr2 - ci3;
ch[t1 + t2] = cr2 + ci3;
t1 += ido;
t3 += t4;
t5 += t4;
}
if (ido == 1)
return;
t1 = 0;
t3 = ido << 1;
for (k = 0; k < l1; k++) {
t7 = t1 + (t1 << 1);
t6 = (t5 = t7 + t3);
t8 = t1;
t10 = (t9 = t1 + t0) + t0;
for (i = 2; i < ido; i += 2) {
t5 += 2;
t6 -= 2;
t7 += 2;
t8 += 2;
t9 += 2;
t10 += 2;
tr2 = cc[t5 - 1] + cc[t6 - 1];
cr2 = cc[t7 - 1] + (taur * tr2);
ch[t8 - 1] = cc[t7 - 1] + tr2;
ti2 = cc[t5] - cc[t6];
ci2 = cc[t7] + (taur * ti2);
ch[t8] = cc[t7] + ti2;
cr3 = taui * (cc[t5 - 1] - cc[t6 - 1]);
ci3 = taui * (cc[t5] + cc[t6]);
dr2 = cr2 - ci3;
dr3 = cr2 + ci3;
di2 = ci2 + cr3;
di3 = ci2 - cr3;
ch[t9 - 1] = wa1[index1 + i - 2] * dr2 - wa1[index1 + i - 1] * di2;
ch[t9] = wa1[index1 + i - 2] * di2 + wa1[index1 + i - 1] * dr2;
ch[t10 - 1] = wa2[index2 + i - 2] * dr3 - wa2[index2 + i - 1] * di3;
ch[t10] = wa2[index2 + i - 2] * di3 + wa2[index2 + i - 1] * dr3;
}
t1 += ido;
}
}
static void dradb4(int ido, int l1, float[] cc, float[] ch, float[] wa1, int index1, float[] wa2, int index2,
float[] wa3, int index3) {
int i, k, t0, t1, t2, t3, t4, t5, t6, t7, t8;
float ci2, ci3, ci4, cr2, cr3, cr4, ti1, ti2, ti3, ti4, tr1, tr2, tr3, tr4;
t0 = l1 * ido;
t1 = 0;
t2 = ido << 2;
t3 = 0;
t6 = ido << 1;
for (k = 0; k < l1; k++) {
t4 = t3 + t6;
t5 = t1;
tr3 = cc[t4 - 1] + cc[t4 - 1];
tr4 = cc[t4] + cc[t4];
tr1 = cc[t3] - cc[(t4 += t6) - 1];
tr2 = cc[t3] + cc[t4 - 1];
ch[t5] = tr2 + tr3;
ch[t5 += t0] = tr1 - tr4;
ch[t5 += t0] = tr2 - tr3;
ch[t5 += t0] = tr1 + tr4;
t1 += ido;
t3 += t2;
}
if (ido < 2)
return;
if (ido != 2) {
t1 = 0;
for (k = 0; k < l1; k++) {
t5 = (t4 = (t3 = (t2 = t1 << 2) + t6)) + t6;
t7 = t1;
for (i = 2; i < ido; i += 2) {
t2 += 2;
t3 += 2;
t4 -= 2;
t5 -= 2;
t7 += 2;
ti1 = cc[t2] + cc[t5];
ti2 = cc[t2] - cc[t5];
ti3 = cc[t3] - cc[t4];
tr4 = cc[t3] + cc[t4];
tr1 = cc[t2 - 1] - cc[t5 - 1];
tr2 = cc[t2 - 1] + cc[t5 - 1];
ti4 = cc[t3 - 1] - cc[t4 - 1];
tr3 = cc[t3 - 1] + cc[t4 - 1];
ch[t7 - 1] = tr2 + tr3;
cr3 = tr2 - tr3;
ch[t7] = ti2 + ti3;
ci3 = ti2 - ti3;
cr2 = tr1 - tr4;
cr4 = tr1 + tr4;
ci2 = ti1 + ti4;
ci4 = ti1 - ti4;
ch[(t8 = t7 + t0) - 1] = wa1[index1 + i - 2] * cr2 - wa1[index1 + i - 1] * ci2;
ch[t8] = wa1[index1 + i - 2] * ci2 + wa1[index1 + i - 1] * cr2;
ch[(t8 += t0) - 1] = wa2[index2 + i - 2] * cr3 - wa2[index2 + i - 1] * ci3;
ch[t8] = wa2[index2 + i - 2] * ci3 + wa2[index2 + i - 1] * cr3;
ch[(t8 += t0) - 1] = wa3[index3 + i - 2] * cr4 - wa3[index3 + i - 1] * ci4;
ch[t8] = wa3[index3 + i - 2] * ci4 + wa3[index3 + i - 1] * cr4;
}
t1 += ido;
}
if (ido % 2 == 1)
return;
}
t1 = ido;
t2 = ido << 2;
t3 = ido - 1;
t4 = ido + (ido << 1);
for (k = 0; k < l1; k++) {
t5 = t3;
ti1 = cc[t1] + cc[t4];
ti2 = cc[t4] - cc[t1];
tr1 = cc[t1 - 1] - cc[t4 - 1];
tr2 = cc[t1 - 1] + cc[t4 - 1];
ch[t5] = tr2 + tr2;
ch[t5 += t0] = sqrt2 * (tr1 - ti1);
ch[t5 += t0] = ti2 + ti2;
ch[t5 += t0] = -sqrt2 * (tr1 + ti1);
t3 += ido;
t1 += t2;
t4 += t2;
}
}
static void dradbg(int ido, int ip, int l1, int idl1, float[] cc, float[] c1, float[] c2, float[] ch, float[] ch2,
float[] wa, int index) {
int idij, ipph = 0, i, j, k, l, ik, is, t0 = 0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10 = 0, t11, t12;
float dc2, ai1, ai2, ar1, ar2, ds2;
int nbd = 0;
float dcp = 0, arg, dsp = 0, ar1h, ar2h;
int ipp2 = 0;
int state = 100;
loop: while (true) {
switch (state) {
case 100:
t10 = ip * ido;
t0 = l1 * ido;
arg = tpi / (float) ip;
dcp = (float) Math.cos(arg);
dsp = (float) Math.sin(arg);
nbd = (ido - 1) >>> 1;
ipp2 = ip;
ipph = (ip + 1) >>> 1;
if (ido < l1) {
state = 103;
break;
}
t1 = 0;
t2 = 0;
for (k = 0; k < l1; k++) {
t3 = t1;
t4 = t2;
for (i = 0; i < ido; i++) {
ch[t3] = cc[t4];
t3++;
t4++;
}
t1 += ido;
t2 += t10;
}
state = 106;
break;
case 103:
t1 = 0;
for (i = 0; i < ido; i++) {
t2 = t1;
t3 = t1;
for (k = 0; k < l1; k++) {
ch[t2] = cc[t3];
t2 += ido;
t3 += t10;
}
t1++;
}
case 106:
t1 = 0;
t2 = ipp2 * t0;
t7 = (t5 = ido << 1);
for (j = 1; j < ipph; j++) {
t1 += t0;
t2 -= t0;
t3 = t1;
t4 = t2;
t6 = t5;
for (k = 0; k < l1; k++) {
ch[t3] = cc[t6 - 1] + cc[t6 - 1];
ch[t4] = cc[t6] + cc[t6];
t3 += ido;
t4 += ido;
t6 += t10;
}
t5 += t7;
}
if (ido == 1) {
state = 116;
break;
}
if (nbd < l1) {
state = 112;
break;
}
t1 = 0;
t2 = ipp2 * t0;
t7 = 0;
for (j = 1; j < ipph; j++) {
t1 += t0;
t2 -= t0;
t3 = t1;
t4 = t2;
t7 += (ido << 1);
t8 = t7;
for (k = 0; k < l1; k++) {
t5 = t3;
t6 = t4;
t9 = t8;
t11 = t8;
for (i = 2; i < ido; i += 2) {
t5 += 2;
t6 += 2;
t9 += 2;
t11 -= 2;
ch[t5 - 1] = cc[t9 - 1] + cc[t11 - 1];
ch[t6 - 1] = cc[t9 - 1] - cc[t11 - 1];
ch[t5] = cc[t9] - cc[t11];
ch[t6] = cc[t9] + cc[t11];
}
t3 += ido;
t4 += ido;
t8 += t10;
}
}
state = 116;
break;
case 112:
t1 = 0;
t2 = ipp2 * t0;
t7 = 0;
for (j = 1; j < ipph; j++) {
t1 += t0;
t2 -= t0;
t3 = t1;
t4 = t2;
t7 += (ido << 1);
t8 = t7;
t9 = t7;
for (i = 2; i < ido; i += 2) {
t3 += 2;
t4 += 2;
t8 += 2;
t9 -= 2;
t5 = t3;
t6 = t4;
t11 = t8;
t12 = t9;
for (k = 0; k < l1; k++) {
ch[t5 - 1] = cc[t11 - 1] + cc[t12 - 1];
ch[t6 - 1] = cc[t11 - 1] - cc[t12 - 1];
ch[t5] = cc[t11] - cc[t12];
ch[t6] = cc[t11] + cc[t12];
t5 += ido;
t6 += ido;
t11 += t10;
t12 += t10;
}
}
}
case 116:
ar1 = 1.f;
ai1 = 0.f;
t1 = 0;
t9 = (t2 = ipp2 * idl1);
t3 = (ip - 1) * idl1;
for (l = 1; l < ipph; l++) {
t1 += idl1;
t2 -= idl1;
ar1h = dcp * ar1 - dsp * ai1;
ai1 = dcp * ai1 + dsp * ar1;
ar1 = ar1h;
t4 = t1;
t5 = t2;
t6 = 0;
t7 = idl1;
t8 = t3;
for (ik = 0; ik < idl1; ik++) {
c2[t4++] = ch2[t6++] + ar1 * ch2[t7++];
c2[t5++] = ai1 * ch2[t8++];
}
dc2 = ar1;
ds2 = ai1;
ar2 = ar1;
ai2 = ai1;
t6 = idl1;
t7 = t9 - idl1;
for (j = 2; j < ipph; j++) {
t6 += idl1;
t7 -= idl1;
ar2h = dc2 * ar2 - ds2 * ai2;
ai2 = dc2 * ai2 + ds2 * ar2;
ar2 = ar2h;
t4 = t1;
t5 = t2;
t11 = t6;
t12 = t7;
for (ik = 0; ik < idl1; ik++) {
c2[t4++] += ar2 * ch2[t11++];
c2[t5++] += ai2 * ch2[t12++];
}
}
}
t1 = 0;
for (j = 1; j < ipph; j++) {
t1 += idl1;
t2 = t1;
for (ik = 0; ik < idl1; ik++)
ch2[ik] += ch2[t2++];
}
t1 = 0;
t2 = ipp2 * t0;
for (j = 1; j < ipph; j++) {
t1 += t0;
t2 -= t0;
t3 = t1;
t4 = t2;
for (k = 0; k < l1; k++) {
ch[t3] = c1[t3] - c1[t4];
ch[t4] = c1[t3] + c1[t4];
t3 += ido;
t4 += ido;
}
}
if (ido == 1) {
state = 132;
break;
}
if (nbd < l1) {
state = 128;
break;
}
t1 = 0;
t2 = ipp2 * t0;
for (j = 1; j < ipph; j++) {
t1 += t0;
t2 -= t0;
t3 = t1;
t4 = t2;
for (k = 0; k < l1; k++) {
t5 = t3;
t6 = t4;
for (i = 2; i < ido; i += 2) {
t5 += 2;
t6 += 2;
ch[t5 - 1] = c1[t5 - 1] - c1[t6];
ch[t6 - 1] = c1[t5 - 1] + c1[t6];
ch[t5] = c1[t5] + c1[t6 - 1];
ch[t6] = c1[t5] - c1[t6 - 1];
}
t3 += ido;
t4 += ido;
}
}
state = 132;
break;
case 128:
t1 = 0;
t2 = ipp2 * t0;
for (j = 1; j < ipph; j++) {
t1 += t0;
t2 -= t0;
t3 = t1;
t4 = t2;
for (i = 2; i < ido; i += 2) {
t3 += 2;
t4 += 2;
t5 = t3;
t6 = t4;
for (k = 0; k < l1; k++) {
ch[t5 - 1] = c1[t5 - 1] - c1[t6];
ch[t6 - 1] = c1[t5 - 1] + c1[t6];
ch[t5] = c1[t5] + c1[t6 - 1];
ch[t6] = c1[t5] - c1[t6 - 1];
t5 += ido;
t6 += ido;
}
}
}
case 132:
if (ido == 1)
return;
for (ik = 0; ik < idl1; ik++)
c2[ik] = ch2[ik];
t1 = 0;
for (j = 1; j < ip; j++) {
t2 = (t1 += t0);
for (k = 0; k < l1; k++) {
c1[t2] = ch[t2];
t2 += ido;
}
}
if (nbd > l1) {
state = 139;
break;
}
is = -ido - 1;
t1 = 0;
for (j = 1; j < ip; j++) {
is += ido;
t1 += t0;
idij = is;
t2 = t1;
for (i = 2; i < ido; i += 2) {
t2 += 2;
idij += 2;
t3 = t2;
for (k = 0; k < l1; k++) {
c1[t3 - 1] = wa[index + idij - 1] * ch[t3 - 1] - wa[index + idij] * ch[t3];
c1[t3] = wa[index + idij - 1] * ch[t3] + wa[index + idij] * ch[t3 - 1];
t3 += ido;
}
}
}
return;
case 139:
is = -ido - 1;
t1 = 0;
for (j = 1; j < ip; j++) {
is += ido;
t1 += t0;
t2 = t1;
for (k = 0; k < l1; k++) {
idij = is;
t3 = t2;
for (i = 2; i < ido; i += 2) {
idij += 2;
t3 += 2;
c1[t3 - 1] = wa[index + idij - 1] * ch[t3 - 1] - wa[index + idij] * ch[t3];
c1[t3] = wa[index + idij - 1] * ch[t3] + wa[index + idij] * ch[t3 - 1];
}
t2 += ido;
}
}
break loop;
}
}
}
static void drftb1(int n, float[] c, float[] ch, float[] wa, int index, int[] ifac) {
int i, k1, l1, l2 = 0;
int na;
int nf, ip = 0, iw, ix2, ix3, ido = 0, idl1 = 0;
nf = ifac[1];
na = 0;
l1 = 1;
iw = 1;
for (k1 = 0; k1 < nf; k1++) {
int state = 100;
loop: while (true) {
switch (state) {
case 100:
ip = ifac[k1 + 2];
l2 = ip * l1;
ido = n / l2;
idl1 = ido * l1;
if (ip != 4) {
state = 103;
break;
}
ix2 = iw + ido;
ix3 = ix2 + ido;
if (na != 0)
dradb4(ido, l1, ch, c, wa, index + iw - 1, wa, index + ix2 - 1, wa, index + ix3 - 1);
else
dradb4(ido, l1, c, ch, wa, index + iw - 1, wa, index + ix2 - 1, wa, index + ix3 - 1);
na = 1 - na;
state = 115;
break;
case 103:
if (ip != 2) {
state = 106;
break;
}
if (na != 0)
dradb2(ido, l1, ch, c, wa, index + iw - 1);
else
dradb2(ido, l1, c, ch, wa, index + iw - 1);
na = 1 - na;
state = 115;
break;
case 106:
if (ip != 3) {
state = 109;
break;
}
ix2 = iw + ido;
if (na != 0)
dradb3(ido, l1, ch, c, wa, index + iw - 1, wa, index + ix2 - 1);
else
dradb3(ido, l1, c, ch, wa, index + iw - 1, wa, index + ix2 - 1);
na = 1 - na;
state = 115;
break;
case 109:
if (na != 0)
dradbg(ido, ip, l1, idl1, ch, ch, ch, c, c, wa, index + iw - 1);
else
dradbg(ido, ip, l1, idl1, c, c, c, ch, ch, wa, index + iw - 1);
if (ido == 1)
na = 1 - na;
case 115:
l1 = l2;
iw += (ip - 1) * ido;
break loop;
}
}
}
if (na == 0)
return;
for (i = 0; i < n; i++)
c[i] = ch[i];
}
}