最近研究使用卡尔曼滤波处理蓝牙RSS原始数据,参考了几篇优秀的博文,终有所获!
- 详细的卡尔曼滤波原理讲解
https://zhuanlan.zhihu.com/p/36745755 - 简单场景下(处理温度、加速度、RSS数据)的卡尔曼滤波原理
https://www.jianshu.com/p/c512a2b82907 - Java、Android使用JKalman
https://blog.csdn.net/kai_zone/article/details/102802105
//初始化卡尔曼滤波参数
private void initial() {
//dynam_params:测量矢量维数,measure_params:状态矢量维数
try {
mFilter = new JKalman(1,1);
double x =0;
mPredictValue = new Matrix(1,1);
mCorrectedValue = new Matrix(1,1);
mMeasurementValue = new Matrix(1,1);
mMeasurementValue.set(0,0,x); //初始状态(随便设置,不会影响后面的结果)
double[][] tr = {{1}}; //转移矩阵
mFilter.setTransition_matrix(new Matrix(tr));
double[][] Q = {{0.00002}};
mFilter.setProcess_noise_cov(new Matrix(Q)); //预测噪声协方差矩阵
double[][] P = {{0.0004}};
mFilter.setMeasurement_noise_cov(new Matrix(P)); //测量噪声协方差矩阵
} catch (Exception e) {
e.printStackTrace();
}
}
//返回预测修正后的数据
public int KalmanFilter(int oldValue){
mPredictValue = mFilter.Predict();
mMeasurementValue.set(0,0,oldValue);
mCorrectedValue = mFilter.Correct(mMeasurementValue);
int newValue = (int) mCorrectedValue.get(0,0);
return newValue;
}
上图中的深蓝色是原始蓝牙RSS数据,浅蓝色是Android卡尔曼滤波结果(结果取整了),红色是matlab上的结果(数组),Q与R的参数一样。两个结果一样,且验证了Jkalman。