void mgc2sp(double *mgc, const int m, const double a, const double g, double *x, double *y, const int flng) { static double *c = NULL; static int size; if (c == NULL) { c = dgetmem(flng / 2 + 1); size = flng; } if (flng > size) { free(c); c = dgetmem(flng / 2 + 1); size = flng; } mgc2mgc(mgc, m, a, g, c, flng / 2, 0.0, 0.0); c2sp(c, flng / 2, x, y, flng); return; }
int main(int argc, char **argv) { int leng = LENG, m = ORDER, start = 0, end = 0, otype = OTYPE, i, no; FILE *fp = stdin; char phase = PHASE; double logk, *x, *y, *c; if ((cmnd = strrchr(argv[0], '/')) == NULL) cmnd = argv[0]; else cmnd++; while (--argc) if (**++argv == '-') { switch (*(*argv + 1)) { case 'm': m = atoi(*++argv); --argc; break; case 'l': leng = atoi(*++argv); --argc; break; case 'p': phase = 1 - phase; break; case 'o': otype = atoi(*++argv); --argc; break; case 's': start = atoi(*++argv); --argc; break; case 'e': end = atoi(*++argv); --argc; break; case 'h': usage(0); default: fprintf(stderr, "%s : Invalid option '%c'!\n", cmnd, *(*argv + 1)); usage(1); } } else fp = getfp(*argv, "rb"); if (end == 0) end = m; x = dgetmem(leng * 2); y = x + leng; c = dgetmem(m + 1); no = leng / 2 + 1; logk = 20.0 / log(10.0); while (freadf(c, sizeof(*c), m + 1, fp) == m + 1) { fillz(c, sizeof(*c), start); for (i = end + 1; i <= m; i++) c[i] = 0.0; c2sp(c, m, x, y, leng); if (phase) switch (otype) { case 1: for (i = no; i--;) x[i] = y[i]; break; case 2: for (i = no; i--;) x[i] = y[i] * 180 / PI; break; default: for (i = no; i--;) x[i] = y[i] / PI; break; } else switch (otype) { case 1: break; case 2: for (i = no; i--;) x[i] = exp(x[i]); break; default: for (i = no; i--;) x[i] *= logk; break; } fwritef(x, sizeof(*x), no, stdout); } return (0); }