因为工做缘由,对数值计算,fft还有小波使用频率比较高;相关可选的方案较多,好比Matlab,简易而又强大,然而用久了,看不到其源码就成为个人心结,顺着贪婪的本性,找到了GSL,以三次样条插值为例,记录其用法。 html
GSL库的安装 node
sudo apt-get install libgsl0-dev libgsl0ldbl编辑环境:emacs
编译环境:gcc + make shell
结果显示:graph + evince ubuntu
graph工具须要安装plotutils包: windows
sudo apt-get install plotutils
evince为ubuntu自带的文档查看器 工具
固然,你也能够在windows或Mac上使用。 spa
对单片机采样与实际电流值创建对应关系表,以理想状况论,该表应为线性关系(感应磁路+AD转换电路),但实验条件下,磁路饱和与元器件差别问题使该表并不能保持较好的线性关系,综合多方面因素,以三次样条插值来构建其对应关系比较合理。 code
GSL主页 GSL库Interpolation模块文档 三次样条插值原理 (维基又被黑了?MLGB) htm
图1 实验数据 ip
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <gsl/gsl_errno.h> #include <gsl/gsl_spline.h> #define DATA_COUNTS 19 #define MAX_LINES 1024 int main() { //double curr[DATA_COUNTS] = {1,3,6,8,10,20,30,50,80,100,200,250,300,350,400,450,500,600,630,650}; //double ad[DATA_COUNTS] = {1,12,18,21,25,42,60,97,154,192,384,463,544,589,644,700,736,820,832,856}; double curr[DATA_COUNTS] = {0,3,6,8,10,20,30,50,80,100,200,250,300,400,450,500,600,630,650}; double ad[DATA_COUNTS] = {1,2,7,11,15,30,43,72,121,155,334,419,500,650,716,778,893,924,946}; double xi = 0; double yi = 0; gsl_interp_accel *acc = gsl_interp_accel_alloc (); gsl_spline *spline = gsl_spline_alloc (gsl_interp_cspline, DATA_COUNTS); gsl_spline_init (spline, ad, curr, DATA_COUNTS); for (xi=1; xi<=ad[DATA_COUNTS-1]; xi++){ yi = gsl_spline_eval (spline, xi, acc); printf("%g %g\n", xi, yi); } gsl_spline_free (spline); gsl_interp_accel_free (acc); return 0; }该源码参照 gsl参考手册——三次样条插值实例程序 。
my_interp : my_interp.c gcc -Wall -g $< -L/usr/lib -lgsl -lgslcblas -lm -o $@ clean: rm -rf my_interp *~ *ps *dat run: ./my_interp>interp.dat graph -T ps<interp.dat>interp.ps show: evince interp.ps其中,run命令下的 “./my_interp>interp.dat”将插值后的数据重定向到文件中,便于绘图工具处理;
Makefile文件命令依次执行以下:
$ make gcc -Wall -g my_interp.c -L/usr/lib -lgsl -lgslcblas -lm -o my_interp $ make run ./my_interp>interp.dat graph -T ps<interp.dat>interp.ps $ make show evince interp.ps图形效果以下:
图2 插值数据可视化
固然也能够使用gnuplot可视化数据:
gnuplot> set term x11 Terminal type set to 'x11' Options are ' nopersist' gnuplot> set datafile separator " " gnuplot> plot 'interp.dat' every::1::946 using 1:2 with lines图示以下:
程序源码中注释的数据,是更换了另外一个磁路结构后测量到的,相应地其图形以下:
从产品研发的角度来看,图2和图3对应的磁路结构比图4对应的磁路结构好得多,其优劣高下立判。