This lib is considered to be used as a sensor's calibration program. Calibration with Spline Interpolation might be useful in the case that you want some model expressing relationship such like between a value of physical quantity and your sensor's voltage, but you cannot estimate a model such as liner, square, cubic polynomial, or sine curve. This makes (Parametric) Cubic Spline Polynomial Model (Coefficients of the polynomial) from some sample plots(e.g. sets of (value, voltage)). The inverse function (x,y)->(y,x) has been implemented so as to get analog data (not stepping or leveled data).

Fork of TRP105F_Spline by Akifumi Takahashi

Committer:
aktk
Date:
Thu May 26 04:50:45 2016 +0000
Revision:
8:e7d451bb4fd4
Parent:
7:e032ddec6ed5
Child:
9:1903c6f8d5a9
function to save and load the data has been implemented.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aktk 3:75f50dbedf1b 1 /**
aktk 3:75f50dbedf1b 2 * Spline_Cubic.h,.cpp
aktk 3:75f50dbedf1b 3 *
aktk 3:75f50dbedf1b 4 * Author: aktk, aktk.j.uec@gmail.com
aktk 3:75f50dbedf1b 5 * Tokyo, Japan.
aktk 3:75f50dbedf1b 6 *
aktk 3:75f50dbedf1b 7 * LOG:
aktk 3:75f50dbedf1b 8 * ver.0 2016/02.12 - 2016/02/16
aktk 3:75f50dbedf1b 9 * TRP105F_Spline.h,.cpp(Ver.2.1)
aktk 3:75f50dbedf1b 10 * ver.1 2016/05.12
aktk 3:75f50dbedf1b 11 */
aktk 3:75f50dbedf1b 12 #ifndef Cubic_Spline_H
aktk 3:75f50dbedf1b 13 #define Cubic_Spline_H
aktk 3:75f50dbedf1b 14
aktk 3:75f50dbedf1b 15 #include "mbed.h"
aktk 7:e032ddec6ed5 16 #include <cmath>
aktk 7:e032ddec6ed5 17 #include <complex>
aktk 3:75f50dbedf1b 18
aktk 3:75f50dbedf1b 19
aktk 3:75f50dbedf1b 20 // Vector Element Type
aktk 3:75f50dbedf1b 21 typedef struct {
aktk 7:e032ddec6ed5 22 double x; //
aktk 4:8db89b731133 23 double y; //
aktk 4:8db89b731133 24 double t; // use as pramameter of x,y.
aktk 4:8db89b731133 25 } Vxyt;
aktk 3:75f50dbedf1b 26
aktk 7:e032ddec6ed5 27 enum UseType {
aktk 3:75f50dbedf1b 28 AsDEBUG,
aktk 3:75f50dbedf1b 29 AsMODULE
aktk 3:75f50dbedf1b 30 };
aktk 3:75f50dbedf1b 31
aktk 4:8db89b731133 32 class CubicSpline2d
aktk 3:75f50dbedf1b 33 {
aktk 3:75f50dbedf1b 34 public:
aktk 3:75f50dbedf1b 35 // Constraction
aktk 4:8db89b731133 36 CubicSpline2d();
aktk 4:8db89b731133 37 CubicSpline2d(unsigned int);
aktk 4:8db89b731133 38 CubicSpline2d(unsigned int, UseType);
aktk 3:75f50dbedf1b 39 // Destraction
aktk 4:8db89b731133 40 ~CubicSpline2d();
aktk 3:75f50dbedf1b 41 // Functions
aktk 8:e7d451bb4fd4 42 double getX(double arg_y);
aktk 8:e7d451bb4fd4 43 double getY(double arg_x);
aktk 3:75f50dbedf1b 44 void calibrateSensor();
aktk 3:75f50dbedf1b 45 void saveSetting();
aktk 3:75f50dbedf1b 46 void saveSetting(const char *filename);
aktk 3:75f50dbedf1b 47 void loadSetting();
aktk 3:75f50dbedf1b 48 void loadSetting(const char *filename);
aktk 3:75f50dbedf1b 49 void printOutData();
aktk 3:75f50dbedf1b 50
aktk 3:75f50dbedf1b 51 private:
aktk 3:75f50dbedf1b 52 //
aktk 3:75f50dbedf1b 53 // Variables
aktk 3:75f50dbedf1b 54 //
aktk 3:75f50dbedf1b 55 UseType _useType;
aktk 4:8db89b731133 56 unsigned int _Sample_Num; // the number of samples for derive spline
aktk 4:8db89b731133 57 Vxyt* _Sample_Set;
aktk 7:e032ddec6ed5 58 double* _C_x[4]; //x = Spline-f(t) = _C_x[0] + _C_x[1]t + _C_x[2]t^2 + _C_x[3]t^3
aktk 7:e032ddec6ed5 59 double* _C_y[4]; //y = Spline-f(t) = _C_y[0] + _C_y[1]t + _C_y[2]t^2 + _C_y[3]t^3
aktk 8:e7d451bb4fd4 60 Vxyt _Last_Point;
aktk 7:e032ddec6ed5 61 //
aktk 7:e032ddec6ed5 62 //
aktk 7:e032ddec6ed5 63 //
aktk 7:e032ddec6ed5 64 //
aktk 3:75f50dbedf1b 65 // For calibration
aktk 3:75f50dbedf1b 66 //
aktk 7:e032ddec6ed5 67 // sampling data for calibration
aktk 3:75f50dbedf1b 68 void _sampleData();
aktk 5:bfb6dbd37aa4 69 // generate a vector of _u_params which is used for Cubic spline model
aktk 7:e032ddec6ed5 70 void _makeModel(
aktk 7:e032ddec6ed5 71 const double* arg_sampled_t,
aktk 7:e032ddec6ed5 72 const double* arg_sampled_ft,
aktk 7:e032ddec6ed5 73 /*-*/ double* arg_C[4],
aktk 7:e032ddec6ed5 74 const unsigned int arg_num = _Sample_Num
aktk 7:e032ddec6ed5 75 );
aktk 7:e032ddec6ed5 76 //
aktk 7:e032ddec6ed5 77 // For calculation
aktk 7:e032ddec6ed5 78 //
aktk 8:e7d451bb4fd4 79 // Fuction to return the value of Cubic polynomial f(t)
aktk 7:e032ddec6ed5 80 double _cubic_f(
aktk 7:e032ddec6ed5 81 const double arg_t,
aktk 8:e7d451bb4fd4 82 const double arg_C[4]
aktk 7:e032ddec6ed5 83 );
aktk 8:e7d451bb4fd4 84 // Function to solve a cubic polinomial
aktk 7:e032ddec6ed5 85 // by using Gardano-Tartaglia formula
aktk 7:e032ddec6ed5 86 void _solve_cubic_f(
aktk 7:e032ddec6ed5 87 std::complex<double>* arg_t,
aktk 8:e7d451bb4fd4 88 const double arg_C[4],
aktk 7:e032ddec6ed5 89 const double arg_ft
aktk 7:e032ddec6ed5 90 );
aktk 3:75f50dbedf1b 91 //
aktk 3:75f50dbedf1b 92 // For debug
aktk 3:75f50dbedf1b 93 //
aktk 3:75f50dbedf1b 94 void _printOutData(unsigned short *arg, int num, char* name);
aktk 4:8db89b731133 95 void _printOutData(Vxyt *arg, int num, char* name);
aktk 3:75f50dbedf1b 96 void _printOutData(double *arg, int num, char* name);
aktk 3:75f50dbedf1b 97 };
aktk 3:75f50dbedf1b 98 #endif