| /* |
| * Copyright (C) 2017 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.server.wifi.util; |
| |
| /** |
| * Utility providiing a basic Kalman filter |
| * |
| * For background, see https://en.wikipedia.org/wiki/Kalman_filter |
| */ |
| public class KalmanFilter { |
| public Matrix mF; // stateTransition |
| public Matrix mQ; // processNoiseCovariance |
| public Matrix mH; // observationModel |
| public Matrix mR; // observationNoiseCovariance |
| public Matrix mP; // aPosterioriErrorCovariance |
| public Matrix mx; // stateEstimate |
| |
| /** |
| * Performs the prediction phase of the filter, using the state estimate to produce |
| * a new estimate for the current timestep. |
| */ |
| public void predict() { |
| mx = mF.dot(mx); |
| mP = mF.dot(mP).dotTranspose(mF).plus(mQ); |
| } |
| |
| /** |
| * Updates the state estimate to incorporate the new observation z. |
| */ |
| public void update(Matrix z) { |
| Matrix y = z.minus(mH.dot(mx)); |
| Matrix tS = mH.dot(mP).dotTranspose(mH).plus(mR); |
| Matrix tK = mP.dotTranspose(mH).dot(tS.inverse()); |
| mx = mx.plus(tK.dot(y)); |
| mP = mP.minus(tK.dot(mH).dot(mP)); |
| } |
| |
| @Override |
| public String toString() { |
| return "{F: " + mF |
| + " Q: " + mQ |
| + " H: " + mH |
| + " R: " + mR |
| + " P: " + mP |
| + " x: " + mx |
| + "}"; |
| } |
| } |