gpfa.c
来自「InsightToolkit-1.4.0(有大量的优化算法程序)」· C语言 代码 · 共 80 行
C
80 行
#include "f2c.h"
#include "netlib.h"
/* Table of constant values */
static integer c__2 = 2;
static integer c__3 = 3;
/* SUBROUTINE 'GPFA' */
/* SELF-SORTING IN-PLACE GENERALIZED PRIME FACTOR (COMPLEX) FFT */
/* */
/* *** THIS IS THE ALL-FORTRAN VERSION *** */
/* ------------------------------- */
/* */
/* CALL GPFA(A,B,TRIGS,INC,JUMP,N,LOT,ISIGN) */
/* */
/* A IS FIRST REAL INPUT/OUTPUT VECTOR */
/* B IS FIRST IMAGINARY INPUT/OUTPUT VECTOR */
/* TRIGS IS A TABLE OF TWIDDLE FACTORS, PRECALCULATED */
/* BY CALLING SUBROUTINE 'SETGPFA' */
/* INC IS THE INCREMENT WITHIN EACH DATA VECTOR */
/* JUMP IS THE INCREMENT BETWEEN DATA VECTORS */
/* N IS THE LENGTH OF THE TRANSFORMS: */
/* ----------------------------------- */
/* N = (2**IP) * (3**IQ) * (5**IR) */
/* ----------------------------------- */
/* LOT IS THE NUMBER OF TRANSFORMS */
/* ISIGN = +1 FOR FORWARD TRANSFORM */
/* = -1 FOR INVERSE TRANSFORM */
/* */
/* WRITTEN BY CLIVE TEMPERTON */
/* RECHERCHE EN PREVISION NUMERIQUE */
/* ATMOSPHERIC ENVIRONMENT SERVICE, CANADA */
/* */
/* ---------------------------------------------------------------------- */
/* */
/* DEFINITION OF TRANSFORM */
/* ----------------------- */
/* */
/* X(J) = SUM(K=0,...,N-1)(C(K)*EXP(ISIGN*2*I*J*K*PI/N)) */
/* */
/* --------------------------------------------------------------------- */
/* */
/* FOR A MATHEMATICAL DEVELOPMENT OF THE ALGORITHM USED, */
/* SEE: */
/* */
/* C TEMPERTON : "A GENERALIZED PRIME FACTOR FFT ALGORITHM */
/* FOR ANY N = (2**P)(3**Q)(5**R)", */
/* SIAM J. SCI. STAT. COMP., MAY 1992. */
/* */
/* ---------------------------------------------------------------------- */
/* Subroutine */ void gpfa_(real *a, real *b, const real *trigs, const integer *inc,
const integer *jump, const integer *n, const integer *lot,
const integer *isign, const integer *npqr, integer *info)
{
/* Local variables */
static integer i, ip, iq, ir;
ip = npqr[0];
iq = npqr[1];
ir = npqr[2];
/* COMPUTE THE TRANSFORM */
/* --------------------- */
i = 0;
if (ip > 0) {
gpfa2f_(a, b, trigs, inc, jump, n, &ip, lot, isign);
i += pow_ii(&c__2, &ip) << 1;
}
if (iq > 0) {
gpfa3f_(a, b, &trigs[i], inc, jump, n, &iq, lot, isign);
i += pow_ii(&c__3, &iq) << 1;
}
if (ir > 0) {
gpfa5f_(a, b, &trigs[i], inc, jump, n, &ir, lot, isign);
}
*info = 0;
} /* gpfa_ */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?