이동 평균 필터(Moving Average Filter)
✔ 이동 평균은 모든 측정 데이터가 아니라, 지정된 갯수의 최근 측정값만 가지고 계산한 평균
✔ 단순 평균을 사용하면 전체 데이터에 대한 평균만을 측정하므로 최근 데이터의 변화량을 감지할 수 없다
✔ 이동 평균을 사용하여 시간에 따른 변화를 반영함
이동 평균 필터 재귀식 유도
- 이동 평균 수식 (개의 데이터가 들어왔을 때 가장 최근의 개에 대한 평균 )
- 재귀식으로 바꾸기 위해 을 등장시켜보자
- 식은 다음을 만족함
- 양 변에 를 빼면
이동 평균 필터 코드
import queue
class MovAvgFilter:
# 이전 스텝의 평균
prevAvg = 0
# 가장 최근 n개의 값을 저장하는 큐
xBuf = queue.Queue()
# 참조할 데이터의 갯수
n = 0
def __init__(self, _n):
# 초기화로 n개의 값을 0으로 둡니다.
for _ in range(_n):
self.xBuf.put(0)
# 참조할 데이터의 갯수를 저장합니다.
self.n = _n
def movAvgFilter(self, x):
# 큐의 front 값은 x_(k-n) 에 해당합니다.
front = self.xBuf.get()
# 이번 스텝에 입력 받은 값을 큐에 넣습니다.
self.xBuf.put(x)
avg = self.prevAvg + (x - front) / self.n
self.prevAvg = avg
return avg
정리
- 평균 계산에 포함되는 데이터 개수가 많으면 노이즈 제거 성능은 좋지만 측정 신호의 변화가 제때 반영되지 않고 지연이 일어날 수 있음 (데이터 개수가 많다 = 평균이 잘 안바뀐다)
- 데이터의 개수가 적으면 측정 신호의 변화는 잘 따라가지만 노이즈 제거가 잘 안될 수 있음
- 따라서 신호의 특성을 잘 파악하여 이동평균의 데이터 개수를 선정해야함
참고
Prev: 1. 평균 필터(Average Filter)
Next: 3. 저주파 통과 필터(Low-Pass Filter)