https://coding-yoon.tistory.com/23?category=830190
ํ์ด์ฌ์๋ ์ฅ์ ์ค ํ๋๋ ์ฌ๋ฌ๊ฐ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ตฌํ๋์ด ์๊ณ , ์์ฝ๊ฒ ์ด์ฉํ ์ ์์ต๋๋ค.
์ ๊ธ์ ๋ค์ด๊ฐ๋ณด์๋ฉด, Scipy ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ Low Pass Filter, High Pass Filter ๋ฑ๋ฑ ํํฐ๋ฅผ ๊ตฌํ๋์ด ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ๋ค ๋ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค ์ ์๊ณ , ๋ฐฐํฌํ ์ ์์ต๋๋ค.
์ด๋ฒ ๊ธ์ Low Pass Filter, High Pass Filter, Band Pass Filter๋ฅผ Scipy ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ชจ๋ํ์ํค๊ณ ๊ตฌํํ๊ฒ ์ต๋๋ค.
์ฐ์ , ๊ตฌํ๋ ๋ชจ์ต์ ๋ณด๊ฒ ์ต๋๋ค.
์ ๊ทธ๋ฆผ์ ์ ๊ฐ Scipy ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์์๊ณ , ์ ๊ฐ ๋ชจ๋ํ๋ฅผ ์์ผ์ ๋๋ฆฐ ๊ฒ์ ๋๋ค.
ํ์ด์ฌ์์ ๋ชจ๋ํ๋ฅผ ํ๋ ๋ฐฉ๋ฒ์ ๊ต์ฅํ ๊ฐ๋จํฉ๋๋ค.
์๋ฅผ ๋ค์ด filter_module์ ์ด๋ฆ์ ๊ฐ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๋ฉด, filter_module.py๋ก ํ์ด์ฌ ํ์ผ์ ๋ง๋ค์ด์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ ์์ ์ด ์ํ๋ ๋ถ๋ถ์ ๊ตฌํํ๋ฉด ๋ฉ๋๋ค.
๋จ, ์กฐ๊ฑด์ด ์๋ค๋ฉด ๊ฐ์ ํ๋ก์ ํธ ์์ ์์ด์ผ ํฉ๋๋ค. ์๋ฌด๋ฆฌ ๊ฐ์ ํด๋ ์์ ์๋ค ํ๋๋ผ๋ ๊ฐ์ ํ๋ก์ ํธ๋ก ๊ณต์ ํ๊ณ ์์ง ์๋ค๋ฉด ์ธ์์ ํ ์ ์์ต๋๋ค.
# filter_module.py
import numpy as np
# Low Pass Filter
def lpf_module(raw_data, time, f_cut_lpf, order, sr):
"""
:param raw_data: Low Pass Filter ํต๊ณผํ ๋ฐ์ดํฐ
:param time: ์๊ฐ
:param f_cut_lpf: ์ฐจ๋จ ์ฃผํ์
:param order: ์ฐจ์
:param sr: sample rate
:param current_list: ์งํ๋๋ฅผ ๋ณด์ฌ์ค list
:return result: Low Pass Filter ๋ฐ์ดํฐ
"""
sample_time = 1 / sr
w_cut_lpf = 2 * np.pi * f_cut_lpf
w_cut_period = 1 / w_cut_lpf
raw_data_temp = raw_data.copy()
previous_low_result = 0
low_result = []
low_list_result = []
step = 0
# low pass filter
for k in range(order, 0, -1):
for j in range(0, len(raw_data)):
for i in range(0, len(time)):
y = (w_cut_period * previous_low_result + sample_time * raw_data_temp[j][i]) / (
w_cut_period + sample_time)
previous_low_result = y
low_result.append(y)
if k > 1:
raw_data_temp[j] = low_result
low_result = []
if k == 1:
low_list_result = np.append(low_list_result, low_result)
low_result = []
result = low_list_result.reshape(len(raw_data_temp), len(time))
return result
# High Pass Filter
def hpf_module(raw_data, time, f_cut_hpf, order, sr):
"""
:param raw_data: High Pass Filter ํต๊ณผํ ๋ฐ์ดํฐ
:param time: ์๊ฐ
:param f_cut_hpf: ์ฐจ๋จ ์ฃผํ์
:param order: ์ฐจ์
:param sr: sample rate
:param current_list: ์งํ๋๋ฅผ ๋ณด์ฌ์ค list
:return result: High Pass Filter ๋ฐ์ดํฐ
"""
w_cut_hpf = 2 * np.pi * f_cut_hpf
w_cut_period = 1 / w_cut_hpf
sample_time = 1/sr
"""
raw_data_temp = self.raw_data # ์ฃผ์๋ฅผ ๋ณต์ฌ
raw_data_temp = self.raw_data.copy # ๊ฐ์ ๋ณต์ฌ
"""
raw_data_temp = raw_data.copy() # raw data
previous_high_result = 0 # previous result
previous_raw_data = 0 # previous raw data
high_result = [] # result
high_list_result = []
step = 0
# high pass filter
for k in range(order, 0, -1):
for j in range(0, len(raw_data_temp)):
for i in range(0, len(time)):
y = w_cut_period / (w_cut_period + sample_time) * \
previous_high_result + w_cut_period / \
(w_cut_period + sample_time) * (
raw_data_temp[j][i] - previous_raw_data)
previous_high_result = y
previous_raw_data = raw_data_temp[j][i]
high_result = np.append(high_result, y)
if k > 1:
raw_data_temp[j] = high_result
high_result = []
if k == 1:
high_list_result = np.append(high_list_result, high_result)
high_result = []
# filter data reshape ( np.append ๋ฅผ ์ฌ์ฉํ๋ฉด ์ผ์ฐจ๋ฐฐ์ด๋ก ์์ )
result = high_list_result.reshape(len(raw_data_temp), len(time))
return result
# Band Pass Filter
def bpf_module(raw_data, time, f_cut_hpf, f_cut_lpf, order, sr, current_list=None):
"""
:param raw_data: Band Pass Filter ํต๊ณผํ ๋ฐ์ดํฐ
:param time: ์๊ฐ
:param f_cut_lpf: ์ฐจ๋จ ์ฃผํ์
:param f_cut_hpf: ์ฐจ๋จ ์ฃผํ์
:param order: ์ฐจ์
:param sr: sample rate
:param current_list: ์งํ๋๋ฅผ ๋ณด์ฌ์ค list
:return result: Band Pass Filter ๋ฐ์ดํฐ
"""
sample_time = sr
raw_data_temp = raw_data.copy() # raw data
w_cut_lpf = 2 * np.pi * f_cut_lpf
w_cut_lpf_period = 1 / w_cut_lpf
previous_low_result = 0 # previous raw data
low_result = [] # result
low_list_result = []
previous_raw_data = 0 # previous raw data
step = 0
# low pass filter
for k in range(order, 0, -1):
for j in range(0, len(raw_data_temp)):
for i in range(0, len(time)):
y = (w_cut_lpf_period * previous_low_result + sample_time * raw_data_temp[j][i]) / (
w_cut_lpf_period + sample_time)
previous_low_result = y
low_result = np.append(low_result, y)
if k > 1:
raw_data_temp[j] = low_result
low_result = []
if k == 1:
low_list_result = np.append(low_list_result, low_result)
low_result = []
raw_data_temp = low_list_result.reshape(len(raw_data_temp), len(time))
previous_high_result = 0 # previous result
w_cut_hpf = 2 * np.pi * f_cut_hpf
w_cut_period = 1 / w_cut_hpf
high_result = [] # result
high_list_result = []
step = 0
# high pass filter
for k in range(order, 0, -1):
for j in range(0, len(raw_data_temp)):
for i in range(0, len(time)):
y = w_cut_period / (w_cut_period + sample_time) * \
previous_high_result + w_cut_period / \
(w_cut_period + sample_time) * (
raw_data_temp[j][i] - previous_raw_data)
previous_high_result = y
previous_raw_data = raw_data_temp[j][i]
high_result = np.append(high_result, y)
if k > 1:
raw_data_temp[j] = high_result
high_result = []
if k == 1:
high_list_result = np.append(high_list_result, high_result)
high_result = []
# filter data reshape ( np.append ๋ฅผ ์ฌ์ฉํ๋ฉด ์ผ์ฐจ๋ฐฐ์ด๋ก ์์ )
result = high_list_result.reshape(len(raw_data_temp), len(time))
return result
์ด๋ ๊ฒ Low Pass Filter, High Pass Filter, Band Pass Filter๋ฅผ ๊ตฌํ๋ ์ ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ์ฌ์ฉํ ๊น์? ์ฌ์ฉ๋ฐฉ๋ฒ๋ ๊ต์ฅํ ๊ฐ๋จํฉ๋๋ค. ํ์ ์ฐ๋ฆฌ๋ค์ด ๋ค์ด๋ฐ์ ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ฒ๋ผ
import ํด์ ๋ถ๋ฌ์ค๋ฉด ๋ฉ๋๋ค. from์๋ ํ์ผ๋ช ์ด ๋ค์ด๊ฐ๋๋ค.
from filter_module import *
"""
from filter_module import lpf_module
from filter_module import hpf_module
from filter_module import bpf_module
"""
raw_data = "๋ฐ์ดํฐ๊ฐ ๋ด๊ฒจ ์๋ ์ด์ฐจ์ ๋ฐฐ์ดํ์"
time = "๋ฐ์ดํฐ์ ์๊ฐ์์ญ"
cut_off_frequency = "์ฐจ๋จ์ฃผํ์"
order = "์ฐจ์"
sr = "sample rate"
# ์ ์ญํต๊ณผํํฐ
lpf_result = lpf_module(raw_data, time, cut_off_frequency, order, sr)
# ๊ณ ์ญํต๊ณผํํฐ
hpf_result = hpf_module(raw_data, time, cut_off_frequency, order, sr)
์ด๋ฐ์์ผ๋ก ๋ชจ๋ํ๋ฅผ ์์ผ ํ๋ก๊ทธ๋๋ฐ์ ์งํํ๊ฒ ๋๋ฉด, ๋์ค์ ํํ๋ก์ ํธํ ๋๋ ์๋นํ ์์ํ๋ฉฐ, ๋ช ๋ฌ์ด ์ง๋ ์์
ํ๊ณ ์ถ๋ค๊ณ ํด๋ ๋น๊ต์ ์ฝ๊ฒ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ํ์ ํฐ ์ฅ์ ์ ์ฌ์ฌ์ฉ์ฑ์ ๋๋ค.
๋์ค์ ํํฐ๊ธฐ๋ฅ์ด ํ์ํ ๋, ์ ์ฝ๋ฉ์ฒ๋ผ ์ฃผ์๊ณผ ๋ชจ๋ํ๋ฅผ ์์ผ๋์ผ๋ฉด filter_module.py๋ง ๋ถ๋ฌ์ค๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
์ฒ์์ ๋ณต์กํ ์ง๋ผ๋ ์ ์ ์ฝ๋ฉ์ด ์ด๋ป์ง๊ธฐ ์์ํ๋ฉด์ ๊ธฐ๋ถ๋ ์ข์์ง๋๋ค@@