Butter 이용해서 BandPassFilter 만들기

오늘의 목적은 다양한 Hz가 난잡하게 섞인 데이터에서 특정 범위 내의 Hz만을 뽑아내는 겁니다.

우선 제가 가지고 있는 난잡한 데이터입니다.

BandPassFilter 설계하기

				
					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 열에 저장됩니다.

마치며...

이를 적용하면 처음에 난잡했던 데이터가 다음과 같이 정렬이 됩니다.

이제 정렬된 데이터 내에서 튀는 값들을 확인하기가 쉽겠습니다.