o0y0o

[1주 BCI 기초 다지기] 5일차: 시간 영역 분석, 주파수 영역 분석, FFT 본문

BCI/1주 BCI 기초 다지기

[1주 BCI 기초 다지기] 5일차: 시간 영역 분석, 주파수 영역 분석, FFT

_\oyo/_ 2025. 1. 27. 21:30

5일차: EEG 데이터의 시간 및 주파수 분석 (25-01-27)

1. 시간 영역(Time-domain) 분석

시간 영역 분석이란?

  • 정의
    • 시간에 따라 변화하는 신호의 진폭(amplitude)을 시각적으로 분석하는 방법.
    • EEG 데이터를 분석할 떄, 신호의 진폭, 파형, 시간적 패턴을 관찰할 수 있음.
  • 특징
    • EEG 데이터의 크기와 변화를 직관적으로 볼 수 있음.
    • 특정 구간에서 발생하는 이벤트(ex. 눈 깜박임, 근육 움직임) 등을 확인 가능.

시간 영역 분석의 목적

  • 신호 품질 확인: 눈에 띄는 노이즈가 있는지 시간적으로 확인할 수 있음.
  • 특정 이벤트 식별: 시간에 따른 큰 진촉 변화난 특정 패턴 확인할 수 있음.

2. 주파수 영역(Frequency-domain) 분석

주파수 영역 분석이란?

  • 정의
    • 신호를 주파수 성분으로 변환하여, 각 주파수 대역의 에너지를 분석하는 방법.
    • EEG 데이터에서 신호의 주파수 성분(Delta, Theta, Alpha, Beta, Gamma)을 파악할 수 있음.

주파수 영역 분석의 목적

  • 신경 활동 상태 분석: 각 주파수 대역은 특정 신경 활동 상태(집중, 이완, 수명 등)과 관련이 있으므로, 주파수 영역 분석을 통해 신경 활동 상태를 분석할 수 있음.
  • 노이즈 식별 및 제거: 전력선 노이즈(50/60 Hz)나 근육 활동 신호(30 Hz 이상)를 주파수 성분으로 확인할 수 있음.
  • 특정 대역 에너지 계산: 주파수 대역별로 에너지를 계산해, 뇌 상태를 정량적으로 분석할 수 있음.

FFT(Fast Fourier Transform)와 주파수 분석

  • FFT란?
    • 신호를 시간 영역에서 주파수 영역으로 변환하는 알고리즘 중 하나.
    • 이를 통해 특정 주파수 대역의 강도를 시각적으로 확인할 수 있음.
  • FFT의 결과
    • x축: 주파수(Hz)
    • y축: 주파수 성분의 강도(Amplitude 또는 Power)

3. 시간-주파수 분석

  • 주파수 영역 분석은 시간 정보가 손실될 수 있음.
  • 특정 시점의 주파수 성분을 추적하기 위해 Short-Time Fourier Transform (STFT)나 Wavelet Transform을 사용해 시간-주파수 분석을 수행할 수 있음.

4. MATLAB에서의 실습

실습 1: 시간 영역 분석

% 샘플링 주파수 설정
fs = 250;
t = (0:size(rawData_multi, 2)-1) / fs; % 시간 벡터

% EEG 신호 시각화
figure;
for ch = 1:size(rawData_multi, 1)
    subplot(size(rawData_multi, 1), 1, ch);
    plot(t, rawData_multi(ch, :));
    title(['채널', num2str(ch), '의 신호']);
    xlabel('Time (s)');
    ylabel('Amplitude (\\muV)');
end
sgtitle('EEG 데이터의 시간 영역 신호');

% 각 채널의 평균 및 표준편차 계산
for ch = 1:size(rawData_multi, 1)
    mean_value = mean(rawData_multi(ch, :));
    std_value = std(rawData_multi(ch, :));
    disp(['채널 ', num2str(ch), ': 평균 = ', num2str(mean_value), ', 표준편차 = ', num2str(std_value)]);
end

실습2: 주파수 영역 분석(FFT)

% FFT 계산
n = length(rawData_multi); % 데이터 길이
f = (0:n/2-1)*(fs/n); % 주파수 벡터

figure;
for ch = 1:size(rawData_multi, 1)
    eeg_fft = fft(rawData_multi(ch, :)); % FFT 수행
    eeg_fft = abs(eeg_fft(1:n/2)); % 양수 주파수 성분만 사용

    subplot(size(rawData_multi, 1), 1, ch);
    plot(f, eeg_fft);
    title(['채널 ', num2str(ch), '의 FFT']);
    xlabel('Frequency (Hz)');
    ylabel('Magnitude');
end
sgtitle('EEG 데이터의 주파수 영역 분석 (FFT)');

% 주파수 대역 정의
delta_range = [0.5 4]; 
theta_range = [4 8];
alpha_range = [8 13];
beta_range = [13 30];
gamma_range = [30 50];

% 주파수별 에너지 계산
for ch = 1:size(rawData_multi, 1)
    eeg_fft = fft(rawData_multi(ch, :));
    eeg_fft = abs(eeg_fft(1:n/2)); % 양수 주파수 성분만 사용

    delta_power = sum(eeg_fft(f >= delta_range(1) & f <= delta_range(2)));
    theta_power = sum(eeg_fft(f >= theta_range(1) & f <= theta_range(2)));
    alpha_power = sum(eeg_fft(f >= alpha_range(1) & f <= alpha_range(2)));
    beta_power = sum(eeg_fft(f >= beta_range(1) & f <= beta_range(2)));
    gamma_power = sum(eeg_fft(f >= gamma_range(1) & f <= gamma_range(2)));

    disp(['채널 ', num2str(ch)]);
    disp(['Delta Power: ', num2str(delta_power)]);
    disp(['Theta Power: ', num2str(theta_power)]);
    disp(['Alpha Power: ', num2str(alpha_power)]);
    disp(['Beta Power: ', num2str(beta_power)]);
    disp(['Gamma Power: ', num2str(gamma_power)]);
end