이번에는 평균 이동 필터를 파이썬으로 구현하려고한다.

근데 여기서 이용하는 소나 데이터가 메트랩 확장자로 되어있다.

 

찾아보니까 사이파이쓰면 된다칸다

 

1. mat file 소나 데이터 읽기

sicpy io loadmat으로 mat 읽고

yield로 데이터 뽑아내도록 구현함

 

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)

 

2, 평균 필터 구현하기

대충 버퍼 사이즈 5라 치자

 

avg x_k = (x_k-4 + x_k-3 + x_k-2 + x_k-1 + x_k) / 5

 

avg x_k-1 같은 경우

= (x_k-4-1 + x_k-3-1 + x_k-2-1 + x_k-1-1 + x_k-1) / 5

= (x_k-5 + x_k-4 + x_k-3 + x_k-2 + x_k-1) / 5

이다 

 

avg x_k - avg x_k-1 로 우항 정리하면

= (x_k - x_k-5) / 5임

 

avg x_k = avg x_k-1 + (x_k - x_k-5) / 5

가 된다.

 

버퍼 사이즈를 5대신 n으로 놓자

avg x_k = avg x_k-1 + (x_k - x_k-n) / n다

 

다시 말을 정리하면

지금 x 평균 = 한번 전 x 평균 + (지금 x 값 + n번 전 x 평균) / n

 

근대 생각해보니까 파이썬에선 리스트 조절만하면 되지 이럴 필요가 없잔아--

위 내용은 무시해도 되고 

 

버퍼 사이즈 10 채운 상태서 평균 계산

다음 시간에선 오래된 값비우고, 새값 넣기 -> 평균계산

으로 루프 돌리면 된다.

 

 

대충 평균 이동필터 구현하긴 했는데

좀 지저분하게 만들어서 찜찜하다

idx 는 x축

x_list는 평균 필터 버퍼 리스트

xsaved는 소나 값 전체 모음

avg 는 평균 값 전체 모음 리스트

동작은 맞으니 pass

import matplotlib.pyplot as plt
def mov_avg_filter(x_list):
    avg = sum(x_list) / len(x_list)
    return avg
idx_list, x_list, xsaved_list, avg_list = [], [], [], []
buf_len = 10
for idx, val in enumerate(get_sonar()):
    if idx > 500:
        break
    idx_list.append(idx)
    x_list.append(val)
    xsaved_list.append(val)
    if len(x_list) < buf_len:
        avg_list.append(val)
    else:
        if len(x_list) > buf_len:
            x_list = x_list[1:]
        avg = mov_avg_filter(x_list)
        avg_list.append(avg)
plt.plot(idx_list, xsaved_list, label="sonar val")
plt.plot(idx_list, avg_list, label="filtered val")
plt.legend()

 

+ Recent posts