Medical AI & Article Review

ECG(심전도) 데이터 노이즈 처리

Kimhj 2023. 8. 28. 11:36

 

ECG 주요 주파수 대역 범위

 

      • ECG 주요 주파수 범위는 1~45Hz 사이에 존재하고, 50~60Hz 이상은 전원선 노이즈로 알려져있음.
      • 사람의 Motion Artifact 는 3Hz 부근의 저주파에서 존재함. 신호처리 알고리즘 패키지에서는 보통 0.5~3.0Hz의 노이즈를 제거하는 것이 일반적임. 
      • 아래와 같은 필터링 방법들로 노이즈를 제거해줄 수 있음.
      • HighPass Filter 
        • 고역 통과 필터는 낮은 주파수의 신호를 차단하고 높은 주파수의 신호를 통과시킨다.
        • 들어, 오디오 신호에서의 배경 소음 제거나, 이미지에서의 경계선 감지와 같은 응용에서 사용함

 

      • Lowpass Filter
        • 고역 통과 필터는 낮은 주파수의 신호를 차단하고 높은 주파수의 신호를 통과시킨다.
        •  들어, 오디오 신호에서의 배경 소음 제거나, 이미지에서의 경계선 감지와 같은 응용에서 사용함

 

import numpy as np
from scipy.signal import butter, lfilter
import matplotlib.pyplot as plt

# Butterworth 필터를 설계하는 함수
def butter_filter(data, cutoff, fs, btype):
    nyq = 0.5 * fs
    normal_cutoff = cutoff / nyq
    b, a = butter(1, normal_cutoff, btype=btype, analog=False)
    y = lfilter(b, a, data)
    return y

fs = 500.0  # 예시: 500Hz 샘플링 주파수
cutoff_high = 1.0  # 예시: 1Hz cut-off 주파수
cutoff_low = 50.0  # 예시: 50Hz cut-off 주파수
t = np.linspace(0, 1, 500, endpoint=False)  # 예시: 1초 동안의 시간
signal = np.cos(2*np.pi*7*t) + 0.5*np.cos(2*np.pi*13*t)  # 두 주파수로 구성된 예시 신호

# 필터 적용
high_passed = butter_filter(signal, cutoff_high, fs, btype='high')
low_passed = butter_filter(signal, cutoff_low, fs, btype='low')

# 결과 시각화
plt.figure(figsize=(12, 8))
plt.plot(t, signal, label='Original Signal')
plt.plot(t, high_passed, label='High-pass Filtered', linestyle='--')
plt.plot(t, low_passed, label='Low-pass Filtered', linestyle='-.')
plt.legend()
plt.grid(True)
plt.show()

 

 

  • Powerline Filter 
    • Power Line Filter는 특히 심전도 (ECG)와 같은 생체 신호 측정에서 중요하며, 주로 전력선의 주파수 노이즈를 제거하기 위해 사용됨. (대부분의 국가는 전력선의 주파수가 50Hz 또는 60Hz이므로, 50Hz를 기준으로 제외)
    • 이러한 전력선 노이즈를 제거하기 위한 방법 중, Notch Filter 사용함. Notch 필터는 특정 주파수의 신호만을 차단하는 필터임.

 

import numpy as np
from scipy.signal import iirnotch, lfilter
import matplotlib.pyplot as plt

def notch_filter(data, notch_freq, Q, fs):
    nyq = 0.5 * fs
    freq = notch_freq / nyq
    b, a = iirnotch(freq, Q)
    y = lfilter(b, a, data)
    return y

fs = 500.0  # 예시: 500Hz 샘플링 주파수
notch_freq = 50.0  # 예시: 50Hz 전력선 노이즈 주파수 (또는 60Hz)
Q = 30.0  # Quality factor
t = np.linspace(0, 1, 500, endpoint=False)  # 예시: 1초 동안의 시간
signal = np.sin(2*np.pi*5*t) + np.sin(2*np.pi*50*t)  # 5Hz와 50Hz 주파수로 구성된 예시 신호

# 필터 적용
filtered_signal = notch_filter(signal, notch_freq, Q, fs)

# 결과 시각화
plt.figure(figsize=(12, 8))
plt.plot(t, signal, label='Original Signal')
plt.plot(t, filtered_signal, label='Notch Filtered', linestyle='--')
plt.legend()
plt.grid(True)
plt.show()