標(biāo)題:
C語言全程線性分段插值算法
[打印本頁]
作者:
daliu
時(shí)間:
2014-9-13 01:09
標(biāo)題:
C語言全程線性分段插值算法
解決傳感器數(shù)據(jù)線性不好或非線性問題,實(shí)現(xiàn)低次多項(xiàng)插值算法,其曲線逼近程度即插值函數(shù)與原函數(shù)誤差基本滿足一般的工業(yè)控制場(chǎng)合需要。此算法占用系統(tǒng)資源少,在數(shù)據(jù)采集和數(shù)據(jù)處理等工業(yè)控制領(lǐng)域,往往使用單片機(jī)或嵌入式系統(tǒng)等資源受限處理器,通過分段線性插值算法簡(jiǎn)化原函數(shù),很多乘除法運(yùn)算優(yōu)化成加減法,減少計(jì)算量,在沒有乘法器的單片機(jī)上也能有很好的表現(xiàn)。
int linear_x8_y8(uint8_t xn,uint8_t x1,uint8_t x2,uint8_t y1,uint8_t y2)
{
int yn;
uint8_t tmp;
if(xn<x1)
{
yn=y1;
}
else if(xn>x2)
{
yn=y2;
}
else
{
if(y1<y2)
{
yn=y2-y1;
tmp=xn-x1;
yn=yn*tmp;
tmp=x2-x1;
yn=yn+(tmp/2);
yn=yn/tmp;
yn=y1+yn;
}
else
{
yn=y1-y2;
tmp=xn-x1;
yn=yn*tmp;
tmp=x2-x1;
yn=yn+(tmp/2);
yn=yn/tmp;
yn=y1-yn;
}
}
return(yn);
}
int lin_clac_x8_y8(uint8_t xn,uint8_t *queue_x,uint8_t *queue_y,uint8_t n)
{
uint8_t i;
int yn;
for(i=1;i<(n-1);i++){
if(xn<=queue_x[i])break;}
yn=linear_x8_y8(xn,queue_x[i-1],queue_x[i],queue_y[i-1],queue_y[i]);
return (yn);
}
調(diào)用示例: uint8_t x[15]={0,52,58,66,72,80,87,92,99,115,139,150,168,186,214,248},y[15]={0,68,73,81,87,94,101,108,114,131,153,166,183,202,229,263};
resul=lin_clac_x8_y8(resul,(uint8_t*)x,(uint8_t*)y,15);
作者:
Mars_
時(shí)間:
2017-7-30 16:51
上述的x1,x2,y1,y2都是采樣點(diǎn)嗎?或者說是第幾次采樣的數(shù)據(jù)?
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1