[칼만필터는 어렵지않아 / Python] CH.03 저주파 통과 필터

2021. 6. 21. 17:25·Minding's Reading/칼만필터는 어렵지 않아
728x90
반응형

tbmoon님의 Github (칼만필터는 어렵지 않아 Python 구현)

https://github.com/tbmoon/kalman_filter

 

tbmoon/kalman_filter

Kalman Filter in Python (파이썬으로 구현하는 칼만 필터). Contribute to tbmoon/kalman_filter development by creating an account on GitHub.

github.com

 

본인의 Github (공부내용 간단정리)

https://github.com/JeongMinHyeok/Kalman_Filter

 

JeongMinHyeok/Kalman_Filter

Contribute to JeongMinHyeok/Kalman_Filter development by creating an account on GitHub.

github.com

 


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

 

이동평균의 한계

  • 이동평균필터의 정의 별도의 항으로 풀어쓰기
    • 모든데이터에 동일가중치 부여함
    • 최신 측정값(데이터)이 현재값과 비슷할 가능성이 높으나, 오래된 데이터와 동일 가중치 처리
    • 이동평균필터를 사용할 때는 장점과 한계 정확히 알고 적재적소 적용하는 것이 중요

 

1차 저주파 통과 필터

  • 최근 측정값에는 높은 가중치, 오래된 값에는 낮은 가중치를 주는 필터
  • 재귀식 (책의 식 3.1)
    • alpha는 0 < alpha < 1인 임의의 상수
    • 저주파통과필터의 x hat k는 평균과 관련없음, '추정값'이라는 용어로 사용
    • 더 오래된 값에 더 낮은 가중치 부여함
  • 측정데이터에 곱해진 계수 a(1-a)와 1-a 크기 비교
    • alpha가 0 < a < 1인 상수이므로,
    • a(1-a) < 1-a (a가 곱해질수록 작아지기 때문)
  • 1차 저주파 통과필터는 지수가중(exponentially weighted)필터라고도 부름

 

저주파 통과 필터 함수

  • 예제(2장과 동일) : 이평손 연구원은 초음파 거리계는 개발하는 중이다. 시제품의 성능을 검증하기 위해 헬기에 초음파거리계를 장착하고 지면까지의 거리를 측정하는 비행 시험을 실시했다. 측정값은 0.02초 간격으로 저장했다. 그런데 헬기의 진동, 지면 상태 등의 영향으로 측정 데이터에 잡음이 심했다. 이동평균필터로 이 잡음을 제거해보자.
import numpy as np
import matplotlib.pyplot as plt
from scipy import io

# 초음파 측정 데이터
input_mat = io.loadmat('./data/3.LPF/SonarAlt.mat')
def low_pass_filter(x_meas, x_esti):
    """저주파 통과 필터 함수를 통해 초음파 계산"""
    x_esti = alpha * x_esti + (1 - alpha) * x_meas
    return x_esti
    

def get_sonar(i):
    """초음파 측정값 반환"""
    z = input_mat['sonarAlt'][0][i]  # input_mat['sonaralt']: (1, 1501)
    return z
# Input parameters.
alpha = 0.7
n_samples = 500
time_end = 10


dt = time_end / n_samples
time = np.arange(0, time_end, dt)
x_meas_save = np.zeros(n_samples)
x_esti_save = np.zeros(n_samples)
x_esti = None
for i in range(n_samples):
    x_meas = get_sonar(i)
    if i == 0:
        x_esti = x_meas
    else:
        x_esti = low_pass_filter(x_meas, x_esti)

    x_meas_save[i] = x_meas
    x_esti_save[i] = x_esti
plt.plot(time, x_meas_save, 'r*', label='Measured')
plt.plot(time, x_esti_save, 'b-', label='Low-pass Filter')
plt.legend(loc='upper left')
plt.title('Measured Altitudes v.s. LPF Values')
plt.xlabel('Time [sec]')
plt.ylabel('Altitude [m]')
plt.show()

  • 측정데이터의 잡음 제거 및 고도 변화 추이 잘 나타나 있음
  • 측정데이터에 맞게 alpha 선정했는지가 중요

 

alpha값을 다르게 설정했을 때 (0.4 / 0.9)

# alpha를 0.4로 설정
alpha = 0.4
n_samples = 500
time_end = 10


dt = time_end / n_samples
time = np.arange(0, time_end, dt)
low_x_meas_save = np.zeros(n_samples)
low_x_esti_save = np.zeros(n_samples)

x_esti = None
for i in range(n_samples):
    x_meas = get_sonar(i)
    if i == 0:
        x_esti = x_meas
    else:
        x_esti = low_pass_filter(x_meas, x_esti)

    low_x_meas_save[i] = x_meas
    low_x_esti_save[i] = x_esti
# alpha를 0.9로 설정
alpha = 0.9

dt = time_end / n_samples
time = np.arange(0, time_end, dt)
high_x_meas_save = np.zeros(n_samples)
high_x_esti_save = np.zeros(n_samples)

x_esti = None
for i in range(n_samples):
    x_meas = get_sonar(i)
    if i == 0:
        x_esti = x_meas
    else:
        x_esti = low_pass_filter(x_meas, x_esti)

    high_x_meas_save[i] = x_meas
    high_x_esti_save[i] = x_esti
plt.plot(time, low_x_esti_save, 'r-', label='alpha=0.4')
plt.plot(time, high_x_esti_save, 'b-', label='alpha=0.9')
plt.legend(loc='upper left')
plt.title('Measured Altitudes v.s. LPF Values')
plt.xlabel('Time [sec]')
plt.ylabel('Altitude [m]')
plt.show()

  • alpha가 작으면 잡음이 더 많고, alpha가 크면 잡음은 줄지만 시간지연이 커짐
  • alpha가 작으면 1-alpha값이 상대적으로 더 커져 측정값의 변화에 더 민감
  • alpha가 크면 직전 추정값의 비중이 더 커져 그래프의 변화 무뎌짐

 

3장 요약

  • 1차 저주파 통과 필터의 수식은 간단하고 구현하기 쉬움
  • 이동평균 필터와 달리 최신 측정값에 더 큰 가중치
  • 이동평균 필터보다 측정 신호의 변화 추이를 더 잘 감지
  • 1차 저주파 통과 필터와 지수 가중 이동평균필터는 같은 필터를 뜻함
728x90

'Minding's Reading > 칼만필터는 어렵지 않아' 카테고리의 다른 글

[칼만필터는 어렵지않아/Python] CH.06 예측과정  (0) 2021.06.24
[칼만필터는 어렵지않아 / Python] CH.05 추정과정  (0) 2021.06.23
[칼만필터는어렵지않아/Python] CH.04 칼만필터  (2) 2021.06.22
[칼만필터는 어렵지 않아/Python] CH.02 이동평균 필터  (0) 2021.06.19
[칼만필터는 어렵지 않아] CH.01 평균필터  (2) 2021.06.16
'Minding's Reading/칼만필터는 어렵지 않아' 카테고리의 다른 글
  • [칼만필터는 어렵지않아 / Python] CH.05 추정과정
  • [칼만필터는어렵지않아/Python] CH.04 칼만필터
  • [칼만필터는 어렵지 않아/Python] CH.02 이동평균 필터
  • [칼만필터는 어렵지 않아] CH.01 평균필터
Minding
Minding
  • Minding
    Today's Minding
    Minding
  • 전체
    오늘
    어제
    • 울고넘는 딥러닝 (278)
      • Minding's Baseball (57)
        • MLB Statcast (29)
        • 머신러닝으로 홈런왕 예측하기 (3)
        • 야구칼럼 (12)
        • 야구 규칙, 용어 (1)
        • 2022-23 질롱 코리아 (8)
        • 류현진 등판경기 (4)
      • Minding's Programming (185)
        • 프로그래머스 코딩테스트 (21)
        • Knowledge (44)
        • Numpy & Pandas (6)
        • Excel (3)
        • Git (1)
        • Pygame (11)
        • CV (3)
        • Tensorflow tutorial (4)
        • Kaggle and Dacon (4)
        • 에러 코드 (8)
        • FastAPI (8)
        • Airflow (29)
        • Crawling (6)
        • Django (14)
        • AWS (18)
        • Spark (5)
      • Minding's Reading (30)
        • 머신러닝 딥러닝에 필요한 기초 수학 with 파이.. (2)
        • 칼만필터는 어렵지 않아 (11)
        • 밑바닥부터 시작하는 딥러닝 (6)
        • 메이저리그 야구 통계학 2e (8)
        • 논문읽기 (2)
        • 빅데이터를 지탱하는 기술 (1)
      • Minding's Life (5)
        • 주식 (4)
        • 각종 소식 (1)
  • 블로그 메뉴

    • 홈
    • Baseball
    • Programming
    • Reading
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    django python
    칼만필터
    KBO
    MLB
    mlb stats api
    파이게임
    코딩테스트
    머신러닝
    야구
    넘파이
    칼만필터는어렵지않아파이썬
    FastAPI
    프로그래머스
    AWS
    데이터 엔지니어
    메이저리그
    딥러닝
    에어플로우
    django
    파이썬
    질롱코리아
    칼만필터는어렵지않아python
    Python
    파이썬게임개발
    Airflow
    칼만필터는어렵지않아
    데이터분석
    게임개발
    KalmanFilter
    pygame
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Minding
[칼만필터는 어렵지않아 / Python] CH.03 저주파 통과 필터
상단으로

티스토리툴바