Python from scratch - PAL
111 subscribers
84 photos
5 videos
6 files
51 links
Download Telegram
.

مرحله 4: نمایش سیگنال EEG در زمان


# Plot first 5 seconds of EEG
raw.plot(duration=5, n_channels=20, scalings='auto')


هر کانال شامل یک الکترود EEG یا MEG

محور X زمان (ثانیه)

محور Y ولتاژ (µV)

هر چه duration بزرگ‌تر باشد، سیگنال در هر صفحه بیشتر فشرده می‌شود.

بخش n_channels=20 یعنی فقط ۲۰ کانال (electrode) از EEG نمایش داده شود.


.
.

مرحله 5: مشاهده طیف فرکانسی EEG (FFT / PSD)


# Power Spectral Density (frequency domain)
raw.plot_psd(fmax=80, picks='eeg')


این نمودار توان سیگنال را در فرکانس‌های مختلف (0–80 Hz) نشان می‌دهد.

برای مشاهده باندهای فرکانسی مانند Alpha (8–13 Hz)، Beta (13–30 Hz) و Gamma (>30 Hz) مناسب است.


.
.
مرحله 6: فیلتر کردن سیگنال


مثلاً حذف نویز برق ۵۰ هرتز

raw_filtered = raw.copy().notch_filter(freqs=50)
raw_filtered.plot(duration=5, n_channels=20)

بعلاوه بسته به اینکه تمرکز ما روی چه بازه‎‌های فرکانسی است از Low-pass filter هم می‌توانیم استفاده کنیم.

مقدار آن بستگی به هدف ما از آنالیز دارد.

مثلاً اگر نیاز داریم روی باند گاما کار کنیم نباید این فرکانس‌ها فیلتر شوند.

در ERP (event-related potential) تمرکز بر پاسخ‌های کند مغز است مانند 0.1-30 Hz


.
❤1
.
مثالی دیگر

raw_lp = raw.copy().filter(l_freq=None, h_freq=40) # Low-pass filter at 40 Hz
raw_lp.plot(duration=5, n_channels=20)

بخش l_freq=None یعنی فیلتر بالاگذر اعمال نمی‌شود.

بخش h_freq=40 یعنی فقط فرکانس‌های زیر ۴۰ هرتز باقی می‌مانند.

.
.

مرحله 7: شناسایی باندهای فرکانسی مرسوم


معمولاً از این تعاریف استفاده می‌شود (مقادیر قابل تغییر هستند):

Delta: 1–4 Hz

Theta: 4–8 Hz

Alpha: 8–12 Hz

Beta: 13–30 Hz

Gamma: 30–80 Hz (or 30–100 Hz)

.
.
Delta: 1–4 Hz

import mne
import numpy as np
import matplotlib.pyplot as plt
from mne.datasets import sample
from mne.filter import filter_data

# Load sample EEG data
data_path = sample.data_path()
raw_file = data_path / 'MEG' / 'sample' / 'sample_audvis_raw.fif'
raw = mne.io.read_raw_fif(raw_file, preload=True)
raw.pick_types(meg=False, eeg=True)

fs = raw.info['sfreq']
channel_name = raw.ch_names[0]

# Get first channel, first 1000 samples
eeg_data = raw.get_data(picks='eeg')[:1, :1000]
time = np.arange(eeg_data.shape[1]) / fs

# Filter Delta band (1–4 Hz)
delta_data = filter_data(eeg_data, sfreq=fs, l_freq=1, h_freq=4, method='fir', verbose=False)

# Plot time domain
plt.figure(figsize=(10,4))
plt.plot(time, delta_data[0] * 1e6, color='navy')
plt.title(f"Delta Band (1–4 Hz) — Time Domain ({channel_name})", fontsize=13)
plt.xlabel("Time (seconds)")
plt.ylabel("Amplitude (µV)")
plt.grid(True)
plt.tight_layout()
plt.show()

.
.
Theta (4–8 Hz)


# Filter Theta band (4–8 Hz)
theta_data = filter_data(eeg_data, sfreq=fs, l_freq=4, h_freq=8, method='fir', verbose=False)

plt.figure(figsize=(10,4))
plt.plot(time, theta_data[0] * 1e6, color='darkorange')
plt.title(f"Theta Band (4–8 Hz) — Time Domain ({channel_name})", fontsize=13)
plt.xlabel("Time (seconds)")
plt.ylabel("Amplitude (µV)")
plt.grid(True)
plt.tight_layout()
plt.show()

.
.
Alpha (8–13 Hz)


# Filter Alpha band (8–13 Hz)
alpha_data = filter_data(eeg_data, sfreq=fs, l_freq=8, h_freq=13, method='fir', verbose=False)

plt.figure(figsize=(10,4))
plt.plot(time, alpha_data[0] * 1e6, color='green')
plt.title(f"Alpha Band (8–13 Hz) — Time Domain ({channel_name})", fontsize=13)
plt.xlabel("Time (seconds)")
plt.ylabel("Amplitude (µV)")
plt.grid(True)
plt.tight_layout()
plt.show()

.
.
Beta (13–30 Hz)

# Filter Beta band (13–30 Hz)
beta_data = filter_data(eeg_data, sfreq=fs, l_freq=13, h_freq=30, method='fir', verbose=False)

plt.figure(figsize=(10,4))
plt.plot(time, beta_data[0] * 1e6, color='red')
plt.title(f"Beta Band (13–30 Hz) — Time Domain ({channel_name})", fontsize=13)
plt.xlabel("Time (seconds)")
plt.ylabel("Amplitude (µV)")
plt.grid(True)
plt.tight_layout()
plt.show()

.
.
Gamma (30–80 Hz)


# Filter Gamma band (30–80 Hz)
gamma_data = filter_data(eeg_data, sfreq=fs, l_freq=30, h_freq=80, method='fir', verbose=False)

plt.figure(figsize=(10,4))
plt.plot(time, gamma_data[0] * 1e6, color='purple')
plt.title(f"Gamma Band (30–80 Hz) — Time Domain ({channel_name})", fontsize=13)
plt.xlabel("Time (seconds)")
plt.ylabel("Amplitude (µV)")
plt.grid(True)
plt.tight_layout()
plt.show()

.