home *** CD-ROM | disk | FTP | other *** search
- /* from fftpkg package in cmlib and netlib -- translated by f2c and modified */
- /* XLISP-STAT 2.1 Copyright (c) 1990, by Luke Tierney */
- /* Additions to Xlisp 2.1, Copyright (c) 1989 by David Michael Betz */
- /* You may give out copies of this software; for conditions see the */
- /* file COPYING included with this distribution. */
-
- #include "xlisp.h"
- #include "osdef.h"
- #ifdef ANSI
- #include "xlsproto.h"
- #else
- #include "xlsfun.h"
- #endif ANSI
-
- /* forward declarations */
- #ifdef ANSI
- int cfft1_(int *,double *,double *,double *,double *,int *),
- cffti1_(int *,double *,double *),
- pass_(int *,int *,int *,int *,int *,double *,double *,double *,double *,
- double *,double *,int *),
- pass2_(int *,int *,double *,double *,double *,int *),
- pass3_(int *,int *,double *,double *,double *,double *,int *),
- pass4_(int *,int *,double *,double *,double *,double *,double *,int *),
- pass5_(int *,int *,double *,double *,double *,double *,double *,double *,int *);
- #else
- int cfft1_(),cffti1_(),pass_(),pass2_(),pass3_(),pass4_(), pass5_();
- #endif
-
- /*
- Public Routine
- */
-
- /*
- * cfft computes the forward or backward complex discrete fourier transform.
- *
- * Input Parameters:
- *
- * n The length of the complex sequence c. The method is
- * more efficient when n is the product of small primes.
- *
- * c A complex array of length n which contains the sequence
- *
- * wsave a real work array which must be dimensioned at least 4n+15
- * in the program that calls cfft.
- * isign 1 for transform, -1 for inverse transform.
- * A call of cfft with isign = 1 followed by a call of cfft with
- * isign = -1 will multiply the sequence by n.
- *
- * Output Parameters:
- *
- * c For j=1,...,n
- *
- * c(j)=the sum from k=1,...,n of
- *
- * c(k)*exp(-isign*i*(j-1)*(k-1)*2*pi/n)
- *
- * where i=sqrt(-1)
- */
-
- int cfft(n, c, wsave, isign)
- int n;
- double *c, *wsave;
- int isign;
- {
- int iw1, iw2;
-
- /* Parameter adjustments */
- --c;
- --wsave;
-
- /* Function Body */
- if (n != 1) {
- iw1 = n + n + 1;
- iw2 = iw1 + n + n;
- cffti1_(&n, &wsave[iw1], &wsave[iw2]);
- cfft1_(&n, &c[1], &wsave[1], &wsave[iw1], &wsave[iw2], &isign);
- }
- return 0;
- }
-
- /*
- Internal Routines
- */
-
- static int cfft1_(n, c, ch, wa, ifac, isign)
- int *n;
- double *c, *ch, *wa, *ifac; /* changed JKL */
- /* int *ifac; seems to be an error JKL */
- int *isign;
- {
- /* System generated locals */
- int i_1;
-
- /* Local variables */
- int idot;
- int i, k1, l1, l2, n2, na, nf, ip, iw, ix2, ix3, ix4, nac, ido, idl1;
-
- /* Parameter adjustments */
- --c;
- --ch;
- --wa;
- --ifac;
-
- /* Function Body */
- nf = ifac[2];
- na = 0;
- l1 = 1;
- iw = 1;
- i_1 = nf;
- for (k1 = 1; k1 <= i_1; ++k1) {
- ip = ifac[k1 + 2];
- l2 = ip * l1;
- ido = *n / l2;
- idot = ido + ido;
- idl1 = idot * l1;
- if (ip == 4) {
- ix2 = iw + idot;
- ix3 = ix2 + idot;
- if (na == 0) {
- pass4_(&idot, &l1, &c[1], &ch[1], &wa[iw], &wa[ix2], &wa[ix3], isign);
- }
- else {
- pass4_(&idot, &l1, &ch[1], &c[1], &wa[iw], &wa[ix2], &wa[ix3], isign);
- }
- na = 1 - na;
- }
- else if (ip == 2) {
- if (na == 0) {
- pass2_(&idot, &l1, &c[1], &ch[1], &wa[iw], isign);
- }
- else {
- pass2_(&idot, &l1, &ch[1], &c[1], &wa[iw], isign);
- }
- na = 1 - na;
- }
- else if (ip == 3) {
- ix2 = iw + idot;
- if (na == 0) {
- pass3_(&idot, &l1, &c[1], &ch[1], &wa[iw], &wa[ix2], isign);
- }
- else {
- pass3_(&idot, &l1, &ch[1], &c[1], &wa[iw], &wa[ix2], isign);
- }
- na = 1 - na;
- }
- else if (ip == 5) {
- ix2 = iw + idot;
- ix3 = ix2 + idot;
- ix4 = ix3 + idot;
- if (na == 0) {
- pass5_(&idot, &l1, &c[1], &ch[1], &wa[iw], &wa[ix2], &wa[ix3],
- &wa[ix4], isign);
- }
- else {
- pass5_(&idot, &l1, &ch[1], &c[1], &wa[iw], &wa[ix2], &wa[ix3],
- &wa[ix4], isign);
- }
- na = 1 - na;
- }
- else {
- if (na == 0) {
- pass_(&nac, &idot, &ip, &l1, &idl1, &c[1], &c[1], &c[1], &ch[1],
- &ch[1], &wa[iw], isign);
- }
- else {
- pass_(&nac, &idot, &ip, &l1, &idl1, &ch[1], &ch[1], &ch[1], &c[1],
- &c[1], &wa[iw], isign);
- }
- if (nac != 0) {
- na = 1 - na;
- }
- }
- l1 = l2;
- iw += (ip - 1) * idot;
- }
- if (na != 0) {
- n2 = *n + *n;
- i_1 = n2;
- for (i = 1; i <= i_1; ++i) {
- c[i] = ch[i];
- }
- }
- return 0;
- }
-
- static int cffti1_(n, wa, ifac)
- int *n;
- double *wa, *ifac;
- /* int *ifac; seems to be an error JKL */
- {
- /* Initialized data */
- static int ntryh[4] = { 3,4,2,5 };
-
- /* System generated locals */
- int i_1, i_2, i_3;
-
- /* Local variables */
- double argh;
- int idot, ntry, i, j;
- double argld;
- int i1, k1, l1, l2, ib;
- double fi;
- int ld, ii, nf, ip, nl, nq, nr;
- double arg;
- int ido, ipm;
- double tpi;
-
- /* Parameter adjustments */
- --wa;
- --ifac;
-
- /* Function Body */
- nl = *n;
- nf = 0;
- j = 0;
-
- L101:
- ++j;
- if (j - 4 <= 0) ntry = ntryh[j - 1];
- else ntry += 2;
- L104:
- nq = nl / ntry;
- nr = nl - ntry * nq;
- if (nr != 0) goto L101;
- ++nf;
- ifac[nf + 2] = ntry;
- nl = nq;
- if (ntry == 2 && nf != 1) {
- i_1 = nf;
- for (i = 2; i <= i_1; ++i) {
- ib = nf - i + 2;
- ifac[ib + 2] = ifac[ib + 1];
- }
- ifac[3] = 2;
- }
- if (nl != 1) goto L104;
-
- ifac[1] = *n;
- ifac[2] = nf;
- tpi = 6.28318530717959;
- argh = tpi / (double) (*n);
- i = 2;
- l1 = 1;
- i_1 = nf;
- for (k1 = 1; k1 <= i_1; ++k1) {
- ip = ifac[k1 + 2];
- ld = 0;
- l2 = l1 * ip;
- ido = *n / l2;
- idot = ido + ido + 2;
- ipm = ip - 1;
- i_2 = ipm;
- for (j = 1; j <= i_2; ++j) {
- i1 = i;
- wa[i - 1] = 1.0;
- wa[i] = 0.0;
- ld += l1;
- fi = 0.0;
- argld = (double) ld * argh;
- i_3 = idot;
- for (ii = 4; ii <= i_3; ii += 2) {
- i += 2;
- fi += 1.0;
- arg = fi * argld;
- wa[i - 1] = cos(arg);
- wa[i] = sin(arg);
- }
- if (ip > 5) {
- wa[i1 - 1] = wa[i - 1];
- wa[i1] = wa[i];
- }
- }
- l1 = l2;
- }
- return 0;
- }
-
- static int pass_(nac, ido, ip, l1, idl1, cc, c1, c2, ch, ch2, wa, isign)
- int *nac;
- int *ido, *ip, *l1, *idl1;
- double *cc, *c1, *c2, *ch, *ch2, *wa;
- int *isign;
- {
- /* System generated locals */
- int ch_dim1, ch_dim2, ch_offset, cc_dim1, cc_dim2, cc_offset, c1_dim1,
- c1_dim2, c1_offset, c2_dim1, c2_offset, ch2_dim1, ch2_offset,
- i_1, i_2, i_3;
-
- /* Local variables */
- int idij, idlj, idot, ipph, i, j, k, l, jc, lc, ik, idj, idl, inc, idp;
- double wai, war;
- int ipp2;
-
- /* Parameter adjustments */
- cc_dim1 = *ido;
- cc_dim2 = *ip;
- cc_offset = cc_dim1 * (cc_dim2 + 1) + 1;
- cc -= cc_offset;
- c1_dim1 = *ido;
- c1_dim2 = *l1;
- c1_offset = c1_dim1 * (c1_dim2 + 1) + 1;
- c1 -= c1_offset;
- c2_dim1 = *idl1;
- c2_offset = c2_dim1 + 1;
- c2 -= c2_offset;
- ch_dim1 = *ido;
- ch_dim2 = *l1;
- ch_offset = ch_dim1 * (ch_dim2 + 1) + 1;
- ch -= ch_offset;
- ch2_dim1 = *idl1;
- ch2_offset = ch2_dim1 + 1;
- ch2 -= ch2_offset;
- --wa;
-
- /* Function Body */
- idot = *ido / 2;
- ipp2 = *ip + 2;
- ipph = (*ip + 1) / 2;
- idp = *ip * *ido;
-
- if (*ido >= *l1) {
- i_1 = ipph;
- for (j = 2; j <= i_1; ++j) {
- jc = ipp2 - j;
- i_2 = *l1;
- for (k = 1; k <= i_2; ++k) {
- i_3 = *ido;
- for (i = 1; i <= i_3; ++i) {
- ch[i + (k + j * ch_dim2) * ch_dim1] =
- cc[i + (j + k * cc_dim2) * cc_dim1]
- + cc[i + (jc + k * cc_dim2) * cc_dim1];
- ch[i + (k + jc * ch_dim2) * ch_dim1] =
- cc[i + (j + k * cc_dim2) * cc_dim1]
- - cc[i + (jc + k * cc_dim2) * cc_dim1];
- }
- }
- }
- i_1 = *l1;
- for (k = 1; k <= i_1; ++k) {
- i_2 = *ido;
- for (i = 1; i <= i_2; ++i) {
- ch[i + (k + ch_dim2) * ch_dim1] = cc[i + (k * cc_dim2 + 1) * cc_dim1];
- }
- }
- }
- else {
- i_1 = ipph;
- for (j = 2; j <= i_1; ++j) {
- jc = ipp2 - j;
- i_2 = *ido;
- for (i = 1; i <= i_2; ++i) {
- i_3 = *l1;
- for (k = 1; k <= i_3; ++k) {
- ch[i + (k + j * ch_dim2) * ch_dim1] =
- cc[i + (j + k * cc_dim2) * cc_dim1]
- + cc[i + (jc + k * cc_dim2) * cc_dim1];
- ch[i + (k + jc * ch_dim2) * ch_dim1] =
- cc[i + (j + k * cc_dim2) * cc_dim1]
- - cc[i + (jc + k * cc_dim2) * cc_dim1];
- }
- }
- }
- i_1 = *ido;
- for (i = 1; i <= i_1; ++i) {
- i_2 = *l1;
- for (k = 1; k <= i_2; ++k) {
- ch[i + (k + ch_dim2) * ch_dim1] = cc[i + (k * cc_dim2 + 1) * cc_dim1];
- }
- }
- }
- idl = 2 - *ido;
- inc = 0;
- i_1 = ipph;
- for (l = 2; l <= i_1; ++l) {
- lc = ipp2 - l;
- idl += *ido;
- i_2 = *idl1;
- for (ik = 1; ik <= i_2; ++ik) {
- c2[ik + l * c2_dim1] = ch2[ik + ch2_dim1] + wa[idl - 1]
- * ch2[ik + (ch2_dim1 << 1)];
- c2[ik + lc * c2_dim1] = - *isign * wa[idl] * ch2[ik + *ip * ch2_dim1];
- }
- idlj = idl;
- inc += *ido;
- i_2 = ipph;
- for (j = 3; j <= i_2; ++j) {
- jc = ipp2 - j;
- idlj += inc;
- if (idlj > idp) {
- idlj -= idp;
- }
- war = wa[idlj - 1];
- wai = wa[idlj];
- i_3 = *idl1;
- for (ik = 1; ik <= i_3; ++ik) {
- c2[ik + l * c2_dim1] += war * ch2[ik + j * ch2_dim1];
- c2[ik + lc * c2_dim1] -= *isign * wai * ch2[ik + jc * ch2_dim1];
- }
- }
- }
- i_1 = ipph;
- for (j = 2; j <= i_1; ++j) {
- i_2 = *idl1;
- for (ik = 1; ik <= i_2; ++ik) {
- ch2[ik + ch2_dim1] += ch2[ik + j * ch2_dim1];
- }
- }
- i_1 = ipph;
- for (j = 2; j <= i_1; ++j) {
- jc = ipp2 - j;
- i_2 = *idl1;
- for (ik = 2; ik <= i_2; ik += 2) {
- ch2[ik - 1 + j * ch2_dim1] = c2[ik - 1 + j * c2_dim1]
- - c2[ik + jc * c2_dim1];
- ch2[ik - 1 + jc * ch2_dim1] = c2[ik - 1 + j * c2_dim1]
- + c2[ik + jc * c2_dim1];
- ch2[ik + j * ch2_dim1] = c2[ik + j * c2_dim1]
- + c2[ik - 1 + jc * c2_dim1];
- ch2[ik + jc * ch2_dim1] = c2[ik + j * c2_dim1]
- - c2[ik - 1 + jc * c2_dim1];
- }
- }
- *nac = 1;
- if (*ido != 2) {
- *nac = 0;
- i_1 = *idl1;
- for (ik = 1; ik <= i_1; ++ik) {
- c2[ik + c2_dim1] = ch2[ik + ch2_dim1];
- }
- i_1 = *ip;
- for (j = 2; j <= i_1; ++j) {
- i_2 = *l1;
- for (k = 1; k <= i_2; ++k) {
- c1[(k + j * c1_dim2) * c1_dim1 + 1] =
- ch[(k + j * ch_dim2) * ch_dim1 + 1];
- c1[(k + j * c1_dim2) * c1_dim1 + 2] =
- ch[(k + j * ch_dim2) * ch_dim1 + 2];
- }
- }
- if (idot <= *l1) {
- idij = 0;
- i_1 = *ip;
- for (j = 2; j <= i_1; ++j) {
- idij += 2;
- i_2 = *ido;
- for (i = 4; i <= i_2; i += 2) {
- idij += 2;
- i_3 = *l1;
- for (k = 1; k <= i_3; ++k) {
- c1[i - 1 + (k + j * c1_dim2) * c1_dim1] = wa[idij - 1]
- * ch[i - 1 + (k + j * ch_dim2) * ch_dim1] + *isign * wa[idij]
- * ch[i + (k + j * ch_dim2) * ch_dim1];
- c1[i + (k + j * c1_dim2) * c1_dim1] = wa[idij - 1]
- * ch[i + (k + j * ch_dim2) * ch_dim1] - *isign * wa[idij]
- * ch[i - 1 + (k + j * ch_dim2) * ch_dim1];
- }
- }
- }
- }
- else {
- idj = 2 - *ido;
- i_1 = *ip;
- for (j = 2; j <= i_1; ++j) {
- idj += *ido;
- i_2 = *l1;
- for (k = 1; k <= i_2; ++k) {
- idij = idj;
- i_3 = *ido;
- for (i = 4; i <= i_3; i += 2) {
- idij += 2;
- c1[i - 1 + (k + j * c1_dim2) * c1_dim1] = wa[idij - 1]
- * ch[i - 1 + (k + j * ch_dim2) * ch_dim1]
- + *isign * wa[idij] * ch[i + (k + j * ch_dim2) * ch_dim1];
- c1[i + (k + j * c1_dim2) * c1_dim1] = wa[idij - 1]
- * ch[i + (k + j * ch_dim2) * ch_dim1] - *isign * wa[idij]
- * ch[i - 1 + (k + j * ch_dim2) * ch_dim1];
- }
- }
- }
- }
- }
- return 0;
- }
-
- static int pass2_(ido, l1, cc, ch, wa1, isign)
- int *ido, *l1;
- double *cc, *ch, *wa1;
- int *isign;
- {
- /* System generated locals */
- int cc_dim1, cc_offset, ch_dim1, ch_dim2, ch_offset, i_1, i_2;
-
- /* Local variables */
- int i, k;
- double ti2, tr2;
-
- /* Parameter adjustments */
- cc_dim1 = *ido;
- cc_offset = cc_dim1 * 3 + 1;
- cc -= cc_offset;
- ch_dim1 = *ido;
- ch_dim2 = *l1;
- ch_offset = ch_dim1 * (ch_dim2 + 1) + 1;
- ch -= ch_offset;
- --wa1;
-
- /* Function Body */
- if (*ido <= 2) {
- i_1 = *l1;
- for (k = 1; k <= i_1; ++k) {
- ch[(k + ch_dim2) * ch_dim1 + 1] = cc[((k << 1) + 1) * cc_dim1 + 1]
- + cc[((k << 1) + 2) * cc_dim1 + 1];
- ch[(k + (ch_dim2 << 1)) * ch_dim1 + 1] = cc[((k << 1) + 1) * cc_dim1 + 1]
- - cc[((k << 1) + 2) * cc_dim1 + 1];
- ch[(k + ch_dim2) * ch_dim1 + 2] = cc[((k << 1) + 1) * cc_dim1 + 2]
- + cc[((k << 1) + 2) * cc_dim1 + 2];
- ch[(k + (ch_dim2 << 1)) * ch_dim1 + 2] = cc[((k << 1) + 1) * cc_dim1 + 2]
- - cc[((k << 1) + 2) * cc_dim1 + 2];
- }
- }
- else {
- i_1 = *l1;
- for (k = 1; k <= i_1; ++k) {
- i_2 = *ido;
- for (i = 2; i <= i_2; i += 2) {
- ch[i - 1 + (k + ch_dim2) * ch_dim1]
- = cc[i - 1 + ((k << 1) + 1) * cc_dim1]
- + cc[i - 1 + ((k << 1) + 2) * cc_dim1];
- tr2 = cc[i - 1 + ((k << 1) + 1) * cc_dim1]
- - cc[i - 1 + ((k << 1) + 2) * cc_dim1];
- ch[i + (k + ch_dim2) * ch_dim1] = cc[i + ((k << 1) + 1) * cc_dim1]
- + cc[i + ((k << 1) + 2) * cc_dim1];
- ti2 = cc[i + ((k << 1) + 1) * cc_dim1]
- - cc[i + ((k << 1) + 2) * cc_dim1];
- ch[i + (k + (ch_dim2 << 1)) * ch_dim1] = wa1[i - 1] * ti2
- - *isign * wa1[i] * tr2;
- ch[i - 1 + (k + (ch_dim2 << 1)) * ch_dim1] = wa1[i - 1] * tr2
- + *isign * wa1[i] * ti2;
- }
- }
- }
- return 0;
- }
-
- static int pass3_(ido, l1, cc, ch, wa1, wa2, isign)
- int *ido, *l1;
- double *cc, *ch, *wa1, *wa2;
- int *isign;
- {
- /* System generated locals */
- int cc_dim1, cc_offset, ch_dim1, ch_dim2, ch_offset, i_1, i_2;
-
- /* Local variables */
- double taui, taur;
- int i, k;
- double ci2, ci3, di2, di3, cr2, cr3, dr2, dr3, ti2, tr2;
-
- /* Parameter adjustments */
- cc_dim1 = *ido;
- cc_offset = (cc_dim1 << 2) + 1;
- cc -= cc_offset;
- ch_dim1 = *ido;
- ch_dim2 = *l1;
- ch_offset = ch_dim1 * (ch_dim2 + 1) + 1;
- ch -= ch_offset;
- --wa1;
- --wa2;
-
- /* Function Body */
- taur = -.5;
- taui = -(*isign) * .866025403784439;
- if (*ido == 2) {
- i_1 = *l1;
- for (k = 1; k <= i_1; ++k) {
- tr2 = cc[(k * 3 + 2) * cc_dim1 + 1] + cc[(k * 3 + 3) * cc_dim1 + 1];
- cr2 = cc[(k * 3 + 1) * cc_dim1 + 1] + taur * tr2;
- ch[(k + ch_dim2) * ch_dim1 + 1] = cc[(k * 3 + 1) * cc_dim1 + 1] + tr2;
- ti2 = cc[(k * 3 + 2) * cc_dim1 + 2] + cc[(k * 3 + 3) * cc_dim1 + 2];
- ci2 = cc[(k * 3 + 1) * cc_dim1 + 2] + taur * ti2;
- ch[(k + ch_dim2) * ch_dim1 + 2] = cc[(k * 3 + 1) * cc_dim1 + 2] + ti2;
- cr3 = taui * (cc[(k * 3 + 2) * cc_dim1 + 1]
- - cc[(k * 3 + 3) * cc_dim1 + 1]);
- ci3 = taui * (cc[(k * 3 + 2) * cc_dim1 + 2]
- - cc[(k * 3 + 3) * cc_dim1 + 2]);
- ch[(k + (ch_dim2 << 1)) * ch_dim1 + 1] = cr2 - ci3;
- ch[(k + ch_dim2 * 3) * ch_dim1 + 1] = cr2 + ci3;
- ch[(k + (ch_dim2 << 1)) * ch_dim1 + 2] = ci2 + cr3;
- ch[(k + ch_dim2 * 3) * ch_dim1 + 2] = ci2 - cr3;
- }
- }
- else {
- i_1 = *l1;
- for (k = 1; k <= i_1; ++k) {
- i_2 = *ido;
- for (i = 2; i <= i_2; i += 2) {
- tr2 = cc[i - 1 + (k * 3 + 2) * cc_dim1]
- + cc[i - 1 + (k * 3 + 3) * cc_dim1];
- cr2 = cc[i - 1 + (k * 3 + 1) * cc_dim1] + taur * tr2;
- ch[i - 1 + (k + ch_dim2) * ch_dim1] = cc[i - 1 + (k * 3 + 1)
- * cc_dim1] + tr2;
- ti2 = cc[i + (k * 3 + 2) * cc_dim1] + cc[i + (k * 3 + 3) * cc_dim1];
- ci2 = cc[i + (k * 3 + 1) * cc_dim1] + taur * ti2;
- ch[i + (k + ch_dim2) * ch_dim1] = cc[i + (k * 3 + 1) * cc_dim1] + ti2;
- cr3 = taui * (cc[i - 1 + (k * 3 + 2) * cc_dim1]
- - cc[i - 1 + (k * 3 + 3) * cc_dim1]);
- ci3 = taui * (cc[i + (k * 3 + 2) * cc_dim1]
- - cc[i + (k * 3 + 3) * cc_dim1]);
- dr2 = cr2 - ci3;
- dr3 = cr2 + ci3;
- di2 = ci2 + cr3;
- di3 = ci2 - cr3;
- ch[i + (k + (ch_dim2 << 1)) * ch_dim1] = wa1[i - 1] * di2
- - *isign * wa1[i] * dr2;
- ch[i - 1 + (k + (ch_dim2 << 1)) * ch_dim1] = wa1[i - 1] * dr2
- + *isign * wa1[i] * di2;
- ch[i + (k + ch_dim2 * 3) * ch_dim1] = wa2[i - 1] * di3
- - *isign * wa2[i] * dr3;
- ch[i - 1 + (k + ch_dim2 * 3) * ch_dim1] = wa2[i - 1] * dr3
- + *isign * wa2[i] * di3;
- }
- }
- }
- return 0;
- }
-
- static int pass4_(ido, l1, cc, ch, wa1, wa2, wa3, isign)
- int *ido, *l1;
- double *cc, *ch, *wa1, *wa2, *wa3;
- int *isign;
- {
- /* System generated locals */
- int cc_dim1, cc_offset, ch_dim1, ch_dim2, ch_offset, i_1, i_2;
-
- /* Local variables */
- int i, k;
- double ci2, ci3, ci4, cr2, cr3, cr4, ti1, ti2, ti3, ti4, tr1, tr2, tr3, tr4;
-
- /* Parameter adjustments */
- cc_dim1 = *ido;
- cc_offset = cc_dim1 * 5 + 1;
- cc -= cc_offset;
- ch_dim1 = *ido;
- ch_dim2 = *l1;
- ch_offset = ch_dim1 * (ch_dim2 + 1) + 1;
- ch -= ch_offset;
- --wa1;
- --wa2;
- --wa3;
-
- /* Function Body */
- if (*ido == 2) {
- i_1 = *l1;
- for (k = 1; k <= i_1; ++k) {
- ti1 = cc[((k << 2) + 1) * cc_dim1 + 2]
- - cc[((k << 2) + 3) * cc_dim1 + 2];
- ti2 = cc[((k << 2) + 1) * cc_dim1 + 2]
- + cc[((k << 2) + 3) * cc_dim1 + 2];
- tr4 = *isign * (cc[((k << 2) + 2) * cc_dim1 + 2]
- - cc[((k << 2) + 4) * cc_dim1 + 2]);
- ti3 = cc[((k << 2) + 2) * cc_dim1 + 2]
- + cc[((k << 2) + 4) * cc_dim1 + 2];
- tr1 = cc[((k << 2) + 1) * cc_dim1 + 1]
- - cc[((k << 2) + 3) * cc_dim1 + 1];
- tr2 = cc[((k << 2) + 1) * cc_dim1 + 1]
- + cc[((k << 2) + 3) * cc_dim1 + 1];
- ti4 = *isign * (cc[((k << 2) + 4) * cc_dim1 + 1]
- - cc[((k << 2) + 2) * cc_dim1 + 1]);
- tr3 = cc[((k << 2) + 2) * cc_dim1 + 1]
- + cc[((k << 2) + 4) * cc_dim1 + 1];
- ch[(k + ch_dim2) * ch_dim1 + 1] = tr2 + tr3;
- ch[(k + ch_dim2 * 3) * ch_dim1 + 1] = tr2 - tr3;
- ch[(k + ch_dim2) * ch_dim1 + 2] = ti2 + ti3;
- ch[(k + ch_dim2 * 3) * ch_dim1 + 2] = ti2 - ti3;
- ch[(k + (ch_dim2 << 1)) * ch_dim1 + 1] = tr1 + tr4;
- ch[(k + (ch_dim2 << 2)) * ch_dim1 + 1] = tr1 - tr4;
- ch[(k + (ch_dim2 << 1)) * ch_dim1 + 2] = ti1 + ti4;
- ch[(k + (ch_dim2 << 2)) * ch_dim1 + 2] = ti1 - ti4;
- }
- }
- else {
- i_1 = *l1;
- for (k = 1; k <= i_1; ++k) {
- i_2 = *ido;
- for (i = 2; i <= i_2; i += 2) {
- ti1 = cc[i + ((k << 2) + 1) * cc_dim1]
- - cc[i + ((k << 2) + 3) * cc_dim1];
- ti2 = cc[i + ((k << 2) + 1) * cc_dim1]
- + cc[i + ((k << 2) + 3) * cc_dim1];
- ti3 = cc[i + ((k << 2) + 2) * cc_dim1]
- + cc[i + ((k << 2) + 4) * cc_dim1];
- tr4 = *isign * (cc[i + ((k << 2) + 2) * cc_dim1]
- - cc[i + ((k << 2) + 4) * cc_dim1]);
- tr1 = cc[i - 1 + ((k << 2) + 1) * cc_dim1]
- - cc[i - 1 + ((k << 2) + 3) * cc_dim1];
- tr2 = cc[i - 1 + ((k << 2) + 1) * cc_dim1]
- + cc[i - 1 + ((k << 2) + 3) * cc_dim1];
- ti4 = *isign * (cc[i - 1 + ((k << 2) + 4) * cc_dim1]
- - cc[i - 1 + ((k << 2) + 2) * cc_dim1]);
- tr3 = cc[i - 1 + ((k << 2) + 2) * cc_dim1]
- + cc[i - 1 + ((k << 2) + 4) * cc_dim1];
- ch[i - 1 + (k + ch_dim2) * ch_dim1] = tr2 + tr3;
- cr3 = tr2 - tr3;
- ch[i + (k + ch_dim2) * ch_dim1] = ti2 + ti3;
- ci3 = ti2 - ti3;
- cr2 = tr1 + tr4;
- cr4 = tr1 - tr4;
- ci2 = ti1 + ti4;
- ci4 = ti1 - ti4;
- ch[i - 1 + (k + (ch_dim2 << 1)) * ch_dim1] = wa1[i - 1] * cr2
- + *isign * wa1[i] * ci2;
- ch[i + (k + (ch_dim2 << 1)) * ch_dim1] = wa1[i - 1] * ci2
- - *isign * wa1[i] * cr2;
- ch[i - 1 + (k + ch_dim2 * 3) * ch_dim1] = wa2[i - 1] * cr3
- + *isign * wa2[i] * ci3;
- ch[i + (k + ch_dim2 * 3) * ch_dim1] = wa2[i - 1] * ci3
- - *isign * wa2[i] * cr3;
- ch[i - 1 + (k + (ch_dim2 << 2)) * ch_dim1] = wa3[i - 1] * cr4
- + *isign * wa3[i] * ci4;
- ch[i + (k + (ch_dim2 << 2)) * ch_dim1] = wa3[i - 1] * ci4
- - *isign * wa3[i] * cr4;
- }
- }
- }
- return 0;
- }
-
- static int pass5_(ido, l1, cc, ch, wa1, wa2, wa3, wa4, isign)
- int *ido, *l1;
- double *cc, *ch, *wa1, *wa2, *wa3, *wa4;
- int *isign;
- {
- /* System generated locals */
- int cc_dim1, cc_offset, ch_dim1, ch_dim2, ch_offset, i_1, i_2;
-
- /* Local variables */
- int i, k;
- double ci2, ci3, ci4, ci5, di3, di4, di5, di2, cr2, cr3, cr5, cr4, ti2, ti3,
- ti4, ti5, dr3, dr4, dr5, dr2, tr2, tr3, tr4, tr5, ti11, ti12, tr11,
- tr12;
-
- /* Parameter adjustments */
- cc_dim1 = *ido;
- cc_offset = cc_dim1 * 6 + 1;
- cc -= cc_offset;
- ch_dim1 = *ido;
- ch_dim2 = *l1;
- ch_offset = ch_dim1 * (ch_dim2 + 1) + 1;
- ch -= ch_offset;
- --wa1;
- --wa2;
- --wa3;
- --wa4;
-
- /* Function Body */
- tr11 = .309016994374947;
- ti11 = -(*isign) * .951056516295154;
- tr12 = -.809016994374947;
- ti12 = -(*isign) * .587785252292473;
- if (*ido == 2) {
- i_1 = *l1;
- for (k = 1; k <= i_1; ++k) {
- ti5 = cc[(k * 5 + 2) * cc_dim1 + 2] - cc[(k * 5 + 5) * cc_dim1 + 2];
- ti2 = cc[(k * 5 + 2) * cc_dim1 + 2] + cc[(k * 5 + 5) * cc_dim1 + 2];
- ti4 = cc[(k * 5 + 3) * cc_dim1 + 2] - cc[(k * 5 + 4) * cc_dim1 + 2];
- ti3 = cc[(k * 5 + 3) * cc_dim1 + 2] + cc[(k * 5 + 4) * cc_dim1 + 2];
- tr5 = cc[(k * 5 + 2) * cc_dim1 + 1] - cc[(k * 5 + 5) * cc_dim1 + 1];
- tr2 = cc[(k * 5 + 2) * cc_dim1 + 1] + cc[(k * 5 + 5) * cc_dim1 + 1];
- tr4 = cc[(k * 5 + 3) * cc_dim1 + 1] - cc[(k * 5 + 4) * cc_dim1 + 1];
- tr3 = cc[(k * 5 + 3) * cc_dim1 + 1] + cc[(k * 5 + 4) * cc_dim1 + 1];
- ch[(k + ch_dim2) * ch_dim1 + 1] = cc[(k * 5 + 1) * cc_dim1 + 1]
- + tr2 + tr3;
- ch[(k + ch_dim2) * ch_dim1 + 2] = cc[(k * 5 + 1) * cc_dim1 + 2]
- + ti2 + ti3;
- cr2 = cc[(k * 5 + 1) * cc_dim1 + 1] + tr11 * tr2 + tr12 * tr3;
- ci2 = cc[(k * 5 + 1) * cc_dim1 + 2] + tr11 * ti2 + tr12 * ti3;
- cr3 = cc[(k * 5 + 1) * cc_dim1 + 1] + tr12 * tr2 + tr11 * tr3;
- ci3 = cc[(k * 5 + 1) * cc_dim1 + 2] + tr12 * ti2 + tr11 * ti3;
- cr5 = ti11 * tr5 + ti12 * tr4;
- ci5 = ti11 * ti5 + ti12 * ti4;
- cr4 = ti12 * tr5 - ti11 * tr4;
- ci4 = ti12 * ti5 - ti11 * ti4;
- ch[(k + (ch_dim2 << 1)) * ch_dim1 + 1] = cr2 - ci5;
- ch[(k + ch_dim2 * 5) * ch_dim1 + 1] = cr2 + ci5;
- ch[(k + (ch_dim2 << 1)) * ch_dim1 + 2] = ci2 + cr5;
- ch[(k + ch_dim2 * 3) * ch_dim1 + 2] = ci3 + cr4;
- ch[(k + ch_dim2 * 3) * ch_dim1 + 1] = cr3 - ci4;
- ch[(k + (ch_dim2 << 2)) * ch_dim1 + 1] = cr3 + ci4;
- ch[(k + (ch_dim2 << 2)) * ch_dim1 + 2] = ci3 - cr4;
- ch[(k + ch_dim2 * 5) * ch_dim1 + 2] = ci2 - cr5;
- }
- }
- else {
- i_1 = *l1;
- for (k = 1; k <= i_1; ++k) {
- i_2 = *ido;
- for (i = 2; i <= i_2; i += 2) {
- ti5 = cc[i + (k * 5 + 2) * cc_dim1] - cc[i + (k * 5 + 5) * cc_dim1];
- ti2 = cc[i + (k * 5 + 2) * cc_dim1] + cc[i + (k * 5 + 5) * cc_dim1];
- ti4 = cc[i + (k * 5 + 3) * cc_dim1] - cc[i + (k * 5 + 4) * cc_dim1];
- ti3 = cc[i + (k * 5 + 3) * cc_dim1] + cc[i + (k * 5 + 4) * cc_dim1];
- tr5 = cc[i - 1 + (k * 5 + 2) * cc_dim1]
- - cc[i - 1 + (k * 5 + 5) * cc_dim1];
- tr2 = cc[i - 1 + (k * 5 + 2) * cc_dim1]
- + cc[i - 1 + (k * 5 + 5) * cc_dim1];
- tr4 = cc[i - 1 + (k * 5 + 3) * cc_dim1]
- - cc[i - 1 + (k * 5 + 4) * cc_dim1];
- tr3 = cc[i - 1 + (k * 5 + 3) * cc_dim1]
- + cc[i - 1 + (k * 5 + 4) * cc_dim1];
- ch[i - 1 + (k + ch_dim2) * ch_dim1] = cc[i - 1 + (k * 5 + 1)
- * cc_dim1] + tr2 + tr3;
- ch[i + (k + ch_dim2) * ch_dim1] = cc[i + (k * 5 + 1)
- * cc_dim1] + ti2 + ti3;
- cr2 = cc[i - 1 + (k * 5 + 1) * cc_dim1] + tr11 * tr2 + tr12 * tr3;
- ci2 = cc[i + (k * 5 + 1) * cc_dim1] + tr11 * ti2 + tr12 * ti3;
-
- cr3 = cc[i - 1 + (k * 5 + 1) * cc_dim1] + tr12 * tr2 + tr11 * tr3;
- ci3 = cc[i + (k * 5 + 1) * cc_dim1] + tr12 * ti2 + tr11 * ti3;
-
- cr5 = ti11 * tr5 + ti12 * tr4;
- ci5 = ti11 * ti5 + ti12 * ti4;
- cr4 = ti12 * tr5 - ti11 * tr4;
- ci4 = ti12 * ti5 - ti11 * ti4;
- dr3 = cr3 - ci4;
- dr4 = cr3 + ci4;
- di3 = ci3 + cr4;
- di4 = ci3 - cr4;
- dr5 = cr2 + ci5;
- dr2 = cr2 - ci5;
- di5 = ci2 - cr5;
- di2 = ci2 + cr5;
- ch[i - 1 + (k + (ch_dim2 << 1)) * ch_dim1] = wa1[i - 1] * dr2
- + *isign * wa1[i] * di2;
- ch[i + (k + (ch_dim2 << 1)) * ch_dim1] = wa1[i - 1] * di2
- - *isign * wa1[i] * dr2;
- ch[i - 1 + (k + ch_dim2 * 3) * ch_dim1] = wa2[i - 1] * dr3
- + *isign * wa2[i] * di3;
- ch[i + (k + ch_dim2 * 3) * ch_dim1] = wa2[i - 1] * di3
- - *isign * wa2[i] * dr3;
- ch[i - 1 + (k + (ch_dim2 << 2)) * ch_dim1] = wa3[i - 1] * dr4
- + *isign * wa3[i] * di4;
- ch[i + (k + (ch_dim2 << 2)) * ch_dim1] = wa3[i - 1] * di4
- - *isign * wa3[i] * dr4;
- ch[i - 1 + (k + ch_dim2 * 5) * ch_dim1] = wa4[i - 1] * dr5
- + *isign * wa4[i] * di5;
- ch[i + (k + ch_dim2 * 5) * ch_dim1] = wa4[i - 1] * di5
- - *isign * wa4[i] * dr5;
- }
- }
- }
- return 0;
- }
-