/********************************************************************
*@函数名:KalmanFilter(float newdata)
*@功 能:卡尔曼滤波
*@形 参:newdata 新数据
*@返回值:滤波后数据
*@备 注:要定义过程噪声和测量噪声
********************************************************************/
/*
Q: 过程噪声,Q增大,动态响应变快,收敛稳定性变坏
R: 测量噪声,R增大,动态响应变慢,收敛稳定性变好
其中p的初值可以随便取,但是不能为0(为0的话卡尔曼滤波器就认为已经是最优滤波器了)
q,r的值需要我们试出来,讲白了就是(买的破温度计有多破,以及你的超人力有多强)
r参数调整滤波后的曲线与实测曲线的相近程度,r越小越接近。
q参数调滤波后的曲线平滑程度,q越小越平滑。
*/
//过程噪音
#define P_Q 0.1
//测量噪声
#define M_R 0.01
float KalmanFilter(float newdata)
{
static float lastdata=0;
//其中p的初值可以随便取,但是不能为0(为0的话卡尔曼滤波器就认为已经是最优滤波器了)
static float p=0.01;
float q = P_Q, r = M_R, kGain = 0;
p = p+q;
kGain = p/(p+r); //卡尔曼滤波系数
newdata = lastdata + (kGain*(newdata-lastdata));
p = (1-kGain)*p;
lastdata = newdata;
return newdata;
}
|