You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.9 KiB
51 lines
1.9 KiB
using System; |
|
using System.Collections.Generic; |
|
using System.Linq; |
|
using System.Text; |
|
using System.Threading.Tasks; |
|
|
|
namespace GKalman |
|
{ |
|
public class GKalman |
|
{ |
|
double _err_measure = 0.0F; |
|
double _err_estimate = 0.0F; |
|
double _q = 0.0F; |
|
double _last_estimate = 0.0F; |
|
public GKalman(float mea_e, float est_e, float q) |
|
{ |
|
setParameters(mea_e, est_e, q); |
|
} |
|
|
|
// разброс измерения, скорость изменения значений (разброс измерения принимается равным разбросу оценки) |
|
public GKalman(float mea_e, float q) |
|
{ |
|
setParameters(mea_e, mea_e, q); |
|
} |
|
|
|
// разброс измерения, разброс оценки, скорость изменения значений |
|
public void setParameters(float mea_e, float est_e, float q) |
|
{ |
|
_err_measure = mea_e; |
|
_err_estimate = est_e; |
|
_q = q; |
|
} |
|
|
|
// разброс измерения, скорость изменения значений (разброс измерения принимается равным разбросу оценки) |
|
public void setParameters(float mea_e, float q) |
|
{ |
|
setParameters(mea_e, mea_e, q); |
|
} |
|
|
|
// возвращает фильтрованное значение |
|
public float filtered(float value) |
|
{ |
|
double _kalman_gain, _current_estimate; |
|
_kalman_gain = _err_estimate / (_err_estimate + _err_measure); |
|
_current_estimate = _last_estimate + _kalman_gain * (value - _last_estimate); |
|
_err_estimate = (1.0 - _kalman_gain) * _err_estimate + Math.Abs(_last_estimate - _current_estimate) * _q; |
|
_last_estimate = _current_estimate; |
|
return (float)_current_estimate; |
|
} |
|
} |
|
}
|
|
|