예제 #1
0
파일: _mgc2sp.c 프로젝트: EQ4/SPTK
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;
}
예제 #2
0
int main(int argc, char **argv)
{
   int m1 = ORDER1, m2 = ORDER2, i;
   double a1 = ALPHA1, a2 = ALPHA2, g1 = GAMMA1, g2 = GAMMA2, *c1, *c2;
   Boolean norm1 = NORMFLG1, norm2 = NORMFLG2, mulg1 = MULGFLG1, mulg2 =
       MULGFLG2;
   FILE *fp = stdin;

   if ((cmnd = strrchr(argv[0], '/')) == NULL)
      cmnd = argv[0];
   else
      cmnd++;
   while (--argc)
      if (**++argv == '-') {
         switch (*(*argv + 1)) {
         case 'm':
            m1 = atoi(*++argv);
            --argc;
            break;
         case 'M':
            m2 = atoi(*++argv);
            --argc;
            break;
         case 'a':
            a1 = atof(*++argv);
            --argc;
            break;
         case 'A':
            a2 = atof(*++argv);
            --argc;
            break;
         case 'g':
            g1 = atof(*++argv);
            --argc;
            break;
         case 'c':
            g1 = atoi(*++argv);
            --argc;
            if (g1 < 1)
               fprintf(stderr, "%s : value of c must be c>=1!\n", cmnd);
            g1 = -1.0 / g1;
            break;
         case 'G':
            g2 = atof(*++argv);
            --argc;
            break;
         case 'C':
            g2 = atoi(*++argv);
            --argc;
            if (g2 < 1)
               fprintf(stderr, "%s : value of C must be C>=1!\n", cmnd);
            g2 = -1.0 / g2;
            break;
         case 'n':
            norm1 = 1 - norm1;
            break;
         case 'N':
            norm2 = 1 - norm2;
            break;
         case 'u':
            mulg1 = 1 - mulg1;
            break;
         case 'U':
            mulg2 = 1 - mulg2;
            break;
         case 'h':
            usage(0);
         default:
            fprintf(stderr, "%s : Invalid option '%c'!\n", cmnd, *(*argv + 1));
            usage(1);
         }
      } else
         fp = getfp(*argv, "rb");

   c1 = dgetmem(m1 + m2 + 2);
   c2 = c1 + m1 + 1;

   if (mulg1 && g1 == 0) {
      fprintf(stderr,
              "%s : gamma for input mgc coefficients should not equal to 0 if you specify -u option!\n",
              cmnd);
      usage(1);
   }

   while (freadf(c1, sizeof(*c1), m1 + 1, fp) == m1 + 1) {

      if (norm1)
         ignorm(c1, c1, m1, g1);
      else if (mulg1)
         c1[0] = (c1[0] - 1.0) / g1;

      if (mulg1)
         for (i = m1; i >= 1; i--)
            c1[i] /= g1;

      mgc2mgc(c1, m1, a1, g1, c2, m2, a2, g2);

      if (norm2)
         gnorm(c2, c2, m2, g2);
      else if (mulg2)
         c1[0] = c1[0] * g2 + 1.0;

      if (mulg2)
         for (i = m2; i >= 1; i--)
            c2[i] *= g2;

      fwritef(c2, sizeof(*c2), m2 + 1, stdout);
   }

   return (0);
}