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:
Sun May 29 09:14:54 2016 +0000
Revision:
9:1903c6f8d5a9
Parent:
8:e7d451bb4fd4
Child:
13:9a51747773af
debugging: (the_t, the_i) now comes to (0,0) unexpectedly

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 9:1903c6f8d5a9 18 #include <vector>
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 9:1903c6f8d5a9 74 const unsigned int arg_num
aktk 9:1903c6f8d5a9 75 );
aktk 9:1903c6f8d5a9 76 void _makeModel(
aktk 9:1903c6f8d5a9 77 const double* arg_sampled_t,
aktk 9:1903c6f8d5a9 78 const double* arg_sampled_ft,
aktk 9:1903c6f8d5a9 79 /*-*/ double* arg_C[4]
aktk 7:e032ddec6ed5 80 );
aktk 7:e032ddec6ed5 81 //
aktk 7:e032ddec6ed5 82 // For calculation
aktk 7:e032ddec6ed5 83 //
aktk 8:e7d451bb4fd4 84 // Fuction to return the value of Cubic polynomial f(t)
aktk 7:e032ddec6ed5 85 double _cubic_f(
aktk 7:e032ddec6ed5 86 const double arg_t,
aktk 8:e7d451bb4fd4 87 const double arg_C[4]
aktk 7:e032ddec6ed5 88 );
aktk 8:e7d451bb4fd4 89 // Function to solve a cubic polinomial
aktk 7:e032ddec6ed5 90 // by using Gardano-Tartaglia formula
aktk 7:e032ddec6ed5 91 void _solve_cubic_f(
aktk 7:e032ddec6ed5 92 std::complex<double>* arg_t,
aktk 8:e7d451bb4fd4 93 const double arg_C[4],
aktk 7:e032ddec6ed5 94 const double arg_ft
aktk 7:e032ddec6ed5 95 );
aktk 3:75f50dbedf1b 96 //
aktk 3:75f50dbedf1b 97 // For debug
aktk 3:75f50dbedf1b 98 //
aktk 9:1903c6f8d5a9 99 void _printOutData(
aktk 9:1903c6f8d5a9 100 const unsigned short* arg,
aktk 9:1903c6f8d5a9 101 const int num,
aktk 9:1903c6f8d5a9 102 const char* name);
aktk 9:1903c6f8d5a9 103 void _printOutData(
aktk 9:1903c6f8d5a9 104 const Vxyt* arg,
aktk 9:1903c6f8d5a9 105 const int num,
aktk 9:1903c6f8d5a9 106 const char* name);
aktk 9:1903c6f8d5a9 107 void _printOutData(
aktk 9:1903c6f8d5a9 108 const double* arg,
aktk 9:1903c6f8d5a9 109 const int num,
aktk 9:1903c6f8d5a9 110 const char* name);
aktk 9:1903c6f8d5a9 111 void _printOutDataCouple(
aktk 9:1903c6f8d5a9 112 const double* arg1,
aktk 9:1903c6f8d5a9 113 const double* arg2,
aktk 9:1903c6f8d5a9 114 const int num,
aktk 9:1903c6f8d5a9 115 const char* name);
aktk 3:75f50dbedf1b 116 };
aktk 3:75f50dbedf1b 117 #endif