📄 fft.cpp
字号:
ch[i__ + (k + j * ch_dim2) * ch_dim1] = c1[i__ + (k + j *
c1_dim2) * c1_dim1] + c1[i__ - 1 + (k + jc * c1_dim2)
* c1_dim1];
ch[i__ + (k + jc * ch_dim2) * ch_dim1] = c1[i__ + (k + j *
c1_dim2) * c1_dim1] - c1[i__ - 1 + (k + jc * c1_dim2)
* c1_dim1];
/* L125: */
}
/* L126: */
}
/* L127: */
}
goto L132;
L128:
i__1 = ipph;
for (j = 2; j <= i__1; ++j) {
jc = ipp2 - j;
i__2 = *ido;
for (i__ = 3; i__ <= i__2; i__ += 2) {
i__3 = *l1;
for (k = 1; k <= i__3; ++k) {
ch[i__ - 1 + (k + j * ch_dim2) * ch_dim1] = c1[i__ - 1 + (k +
j * c1_dim2) * c1_dim1] - c1[i__ + (k + jc * c1_dim2)
* c1_dim1];
ch[i__ - 1 + (k + jc * ch_dim2) * ch_dim1] = c1[i__ - 1 + (k
+ j * c1_dim2) * c1_dim1] + c1[i__ + (k + jc *
c1_dim2) * c1_dim1];
ch[i__ + (k + j * ch_dim2) * ch_dim1] = c1[i__ + (k + j *
c1_dim2) * c1_dim1] + c1[i__ - 1 + (k + jc * c1_dim2)
* c1_dim1];
ch[i__ + (k + jc * ch_dim2) * ch_dim1] = c1[i__ + (k + j *
c1_dim2) * c1_dim1] - c1[i__ - 1 + (k + jc * c1_dim2)
* c1_dim1];
/* L129: */
}
/* L130: */
}
/* L131: */
}
L132:
if (*ido == 1) {
return 0;
}
i__1 = *idl1;
for (ik = 1; ik <= i__1; ++ik) {
c2[ik + c2_dim1] = ch2[ik + ch2_dim1];
/* L133: */
}
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];
/* L134: */
}
/* L135: */
}
if (nbd > *l1) {
goto L139;
}
is = -(*ido);
i__1 = *ip;
for (j = 2; j <= i__1; ++j) {
is += *ido;
idij = is;
i__2 = *ido;
for (i__ = 3; 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] - 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] + wa[idij] * ch[i__ -
1 + (k + j * ch_dim2) * ch_dim1];
/* L136: */
}
/* L137: */
}
/* L138: */
}
goto L143;
L139:
is = -(*ido);
i__1 = *ip;
for (j = 2; j <= i__1; ++j) {
is += *ido;
i__2 = *l1;
for (k = 1; k <= i__2; ++k) {
idij = is;
i__3 = *ido;
for (i__ = 3; 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] - 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] + wa[idij] * ch[i__ -
1 + (k + j * ch_dim2) * ch_dim1];
/* L140: */
}
/* L141: */
}
/* L142: */
}
L143:
return 0;
}
int FFT::cosqf_(int *n, double *x, double *wsave)
{
/* Initialized data */
static double sqrt2 = 1.4142135623731f;
/* System generated locals */
int i__1;
/* Local variables */
static double tsqx;
// extern /* Subroutine */ int cosqf1_(integer *, real *, real *, real *);
/* Parameter adjustments */
--wsave;
--x;
/* Function Body */
if ((i__1 = *n - 2) < 0) {
goto L102;
} else if (i__1 == 0) {
goto L101;
} else {
goto L103;
}
L101:
tsqx = sqrt2 * x[2];
x[2] = x[1] - tsqx;
x[1] += tsqx;
L102:
return 0;
L103:
cosqf1_(n, &x[1], &wsave[1], &wsave[*n + 1]);
return 0;
}
int FFT::cosqf1_(int *n, double *x, double *w, double *xh)
{
int i__1;
/* Local variables */
static int i__, k, kc, np2, ns2;
static double xim1;
static int modn;
static double scale;
// extern /* Subroutine */ int rfftf_(integer *, real *, real *);
/* Parameter adjustments */
--xh;
--w;
--x;
/* Function Body */
scale = .5f;
x[1] *= 2.f;
ns2 = (*n + 1) / 2;
np2 = *n + 2;
i__1 = ns2;
for (k = 2; k <= i__1; ++k) {
kc = np2 - k;
xh[k] = x[k] + x[kc];
xh[kc] = x[k] - x[kc];
/* L101: */
}
modn = *n % 2;
if (modn == 0) {
xh[ns2 + 1] = x[ns2 + 1] + x[ns2 + 1];
}
i__1 = ns2;
for (k = 2; k <= i__1; ++k) {
kc = np2 - k;
x[k] = w[k - 1] * xh[kc] + w[kc - 1] * xh[k];
x[kc] = w[k - 1] * xh[k] - w[kc - 1] * xh[kc];
/* L102: */
}
if (modn == 0) {
x[ns2 + 1] = w[ns2] * xh[ns2 + 1];
}
rfftf_(n, &x[1], &xh[1]);
i__1 = *n;
for (i__ = 3; i__ <= i__1; i__ += 2) {
xim1 = x[i__ - 1] - x[i__];
x[i__] = scale * (x[i__ - 1] + x[i__]);
x[i__ - 1] = scale * xim1;
/* L103: */
}
x[1] *= .5f;
x[*n] *= .5f;
return 0;
}
int FFT::rfftf_(int *n, double *r__, double *wsave)
{
// extern /* Subroutine */ int rfftf1_(integer *, real *, real *, real *, real *);
/* Parameter adjustments */
--wsave;
--r__;
/* Function Body */
if (*n == 1) {
return 0;
}
rfftf1_(n, &r__[1], &wsave[1], &wsave[*n + 1], &wsave[(*n << 1) + 1]);
return 0;
}
int FFT::rfftf1_(int *n, double *c__, double *ch, double *wa, double *ifac)
{
int i__1;
/* Local variables */
static int i__, k1, l1, l2, na, kh, nf, ip, iw, ix2, ix3, ix4, ido,
idl1;
/* extern int radf2_(integer *, integer *, real *, real *,
real *), radf3_(integer *, integer *, real *, real *, real *,
real *), radf4_(integer *, integer *, real *, real *, real *,
real *, real *), radf5_(integer *, integer *, real *, real *,
real *, real *, real *, real *), radfg_(integer *, integer *,
integer *, integer *, real *, real *, real *, real *, real *,
real *);
*/
/* Parameter adjustments */
--ifac;
--wa;
--ch;
--c__;
/* Function Body */
nf = ifac[2];
na = 1;
l2 = *n;
iw = *n;
i__1 = nf;
for (k1 = 1; k1 <= i__1; ++k1) {
kh = nf - k1;
ip = ifac[kh + 3];
l1 = l2 / ip;
ido = *n / l2;
idl1 = ido * l1;
iw -= (ip - 1) * ido;
na = 1 - na;
if (ip != 4) {
goto L102;
}
ix2 = iw + ido;
ix3 = ix2 + ido;
if (na != 0) {
goto L101;
}
radf4_(&ido, &l1, &c__[1], &ch[1], &wa[iw], &wa[ix2], &wa[ix3]);
goto L110;
L101:
radf4_(&ido, &l1, &ch[1], &c__[1], &wa[iw], &wa[ix2], &wa[ix3]);
goto L110;
L102:
if (ip != 2) {
goto L104;
}
if (na != 0) {
goto L103;
}
radf2_(&ido, &l1, &c__[1], &ch[1], &wa[iw]);
goto L110;
L103:
radf2_(&ido, &l1, &ch[1], &c__[1], &wa[iw]);
goto L110;
L104:
if (ip != 3) {
goto L106;
}
ix2 = iw + ido;
if (na != 0) {
goto L105;
}
radf3_(&ido, &l1, &c__[1], &ch[1], &wa[iw], &wa[ix2]);
goto L110;
L105:
radf3_(&ido, &l1, &ch[1], &c__[1], &wa[iw], &wa[ix2]);
goto L110;
L106:
if (ip != 5) {
goto L108;
}
ix2 = iw + ido;
ix3 = ix2 + ido;
ix4 = ix3 + ido;
if (na != 0) {
goto L107;
}
radf5_(&ido, &l1, &c__[1], &ch[1], &wa[iw], &wa[ix2], &wa[ix3], &wa[
ix4]);
goto L110;
L107:
radf5_(&ido, &l1, &ch[1], &c__[1], &wa[iw], &wa[ix2], &wa[ix3], &wa[
ix4]);
goto L110;
L108:
if (ido == 1) {
na = 1 - na;
}
if (na != 0) {
goto L109;
}
radfg_(&ido, &ip, &l1, &idl1, &c__[1], &c__[1], &c__[1], &ch[1], &ch[1], &wa[iw]);
na = 1;
goto L110;
L109:
radfg_(&ido, &ip, &l1, &idl1, &ch[1], &ch[1], &ch[1], &c__[1], &c__[1]
, &wa[iw]);
na = 0;
L110:
l2 = l1;
/* L111: */
}
if (na == 1) {
return 0;
}
i__1 = *n;
for (i__ = 1; i__ <= i__1; ++i__) {
c__[i__] = ch[i__];
/* L112: */
}
return 0;
}
int FFT::radf2_(int *ido, int *l1, double *cc, double *ch, double *wa1)
{
/* System generated locals */
int ch_dim1, ch_offset, cc_dim1, cc_dim2, cc_offset, i__1, i__2;
/* Local variables */
static int i__, k, ic;
static double ti2, tr2;
static int idp2;
/* Parameter adjustments */
ch_dim1 = *ido;
ch_offset = 1 + ch_dim1 * 3;
ch -= ch_offset;
cc_dim1 = *ido;
cc_dim2 = *l1;
cc_offset = 1 + cc_dim1 * (1 + cc_dim2);
cc -= cc_offset;
--wa1;
/* Function Body */
i__1 = *l1;
for (k = 1; k <= i__1; ++k) {
ch[((k << 1) + 1) * ch_dim1 + 1] = cc[(k + cc_dim2) * cc_dim1 + 1] +
cc[(k + (cc_dim2 << 1)) * cc_dim1 + 1];
ch[*ido + ((k << 1) + 2) * ch_dim1] = cc[(k + cc_dim2) * cc_dim1 + 1]
- cc[(k + (cc_dim2 << 1)) * cc_dim1 + 1];
/* L101: */
}
if ((i__1 = *ido - 2) < 0) {
goto L107;
} else if (i__1 == 0) {
goto L105;
} else {
goto L102;
}
L102:
idp2 = *ido + 2;
i__1 = *l1;
for (k = 1; k <= i__1; ++k) {
i__2 = *ido;
for (i__ = 3; i__ <= i__2; i__ += 2) {
ic = idp2 - i__;
tr2 = wa1[i__ - 2] * cc[i__ - 1 + (k + (cc_dim2 << 1)) * cc_dim1]
+ wa1[i__ - 1] * cc[i__ + (k + (cc_dim2 << 1)) * cc_dim1];
ti2 = wa1[i__ - 2] * cc[i__ + (k + (cc_dim2 << 1)) * cc_dim1] -
wa1[i__ - 1] * cc[i__ - 1 + (k + (cc_dim2 << 1)) *
cc_dim1];
ch[i__ + ((k << 1) + 1) * ch_dim1] = cc[i__ + (k + cc_dim2) *
cc_dim1] + ti2;
ch[ic + ((k << 1) + 2) * ch_dim1] = ti2 - cc[i__ + (k + cc_dim2) *
cc_dim1];
ch[i__ - 1 + ((k << 1) + 1) * ch_dim1] = cc[i__ - 1 + (k +
cc_dim2) * cc_dim1] + tr2;
ch[ic - 1 + ((k << 1) + 2) * ch_dim1] = cc[i__ - 1 + (k + cc_dim2)
* cc_dim1] - tr2;
/* L103: */
}
/* L104: */
}
if (*ido % 2 == 1) {
return 0;
}
L105:
i__1 = *l1;
for (k = 1; k <= i__1; ++k) {
ch[((k << 1) + 2) * ch_dim1 + 1] = -cc[*ido + (k + (cc_dim2 << 1)) *
cc_dim1];
ch[*ido + ((k << 1) + 1) * ch_dim1] = cc[*ido + (k + cc_dim2) *
cc_dim1];
/* L106: */
}
L107:
return 0;
}
int FFT::radf3_(int *ido, int *l1, double *cc, double *ch, double *wa1, double *wa2)
{
/* Initialized data */
static double taur = -.5f;
static double taui = .866025403784439f;
/* System generated locals */
int ch_dim1, ch_offset, cc_dim1, cc_dim2, cc_offset, i__1, i__2;
/* Local variables */
static int i__, k, ic;
static double ci2, di2, di3, cr2, dr2, dr3, ti2, ti3, tr2, tr3;
static int idp2;
/* Parameter adjustments */
ch_dim1 = *ido;
ch_offset = 1 + (ch_dim1 << 2);
ch -= ch_offset;
cc_dim1 = *ido;
cc_dim2 = *l1;
cc_offset = 1 + cc_dim1 * (1 + cc_dim2);
cc -= cc_offset;
--wa1;
--wa2;
/* Function Body */
i__1 = *l1;
for (k = 1; k <= i__1; ++k) {
cr2 = cc[(k + (cc_dim2 << 1)) * cc_dim1 + 1] + cc[(k + cc_dim2 * 3) *
cc_dim1 + 1];
ch[(k * 3 + 1) * ch_dim1 + 1] = cc[(k + cc_dim2) * cc_dim1 + 1] + cr2;
ch[(k * 3 + 3) * ch_dim1 + 1] = taui * (cc[(k + cc_dim2 * 3) *
cc_dim1 + 1] - cc[(k + (cc_dim2 << 1)) * cc_dim1 + 1]);
ch[*ido + (k * 3 + 2) * ch_dim1] = cc[(k + cc_dim2) * cc_dim1 + 1] +
taur * cr2;
/* L101: */
}
if (*ido == 1) {
return 0;
}
idp2 = *ido + 2;
i__1 = *l1;
for (k = 1; k <= i__1; ++k) {
i__2 = *ido;
for (i__ = 3; i__ <= i__2; i__ += 2) {
ic = idp2 - i__;
dr2 = wa1[i__ - 2] * cc[i__ - 1 + (k + (cc_dim2 << 1)) * cc_dim1]
+ wa1[i__ - 1] * cc[i__ + (k + (cc_dim2 << 1)) * cc_dim1];
di2 = wa1[i__ - 2] * cc[i__ + (k + (cc_dim2 << 1)) * cc_dim1] -
wa1[i__ - 1] * cc[i__ - 1 + (k + (cc_dim2 << 1)) *
cc_dim1];
dr3 = wa2[i__ - 2] * cc[i__ - 1 + (k + cc_dim2 * 3) * cc_dim1] +
wa2[i__ - 1] * cc[i__ + (k + cc_dim2 * 3) * cc_dim1];
di3 = wa2[i__ - 2] * cc[i__ + (k + cc_dim2 * 3) * cc_dim1] - wa2[
i__ - 1] * cc[i__ - 1 + (k + cc_dim2 * 3) * cc_dim1];
cr2 = dr2 + dr3;
ci2 = di2 + di3;
ch[i__ - 1 + (k * 3 + 1) * ch_dim1] = cc[i__ - 1 + (k + cc_dim2) *
cc_dim1] + cr2;
ch[i__ + (k * 3 + 1) * ch_dim1] = cc[i__ + (k + cc_dim2) *
cc_dim1] + ci2;
tr2 = cc[i__ - 1 + (k + cc_dim2) * cc_dim1] + taur * cr2;
ti2 = cc[i__ + (k + cc_dim2) * cc_dim1] + taur * ci2;
tr3 = taui * (di2 - di3);
ti3 = taui * (dr3 - dr2);
ch[i__ - 1 + (k * 3 + 3) * ch_dim1] = tr2 + tr3;
ch[ic - 1 + (k * 3 + 2) * ch_dim1] = tr2 - tr3;
ch[i__ + (k * 3 + 3) * ch_dim1] = ti2 + ti3;
ch[ic + (k * 3 + 2) * ch_dim1] = ti3 - ti2;
/* L102: */
}
/* L103: */
}
return 0;
}
int FFT::radf4_(int *ido, int *l1, double *cc, double *ch, double *wa1, double *wa2, double *wa3)
{
/* Initialized data */
static double hsqt2 = .7071067811865475f;
/* System generated locals */
int cc_dim1, cc_dim2, cc_offset, ch_dim1, ch_offset, i__1, i__2;
/* Local variables */
static int i__, k, ic;
static double ci2, ci3, ci4, cr2, cr3, cr4, ti1, ti2, ti3, ti4, tr1, tr2,
tr3, tr4;
static int idp2;
/* Parameter adjustments */
ch_dim1 = *ido;
ch_offset = 1 + ch_dim1 * 5;
ch -= ch_offset;
cc_dim1 = *ido;
cc_dim2 = *l1;
cc_offset = 1 + cc_dim1 * (1 + cc_dim2);
cc -= cc_offset;
--wa1;
--wa2;
--wa3;
/* Function Body */
i__1 = *l1;
for (k = 1; k <= i__1; ++k) {
tr1 = cc[(k + (cc_dim2 << 1)) * cc_dim1 + 1] + cc[(k + (cc_dim2 << 2))
* cc_dim1 + 1];
tr2 = cc[(k + cc_dim2) * cc_dim1 + 1] + cc[(k + cc_dim2 * 3) *
cc_dim1 + 1];
ch[((k << 2) + 1) * ch_dim1 + 1] = tr1 + tr2;
ch[*ido + ((k << 2) + 4) * ch_dim1] = tr2 - tr1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -