线性回归方程在嵌入式开发中是非常常用的,尤其在参数校准这块应用非常普遍,无论你是写在上位机代码中,还是直接写在嵌入式软件中。
下面是我在PT100校准中写的关于线性回归方程代码。
/*
线性回归方程公式
平均值XA=(X1+X2+...+XN)/N
平均值YA=(Y1+Y2+...+YN)/N
斜率K=((X1-XA)(Y1-YA)+(X2-XA)(Y2-YA)+...)/((X1-XA)(X1-XA)+(X2-XA)(X2-XA)+...)
截距T=YA-K*XA
*/
#define RES_100_REAL_VALUE 9930//0.01oumu
#define RES_110_REAL_VALUE 11050//0.01oumu
#define RES_120_REAL_VALUE 11850//0.01oumu
#define RES_130_REAL_VALUE 13020//0.01oumu
uint32_t PT100_REAL_RES_VALUEy[4]=
{
RES_100_REAL_VALUE,RES_110_REAL_VALUE,RES_120_REAL_VALUE,RES_130_REAL_VALUE
};
/*
平均值函数
*/
float Average(uint32_t *p_array,uint8_t n_size)
{
uint32_t temp_sum =0;
for(uint8_t i=0;i<n_size;i++)
temp_sum+=p_array[i];
return temp_sum/n_size;
}
/*
求平均值YN
*/
float REAL_RES_ave=Average(PT100_REAL_RES_VALUEy,sizeof(PT100_REAL_RES_VALUEy)/sizeof(PT100_REAL_RES_VALUEy[0]));
/*
函数功能:求数组各元素的线性回归方程的斜率
入口参数p_get_val为一个数组的首地址
入口参数n_size为数组元素个数
返回数组各元素的线性回归方程的斜率
*/
float PT100_K_CORRECT3(uint32_t *p_get_val,uint8_t n_size)
{
float temp_k_val;
float Get_Res_ave;
Get_Res_ave=Average(p_get_val,n_size);//XA
temp_k_val=(float)
((p_get_val[0]-Get_Res_ave)*(PT100_REAL_RES_VALUEy[0]-REAL_RES_ave)
+(p_get_val[1]-Get_Res_ave)*(PT100_REAL_RES_VALUEy[1]-REAL_RES_ave)
+(p_get_val[2]-Get_Res_ave)*(PT100_REAL_RES_VALUEy[2]-REAL_RES_ave)
+(p_get_val[3]-Get_Res_ave)*(PT100_REAL_RES_VALUEy[3]-REAL_RES_ave))
/
((p_get_val[0]-Get_Res_ave)*(p_get_val[0]-Get_Res_ave)
+(p_get_val[1]-Get_Res_ave)*(p_get_val[1]-Get_Res_ave)
+(p_get_val[2]-Get_Res_ave)*(p_get_val[2]-Get_Res_ave)
+(p_get_val[3]-Get_Res_ave)*(p_get_val[3]-Get_Res_ave)
);//K
return temp_k_val;
}
/*
函数功能:求数组各元素的线性回归方程的截距
入口参数p_get_val为一个数组的首地址
入口参数n_size为数组元素个数
返回数组各元素的线性回归方程的截距
*/
short PT100_T_CORRECT3(uint32_t *p_get_val,uint8_t n_size)
{
float temp_k_val,Get_Res_ave;
short temp_t_val;
Get_Res_ave=Average(p_get_val,n_size);//XA
temp_k_val=PT100_K_CORRECT3(p_get_val,n_size);//K
temp_t_val=REAL_RES_ave-temp_k_val*Get_Res_ave;//T
return temp_t_val;
}
今天先弄一个keil编辑器里的源码,后期有时间弄VisualStudio的代码,以及测试代码。