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:
Mon May 30 09:18:50 2016 +0000
Revision:
13:9a51747773af
Parent:
9:1903c6f8d5a9
all function has briefly 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 13:9a51747773af 15 #define DEBUG
aktk 13:9a51747773af 16 #define VERSION_C
aktk 13:9a51747773af 17 //#define DEBUG_MAKE_MODEL
aktk 13:9a51747773af 18 //#define DEBUG_SOLVE
aktk 13:9a51747773af 19 //#define DEBUG_GETX "DEBUG_GETX\n"
aktk 13:9a51747773af 20 //#define DEBUG_GETY "DEBUG_GETY\n"
aktk 13:9a51747773af 21
aktk 3:75f50dbedf1b 22 #include "mbed.h"
aktk 7:e032ddec6ed5 23 #include <cmath>
aktk 7:e032ddec6ed5 24 #include <complex>
aktk 9:1903c6f8d5a9 25 #include <vector>
aktk 3:75f50dbedf1b 26
aktk 3:75f50dbedf1b 27 // Vector Element Type
aktk 3:75f50dbedf1b 28 typedef struct {
aktk 7:e032ddec6ed5 29 double x; //
aktk 4:8db89b731133 30 double y; //
aktk 4:8db89b731133 31 double t; // use as pramameter of x,y.
aktk 4:8db89b731133 32 } Vxyt;
aktk 3:75f50dbedf1b 33
aktk 7:e032ddec6ed5 34 enum UseType {
aktk 3:75f50dbedf1b 35 AsDEBUG,
aktk 3:75f50dbedf1b 36 AsMODULE
aktk 3:75f50dbedf1b 37 };
aktk 3:75f50dbedf1b 38
aktk 4:8db89b731133 39 class CubicSpline2d
aktk 3:75f50dbedf1b 40 {
aktk 3:75f50dbedf1b 41 public:
aktk 3:75f50dbedf1b 42 // Constraction
aktk 4:8db89b731133 43 CubicSpline2d();
aktk 4:8db89b731133 44 CubicSpline2d(unsigned int);
aktk 4:8db89b731133 45 CubicSpline2d(unsigned int, UseType);
aktk 3:75f50dbedf1b 46 // Destraction
aktk 4:8db89b731133 47 ~CubicSpline2d();
aktk 3:75f50dbedf1b 48 // Functions
aktk 8:e7d451bb4fd4 49 double getX(double arg_y);
aktk 8:e7d451bb4fd4 50 double getY(double arg_x);
aktk 3:75f50dbedf1b 51 void calibrateSensor();
aktk 3:75f50dbedf1b 52 void saveSetting();
aktk 3:75f50dbedf1b 53 void saveSetting(const char *filename);
aktk 3:75f50dbedf1b 54 void loadSetting();
aktk 3:75f50dbedf1b 55 void loadSetting(const char *filename);
aktk 3:75f50dbedf1b 56 void printOutData();
aktk 3:75f50dbedf1b 57
aktk 3:75f50dbedf1b 58 private:
aktk 3:75f50dbedf1b 59 //
aktk 3:75f50dbedf1b 60 // Variables
aktk 3:75f50dbedf1b 61 //
aktk 3:75f50dbedf1b 62 UseType _useType;
aktk 4:8db89b731133 63 unsigned int _Sample_Num; // the number of samples for derive spline
aktk 4:8db89b731133 64 Vxyt* _Sample_Set;
aktk 7:e032ddec6ed5 65 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 66 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 67 Vxyt _Last_Point;
aktk 7:e032ddec6ed5 68 //
aktk 7:e032ddec6ed5 69 //
aktk 7:e032ddec6ed5 70 //
aktk 7:e032ddec6ed5 71 //
aktk 3:75f50dbedf1b 72 // For calibration
aktk 3:75f50dbedf1b 73 //
aktk 7:e032ddec6ed5 74 // sampling data for calibration
aktk 3:75f50dbedf1b 75 void _sampleData();
aktk 5:bfb6dbd37aa4 76 // generate a vector of _u_params which is used for Cubic spline model
aktk 7:e032ddec6ed5 77 void _makeModel(
aktk 7:e032ddec6ed5 78 const double* arg_sampled_t,
aktk 7:e032ddec6ed5 79 const double* arg_sampled_ft,
aktk 7:e032ddec6ed5 80 /*-*/ double* arg_C[4],
aktk 9:1903c6f8d5a9 81 const unsigned int arg_num
aktk 9:1903c6f8d5a9 82 );
aktk 9:1903c6f8d5a9 83 void _makeModel(
aktk 9:1903c6f8d5a9 84 const double* arg_sampled_t,
aktk 9:1903c6f8d5a9 85 const double* arg_sampled_ft,
aktk 9:1903c6f8d5a9 86 /*-*/ double* arg_C[4]
aktk 7:e032ddec6ed5 87 );
aktk 7:e032ddec6ed5 88 //
aktk 7:e032ddec6ed5 89 // For calculation
aktk 7:e032ddec6ed5 90 //
aktk 8:e7d451bb4fd4 91 // Fuction to return the value of Cubic polynomial f(t)
aktk 7:e032ddec6ed5 92 double _cubic_f(
aktk 7:e032ddec6ed5 93 const double arg_t,
aktk 8:e7d451bb4fd4 94 const double arg_C[4]
aktk 7:e032ddec6ed5 95 );
aktk 8:e7d451bb4fd4 96 // Function to solve a cubic polinomial
aktk 7:e032ddec6ed5 97 // by using Gardano-Tartaglia formula
aktk 7:e032ddec6ed5 98 void _solve_cubic_f(
aktk 7:e032ddec6ed5 99 std::complex<double>* arg_t,
aktk 8:e7d451bb4fd4 100 const double arg_C[4],
aktk 7:e032ddec6ed5 101 const double arg_ft
aktk 7:e032ddec6ed5 102 );
aktk 3:75f50dbedf1b 103 //
aktk 3:75f50dbedf1b 104 // For debug
aktk 3:75f50dbedf1b 105 //
aktk 9:1903c6f8d5a9 106 void _printOutData(
aktk 9:1903c6f8d5a9 107 const unsigned short* arg,
aktk 9:1903c6f8d5a9 108 const int num,
aktk 9:1903c6f8d5a9 109 const char* name);
aktk 9:1903c6f8d5a9 110 void _printOutData(
aktk 9:1903c6f8d5a9 111 const Vxyt* arg,
aktk 9:1903c6f8d5a9 112 const int num,
aktk 9:1903c6f8d5a9 113 const char* name);
aktk 9:1903c6f8d5a9 114 void _printOutData(
aktk 9:1903c6f8d5a9 115 const double* arg,
aktk 9:1903c6f8d5a9 116 const int num,
aktk 9:1903c6f8d5a9 117 const char* name);
aktk 9:1903c6f8d5a9 118 void _printOutDataCouple(
aktk 9:1903c6f8d5a9 119 const double* arg1,
aktk 9:1903c6f8d5a9 120 const double* arg2,
aktk 9:1903c6f8d5a9 121 const int num,
aktk 9:1903c6f8d5a9 122 const char* name);
aktk 3:75f50dbedf1b 123 };
aktk 3:75f50dbedf1b 124 #endif