1 #ifndef INCLUDE_AL_MATH_INTERPOLATION_HPP
2 #define INCLUDE_AL_MATH_INTERPOLATION_HPP
56 template <
class Tf,
class Tv>
57 Tv
bezier(Tf frac,
const Tv& x2,
const Tv& x1,
const Tv& x0);
65 template <
class Tf,
class Tv>
66 Tv
bezier(Tf frac,
const Tv& x3,
const Tv& x2,
const Tv& x1,
const Tv& x0);
77 template <
class Tf,
class Tv>
78 Tv
casteljau(
const Tf& frac,
const Tv& a,
const Tv& b,
const Tv& c,
84 template <
class Tp,
class Tv>
85 Tv
hermite(Tp f,
const Tv& w,
const Tv& x,
const Tv& y,
const Tv& z, Tp tension,
96 void lagrange(T* h, T delay,
int order);
129 template <
class Tf,
class Tv>
137 template <
class Tf,
class Tv>
138 Tv
cubic(Tf frac,
const Tv& w,
const Tv& x,
const Tv& y,
const Tv& z);
145 template <
class Tf,
class Tv>
146 Tv
cubic2(Tf frac,
const Tv& w,
const Tv& x,
const Tv& y,
const Tv& z);
151 template <
class Tf,
class Tv>
152 Tv
linear(Tf frac,
const Tv& x,
const Tv& y);
157 template <
class Tf,
class Tv>
158 Tv
linear(Tf frac,
const Tv& x,
const Tv& y,
const Tv& z);
163 template <
class Tf,
class Tv>
164 Tv
linearCyclic(Tf frac,
const Tv& x,
const Tv& y,
const Tv& z);
169 template <
class Tf,
class Tv>
170 void linear(Tv* dst,
const Tv* xs,
const Tv* xp1s,
int len,
const Tf& frac);
175 template <
class Tf,
class Tv>
176 Tv
nearest(Tf frac,
const Tv& x,
const Tv& y);
181 template <
class Tf,
class Tv>
182 inline Tv
bilinear(
const Tf& fracX,
const Tf& fracY,
const Tv& xy,
const Tv& Xy,
183 const Tv& xY,
const Tv& XY) {
190 template <
class Tf2,
class Tv>
191 inline Tv
bilinear(
const Tf2& f,
const Tv& xy,
const Tv& Xy,
const Tv& xY,
193 return bilinear(f[0], f[1], xy, Xy, xY, XY);
199 template <
class Tf,
class Tv>
200 inline Tv
trilinear(
const Tf& fracX,
const Tf& fracY,
const Tf& fracZ,
201 const Tv& xyz,
const Tv& Xyz,
const Tv& xYz,
const Tv& XYz,
202 const Tv& xyZ,
const Tv& XyZ,
const Tv& xYZ,
205 bilinear(fracX, fracY, xyZ, XyZ, xYZ, XYZ));
213 template <
class Tf3,
class Tv>
214 inline Tv
trilinear(
const Tf3& f,
const Tv& xyz,
const Tv& Xyz,
const Tv& xYz,
215 const Tv& XYz,
const Tv& xyZ,
const Tv& XyZ,
const Tv& xYZ,
217 return trilinear(f[0], f[1], f[2], xyz, Xyz, xYz, XYz, xyZ, XyZ, xYZ, XYZ);
224 template <
class Tf,
class Tv>
225 inline Tv
bezier(Tf d,
const Tv& x2,
const Tv& x1,
const Tv& x0) {
229 return dm12 * x2 + Tf(2) * dm1 * d * x1 + d2 * x0;
241 template <
class Tf,
class Tv>
242 inline Tv
bezier(Tf d,
const Tv& x3,
const Tv& x2,
const Tv& x1,
const Tv& x0) {
243 Tv c1 = Tf(3) * (x2 - x3);
244 Tv c2 = Tf(3) * (x1 - x2) - c1;
245 Tv c3 = x0 - x3 - c1 - c2;
246 return ((c3 * d + c2) * d + c1) * d + x3;
249 template <
class Tf,
class Tv>
250 Tv
casteljau(
const Tf& f,
const Tv& a,
const Tv& b,
const Tv& c,
const Tv& d) {
257 template <
class Tf,
class Tv>
263 Tf h00 = (1 + 2 * f) * (f - 1) * (f - 1);
264 Tf h10 = f * (f - 1) * (f - 1);
265 Tf h01 = f * f * (3 - 2 * f);
266 Tf h11 = f * f * (f - 1);
279 w[0] = (-b * h10 / (x[2] - x[0]));
280 w[1] = (h00 - b * h11 / (x[3] - x[1]));
281 w[2] = (h01 + b * h10 / (x[2] - x[0]));
282 w[3] = (+b * h11 / (x[3] - x[1]));
285 template <
class Tf,
class Tv>
286 inline Tv
cubic(Tf f,
const Tv& w,
const Tv& x,
const Tv& y,
const Tv& z) {
306 Tv c1 = (y - w) * Tf(0.5);
307 Tv c3 = (x - y) * Tf(1.5) + (z - w) * Tf(0.5);
308 Tv c2 = c1 + w - x - c3;
309 return ((c3 * f + c2) * f + c1) * f + x;
313 void cubic(T* dst,
const T* xm1s,
const T* xs,
const T* xp1s,
const T* xp2s,
315 for (
int i = 0; i < len; ++i)
316 dst[i] =
cubic(f, xm1s[i], xs[i], xp1s[i], xp2s[i]);
320 template <
class Tf,
class Tv>
321 inline Tv
cubic2(Tf f,
const Tv& w,
const Tv& x,
const Tv& y,
const Tv& z) {
322 Tv c3 = z - y - w + x;
325 return ((c3 * f + c2) * f + c1) * f + x;
335 template <
class Tp,
class Tv>
336 inline Tv
hermite(Tp f,
const Tv& w,
const Tv& x,
const Tv& y,
const Tv& z,
337 Tp tension, Tp bias) {
338 tension = (Tp(1) - tension) * Tp(0.5);
343 Tv m0 = ((x * Tv(2) - w - y) * bias + y - w) * tension;
344 Tv m1 = ((y * Tv(2) - x - z) * bias + z - x) * tension;
358 Tp a3 = Tp(-2) * f3 + Tp(3) * f2;
361 Tp a1 = f3 - Tp(2) * f2 + f;
363 return x * a0 + m0 * a1 + m1 * a2 + y * a3;
368 for (
int i = 0; i <= order; ++i) {
371 for (
int j = 0; j <= order; ++j) {
374 coef *= (delay - j_f) / (i_f - j_f);
389 h[0] = (d - T(1)) * (d - T(2)) * T(0.5);
390 h[1] = -d * (d - T(2));
391 h[2] = d * (d - T(1)) * T(0.5);
399 h[0] = -d1 * d2 * d3 * T(1. / 6.);
400 h[1] = d * d2 * d3 * T(0.5);
401 h[2] = -d * d1 * d3 * T(0.5);
402 h[3] = d * d1 * d2 * T(1. / 6.);
416 template <
class Tf,
class Tv>
417 inline Tv
linear(Tf f,
const Tv& x,
const Tv& y) {
418 return (y - x) * f + x;
421 template <
class Tf,
class Tv>
422 inline Tv
linear(Tf frac,
const Tv& x,
const Tv& y,
const Tv& z) {
428 template <
class Tf,
class Tv>
429 void linear(Tv* dst,
const Tv* xs,
const Tv* xp1s,
int len,
const Tf& f) {
430 for (
int i = 0; i < len; ++i) dst[i] =
linear(f, xs[i], xp1s[i]);
433 template <
class Tf,
class Tv>
434 inline Tv
linearCyclic(Tf frac,
const Tv& x,
const Tv& y,
const Tv& z) {
438 else if (frac >= Tf(2))
443 template <
class Tf,
class Tv>
444 inline Tv
nearest(Tf f,
const Tv& x,
const Tv& y) {
445 return (f < Tf(0.5)) ? x : y;
Tv cubic(Tf frac, const Tv &w, const Tv &x, const Tv &y, const Tv &z)
Cubic interpolation.
Tv hermite(Tp f, const Tv &w, const Tv &x, const Tv &y, const Tv &z, Tp tension, Tp bias)
Tv casteljau(const Tf &frac, const Tv &a, const Tv &b, const Tv &c, const Tv &d)
de Casteljau algorithm for four point interpolation
Tv nearest(Tf frac, const Tv &x, const Tv &y)
Tv trilinear(const Tf &fracX, const Tf &fracY, const Tf &fracZ, const Tv &xyz, const Tv &Xyz, const Tv &xYz, const Tv &XYz, const Tv &xyZ, const Tv &XyZ, const Tv &xYZ, const Tv &XYZ)
void lagrange2(T *h, T delay)
Tv linearCyclic(Tf frac, const Tv &x, const Tv &y, const Tv &z)
void lagrange1(T *h, T delay)
void lagrange3(T *h, T delay)
void cardinalSpline(Tv *w, const Tv *x, const Tf &f, double b)
Compute weights for cubic cardinal spline.
void lagrange(T *h, T delay, int order)
Computes FIR coefficients for Waring-Lagrange interpolation.
Tv linear(Tf frac, const Tv &x, const Tv &y)
Tv bezier(Tf frac, const Tv &x2, const Tv &x1, const Tv &x0)
Bezier curve, 3-point quadratic.
Tv bilinear(const Tf &fracX, const Tf &fracY, const Tv &xy, const Tv &Xy, const Tv &xY, const Tv &XY)
Tv cubic2(Tf frac, const Tv &w, const Tv &x, const Tv &y, const Tv &z)
Cubic interpolation.