找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12975|回复: 1
打印 上一主题 下一主题
收起左侧

C语言全程线性分段插值算法

[复制链接]
跳转到指定楼层
楼主
ID:65608 发表于 2014-9-13 01:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  解决传感器数据线性不好或非线性问题,实现低次多项插值算法,其曲线逼近程度即插值函数与原函数误差基本满足一般的工业控制场合需要。此算法占用系统资源少,在数据采集和数据处理等工业控制领域,往往使用单片机或嵌入式系统等资源受限处理器,通过分段线性插值算法简化原函数,很多乘除法运算优化成加减法,减少计算量,在没有乘法器的单片机上也能有很好的表现。
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);
}
调用示例: 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);


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:139339 发表于 2017-7-30 16:51 | 只看该作者
上述的x1,x2,y1,y2都是采样点吗?或者说是第几次采样的数据?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表