저주파 통과 필터(low pass filter)

저주파 통과 필터(low pass filter)

2019, Jun 22    
  • 출처 : 칼만필터는 어렵지 않아
  • 저주파 통과 필터(low pass filter)는 이름 그대로 저주파 신호는 통과시키고 고주파 신호는 걸러내는 필터를 말합니다.
  • 저주파 통과 필터는 노이즈 제거용으로 많이 사용되는데 대개 측정하려는 신호는 저주파이고 노이즈는 고주파 성분으로 되어 있기 때문입니다.
  • 저주파 통과 필터는 특정 수식의 필터를 지칭하는 고유 명사가 아니라 저주파만 통과시키는 특성을 가진 모든 필터를 총칭하는 일반 명사입니다.
    • 이번 글에서는 저주파 통과 필터 중에서 가장 간단한 1차(first order) 저주파 통과 필터만 다룰 예정입니다.


  • 먼저 이동 평균 필터의 한계에 대하여 먼저 다뤄 보도록 하겠습니다.
  • 이동 평균 필터를 실제로 사용해보면 노이즈를 제거하면서 변화 추이를 반영하는게 생각보다 쉽지 않을 수 있습니다.
  • 그 이유는 다음 식을 보면서 설명드리겠습니다.
  •  \(\bar{x}_{k} = \frac{x_{k-n+1} + x_{k-n+2} + \cdots + x_{k}}{n}\)
  •  \(= \frac{1}{n} x_{k-n+1} + \frac{1}{n}x_{k-n+2} + \cdots + \frac{1}{n}x_{k}\)
  • 위 식을 보면 이동 평균 필터에서는 모든 데이터에 동일한 가중치 1/n을 부여합니다.
    • 즉, 가장 최근의 데이터 \(x_{k}\)와 가장 오래된 데이터 \(x_{k-n+1}\)을 같은 비중으로 평균에 반영하는 것입니다.
    • 타당한 이유가 있는 경우를 제외하면 시간에 따른 변화가 있는 데이터는 가장 최근에 있는 데이터가 가장 중요한 것은 의심의 여지가 없습니다.
  • 자동차, 비행기 같이 빠르게 움직이는 물체의 입력값은 사실 10초전 1초전 데이터는 0.1초전 데이터에 비하면 의미가 거의 없을 수도 있습니다.
  • 하지만 이동 평균은 모든 측정값에 동일한 가중치를 두고 처리합니다. 심지어 측정값의 변화가 클수록 이 약점은 더 두드러집니다.
  • 따라서 이동평균필터를 변화가 심한 신호에 적용하면, 노이즈 제거와 변화 민감성을 동시에 달성하기가 어렵습니다.
  • 그러면 최근 측정값에는 높은 가중치를 주고, 오래된 값일수록 가중치를 낮게 주면 어떻게 될까요??


1차 저주파 통과 필터

  • 최근 측정값에 높은 가중치를 주는 방법으로 앞에서 언급한 1차 저주파 통과 필터가 있습니다.
  •  \(\bar{x}_{k} = \alpha \bar{x}_{k-1}+ (1-\alpha)x_{k} \ \ \ (0 \lt \alpha \lt 1)\)
  • 이 식은 앞의 글 평균 필터에서 정의한 식과 동일 합니다.
    • 평균 필터에서의 \(\alpha = \frac{k-1}{k}\) 였었습니다.
  • 저주파 통과 필터에는 반면 평균과 전혀 상관없는 값입니다. 따라서 여기에서는 평균이라는 용어는사용하지 않고 추정값(estimated value)라는 용어를 쓰겠습니다.
  • 그러면 추정값 \(x_{k}\)가 과연 이동 평균 필터의 단점을 보완하는지 알아보겠습니다.
  •  \(\bar{x}_{k} = \alpha \bar{x}_{k-1} + (1 - \alpha) x_{k}\)
  •  \(= \alpha\{\alpha\bar{x}_{k-2} + (1-\alpha)x_{k-1}\} + (1-\alpha)x_{k}\)
  •  \(= \alpha^{2}\bar{x}_{k-2} + \alpha(1-\alpha)x_{k-1} + (1-\alpha)x_{k}\)
  • 여기서 측정 데이터 \(x_{k-1}, x_{k}\)에 곱해진 계수 \(\alpha, 1-\alpha\)를 비교해 보면
    •  \(0 \lt \alpha \lt 1\) 범위를 가지므로 \(\alpha (1-\alpha) \lt 1-\alpha\)의 관계가 성립합니다.
  • 즉 최근 측정값 (\(x_{k}\))이 이전 측정값(\(x_{k-1}\)) 보다 더 큰 가중치를 가지고 있음을 알 수 있습니다.


  • 한 스텝 더 진행해 보도록 하겠습니다.
  •  \(\bar{x}_{k} = \alpha^{2}\bar{x}_{k-2} + \alpha(1-\alpha)x_{k-1} + (1-\alpha)x_{k}\)
  •  \(= \alpha^{2}\{ \alpha\bar{x}_{k-3} + (1-\alpha)x_{k-2}\} + \alpha(1-\alpha)x_{k-1} + (1-\alpha)x_{k}\)
  •  \(= \alpha^{3}\bar{x}_{k-3} + \alpha^{2}(1-\alpha)\bar{x}_{k-2} + \alpha(1-\alpha)x_{k-1} + (1-\alpha)x_{k}\)
  • 이 때, 각 계수의 관계는 \(\alpha^{2}(1-\alpha) \lt \alpha(1-\alpha) \lt 1 - \alpha\) 이므로 최근 값과 멀어질수록 값이 기하급수적으로 작아집니다.
  • 이러한 가중치 차별화 덕분에 저주파 통과 필터는 노이즈 제거와 변화 민감성이라는 상충되는 요구를 이동평균 필터보다 더 잘 충족시킵니다.
  • 그리고 위에서 살펴본 1차 저주파 통과 필터를 지수 가중 이동 평균 필터 라고 부르기도 합니다.


  • 저주파 통과 필터의 식을 보면 파라미터 \(\alpha\)는 어떻게 정해주면 될까요?
  • 사실 이 값을 어떻게 정해주냐에 따라서 성능이 좋아질수도 나빠질수도 있습니다.
    • 저주파 통과 필터의 \(\alpha\)는 이동 평균 필터의 \(n\)과 역할이 유사합니다.
    • 계수 \(\alpha\)의 값에 따라서 어느 순간 부터는 값이 너무 작아져서 오래된 값은 무시 되기 때문에 \(n\)과 역할이 비슷하다고 생각하시면 됩니다.
  • 그러면 \(\alpha\)의 값은 어떻게 정하는 것이 좋은지 살펴보겠습니다.


  • 결과적으론 \(\alpha\)가 작으면 노이즈는 많지만 변화에 민감합니다.
  • 반면 \(\alpha\)가 크면 노이즈를 제거하지만 변화에 둔감합니다.
  • 저주파 통과 필터 식은 \(\bar{x}_{k} = \alpha \bar{x}_{k-1} + (1-\alpha) x_{k}\) 입니다.
    • 먼저 \(\alpha\)가 작으면 상대적으로 \(1 - \alpha\)는 커지게 됩니다. 결국 추정값 계산에 측정값 \(x_{k}\)가 더 많이 반영되게 됩니다.
      • 이렇게 되면 저주파 통과 필터는 노이즈 제거보다는 측정값의 변화에 더 민감해집니다. 그래서 \(\alpha\)가 작을 때 추정값에 노이즈가 더 많이 나타나는 것입니다.
    • 반면에 \(\alpha\)가 커지면 추정값(\(\bar{x}_{k-1}\))의 비중이 더 커지게 되어 추정값이 직전 추정값과 크게 달라지지 않게 됩니다.
      • 따라서 \(\alpha\)가 크면 노이즈가 줄어들고 추정값 그래프의 변화가 무뎌지는 이유가 됩니다.


저주파 통과 필터 코드

  • python 코드
class LPF:
    # 이전 스텝의 예측값
    prevX = 0
    
    # 측정값 x와 상수 알파를 입력 받아 low pass filter를 수행합니다.
    def lpf(self, x, alpha):
        # low pass filter 
        x_lpf = alpha * self.prevX + (1 - alpha)*x
        # 이전 스텝 값 갱신
        self.prevX = x_lpf
        return x_lpf      


  • cpp 코드


  • 1차 저주파 통과 필터의 수식은 매우 단순하며 이동 평균 필터에 비해 좋은 특성을 가지고도 있습니다.
  • 이 덕분에 측정 신호의 변화 추이를 이동평균 필터보다 더 잘 감지해 낼 수 있습니다.