المحطة 1 · الدرس 3

بنية EEG struct

أساسي12 دقيقةقبل هذا الدرس: الواجهة والقوائماطبع البطاقة
تبدأ من: eeglab_data.set (D1) · لا شيء: البيانات كما نزّلتها.تنزيل البيانات (يفتح في نافذة جديدة)
سكربت الوصول لهذه الحالة
MATLAB
[ALLEEG, EEG, CURRENTSET, ALLCOM] = eeglab;
sampleFolder = fullfile(fileparts(which('eeglab')), 'sample_data');
EEG = pop_loadset('filename', 'eeglab_data.set', 'filepath', sampleFolder);
[ALLEEG, EEG, CURRENTSET] = pop_newset(ALLEEG, EEG, 0, 'setname', 'Continuous EEG Data', 'gui', 'off');
eeglab redraw;

الفكرة باختصار

كل ما تراه في نافذة EEGLAB محفوظ في متغيّر واحد في MATLAB اسمه EEG. هذا المتغيّر من نوع structمتغيّر في MATLAB يجمع عدة حقول مسمّاة في مكان واحد.، أي صندوق فيه حقلfield (in a struct)جزء مسمّى داخل struct يحمل قيمة، مثل EEG.srate. لكل منها اسم.

النافذة الرئيسية تعرض ملخصاً فقط. أما سكربتscriptملف أوامر MATLAB ينفّذ خطوات المعالجة بالترتيب. فتقرأ من EEG وتكتب فيه مباشرة. إذا فهمت حقوله الأساسية، تستطيع فحص أي خطوة بنفسك.

قبل وبعد

شجرة EEG في eeglab_data.set: data مصفوفة 32 × 30504 (القنوات في الصفوف والعيّنات في الأعمدة)، و srate قيمته 128، و chanlocs فيه 32 عنصراً، و event فيه 154 عنصراً، و icaweights فارغ حتى تشغيل ICA.

أسئلتك بعد هذا، كل جواب في قسمه:

لماذا أحتاج هذه الخطوة؟

السبب بالتفصيل، والمصطلحات التي تحتاجها

ستستخدم نفس طريقة النقطة التي استخدمتها مع المتغيّر demo في درس أساسيات MATLAB: EEG.srate تعني الحقل srate داخل EEG.

كيف أطبّقها في EEGLAB؟

7 خطوة من القوائم

1. افتح الحقول في الـ Workspace

  1. افتح داتاستdatasetملف بيانات EEG واحد محمّل في EEGLAB مع معلوماته. (dataset) كما في الدرس السابق.
  2. في لوحة Workspace في MATLAB، اضغط مرتين على EEG.
  3. تظهر حقول EEG في جدول. اضغط مرتين على أي حقل لتفتحه، مثل chanlocs أو event.

2. اقرأ الأحداث من EEGLAB

  1. افتح Edit ثم Event values.
  2. تظهر نافذة تعرض حدثاً (حدثeventعلامة في التسجيل تحدد لحظة شيء مهم، مثل ظهور مثير.) واحداً في كل مرة: type و position و latency. (الحقل urevent لا يظهر في هذه النافذة.)
  3. لاحظ أن عنوان حقل التوقيتlatency (event)موضع الحدث في التسجيل، ويُخزَّن في EEGLAB بالعيّنات. (latency) في النافذة latency (sec): النافذة تعرض التوقيت بالثواني، أما EEG.event فيحفظه عيّنةsampleقيمة واحدة للإشارة في لحظة زمنية واحدة.. أول حدث يظهر هنا عند حوالي 1.0001 ثانية.
  4. أغلق النافذة بزر Cancel حتى لا تغيّر شيئاً.

3. اقرأ معلومات الداتاست

افتح Edit ثم Dataset info. تظهر قيم مثل اسم الداتاست معدل العيّناتsampling rateعدد العيّنات المسجّلة في الثانية لكل قناة. (sampling rate). أغلقها بـ Cancel.

كيف أكتبها بالكود؟

نفس الخطوات في 18 أسطر MATLAB

اكتب هذه الأسطر في الـ Command Window، سطراً سطراً، وقارن الناتج بالتعليق:

MATLAB
% Basic information
EEG.setname            % 'Continuous EEG Data'
EEG.nbchan             % 32 channels
EEG.srate              % 128 samples per second
EEG.pnts               % 30504 samples per channel
(EEG.pnts - 1) / EEG.srate   % 238.3047 seconds (same as EEG.xmax)

% The signal: channels x samples
size(EEG.data)         % 32 30504
class(EEG.data)        % 'single'
EEG.data(1, 1:5)       % first 5 samples of channel 1 (microvolts)

% Channel names
{EEG.chanlocs(1:3).labels}   % 'FPz' 'EOG1' 'F3'

% First event: type and latency
EEG.event(1).type      % 'square'
EEG.event(1).latency   % 129.0087 (in samples)
(EEG.event(1).latency - 1) / EEG.srate   % 1.0001 (in seconds)

% Empty until ICA is computed
isempty(EEG.icaweights)   % 1 (true)
  • لماذا نطرح 1؟ في MATLAB أول عيّنة رقمها 1 وتقع عند الزمن صفر. لذلك الزمن بالثواني = (رقم العيّنة − 1) ÷ معدل العيّنات.
  • EEG.data(1, 1:5): الرقم الأول يختار قناةchannelالإشارة المسجّلة من قطب واحد، وهي ما يعرضه EEGLAB. (channel)، أي الصف، والثاني يختار العيّنات (الأعمدة).

أي قيمة أختار؟

القيم المناسبة حسب هدف تحليلك

لا توجد قيمة تختارها هنا. هذه الحقول الأساسية التي ستعود لها في كل الدروس:

الحقلماذا يحفظالوحدةالقيمة في eeglab_data.set
EEG.nbchanعدد القنواتقناة32
EEG.srateمعدل العيّناتهرتز128
EEG.pntsعدد العيّنات في كل قناةعيّنة30504
EEG.trialsعدد المقاطع (1 = بيانات مستمرة)مقطع1
EEG.xmin و EEG.xmaxزمن أول عيّنة وآخر عيّنةثانية0 و 238.3047 (آخر عيّنة)
EEG.timesزمن كل عيّنةميلي ثانيةمن 0 إلى 238304.6875
EEG.dataإشارةsignalقيم تتغيّر مع الزمن، مثل الجهد المسجّل في قناة. نفسهاميكروفولتمصفوفة 32 × 30504
EEG.chanlocsاسم كل قناة وموقعها—32 عنصراً
EEG.eventالأحداث: النوع والتوقيتالتوقيت بالعيّنات154 حدثاً (80 square و 74 rt)
EEG.icaweightsأوزان ICAطريقة تفصل الإشارة المسجّلة إلى مصادر مستقلة، بعضها دماغي وبعضها آرتفاكت.—فارغ

كيف أتأكد أنها نجحت؟

4 فحوص سريعة
  1. size(EEG.data) يعطي 32 30504.
  2. (EEG.pnts - 1) / EEG.srate يعطي 238.3047، وهو نفس EEG.xmax ونفس Epoch end (sec) في النافذة الرئيسية (تعرضه مقرّباً 238.305).
  3. EEG.event(1).type يعطي 'square'، والتوقيت المحوّل يعطي حوالي 1.0001 ثانية، ويطابق ما رأيته في Edit ثم Event values.
  4. numel(EEG.event) يعطي 154، ويطابق سطر Events في النافذة الرئيسية.

ما الأخطاء التي يقع فيها كثيرون؟

5 أخطاء، وكيف تتجنّبها
  • قلب الأبعاد. في EEGLAB القنوات في الصفوف والعيّنات في الأعمدة. EEG.data(:, 1) هي كل القنوات عند أول عيّنة، لا القناة الأولى كاملة. القناة الأولى كاملة هي EEG.data(1, :).
  • قراءة latency على أنها ثوانٍ. في EEG.event التوقيت بالعيّنات. حوّله بالمعادلة أعلاه، ولا تنسَ طرح 1.
  • نسيان أن EEG.times بالميلي ثانية. بينما EEG.xmin و EEG.xmax بالثواني.
  • تعديل EEG يدوياً ثم نسيان إبلاغ EEGLAB. إذا غيّرت حقلاً بنفسك، شغّل EEG = eeg_checkset(EEG); ثم خزّنه بـ [ALLEEG, EEG, CURRENTSET] = eeg_store(ALLEEG, EEG, CURRENTSET); و eeglab redraw. وإلا قد تعرض النافذة الرئيسية قيماً قديمة.
  • الخلط بين القناة قطبelectrodeالقطعة المعدنية التي توضع على الرأس لالتقاط الإشارة. (electrode). EEG.chanlocs(5) هي القناة الخامسة في البيانات، وموقعها هو موقع القطب الذي سجّلها. ترتيب القنوات في الملف لا يتبع ترتيباً على الرأس.

أين أقرأ أكثر؟

2 مراجع: التوثيق الرسمي أولاً

مكتوب لـ EEGLAB 2026.1 · 2026-10-28

تحتاج مساعدة؟

اسأل، أو شاركنا رأيك، أو بلّغ عن خطأ