Skip to content

modm:math:interpolation: Interpolation Methods

Simple interpolation methods between a list of points.

Linear Interpolation

Example:

// Definition of the supporting points. The first type is the
// input type, the second the output type
using Point = modm::Pair<int8_t, int16_t>;

// Create a array of supporting points describing the curve.
const Point supportingPoints[6] =
{
    { 30, -200 },
    { 50, 0 },
    { 90, 50 },
    { 150, 2050 },
    { 200, 3000 },
    { 220, 20000 }
};

modm::interpolation::Linear<Point> value(supportingPoints, 6);
// ...

int8_t  a = 40;
int16_t b = value.interpolate(a);

Example with supporting points read from flash:

// Definition of a supporting point
using Point = modm::Pair<int8_t, int16_t>;

// Array of supporting points in flash
FLASH_STORAGE(Point supportingPoints[6]) =
{
    { 30, -200 },
    { 50, 0 },
    { 90, 50 },
    { 150, 2050 },
    { 200, 3000 },
    { 220, 20000 }
};

// Create an interpolator object which reads the
// supporting points from flash.
modm::interpolation::Linear<Point, modm::accessor::Flash>
        value(modm::accessor::asFlash(supportingPoints), 6);
// ...

int8_t  a = 20;
int16_t b = value.interpolate(a);

Lagrange Interpolation

Example:

using Point = modm::Pair<float, float>;

// interpolate x^2 over the range of 1 <= x <= 3
Point points[3] =
{
    { 1, 1 },
    { 2, 4 },
    { 3, 9 }
};

modm::interpolation::Lagrange<Point> value(points, 3);
// ...

float output = value.interpolate(1.5f);
// output => 2.25;

Warning

Only floating points types are allowed as second type of modm::Pair, otherwise the calculation will deliver wrong results!

See Wikipedia.

Dependencies

modm:math:interpolation modm_math_interpolation modm: math: interpolation modm_architecture_accessor modm: architecture: accessor modm_math_interpolation->modm_architecture_accessor modm_container modm: container modm_math_interpolation->modm_container modm_math_utils modm: math: utils modm_math_interpolation->modm_math_utils