lb0857 发表于 2024-1-27 20:11:05

请教,stm32可以拟合成线性度很好的数据吗

10个点采集数据,控制板外接一款传感器模拟量0~10v,ad采集之后,要拟合成为线性度很好数据,坛友看看,有没有可能实现。数据

foxpro2005 发表于 2024-1-27 20:52:00

线性拟合不就得了, 实际效果要自己测了

lb0857 发表于 2024-1-27 22:29:56

X Value        Calculated Y        Ideal Y
0.01        -0.29                0.00
1.48        1.27                0.66
2.60        2.46                1.33
3.67        3.59                2.00
4.71        4.70                2.66
5.70        5.75                3.33
6.59        6.69                4.00
7.39        7.54                4.66
8.08        8.27                5.33
8.67        8.90                6.00
9.12        9.37                6.66
9.40        9.67                7.33
9.60        9.88                8.00
9.75        10.04                8.66
9.87        10.17                9.33
9.96        10.27                10.00

按照ls公式进行运算得出值:Calculated Y       
线性度不如你的好。啥情况

智涅 发表于 2024-1-28 00:17:18

11个点,分成10段线性,精度也不够吗?

t3486784401 发表于 2024-1-28 01:15:52

本帖最后由 t3486784401 于 2024-1-28 01:19 编辑

分段就不说了,多项式也挺香的啊。 实测到 5 阶就看起来很像样了,R^2 有四个九:

zchong 发表于 2024-1-28 08:14:49

有点迷糊,传感器是线性的吗?拟合成线性本身不存在问题,问题在于是否适合拟合成线性。如果是我,先找100个传感器(多样本),每个传感器测10组以上数据(单个样本多次测量,减少随机误差),先看看传感器特性再进一步选择如何拟合比较合适,{:lol:}

honami520 发表于 2024-1-28 09:26:20

用:最小二乘法

redroof 发表于 2024-1-28 10:20:25

你这根本就不是线性啊,明明像个有点弯的多项式。
除掉0那个点以外,别的点估计用个3阶就够完美的拟合了。
或者如果你知道人家内部的电路原理,也可能可以用其它样子的公式来拟合,比如带有除号,自变量在除数里(可变电阻跟别的东西并联),或者带指数的(ntc就是)

ibmx311 发表于 2024-1-28 18:20:22

redroof 发表于 2024-1-28 10:20
你这根本就不是线性啊,明明像个有点弯的多项式。
除掉0那个点以外,别的点估计用个3阶就够完美的拟合了。
...
(引用自8楼)

不就是线性吗,我画一条直线要多直就多直

redroof 发表于 2024-1-28 19:37:53

ibmx311 发表于 2024-1-28 18:20
不就是线性吗,我画一条直线要多直就多直
(引用自9楼)

实际数据不线性啊,所以正确的做法应该是用个多项式插值。
看起来这个曲线的曲率是单调的,总是凸的,所以还算好,很可能2-3阶就足够了

lb0857 发表于 2024-1-28 21:27:20

stm32F1单片机进行拟合,结果总是不如意。
理想中达到二楼效果,
实际上尾端很难搞。

lb0857 发表于 2024-1-28 21:28:56

redroof 发表于 2024-1-28 19:37
实际数据不线性啊,所以正确的做法应该是用个多项式插值。
看起来这个曲线的曲率是单调的,总是凸的,所 ...
(引用自10楼)

多项式差值实验了,
有可能是方法不对,线性度还是很差。

redroof 发表于 2024-1-28 21:48:19

lb0857 发表于 2024-1-28 21:28
多项式差值实验了,
有可能是方法不对,线性度还是很差。
(引用自12楼)

excel可以直接做多项式拟合啊,上面有人都发了。你去掉第一个点试试,3阶很可能就够了

autolog 发表于 2024-1-28 21:57:18

t3486784401 发表于 2024-1-28 01:15
分段就不说了,多项式也挺香的啊。 实测到 5 阶就看起来很像样了,R^2 有四个九:

...
(引用自5楼)

有没有可能,楼主问的是用stm32来拟合😁
也就是用C语言写拟合算法

t3486784401 发表于 2024-1-28 22:07:26

autolog 发表于 2024-1-28 21:57
有没有可能,楼主问的是用stm32来拟合😁
也就是用C语言写拟合算法
(引用自14楼)

这得看楼主自己的目的。

至少这么多层楼了,还没说明白是要 在线拟合 还是 离线拟合

lb0857 发表于 2024-1-29 08:44:34

autolog 发表于 2024-1-28 21:57
有没有可能,楼主问的是用stm32来拟合😁
也就是用C语言写拟合算法
(引用自14楼)

主机是stm32f1做主控
就是这芯片用C语言写拟合算法

redroof 发表于 2024-1-29 08:58:04

lb0857 发表于 2024-1-29 08:44
主机是stm32f1做主控
就是这芯片用C语言写拟合算法
(引用自16楼)

别人问你的意思是,你人工采样10个点,然后丢到excel里算岀一条正确的拟合曲线,然后把这些曲线系数放到板子里用,这样是否可以?
或者你需要板子自己根据不同的10个已知点来计算拟合曲线的系数?

liuxiangyub 发表于 2024-1-29 09:29:54

t3486784401 发表于 2024-1-28 01:15
分段就不说了,多项式也挺香的啊。 实测到 5 阶就看起来很像样了,R^2 有四个九:

...
(引用自5楼)

果然是大侠,

我又学到了一招:excel做拟合公式

iamseer 发表于 2024-1-29 10:34:43

lb0857 发表于 2024-1-29 08:44
主机是stm32f1做主控
就是这芯片用C语言写拟合算法
(引用自16楼)

STM32和电脑跑C有什么区别?是不支持浮点?还是内存不够?还是CPU速度不行?
如果这些没区别,你没有必要强调STM32。你需要的是C的拟合代码。

User

I have x = 1,2,3,4,5,6,7,8,9,10,11, and y = 0.01,1.1,2.77,4.3,5.68,6.87,7. 88,8.7,9.34,9. 85,10.21
I need linear regression code in C

Certainly! Here's the C code for linear regression using the given data:

c
#include <stdio.h>

// Function to calculate the mean of an array
float calculateMean(float arr[], int n) {
    float sum = 0.0;
    for (int i = 0; i < n; i++) {
      sum += arr;
    }
    return sum / n;
}

// Function to calculate the slope (m) of the line
float calculateSlope(float x[], float y[], int n) {
    float sumXY = 0.0, sumX = 0.0, sumY = 0.0, sumX2 = 0.0;

    for (int i = 0; i < n; i++) {
      sumXY += x * y;
      sumX += x;
      sumY += y;
      sumX2 += x * x;
    }

    return (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX);
}

// Function to calculate the intercept (c) of the line
float calculateIntercept(float x[], float y[], int n, float slope) {
    float meanX = calculateMean(x, n);
    float meanY = calculateMean(y, n);

    return meanY - slope * meanX;
}

int main() {
    // Given data
    float x[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
    float y[] = {0.01, 1.1, 2.77, 4.3, 5.68, 6.87, 7.88, 8.7, 9.34, 9.85, 10.21};

    // Number of data points
    int n = sizeof(x) / sizeof(x);

    // Calculate slope and intercept
    float slope = calculateSlope(x, y, n);
    float intercept = calculateIntercept(x, y, n, slope);

    // Print the equation of the line (y = mx + c)
    printf("Equation of the line: y = %.2fx + %.2f\n", slope, intercept);

    return 0;
}

Replace the existing x and y arrays with your given data. The program will calculate the slope and intercept of the line that best fits the data and print the equation of the line.

随便拿个在线编译器跑一下,结果是 Equation of the line: y = 1.06x + -0.30。和2楼结果一致。

erxun 发表于 2024-1-29 10:52:02

https://www.bilibili.com/video/BV1cC4y1k7t7/?spm_id_from=333.1365.list.card_archive.click&vd_source=b9fe0793d2bfda1e9cba6c97eaafcec7

lb0857 发表于 2024-1-29 11:39:27

iamseer 发表于 2024-1-29 10:34
STM32和电脑跑C有什么区别?是不支持浮点?还是内存不够?还是CPU速度不行?
如果这些没区别,你没有必要 ...
(引用自19楼)

谢谢啦
我稍后验证去

zhangling520 发表于 2024-1-29 13:02:22

t3486784401 发表于 2024-1-28 01:15
分段就不说了,多项式也挺香的啊。 实测到 5 阶就看起来很像样了,R^2 有四个九:

...
(引用自5楼)

请问下大佬,离线拟合后,单片机能跑起来这五阶的公式吗

t3486784401 发表于 2024-1-29 13:17:35

zhangling520 发表于 2024-1-29 13:02
请问下大佬,离线拟合后,单片机能跑起来这五阶的公式吗
(引用自22楼)

就几个浮点乘法,有啥不行的。 当然你要限定计算时间、提高 fps 有可能速度不够。
十来次浮点运算,就算再慢的 51 差不多 10ms 也足够折腾了。

跑拟合(计算方程参数)运算量比这个大多了,所以一般放在 PC 上跑拟合;
在 MPU 端一般只运行简单的多项式计算。如果还要加速,甚至需要退化到查表。

t3486784401 发表于 2024-1-29 13:21:57

iamseer 发表于 2024-1-29 10:34
STM32和电脑跑C有什么区别?是不支持浮点?还是内存不够?还是CPU速度不行?
如果这些没区别,你没有必要 ...
(引用自19楼)

所以说楼主一直没明确,是否需要现场拟合。

比如有多个系统,需要现场识别不同系统参数,输出不同的拟合方程,这时候就要 MPU 端进行拟合;
但更多情况下是固定系统,做几套实验把拟合方程算出来就行,现场 MPU 顶多是对拟合方程应用下,这种就可以离线算。

ibmx311 发表于 2024-1-29 16:16:46

stm32 的算力和电脑有可比性吗,一个是百十兆的速度一个是四五G的速度,而且电脑都是多核的。电脑电源的功率已经决定一切了,厂里上个月装了几台电脑电源都是1000w的,四年前我负责装的电脑电源也是550W的,stm32才能用几个电
页: [1]
查看完整版本: 请教,stm32可以拟合成线性度很好的数据吗