Ejemplo n.º 1
0
// Return the partial fraction expansion of the approximation x^(-pnum/pden)
int AlgRemez::getIPFE(Float *Res, Float *Pole, Float *Norm) {
  char *fname = "getIPFE(Float*, Float*, Float*)";
  VRB.Func(cname,fname);

  bigfloat *r = new bigfloat[d];
  if(r == 0) ERR.Pointer(cname,fname,"r");
  VRB.Smalloc(cname,fname,"r",r,n * sizeof(bigfloat));
  bigfloat *p = new bigfloat[n];
  if(p == 0) ERR.Pointer(cname,fname,"p");
  VRB.Smalloc(cname,fname,"p",p,d * sizeof(bigfloat));
  
  // Want the inverse function
  for (int i=0; i<n; i++) {
    r[i] = poles[i];
    p[i] = roots[i];
  }

  // Perform a partial fraction expansion
  pfe(r, p, (bigfloat)1l/norm);

  // Convert to Float and return
  *Norm = (Float)((bigfloat)1l/(norm));
  for (int i=0; i<n; i++) {
    Res[i] = (Float)r[i];
    Pole[i] = (Float)p[i];
  }

  VRB.Sfree(cname,fname, "r",r);
  delete [] r;
  VRB.Sfree(cname,fname, "p",p);
  delete [] p;

  // Where the smallest shift is located
  return 0;
}
Ejemplo n.º 2
0
//!< Return the partial fraction expansion of the approximation x^(pnum/pden)
int AlgRemez::getPFE(Float *Res, Float *Pole, Float *Norm) {
  char *fname = "getPFE(Float*, Float*, Float*)";
  VRB.Func(cname,fname);

  if (n!=d) ERR.General(cname,fname,"Cannot handle case: Numerator degree neq Denominator degree\n");

  bigfloat *r = new bigfloat[n];
  if(r == 0) ERR.Pointer(cname,fname,"r");
  VRB.Smalloc(cname,fname,"r",r,n * sizeof(bigfloat));
  bigfloat *p = new bigfloat[d];
  if(p == 0) ERR.Pointer(cname,fname,"p");
  VRB.Smalloc(cname,fname,"p",p,d * sizeof(bigfloat));
  
  for (int i=0; i<n; i++) r[i] = roots[i];
  for (int i=0; i<d; i++) p[i] = poles[i];
  
  // Perform a partial fraction expansion
  pfe(r, p, norm);

  // Convert to Float and return
  *Norm = (Float)norm;
  for (int i=0; i<n; i++) Res[i] = (Float)r[i];
  for (int i=0; i<d; i++) Pole[i] = (Float)p[i];

  VRB.Sfree(cname,fname, "r",r);
  delete [] r;
  VRB.Sfree(cname,fname, "p",p);
  delete [] p;

  // Where the smallest shift is located
  return 0;
}
Ejemplo n.º 3
0
// Return the partial fraction expansion of the approximation x^(-pnum/pden)
int AlgRemez::getIPFE(double *Res, double *Pole, double *Norm) {

  if (n!=d) {
    printf("Cannot handle case: Numerator degree neq Denominator degree\n");
    return 0;
  }

  if (!alloc) {
    printf("Approximation not yet generated\n");
    return 0;
  }

  if (!foundRoots) {
    printf("Roots not found, so PFE cannot be taken\n");
    return 0;
  }

  bigfloat *r = new bigfloat[d];
  bigfloat *p = new bigfloat[n];
  
  // Want the inverse function
  for (int i=0; i<n; i++) {
    r[i] = poles[i];
    p[i] = roots[i];
  }

  // Perform a partial fraction expansion
  pfe(r, p, (bigfloat)1l/norm);

  // Convert to double and return
  *Norm = (double)((bigfloat)1l/(norm));
  for (int i=0; i<n; i++) {
    Res[i] = (double)r[i];
    Pole[i] = (double)p[i];
  }

  delete [] r;
  delete [] p;

  // Where the smallest shift is located
  return 0;
}