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

الاستيفاء (interpolation)

أساسي10 دقائققبل هذا الدرس: القنوات السيئةاطبع البطاقة
تبدأ من: eeglab_data.set (D1) · ما طُبّق عليه قبل هذا الدرس: فلترة high-pass و low-pass، إزالة ضوضاء الكهرباء (50 أو 60 هرتز)، القنوات السيئةتنزيل البيانات (يفتح في نافذة جديدة)
سكربت الوصول لهذه الحالة
MATLAB
[ALLEEG, EEG, CURRENTSET, ALLCOM] = eeglab;
eeglabRoot = fileparts(which('eeglab'));
EEG = pop_loadset('eeglab_data.set', fullfile(eeglabRoot, 'sample_data'));
fullLocs = EEG.chanlocs;

% Main dataset: high-pass at 0.1 Hz, then 60 Hz line-noise removal
EEG = pop_eegfiltnew(EEG, 'locutoff', 0.1);
EEG = pop_eegfiltnew(EEG, 'locutoff', 58, 'hicutoff', 62, 'revfilt', 1);
EEG.filename = ''; EEG.filepath = ''; EEG.datfile = ''; EEG.saved = 'no';
[ALLEEG, EEG, CURRENTSET] = pop_newset(ALLEEG, EEG, 0, 'setname', 'D1 hp0.1 notch60', 'gui', 'off');

% Bad channels you removed earlier, e.g. {'T7'}; leave empty if none
badChans = {};
if ~isempty(badChans)
    EEG = pop_select(EEG, 'rmchannel', badChans);
end
EEG.filename = ''; EEG.filepath = ''; EEG.datfile = ''; EEG.saved = 'no';
[ALLEEG, EEG, CURRENTSET] = pop_newset(ALLEEG, EEG, CURRENTSET, 'setname', 'D1 badch', 'gui', 'off');
eeglab redraw;

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

في الدرس السابق حذفت قناةchannelالإشارة المسجّلة من قطب واحد، وهي ما يعرضه EEGLAB. السيئة. الآن تعيد بناءها الاستيفاءinterpolationتقدير إشارة قناة محذوفة من القنوات المحيطة بها. (interpolation): يحسب EEGLAB قيمة كل قناة محذوفة من القنوات المحيطة بها، حسب مواقع قطبelectrodeالقطعة المعدنية التي توضع على الرأس لالتقاط الإشارة. على الرأس. وفي D1 لا قناة سيئةbad channelقناة إشارتها مسطّحة أو مليئة بالضوضاء طوال التسجيل تقريباً.، فتتدرّب على نسخة مؤقتة لا تحفظها.

لماذا لا تكمل بدونها؟ لثلاثة أسباب:

قبل وبعد

اعرض
خريطة فروة الرأس بعد حذف القناة C3: لا نقطة في موضع C3، والألوان حوله من تنعيم الرسم.
قبل: D1 noC3البيانات: عيّنة EEGLAB الرسمية (eeglab_data.set)
الخريطة نفسها بعد الاستيفاء بنفس الزمن ونفس حدود الألوان: عادت نقطة C3، والنمط قريب جداً من الخريطة الأصلية.
بعد: D1 C3 backالبيانات: عيّنة EEGLAB الرسمية (eeglab_data.set)

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

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

السبب بالتفصيل، والمصطلحات التي تحتاجها
  1. المرجع المتوسطaverage referenceمرجع يساوي متوسط كل قنوات الرأس. يحتاج قنوات موزّعة على الرأس كله. قناة ناقصة في جهة تجعل المتوسط مائلاً نحو الجهة الأخرى.
  2. المقارنة بين مشاركparticipantالشخص الذي سُجّلت بياناته في التجربة. تحتاج نفس القنوات عند الجميع.
  3. خرائط الرأس ترسم فراغاً مكان القناة الناقصة.

لكن للاستيفاء ثمن. القناة المستوفاة خليط من القنوات الأخرى، فلا تضيف معلومة جديدة. لذلك تنقص كل قناة مستوفاة رتبة البياناتrankعدد القنوات المستقلة فعلاً في البيانات، ويقل بعد الاستيفاء أو المرجع المتوسط. (rank) بواحد. ستحتاج هذه المعلومة في درس ICAطريقة تفصل الإشارة المسجّلة إلى مصادر مستقلة، بعضها دماغي وبعضها آرتفاكت..

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

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

ابدأ من “نقطة البداية”. سكربتها يضع داتاستdatasetملف بيانات EEG واحد محمّل في EEGLAB مع معلوماته. التي قبل حذف القنوات، أي D1 hp0.1 notch60، في الداتاست 1، والنسخة الرئيسية D1 badch في الداتاست 2. ستحتاج رقم الداتاست 1 مع بياناتك، لأن مواقع كل القنوات محفوظة فيها.

أولاً: تمرين على قناة سليمة

  1. والداتاست D1 badch هي الحالية، افتح Edit ثم Select data. اكتب C3 في خانةfield (in a dialog)مكان في نافذة نكتب فيه قيمة أو نختارها. Channel(s)، وفعّل المربع تحت on->remove these، ثم اضغط OK.
  2. سمِّ الداتاست الجديدة D1 noC3. في النافذة الرئيسية صار Channels per frame يساوي 31.
  3. افتح Tools ثم Interpolate electrodes. تظهر نافذة بعنوان Interpolate channel(s) — pop_interp().
  4. اضغط Use all channels from other dataset، واكتب 2، أي رقم الداتاست D1 badch، في خانة Dataset index، ثم OK. يظهر اسم C3 تحت What channel(s) do you want to interpolate.
  5. في Interpolation method اترك Spherical، واترك Time range [min max] (s) فارغة، ثم اضغط OK.
  6. تطبع نافذة الأوامر Interpolating 1 channels.... سمِّ الداتاست D1 C3 back. صار عدد القنوات 32 من جديد.
  7. قارن C3 في D1 badch وفي D1 C3 back من Plot ثم Channel data (scroll). الإشارتان متشابهتان جداً.
  8. هذه نسخ تمرين، فلا تحفظها. ارجع إلى D1 badch.

ثانياً: الاستيفاء على بياناتك

  1. والداتاست التي حذفت منها القنوات السيئة هي الحالية، افتح Tools ثم Interpolate electrodes.
  2. اضغط Use all channels from other dataset، واكتب رقم الداتاست التي قبل الحذف. تظهر أسماء القنوات المحذوفة.
  3. اترك Spherical، واضغط OK. سمِّ الناتج D1 interp واحفظه.
  4. في D1 لم تُحذف قناة، فإذا جرّبت يقول EEGLAB No new channels selected. النسخة الرئيسية تبقى D1 badch، ودرس إعادة المرجعre-referencingتغيير المرجع بعد التسجيل بحساب الجهد بالنسبة لمرجع جديد. يبدأ منها.

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

نفس الخطوات في 15 أسطر MATLAB
MATLAB
% Rebuild the removed channels from the full channel list (fullLocs)
if ~isempty(badChans)
    EEG = pop_interp(EEG, fullLocs, 'spherical');
end
EEG.setname = 'D1 interp';
fprintf('Channels after interpolation: %d\n', EEG.nbchan);
EEG = pop_saveset(EEG, 'filename', 'D1_interp.set', 'filepath', pwd);

% Exercise: remove a good channel, rebuild it, compare with the original
testChan = 'C3';
EEG_drop = pop_select(EEG, 'rmchannel', {testChan});
EEG_back = pop_interp(EEG_drop, fullLocs, 'spherical');
iOrig = find(strcmp({EEG.chanlocs.labels}, testChan));
iBack = find(strcmp({EEG_back.chanlocs.labels}, testChan));
r = corrcoef(double(EEG.data(iOrig, :)), double(EEG_back.data(iBack, :)));
fprintf('Correlation between original and interpolated %s: %.2f\n', testChan, r(1, 2));

المتغيّر fullLocs من سكربت نقطة البداية: نسخة من مواقع كل القنوات قبل أي حذف. احفظها دائماً في بداية المعالجة.

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

القيم المناسبة حسب هدف تحليلك
الإعدادالقيمةلماذا
طريقة الاستيفاءSphericalالخيار الأول في النافذة، وهو الافتراضي في pop_interp. يستخدم مواقع الأقطاب على سطح الرأس.
مصدر المواقعكل القنوات من الداتاست التي قبل الحذف، أو fullLocs في السكربتهكذا يعرف EEGLAB أسماء القنوات الناقصة ومواقعها، ويعيدها بترتيبها الأصلي.
مكان الخطوةبعد حذف القنوات السيئة، وقبل إعادة المرجعالمرجع المتوسط يحتاج كل القنوات.
عدد القنوات المستوفاةقليلكل قناة مستوفاة تنقص رتبة البيانات بواحد، ولا تضيف معلومة جديدة.
Interpolate removed channel(s) في نافذة إعادة المرجعليس في مسارنايستوفي ويعيد المرجع في خطوة واحدة. نحن نفصل الخطوتين حتى تتحقق من كل واحدة.

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

4 فحوص سريعة
  1. عدد القنوات رجع كاملاً: Channels per frame في النافذة الرئيسية يساوي العدد الأصلي. في D1 يساوي 32.
  2. نفس الترتيب: في Plot ثم Channel locations ثم By name تظهر القنوات المستوفاة في أماكنها.
  3. التمرين: السكربت يطبع ارتباطاً قريباً من 0.98 بين C3 الأصلية والمستوفاة.
  4. الإشارة منطقية: في Plot ثم Channel data (scroll) تشبه القناة المستوفاة جاراتها، بلا خط مسطّح ولا قفزات.

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

4 أخطاء، وكيف تتجنّبها
  • إعادة المرجع قبل الاستيفاء. المرجع المتوسط على قنوات ناقصة يميل نحو الجهة التي فيها قنوات أكثر. استوفِ أولاً، ثم أعد المرجع.
  • فقدان المواقع الأصلية. بعد حذف القناة لا يعرف EEGLAB أين كانت إلا من داتاست سابقة أو من fullLocs. احفظ المواقع قبل أي حذف.
  • نسيان أن الرتبة نقصت. إذا استوفيت قناتين، فرتبة البيانات أقل من عدد القنوات باثنين، وبعد المرجع المتوسط بثلاثة: 32 قناة تعطي رتبة 29. اكتب هذا الرقم وقارنه بما يطبعه pop_runica عند تشغيل ICA.
  • الثقة الزائدة بالقنوات الطرفية. القناة على حافة الشبكة، مثل T7، لها جيران من جهة واحدة فقط، فاستيفاؤها أقل دقة من قناة في الوسط مثل C3.

كيف أكتبها في ورقتي؟

قالب Methods: عدّل البيانات والإعدادات والإصدارات لتطابق ما نفّذته

قالب: عدّل البيانات والإعدادات والإصدارات لتطابق ما نفّذته.

Removed channels were interpolated using spherical spline interpolation (pop_interp, EEGLAB 2026.1).

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

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

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

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

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