이동 평균 필터(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)


평균필터이동평균필터상태추정