void rdft(int n, int isgn, double *a) { void bitrv2(int n, double *a); void cftfsub(int n, double *a); void cftbsub(int n, double *a); void rftfsub(int n, double *a); void rftbsub(int n, double *a); double xi; if (isgn >= 0) { if (n > 4) { bitrv2(n, a); cftfsub(n, a); rftfsub(n, a); } else if (n == 4) { cftfsub(n, a); } xi = a[0] - a[1]; a[0] += a[1]; a[1] = xi; } else { a[1] = 0.5 * (a[0] - a[1]); a[0] -= a[1]; if (n > 4) { rftbsub(n, a); bitrv2(n, a); cftbsub(n, a); } else if (n == 4) { cftfsub(n, a); } } }
void ddst(int n, int isgn, double *a) { void bitrv2(int n, double *a); void cftfsub(int n, double *a); void cftbsub(int n, double *a); void rftfsub(int n, double *a); void rftbsub(int n, double *a); void dstsub(int n, double *a); void dstsub4(int n, double *a); int j; double xr; if (isgn < 0) { xr = a[n - 1]; for (j = n - 2; j >= 2; j -= 2) { a[j + 1] = -a[j] - a[j - 1]; a[j] -= a[j - 1]; } a[1] = a[0] + xr; a[0] -= xr; if (n > 4) { rftbsub(n, a); bitrv2(n, a); cftbsub(n, a); } else if (n == 4) { cftfsub(n, a); } } if (n > 4) { dstsub(n, a); } else { dstsub4(n, a); } if (isgn >= 0) { if (n > 4) { bitrv2(n, a); cftfsub(n, a); rftfsub(n, a); } else if (n == 4) { cftfsub(n, a); } xr = a[0] - a[1]; a[0] += a[1]; for (j = 2; j < n; j += 2) { a[j - 1] = -a[j] - a[j + 1]; a[j] -= a[j + 1]; } a[n - 1] = -xr; } }
void lsx_rdft_generic(int isgn, double *a, FFTcontext z) { double xi; int n = z.n; int nw = n >> 2; if (isgn >= 0) { if (n > 4) { bitrv2(n, z.br, a); cftfsub(n, a, z.sc); rftfsub(n, a, nw, z.sc + nw); } else if (n == 4) { cftfsub(n, a, z.sc); } xi = a[0] - a[1]; a[0] += a[1]; a[1] = xi; } else { a[1] = 0.5 * (a[0] - a[1]); a[0] -= a[1]; if (n > 4) { rftbsub(n, a, nw, z.sc + nw); bitrv2(n, z.br, a); cftbsub(n, a, z.sc); } else if (n == 4) { cftfsub(n, a, z.sc); } } }