이번엔 소나 데이터로 저주파 통과 필터 만듬

내용은 단순하다

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()

 

+ Recent posts