오늘의 목적은 다양한 Hz가 난잡하게 섞인 데이터에서 특정 범위 내의 Hz만을 뽑아내는 겁니다.
우선 제가 가지고 있는 난잡한 데이터입니다.
from scipy.signal import butter, filtfilt
# Band-Pass Filter 설계
nyquist = 0.5 * fs
low = 0.5 / nyquist
high = 3 / nyquist
b, a = butter(N=2, Wn=[low, high], btype='band')
# BPF 적용한 값을 FLT 에 넣는다.
df["FLT"] = filtfilt(b, a, df['RAW'])
df 내에 RAW 라는 데이터가 있다는 가정 하에, 이 RAW 데이터들에 BPF 필터를 적용하는 방법입니다.
이를 위해서는 scipy.signal 모듈이 필요합니다.
코드를 한줄씩 해석해보겠습니다.
nyquist = 0.5 * fs
nyquist는 나이퀴스트 주파수를 나타냅니다.
나이퀴스트 주파수는 샘플링 주파수의 절반으로, fs는 샘플링 주파수(초당 샘플링 횟수)를 의미합니다.
따라서, fs가 32 Hz이면 나이퀴스트 주파수는 16 Hz가 됩니다.
low = 0.5 / nyquist
high = 3 / nyquist
low와 high는 대역 통과 필터(Band-Pass Filter)의 저주파수와 고주파수 경계를 설정합니다.
low = 0.5 / nyquist는 필터의 저주파수 경계를 0.5 Hz로 설정합니다.
high = 3 / nyquist는 필터의 고주파수 경계를 3 Hz로 설정합니다.
이 필터는 0.5 Hz와 3 Hz 사이의 주파수만 통과시키게 됩니다.
b, a = butter(N=2, Wn=[low, high], btype='band')
butter 함수는 Butterworth 필터를 설계합니다.
N=2는 필터의 차수를 나타내며, 2차 필터를 사용합니다. 차수가 높을수록 필터의 기울기가 급격해집니다.
Wn=[low, high]는 필터의 저주파수와 고주파수 경계를 설정합니다.
btype=’band’는 대역 통과 필터를 의미합니다.
결과적으로, b와 a는 필터의 계수를 나타내는 배열로, 이 계수들은 필터를 적용하는 데 사용됩니다.
df["FLT"] = filtfilt(b, a, df['RAW'])
filtfilt 함수는 앞뒤로 필터를 적용하여 신호를 필터링합니다. 이 방법은 신호의 위상 왜곡을 최소화합니다.
b와 a는 필터의 계수이며, df[‘RAW’]는 필터링할 데이터 열입니다.
필터링된 결과는 FLT 열에 저장됩니다.
이를 적용하면 처음에 난잡했던 데이터가 다음과 같이 정렬이 됩니다.
이제 정렬된 데이터 내에서 튀는 값들을 확인하기가 쉽겠습니다.