이동평균필터와 로우패스필터와 아무런 관련이 없어 보이지만 매우 깊은 연관성이 있다.
이동평균필터와 로우패스필터가 어떻게 이어지며, 데이터 추정 관점과 전자공학에서 바라보는 관점과도 비교를 해보고자 한다.
1. 이동평균 필터의 한계
데이터 추정 관점에서 이동 평균의 의미에 대해 다시 살펴보는 것을 시작으로 이동 평균 필터의 한계를 알아보자.
xˉk=nxk−n+1+xk−n+2+⋯+xk−1+xk
=n1xk−n+1+n1xk−n+2+⋯+n1xk−1+n1xk
식에서도 알 수 있듯, 이동 평균의 특징이자 단점은 모든 이전 데이터에 동일한 가중을 준다는 것이다. 즉, 오래된 측정값과 최신 측정값을 같은 비중으로 취급한다.
이 단점을 해결하여 오래된 측정값보다 최근 측정값에 더 높은 가중치를 준 것이 바로 로우 패스 필터이다.
2. 로우패스 필터 재귀식
위의 아이디어를 재귀식으로 아래와 같이 표현해 볼 수 있을 것이다.
xk=αxk−1+(1−α)xk
어디서 많이 보던 식일 것이다. 바로 평균 필터의 식과 같은 구조를 공유하기 때문이다.
xk=kk−1xk−1+k1xk
아직 위 재귀식이 어떻게 최근 측정값에 더 높은 가중치를 주는지 이해가 가지 않는다면 다시 α로 이루어진 재귀식을 풀어보자.
xk=αxk−1+(1−α)xk
=α(αxk−2+(1−α)xk−1)+(1−α)xk
=α2xk−2+α(1−α)xk−1+(1−α)xk
여기서 α를 0<α<1의 크기를 같는 상수로 둔다면,
α(1−α)<(1−α)
이므로 최근 측정값(xk)가 과거 추정값(xk−1)보다 더 큰 가중치를 부여 받아 추정에 반영되고 있음을 알 수 있다.
이 때, 과거 가중치는 최근 가중치에 정확히 α배에 비례해 감소하므로 이동평균 필터를 다른 말로 지수 가중 이동평균 필터라고도 부른다.
3. 전기 신호 관점에서의 로우패스 필터
보통 로우 패스 필터는 전기공학이나 전자공학 또는 주파수를 다루는 학문에서 오히려 더 많이 들어보았을 것이다.
주파수 관점(라플라스 도메인)에서도 한번 로우패스 필터를 이해하고, 데이터 추정 관점의 재귀식과 연결해보자.
(주의: 전달함수 개념과 라플라스 변환에 대해 알고 있다는 가정하에 작성됨)

보통 로우패스를 간단히 RC회로로 구현하는 것을 많이 보았을 것이다. 여기서의 input과 output은 전압(v(t))이다.
키르히르프의 법칙을 사용해 미분방정식을 도출하면 아래와 같다.
Ri(t)+vo(t)=vi(t)
RCdtdvo(t)+vo(t)=vi(t),∵i(t)=Cdtdvo(t)
RCv˙o(t)+vo(t)=vi(t)
라플라스 변환을 하여 전달함수를 구하면
(RCs+1)Vo(s)=Vi(s),
G(s)=Vi(s)Vo(s)=RCs+11=s+ωcωc,ωc=1/RC
위 식이 도출된다. 여기서의 ωc가 바로 cut-off frequency이다. 위식을 다시 라플라스 역변환을 해보자.
Vo(s)=G(s)Vi(s)=s+ωcωcVi(s)
(s+ωc)Vo(s)=ωcVi(s)
v˙o(t)+ωcvo(t)=ωcvi(t)
이동 평균 필터 관점에서 input은 측정값(xk), ouuput은 필터링 된 값(xˉk)이므로 위 식을 다시 표현하면 아래와 같다.
xˉ˙k+ωcxˉk=ωcxk
Δtxˉk−xˉk−1+ωcxˉk=ωcxk
∴xˉk=ωc+Δt1xˉk−1+ωc+Δtωcxk
그러므로 알파는 다음과 같음을 알 수 있다.
α=ωc+Δt1
주파수 관점에서 말하는 cut-off frequency가 데이터 추정 관점에서도 α의 형태로 녹아든 것을 볼 수 있다.
결국,
α가 커진다는 것은 컷오프 주파수가 줄어들어 잡음 제거보다 측정값에 더 민감해 진다는 것을,
α가 작아진다는 것은 컷오프 주파수가 커져 측정값보다 잡음 제거에 더 민감해진다는 것을 직관적으로 알수 있게 된다.
또한, 로우패스 필터도 일종의 가중평균필터이므로 가중평균필터와 동일하게 Phase에 Shift가 발생하는 것을 알 수 있다.
3. 로우패스 필터 함수
function xlpf = LPF(x)
%
persistent prevX
persistent firstRun
if isempty(firstRun)
prevX = x;
firstRun = 1;
end
alpha = 0.7;
xlpf = alpha*prevX + (1 - alpha)*x;
prevX = xlpf;
