반응형
2023.09.14 - [기타] - Average Filter, 평균 필터
평균 필터(Average Filter)의 한계점
- 이전 포스트에서 소개한 평균 필터는 측정하는 기준값(14.1)이 고정이었다.
- 이 측정 기준값이 지속적으로 변하게 되면 필터값이 측정값들을 따라가지 못하게 된다.
이동 평균 필터(Moving Average Filter)
- 평균 필터의 한계점을 보안한 방법.
- 현재까지 측정된 데이터들을 모두 보지 않고, 현재 시점 기준으로 일부분만 보면서 평균을 구해나가는 것.
이동 평균 필터 Python 코드
1. 평균 필터 코드에서 avg_filter 함수를 아래 함수로 대체
def mov_avg_filter(x_n, x_meas):
"""Calculate average sonar using a moving average filter (batch expression)."""
n = len(x_n)
for i in range(n-1):
x_n[i] = x_n[i+1]
x_n[n-1] = x_meas
x_avg = np.mean(x_n)
return x_avg, x_n
- for문을 통해 배열 값들을 index 앞으로 한 칸씩 밀어준다. (ex. n=10 -> x[0] = x[1] ..... x[8] = x[9])
- x_n[n-1], 즉 x_n 배열의 마지막 index에 현재 측정값을 저장. (ex. n=10 -> x[9] = 최신 측정값)
2. n_sample 만큼 실시간 값을 이동 평균 필터를 이용하여 평균을 구해준다.
time_end = 10
dt = 0.2
time = np.arange(0, time_end, dt)
n_samples = len(time)
x_meas_save = np.zeros(n_samples)
x_avg_save = np.zeros(n_samples)
x_avg = 0
n = 10
for i in range(n_samples):
k = i + 1
x_meas = get_meas()
if k == 1:
x_avg, x_n = x_meas, x_meas * np.ones(n)
else:
x_avg, x_n = mov_avg_filter(x_n, x_meas)
x_meas_save[i] = x_meas
x_avg_save[i] = x_avg
plt.plot(time, x_meas_save, 'r:*', label='Measured')
plt.plot(time, x_avg_save, 'b-', label='Average')
plt.legend(loc='upper left')
plt.title('Average Filter Values')
plt.xlabel('Time [sec]')
plt.ylabel('Value')
plt.savefig('png/mov_average_filter.png')
- 전체적인 부분은 Average filter 코드와 같다.
- 차이점은 전체 데이터의 값으로 평균을 구하는 것이 아닌, x_n이라는 배열로 현재 시점에서 n만큼의 데이터만 보고 평균을 구한다.
3. 결과
- 평균 필터와 마찬가지로 노이즈들을 어느 정도 보안해 주는 모습.
x_avg = 0
n = 10
add_num = 0 # 추가
for i in range(n_samples):
k = i + 1
x_meas = get_meas() + add_num # 측정값에 add_num 더하기
add_num += 1
if k == 1:
x_avg, x_n = x_meas, x_meas * np.ones(n)
else:
x_avg, x_n = mov_avg_filter(x_n, x_meas)
x_meas_save[i] = x_meas
x_avg_save[i] = x_avg
- 평균 필터의 한계점에서와 마찬가지로 측정 기준값을 지속적으로 변화시켜 보았다.
- 평균 필터와 다르게 변화하는 기분값을 필터값이 잘 따라간다.
반응형
'기타' 카테고리의 다른 글
Kalman Filter, 칼만 필터 (0) | 2023.10.12 |
---|---|
Low Pass Filter, 저주파 필터 (0) | 2023.09.15 |
Average Filter, 평균 필터 (0) | 2023.09.14 |
detectron2 install error (0) | 2023.07.07 |
[GitLab] 접속 시 연결을 거부했습니다. (ERR_CONNECTION_REFUSED) (0) | 2023.03.07 |