caicaptain2 发表于 2022-3-11 15:12:41

五点二次线性平滑的函数分享

本帖最后由 caicaptain2 于 2022-3-11 16:33 编辑

研究了一下线性多次平滑的滤波算法。 公式是这个:



函数如下:/**
*@function: - 5点2次线性平滑
*@data:输入数据,输出数据
*@size;data数据的个数
*返回滤波后的值 */
int8_tLinearSmooth5p2(float* data, uint16_t size)
{
float output; //5点缓存
uint16_t j=0;
int8_tPara={ //每一行的数字之和为35
    {31, 9,-3,-5, 3},
    { 9,13,12, 6,-5},
    {-3,12,17,12,-3},
    {-5, 6,12,13, 9},
    { 3,-5,-3, 9,31},      
};

if(size<5) return -1; //数据太少。不处理。
else
{
    output=(Para*data+ Para*data+Para*data+Para*data+ Para*data)/35;
    output=(Para*data+ Para*data+Para*data+Para*data+ Para*data)/35;

    output=(Para*data+ Para*data+Para*data+Para*data+ Para*data)/35;
    output=(Para*data+ Para*data+Para*data+Para*data+ Para*data)/35;
   
    for(j=2;j<=size-3;j++)
      {
      output=(Para*data+ Para*data+Para*data+Para*data+ Para*data)/35;
      data=output;
      }
      data=output;
      data=output;
      data=output;
      data=output;
      return 1; //成功转换。
}
}   



eric2013 发表于 2022-3-12 11:19:37

谢谢分享。

ssssssss 发表于 2022-3-21 14:33:20

比如我来一个点执行一次这个函数,那么第一个参数就是一个数组buffdata,buffdata(最新的数据);buffdata(前一个数据);buffdata(更前一个数据);buffdata(更更前一个数据);buffdata(更更更前一个数据);buffdata(更更更更前一个数据);第二个参数就是5,数据的个数;?是否对呢?返回的值就是当前加权后的算出的值,然后把点打到屏幕?

caicaptain2 发表于 2022-3-21 17:08:15

ssssssss 发表于 2022-3-21 14:33
比如我来一个点执行一次这个函数,那么第一个参数就是一个数组buffdata,buffdata(最新的数据);buffdat ...

我的数学也不好,只是照葫芦画瓢。。。。
似乎是就是把前后的数据进行加权平均,得到当前数据。 为什么是这个权重? 因为数学家经过计算了,这样子的方差最小。

ssssssss 发表于 2022-3-21 22:52:16

本帖最后由 ssssssss 于 2022-3-22 08:11 编辑

caicaptain2 发表于 2022-3-21 17:08
我的数学也不好,只是照葫芦画瓢。。。。
似乎是就是把前后的数据进行加权平均,得到当前数据。 为什么 ...
函数的入口参数我理解的对吗?

网络摘抄
1、五点线性拟合去差值原理是利用五点数据拟合出一条曲线来计算每一未知点的函数值。选择周围五个点,去掉最大值和最小值求剩余三个点的平均,使其相邻点变得平滑。2、五点线性平滑算法原理是利用最小二乘法拟合一条直线来计算未知点的函数值,属于一种均值滤波。


五点三次平滑法(cubical smoothing algorithm with five-point approximation)
Y=a0+a1x+a2x^2+a3x^3 三次多项式拟合:
yo(-2)=(69*yi(-2)+4*yi(-1)-6*yi(0)+4*yi(1)-yi(2))/70
yo(-1)=(2*yi(-2)+27*yi(-1)+12*yi(0)-8*yi(1)+2*yi(2))/35
yo(0) =(-3*yi(-2)+12*yi(-1)+17*yi(0)+12*yi(1)-3*yi(2))/35 (除了前两项和后两项外,都可用此式)
yo(1) =(2*yi(-2)-8*yi(-1)+12*yi(0)+27*yi(1)+2*yi(2))/35
yo(2) =(-yi(-2)+4*yi(-1)-6*yi(0)+4*yi(1)+69*yi(2))/70

七点三次平滑法:yo(0) =(-2*yi(-3)+3*yi(-2)+6*yi(-1)+7*yi(0)+6*yi(1)+3*yi(2)-2*yi(3))/21


caicaptain2 发表于 2022-3-22 12:28:16

ssssssss 发表于 2022-3-21 22:52
函数的入口参数我理解的对吗?

网络摘抄


是的。
5点好理解,二次,三次的区别不懂区别。

ssssssss 发表于 2022-3-22 19:58:14

caicaptain2 发表于 2022-3-22 12:28
是的。
5点好理解,二次,三次的区别不懂区别。

你试的效果如何,你多长时间采集一个值?

ssssssss 发表于 2022-3-24 17:44:26

caicaptain2 发表于 2022-3-22 12:28
是的。
5点好理解,二次,三次的区别不懂区别。

double KalmanFilter(double inData)
{
    static double prevData = 0;                              //上一个数据
    static double p = 10, q = 0.00005, r = 0.005, kGain = 0; //q值控制误差,r控制响应速度
    p = p + q;
    kGain = p / (p + r);                                       //计算增益
    inData = prevData + (kGain * ((double)inData - prevData)); //计算本次滤波估计值
    p = (1 - kGain) * p;                                       //更新测量方差
    prevData = inData;
    return inData;
}



看看这个函数行不行?

caicaptain2 发表于 2022-3-25 09:30:01

ssssssss 发表于 2022-3-24 17:44
double KalmanFilter(double inData)
{
    static double prevData = 0;                           ...
粗看,p的初始值有点问题吧。
第一轮,p等于10,那么kgain约等于1,第二轮,p值就几乎归零了。
可以用excel拉一个表格,观察kgain的变化,评估是否合理。

ssssssss 发表于 2022-3-25 16:08:13

caicaptain2 发表于 2022-3-25 09:30
粗看,p的初始值有点问题吧。
第一轮,p等于10,那么kgain约等于1,第二轮,p值就几乎归零了。
可以用e ...

我的一个朋友说,可以用excel表格,用一串数据试试就知道了,这个函数是可以用的

larry.wong 发表于 2022-3-29 09:50:26

ssssssss 发表于 2022-3-24 17:44
double KalmanFilter(double inData)
{
    static double prevData = 0;                           ...

测试过,可用,效果不错。感谢分享!

yayasoso138 发表于 2022-3-29 21:05:08

核信号处理中这个函数用的很多,还有7点法,9点法和11点。以前在一本核信号处理书上看到过,具体系数都忘记了。一般用在谱数据预处理上,适合滤除随机干扰噪声,对特征峰影响较小。

ssssssss 发表于 2022-4-21 09:38:06

larry.wong 发表于 2022-3-29 09:50
测试过,可用,效果不错。感谢分享!

你的测试场景是啥,具体是啥功能?能大概说一下嘛?

larry.wong 发表于 2022-5-18 11:57:06

ssssssss 发表于 2022-4-21 09:38
你的测试场景是啥,具体是啥功能?能大概说一下嘛?

测度的的一个称重的应变数据,稳定挺快的,对外部振动反映会慢些。
页: [1]
查看完整版本: 五点二次线性平滑的函数分享