반응형

2023.09.14 - [기타] - Average Filter, 평균 필터

 

Average Filter, 평균 필터

평균 (Average) - 모든 데이터의 합을 데이터의 개수로 나눠준 값. 평균 필터 (Average Filter) - 실시간 데이터들의 평균을 구하고, 새로운 데이터를 포함하여 새로운 평균을 구하는 방법. 평균 필터 수

wjs7347.tistory.com


평균 필터(Average Filter)의 한계점

기준값(14.1)을 기준으로 노이즈가 발생한 측정값을 따라가는 평균 필터 값

- 이전 포스트에서 소개한 평균 필터는 측정하는 기준값(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

- 평균 필터의 한계점에서와 마찬가지로 측정 기준값을 지속적으로 변화시켜 보았다.

 

 

- 평균 필터와 다르게 변화하는 기분값을 필터값이 잘 따라간다.

 

 

 

 

반응형
woongs_93