o0y0o

[1주 BCI 기초 다지기] 3일차: IIR, FIR, Band-pass, Notch 필터 본문

BCI/1주 BCI 기초 다지기

[1주 BCI 기초 다지기] 3일차: IIR, FIR, Band-pass, Notch 필터

_\oyo/_ 2025. 1. 25. 00:11

3일차: EEG 신호 전처리 I (25-01-24)

1. 신호 필터링의 기본 개념

왜 필터링이 필요한가?

  • EEG 신호는 두피에서 측정한 미세 전압으로, 주변 환경 노이즈나 생체아티팩트(근전도, 눈 깜박임 등) 때문에 잡음이 들어갈 수 있음.
  • 원하는 주파수 범위의 신호만 추출하거나 특정 잡음 주파수를 제거하기 위해 필터를 사용.

디지털 신호 처리 필터 유형

  • IIR 필터 (Infinite Impulse Response Filter)
    • IIR 필터는 출력 신호가 이전 출력값에 의존하는 피드백(Feedback) 구조를 지님.
    • 이 필터의 임펄스 응답(Impulse Response)이 무한히 길게 이어질 수 있기에 Infinite Impulse Response라고 불림.
    • 효율적이고 계산량이 적지만 위상 왜곡의 가능성이 존재함.
  • FIR 필터 (Finite Impulse Response Filter)
    • FIR 필터는 출력 신호가 입력값에만 의존하는 구조로, 피드백이 없음.
    • 이 필터의 임펄스 응답이 유한한 길이를 가지기 때문에 Finite Impulse Response라고 불림.
    • 안정적이지만 계산량이 많고, 선형 위상의 특성을 지녀 설계에 따라 시신호의 위상 왜곡이 발생하지 않음.
  • IIR vs FIR특성 IIR 필터 FIR 필터
    구조 피드백 존재 피드백 없음
    위상 왜곡 발생 가능 선형 위상 가능
    차수 낮은 차수로도 성능 발휘 높은 차수 필요
    계산량 적음 많음
    안정성 설계에 따라 불안정할 수 있음 항상 안정적
    적용 분야 실시간 처리, 자원 제한된 시스템 고품질 처리, 위상 왜곡이 문제일 때

대표적인 필터 두 가지

https://ko.wikipedia.org/wiki/%ED%95%84%ED%84%B0_%28%EC%8B%A0%ED%98%B8_%EC%B2%98%EB%A6%AC%29

  • 신호 처리 필터는 다양하지만, BCI에서는 주로 다음의 두 가지 필터를 사용.
  • Band-pass 필터
    • 특정 주파수 범위(예: 1~50 Hz)만 통과시키고, 그 밖의 주파수는 억제하는 필터.
    • EEG 분석에서는 0.5~50 Hz 정도의 범위를 많이 사용하지만, 분석 목적에 따라 달라질 수 있음.
  • Notch 필터
    • 특정 주파수(예: 50 Hz 또는 60 Hz)를 제거하기 위해 사용하는 필터.
    • 전원 주파수(AC noise) 제거를 위해 많이 쓰임.
    • 한국 및 유럽 등은 50 Hz, 미국 등 일부 지역은 60 Hz 전력선 주파수를 제거할 때 사용.

2. MATLAB을 활용한 간단한 필터링 실습

필터 설계 함수

  • designfilt: 다양한 파라미터를 설정해 IIR/FIR 필터를 설계할 수 있음.
  • filtfilt: 설계된 필터를 적용해 위상 왜곡 없는 필터링(양방향 필터링)을 할 수 있음.

ex. Badn-pass 필터 설계 (FIR, 30~50 Hz)

fs = 250; % 샘플링 주파수

% 밴드패스 필터 설계 (FIR, 1~50 Hz 범위를 통과)
bpFilt_FIR = designfilt('bandpassfir', ...
    'FilterOrder', 100, ...
    'CutoffFrequency1', 1, ...
    'CutoffFrequency2', 50, ...
    'SampleRate', fs);

% 필터 주파수 응답 확인
fvtool(bpFilt_FIR);

실제 데이터 필터링

  • 예제 데이터 생성
fs = 250;  % 샘플링 주파수 (Hz)
t = 0:1/fs:10;  % 10초간의 데이터 생성

% 다양한 주파수 대역의 뇌파 신호 생성
delta_wave = 0.5 * sin(2 * pi * 2 * t);    % Delta (2 Hz)
theta_wave = 0.3 * sin(2 * pi * 6 * t);    % Theta (6 Hz)
alpha_wave = 0.2 * sin(2 * pi * 10 * t);   % Alpha (10 Hz)
beta_wave = 0.1 * sin(2 * pi * 20 * t);    % Beta (20 Hz)
gamma_wave = 0.05 * sin(2 * pi * 40 * t);  % Gamma (40 Hz)

% 신호 합성 (뇌파 대역 혼합)
eeg_signal = delta_wave + theta_wave + alpha_wave + beta_wave + gamma_wave;

% 노이즈 추가
noise = 0.3 * sin(2 * pi * 50 * t);  % 50 Hz 전력선 노이즈
rawData = eeg_signal + noise;

% 신호 시각화
figure;
subplot(2,1,1);
plot(t, eeg_signal);
title('합성된 뇌파 신호 (Noise 없음)');
xlabel('Time (s)');
ylabel('Amplitude');

subplot(2,1,2);
plot(t, rawData);
title('노이즈가 추가된 Raw EEG 데이터');
xlabel('Time (s)');
ylabel('Amplitude');

  • 예제 데이터에 Notch 필터 적용
% ---- Notch 필터 (50 Hz 제거) ----
f0 = 50;   % 제거할 주파수 (50 Hz)
Q = 35;    % 품질 계수 (좁은 대역 제거)
notchFilt = designfilt('bandstopiir', ...
    'FilterOrder', 2, ...
    'HalfPowerFrequency1', f0 - 1, ...
    'HalfPowerFrequency2', f0 + 1, ...
    'SampleRate', fs);

% Notch 필터 적용
filteredData_notch = filtfilt(notchFilt, rawData);


% ---- 필터링 결과 시각화 ----
figure;

% 원본 신호
subplot(2,1,1);
plot(t, rawData);
title('원본 신호 (노이즈 포함)');
xlabel('Time (s)');
ylabel('Amplitude');

% Notch 필터 적용 신호
subplot(2,1,2);
plot(t, filteredData_notch);
title('Notch 필터 적용 (50 Hz 제거)');
xlabel('Time (s)');
ylabel('Amplitude');