脳磁図データの表示(evoked data)

加算波形データを表示する方法です。 いろんな方法があると思いますがaxes1個のものにしてみました。 データは広島大学大学院医歯薬保健学研究院生体環境適応科学研究室(弓削研究室)の 大鶴先生から頂いた体性感覚刺激の2つのFIFFファイルをMATファイルに変換したものです。 被験者名と検査日は削除しています。 データはhttp://meg.aalip/matlab/data/SEF1.matとhttp://meg.aalip.matlab/data/SEF2.matから入手できます。 vv_lout.matはレイアウト表示用のファイルです。

Contents

脳磁図データとレイアウトデータの読み込み

ファイルはそれぞれ

http://meg.aalip.jp/matlab/data/SEF1.mat

http://meg.aalip.jp/matlab/data/SEF2.mat

http://meg.aalip.jp/matlab/data/vv_lout.mat

から入手してください。 データファイルが隣のフォルダ、../dataフォルダにあると仮定しています。 データですが、頭とDewarの位置関係は変わらず、標本化周波数は同一と仮定しています。

load('../data/SEF1');
SEF1=ave_0001;
MTX1=MEG2HEAD;
load('../data/SEF2');
SEF2=ave_0001;
MTX2=MEG2HEAD;
load('../data/vv_lout');

SSP適応

Signal Space Projectionを適応します。 PCA_xxxxのチャンネル順とデータのチャンネル順が同じと仮定しています。 またSEF1とSEF2のSSPが同一のものであると仮定しています。 SSPの効果が一目瞭然と思います。

if exist('PCA_0001','var')
    SSP=eye(length(PCA_0001));
    for n=1:999
        nPCA=sprintf('PCA_%04.0f',n);
        if exist(nPCA,'var')
            nPCA=eval(nPCA);% 文字列を実際の固有ベクトルに
            SSP=SSP-nPCA*nPCA';
        else
            break;
        end;
    end;
    ch=1:length(PCA_0001);
    figure('color',[1,1,1]);
    subplot(221);plot(SEF1(:,end),SEF1(:,ch),'color',[0,0,1]);
    title('SSP前');
    subplot(222);plot(SEF2(:,end),SEF2(:,ch),'color',[0,0.5,0]);
    title('SSP前');
    SEF1(:,ch)=SEF1(:,ch)*SSP;
    SEF2(:,ch)=SEF2(:,ch)*SSP;
    subplot(223);plot(SEF1(:,end),SEF1(:,ch),'color',[0,0,1]);
    title('SSP後');
    subplot(224);plot(SEF2(:,end),SEF2(:,ch),'color',[0,0.5,0]);
    title('SSP後');
    haxes=findobj(gcf,'type','axes');% 単位記入
    for n=1:length(haxes);
        set(gcf,'CurrentAxes',haxes(n));
        axis tight;
        xlabel('[ms]');ylabel('[fT or fT/cm]');
    end;
end;

2~200Hzの周波数帯域通過フィルタの作成

最小二乗線形位相 FIR フィルターであるfirls関数を使って周波数フィルタを設計し、 周波数応答を見てみます。

sfreq=1000/(SEF1(2,end)-(SEF1(1,end)));
bandpass=[2,200]; % 通過周波数帯域

f=[0,1,3,199,201,sfreq/2]/(sfreq/2);
a=1;% FIRなので分母は1
n=256;% 次数は128
bp=[0,0,1,1,0,0];
b=firls(n,f,bp);

[h,w]=freqz(b,a,1000,sfreq);
figure('color',[1,1,1]);
subplot(211);plot(w,abs(h));grid on;
set(gca,'xlim',[0,sfreq/2]);
xlabel('[Hz]');
subplot(212);plot(w,abs(h));grid on;
set(gca,'xlim',[0,10]);
xlabel('[Hz]');

周波数フィルタの適応

低周波帯域のフィルタ特性はかなり甘甘です。 実際にフィルタを適応してみます。位相がズレないようfiltfilt関数を使います。

figure('color',[1,1,1]);
for n=1:2
    switch n
        case 1;data=SEF1;color=[0,0,1];
        case 2;data=SEF2;color=[0,0.5,0];
    end;
    time=data(:,end);ch=1:306;
    subplot(2,2,1+(n-1));plot(time,data(:,ch),'color',color);
    axis tight;grid on;title('フィルタ前');xlabel('[ms]');
    data(:,ch)=filtfilt(b,a,data(:,ch));
    subplot(2,2,3+(n-1));plot(time,data(:,ch),'color',color);
    axis tight;grid on;title('フィルタ後');xlabel('[ms]');
    switch n
        case 1;SEF1=data;
        case 2;SEF2=data;
    end;
end;

全波形表示

gradiometerのMEGxxx2とMEGxxx3は対応してないかもしれません。 MEGxxx1はmagnetometerです。magnetomterとgradiometerで単位が異なるので補正してます。

time=union(SEF1(:,end),SEF2(:,end));% 2つの時間帯を統合
lout=vv_lout;
wd=lout(1,4);% 波形の幅
ht=lout(1,5);% 波形の高さ
ch=1:306;
chlout=1:306;% layout用
amp=0.01*ht;
amp102=0.2;% magnetometerは単位が違うので5分の1で表示
X0=linspace(0,wd,length(time))';

for n=1:2;
    switch n
        case 1;data=SEF1;
            hf=figure('color',[1,1,1]);
            color=[0,0,1];
        case 2;data=SEF2;
            color=[0,0.5,0];
    end;
    [~,t]=intersect(time,data(:,end));% 統合した時間のなかでdataの時間部分を表示
    data=amp*data(:,ch);
    data(:,3:3:306)=amp102*data(:,3:3:306);% magnetometerだけ補正
    smp=length(t);
    X=ones(smp,1)*lout(chlout,2)'+X0(t,:)*ones(1,size(data,2));
    Y=ones(smp,1)*lout(chlout,3)'+data;
    plot(X,Y,'color',color);hold on;
end;
set(gca,'Ydir','normal');
axis tight;axis off;
title('全波形表示');

gradiometer波形の表示

MEGxxx1の成分、magnetometerの成分を除去してます。

time=union(SEF1(:,end),SEF2(:,end));% 2つの時間帯を統合
lout=vv_gra;
wd=lout(1,4);% 波形の幅
ht=lout(1,5);% 波形の高さ
ch=1:306;
ch(3:3:306)=[];% magnetometerは除去
chlout=1:204;% layout用
amp=0.01*ht;
X0=linspace(0,wd,length(time))';

for n=1:2;
    switch n
        case 1;data=SEF1;
            hf=figure('color',[1,1,1]);
            color=[0,0,1];
        case 2;data=SEF2;
            color=[0,0.5,0];
    end;
    [~,t]=intersect(time,data(:,end));% 統合した時間のなかでdataの時間部分を表示
    data=amp*data(:,ch);
    smp=length(t);
    X=ones(smp,1)*lout(chlout,2)'+X0(t,:)*ones(1,size(data,2));
    Y=ones(smp,1)*lout(chlout,3)'+data;
    plot(X,Y,'color',color);hold on;
end;
set(gca,'Ydir','normal');
axis tight;axis off;
title('gradiometer波形表示');

gradiometer波形のroot mean square波形表示

MEGxxx2とMEGxxx3のroot mean square波形を表示します。magnetometerのlayoutを使います。

time=union(SEF1(:,end),SEF2(:,end));% 2つの時間帯を統合
lout=vv_mag;
wd=lout(1,4);% 波形の幅
ht=lout(1,5);% 波形の高さ
ch=1:306;
ch(3:3:306)=[];% magnetometerは除去
chlout=1:102;% layout用
amp=0.01*ht;
X0=linspace(0,wd,length(time))';

for n=1:2;
    switch n
        case 1;data=SEF1;
            hf=figure('color',[1,1,1]);
            color=[0,0,1];
        case 2;data=SEF2;
            color=[0,0.5,0];
    end;
    [~,t]=intersect(time,data(:,end));% 統合した時間のなかでdataの時間部分を表示
    data=amp*data(:,ch);
    smp=length(t);
    data=sqrt(data(:,1:2:end).^2+data(:,2:2:end).^2);
    X=ones(smp,1)*lout(chlout,2)'+X0(t,:)*ones(1,size(data,2));
    Y=ones(smp,1)*lout(chlout,3)'+data;
    plot(X,Y,'color',color);hold on;
end;
set(gca,'Ydir','normal');
axis tight;axis off;
title('gradiometer波形のroot mean square波形表示');