なんでもフィルタリングできて手軽に実装できるカルマンフィルター!
Javaでの実装例がなかったのでメモとして書いておきます。
public static void main(String[] args){
ArrayList<Double> result = new ArrayList<Double>();
double now = 0;
double xPre = 0;
double pPre = 0;
double sigmaW = 0;
double sigmaV = 0;
//引数指定 1 sigmaW , 2 sigmaV
sigmaW = Integer.parseInt("5");
sigmaV = Integer.parseInt("50");
Scanner sc = new Scanner(System.in);
while(true){
now = sc.nextDouble();
if(now == -1){
break;
}
double xForecast = xPre;
double pForecast = pPre + sigmaW;
double KGain = pForecast/(pForecast + sigmaV);
double xFiltered = (xForecast + KGain*(now - xForecast));
double pFiletered = (1-KGain) * pForecast;
result.add(xFiltered);
System.out.println(xFiltered);
xPre = xFiltered;
pPre = pFiletered;
}
System.out.println("-------------------------------");
for(Double out : result){
System.out.println(out);
}
}
sigmaWとsigmaVの組み合わせによってフィルタリングの度合いが変わってきます。
これを利用してAPI化することによって様々な数値をフィルタリングさせることができます。
ここではリストとして出力しているがリアルタイムで値を出力させることもできます。