/* Value of a blob --------------------------------------------------------- */ double kaiser_value(double r, double a, double alpha, int m) { double rda, rdas, arg, w; rda = r / a; if (rda <= 1.0) { rdas = rda * rda; arg = alpha * sqrt(1.0 - rdas); if (m == 0) { w = bessi0(arg) / bessi0(alpha); } else if (m == 1) { w = sqrt (1.0 - rdas); if (alpha != 0.0) w *= bessi1(arg) / bessi1(alpha); } else if (m == 2) { w = sqrt (1.0 - rdas); w = w * w; if (alpha != 0.0) w *= bessi2(arg) / bessi2(alpha); } else if (m == 3) { w = sqrt (1.0 - rdas); w = w * w * w; if (alpha != 0.0) w *= bessi3(arg) / bessi3(alpha); } else if (m == 4) { w = sqrt (1.0 - rdas); w = w * w * w *w; if (alpha != 0.0) w *= bessi4(arg) / bessi4(alpha); } else REPORT_ERROR(ERR_VALUE_INCORRECT, "m out of range in kaiser_value()"); } else w = 0.0; return w; }
double bessi4(double x) { return (x == 0) ? 0 : bessi2(x) - ((2 * 3) / x) * bessi3(x); }