[칼만 필터는 어렵지 않아] 1.1 재귀 필터 - 평균 필터
그동안 깨작 깨작 공부했던 칼만필터 구현을 [칼만 필터는 어렵지 않아]라는 책으로 확실히 정리해보고자 한다.
재귀식(recursive expression)
먼저 필터를 이해하기 전에 '재귀식'이 정확히 무엇인지 먼저 짚고 넘어가고자 한다.
내가 이해한 바로 재귀식이란 'k번째 변수를 k-1번째 변수에 대한 함수로 표현이 가능한 식'을 말한다.
예를 들어 k-1개의 데이터와 k개의 데이터들의 평균이 아래와 같다면
$$\overline{x}_{k-1}=\frac{x_1+x_2+\cdots+x_{k-1}}{k-1}$$
$$\overline{x}_{k}=\frac{x_1+x_2+\cdots+x_{k-1}+x_{k}}{k}$$
\(\overline{x}_{k}\)를 다시 이렇게 표현할 수 있다는 말이다.
$$\overline{x}_{k}=\frac{k-1}{k}\overline{x}_{k-1}+\frac{1}{k}x_k$$ or
$$\overline{x}_{k}=\alpha\overline{x}_{k-1}+(1-\alpha)x_k$$
재귀식을 사용하지 않는다면, 우리는 \(\overline{x}_{k}\)를 구하기 위해 \(x_1+x_2+\cdots+x_k\)를 모두 알아야하므로 그만큼 메모리를 사용해야한다.
하지만 재귀식을 사용한다면, 전에 구한 \(\overline{x}_{k-1}\)와 새로 들어온 입력\(x_{k}\) 두 변수에 대한 메모리만 사용하면 되므로 매우 효율적이다.
이제 재귀식을 사용하여 평균필터를 구현해 보도록 하자.
평균 필터 함수
전압센서를 통해 들어오는 전압입력값은 매 샘플링 마다 스칼라 값으로 들어오므로 이에 맞게 함수를 구현하여야 한다.
함수는 아래와 같다.
function avg = AvgFilter(x)
%
%
persistent prevAvg k % persistent 변수는 함수가 끝나도 값이 초기화되지 않는다.
persistent firstRun
if isempty(firstRun) %4번째 줄에서 변수를 선언하면 값은 빈 값으로 입력되며 이것을 이용해 변수들을 초기화 한다.
k = 1;
prevAvg = 0;
firstRun = 1;
end
alpha = (k - 1) / k;
avg = alpha*prevAvg + (1 - alpha)*x;
prevAvg = avg;
k = k + 1;
아래의 그림은 평균필터를 이용해 전압 센서의 노이즈를 필터링한 결과이다.