Spaces:
Build error
Build error
/* -*-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]; | |
} | |
} | |