单片机ADC采样算法 之 卡尔曼滤波
算法的核心思想是,根据当前的仪器"测量值" 和上一刻的 “预测量” 和 “误差”,计算得到当前的最优量.
再预测下一刻的量, 里面比较突出的是观点是. 把误差纳入计算, 而且分为预测误差和测量误差两种.通称为 噪声. 还有一个非常大的特点是,误差独立存在, 始终不受测量数据的影响。
下来先了解一个卡尔曼滤波中几个参数的含义:概率(Probability),随即变量(Random Variable),高斯或正态分配(Gaussian Distribution)还有State-space Model等等。
关于卡尔曼公式的含义及推导,网上已经有很多文章了,这里不在赘述,直接看C代码的实现。
/*
R值固定,Q值越大,代表越信任测量值,Q值无穷大,代表只用测量值。
Q值越小,代表越信任模型预测值,Q值为0,代表只用模型预测值。
*/
//参数一
float KalmanFilter( float inData )
{
static float prevData = 0; //上一个数据
static float p = 10, q = 0.001, r = 0.001, kGain = 0; // q 控制误差 r 控制响应速度
p = p + q;
kGain = p / ( p + r ); //计算卡尔曼增益
inData = prevData + ( kGain * ( inData - prevData ) ); //计算本次滤波估计值
p = ( 1