欢迎光临散文网 会员登陆 & 注册

嵌入式软件开发常用算法---一维线性插值

2023-03-01 21:56 作者:6号课堂  | 我要投稿

各位朋友大家后,今天迎来了继于最小二乘法之后的第二个算法,一维线性插值法(图像处理会用到多维插值)。相信很多的朋友在项目开发的过程中会遇到,随温度变化传感器的输出数据比如电压、电流、速度、光强、角度、加速度等信息就会随之发生变化。这是由于温度变化引起的传感器温漂现象,(基本上所有的电子元器件、传感器都有温漂),所以我们一般会用温度补偿算法来抑制温漂

    下图是DS18B20的温度漂移曲线图,可以看出随着温度的变化,温度误差没有一定的线性度可言,进行温度补偿也是比较困难,那怎么才能解决这个问题呢?

 图 1 DS18B20

      要解决这个问题就不得不提两个伟大的数学家,也就是伴随我们大学几年的恐怖存在:牛顿和尼布莱茨。

          图 2   牛顿
图 3 尼布莱茨


为什么要提这两个死了也不让活着的人好好活的人呢?,那是因为他们提出了微积分,即无限逼近的先进思想。这个思想在嵌入式开发过程中可以帮助我们解决大量的现实问题。
什么是一维线性插值法?一维线性插值是针对一维数据的数值常用处理方法,它根据一维数据序列中左右相邻的两个数据点,来估算这两个点之间的任意点。说得再明白一点,两点确定一条直线,也就是确定正比例函数。

图 4 线性插值


      那这与我们的微积分有什么关系呢?大家别着急嘛。请继续往下看‘

图 5  微积分简图


  大家一定还记得微积分的本质:微积分其实就是通过分割、求和、取极限的方式,进而将比较复杂的问题化简为简单问题。通过求解图7阴影部分的长方形面积来无限逼近曲线部分面积。微积分的思想是这些长方形分的越窄,分的越越细它就越逼近曲线面积,最好能无限细。

     用它怎么解决我们的现实问题呢?大家请看图7假设它是一个受温度影响比较大的系统,其中采集了10个点,由此我们来估计0-50度之间传感器输出的值。最简单的方法就是分段函数了,这里的分段函数其实就是体现了微积分思想,我们采集到的点越多,分的函数段越多越接近传感器的真实值。

      对于这个问题(温度补偿)来说,我们只需要将一维线性插值法和分段函数相结合就可以了,也就是对上述系统进行温度补偿。那具体的温度补偿函数线性关系式是什么样子的呢?

(1)


     在该系统中每隔5度采集一次,假设第10度采集到的传感器的值是S10,加号后面的一部分就是计算的增量部分,两者相加就是我们所拟合的值,当然这里是计算的是10-15度分段函数,通过改该函数可以估算传感器10-15度任意温度的输出数据。一个拥有温补的系统中是由多个分段组成的。

要彻底完成温度补偿,我们这里所需要实现的其实是两个函数:1分段函数2.这个一维线性插值函数。
这里我们列出这两个函数的代码供大家参考和学习。
分段函数的代码实现如下:


图 5 分段函数

飞鱼模拟了一组数据来说明上面算法的功能。请看下面数据

图7 传感器温度曲线图

        假设X轴表示传感器的温度值,Y轴表示传感器在该温度对应的数据输出。工程实现过程中在传感器的标定阶段,我们会把不同温度点的值(图7中Y轴数据)存储到FLASH中。使用时把FLASH中的这些数据读出来放到数组中。然后再用分段函数和线性插值法计算传感器的输出,接下来我们说说具体实现过程。图7所示传感器在0-45度范围内,采集了10个温度点的数据。假设我们要计算27度时传感器输出值,上面的分段函数可以这么调用:subsection(0 ,45,10 ,27, segment ,  output ),第一个参数是温度的最小值,第二个参数是温度的最大值,第三个参数是是多少个采样点,第四个参数是传感器当前时刻的温度值,第5、第6个是输出信息。把上述入参带到分段函数里面,可以发现该分段函数计算的输出值,segment[0]为5,segment[0]为6,说明27度位于第5和第6个采样点之间,out[0]为25,out[1]为30。说明27度在25度到30度之间的分段。确定了函数分段,接下来就可以采用线性插值法把传感器的值计算出来。假设我们把Y轴的数据读出来放在一个叫做Sensor_Val[10]的数组中,Sensor_Val[]={7,12,14,16,21,25,29,33,36,40}。将上述分段函数执行的结果带入到公式(1)中 S27 = S25 +( S30-S25)/(30-25)*(27-25);所以27度时传感器的输出为26.6。如果用折线图表示拟合的结果如图8所示:

图 8 传感器数据折线拟合


          好了,今天的算法就分享到这里了,越是简单的方法越是能解决我们的现实问题,大道至简嘛。下面是飞鱼的个人微信:fei_yu_90,欢迎技术交流。



嵌入式软件开发常用算法---一维线性插值的评论 (共 条)

分享到微博请遵守国家法律