이번엔 소나 데이터로 저주파 통과 필터 만듬
내용은 단순하다
x_k = alpha * x_k-1 + (1 - alpha) * x_k
평균 이동 필터가 새로 들어온 값을 1/n 만큼 반영하다보니
필터 결과가 뒤쳐짐
저주파 통고가 필터에서는 alpha를 설정해줘서 1/n만큼이 아닌
위의 경우 (1 - alpha) 만큼 반영시켜서 좀 반응이 빠름
이전에 구현한 소나 데이터 로드함수 그대로 쓰고
import scipy.io
sonar = scipy.io.loadmat("SonarAlt.mat")
def get_sonar():
sonar_arr = sonar["sonarAlt"][0]
sonar_len = len(sonar_arr)
for i in range(sonar_len):
yield sonar_arr[i]
for val in get_sonar():
print(val)
매트랩 코드 보니 조금 다른데?
그냥 이동 평균 구현한거 고쳐서 만듬
avg 계산은 없고 그대로 쓴다.
이건 아닌거가아서 이동 평균 구현한걸 lpf로 만들어버림
구현은 했는데 위에 이동 평균이랑 별 차이를 모르겠다 이동평균이랑 lpf랑 같이 섞어봄
import matplotlib.pyplot as plt
def lpf_filter(buf_list, alpha):
prev_avg = sum(buf_list[:-1]) / len(buf_list[:-1])
avg = prev_avg * alpha + (1 - alpha) * buf_list[-1]
return avg
idx_list, buf_list, val_list, avg_list = [], [], [], []
buf_len = 10
alpha = 0.7
for idx, val in enumerate(get_sonar()):
if idx > 500:
break
buf_list.append(val)
if len(buf_list) > buf_len:
buf_list = buf_list[1:]
avg = lpf_filter(buf_list, alpha)
idx_list.append(idx)
val_list.append(val)
avg_list.append(avg)
plt.plot(idx_list, val_list, label="raw val")
plt.plot(idx_list, avg_list, label="filtered val")
alpha 값을 0.9로 했을때는
이동 평균이랑 별 차이가 없었음
alpha를 0.3으로 지정해서 새 값이 0.7만큼 가중을 시켰을때
실제 데이터에 좀 더 가깝고 반응이 빨랏음
500까지 하면 너무 새밀해서
200으로 샘플을 줄여 플로팅
import matplotlib.pyplot as plt
def lpf_filter(buf_list, alpha):
prev_avg = sum(buf_list[:-1]) / len(buf_list[:-1])
avg = prev_avg * alpha + (1 - alpha) * buf_list[-1]
return avg
def mov_avg_filter(buf_list):
avg = sum(buf_list) / len(buf_list)
return avg
idx_list, buf_list, val_list, lpf_list, mov_avg_list = [], [], [], [], []
buf_len = 10
alpha = 0.3
for idx, val in enumerate(get_sonar()):
if idx > 200:
break
buf_list.append(val)
if len(buf_list) > buf_len:
buf_list = buf_list[1:]
lpf = lpf_filter(buf_list, alpha)
mov_avg = mov_avg_filter(buf_list)
idx_list.append(idx)
val_list.append(val)
lpf_list.append(lpf)
mov_avg_list.append(mov_avg)
plt.plot(idx_list, val_list, label="raw val")
plt.plot(idx_list, lpf_list, label="lpf val")
plt.plot(idx_list, mov_avg_list, label="mov avg val")
plt.legend()
'컴퓨터과학 > 필터' 카테고리의 다른 글
칼만필터 파이썬 - 6. 칼만 필터를 이용한 추적기 구현 (0) | 2023.10.03 |
---|---|
칼만필터 파이썬 - 5. 칼만 필터를 이용한 위치로 속도 계산 (0) | 2023.10.02 |
칼만필터 파이썬 - 4. 단순 칼만 필터 구현 (0) | 2023.10.02 |
칼만필터 파이썬 - 2. 평균 이동 필터 (0) | 2023.10.02 |
칼만필터 파이썬 - 1. 평균 필터 (0) | 2023.10.02 |