(備份)MATLAB腦波繪圖(基于SleepSign2.0)
本教程中SleepSign的FFT導出參數(shù)設置為:
total time = 60min
time division = epoch time = 4 s
display range = 0.0 - 29.75 Hz
(參數(shù)不一致也沒事)
?
1、使用SleepSign的text output和FFT功能,分別導出電壓與頻率的txt文件
?
2、將附件中的代碼根據(jù)自身需要調整后,全選復制進MATLAB命令行窗口,回車運行
?
?
選擇剛才導出的txt文件即可
?
時頻圖可根據(jù)實際情況選擇繪制原圖或擬合后的平滑圖,詳見代碼黃底字內容。參考效果如下
原圖(n=1)
?
平滑圖(n=10)
?
3、時頻圖顏色深度可在坐標區(qū)屬性中自行修改
?
?
?
?
4、點擊“文件”→“另存為”,保存為svg矢量圖
?
?
可以先在MATLAB里畫好草圖,再根據(jù)需求將svg圖片導入Adobe Illustrator進一步修補美化
附件
EEG、EMG信號圖+時頻熱圖代碼
注:
1. “%”后為此串代碼的中文注釋,黃底字為通常需要改動的參數(shù)
2. 軟件版本為MATLAB R2019b
close all;
clear;
%清空所有圖窗;清空工作區(qū)數(shù)據(jù)
?
figure('position',[300,20,800,800]);
%創(chuàng)建圖窗,設置位置和大小[與屏幕左側間距,與屏幕下側間距,長,寬]。默認單位為像素,尺寸會受屏幕縮放影響
?
?
?
%%%%%%%%%%第一部分 繪制EEG與EMG信號圖%%%%%%%%%%
?
if logical(1)
%選擇是否運行這部分代碼,1為運行,0為不運行
?
[filename,pathname] = uigetfile({'*.txt'},'選擇要打開的信號文件');
if pathname==0
return;
end
%保存選定文件的名稱和路徑,若未選取文件,則直接結束代碼避免報錯
?
signal=importdata(fullfile(pathname,filename),' ',18);
%從該文件中讀取數(shù)據(jù)(文件路徑,列分隔符,從第18行后開始讀?。?/span>
?
yEEG=400;
yEMG=200;
%設置EEG、EMG信號圖的波幅顯示范圍
?
EEG=axes('position',[0.15,0.8,0.7,0.1]);
%設置坐標軸位置[與figure左側間距百分比,與figure下側間距百分比,長占figure百分比,寬占figure百分比]
?
plot(signal.data(:,1),'linewidth',0.5,'Color',[0,0,0]);
%繪制EEG信號圖,設置線寬,顏色[R,G,B]
?
text(0,0,'EEG ?','HorizontalAlignment','right','FontSize',16,'FontName','Arial');
%在坐標軸左側添加文字“EEG”,設置字號,字體
?
xlim([1,size(signal.data,1)]);
%設置x軸顯示范圍[起始坐標,終止坐標]
?
ylim([-yEEG,yEEG]);
%設置y軸顯示范圍[起始坐標,終止坐標]
?
EEG.XAxis.Visible='off';EEG.YAxis.Visible='off';
%隱藏XY軸
?
EMG=axes('position',[0.15,0.725,0.7,0.075]);
%設置坐標軸位置[與figure左側間距百分比,與figure下側間距百分比,長占figure百分比,寬占figure百分比]
?
plot(signal.data(:,2),'linewidth',0.5,'Color',[0,0,0]);
%繪制EMG信號圖,設置線寬,顏色[R,G,B]
?
text(0,0,'EMG??','HorizontalAlignment','right','FontSize',16,'FontName','Arial');
%在坐標軸左側添加文字“EMG”,設置字號,字體
?
xlim([1,size(signal.data,1)]);
%設置x軸顯示范圍[起始坐標,終止坐標]
?
ylim([-yEMG,yEMG]);
%設置y軸顯示范圍[起始坐標,終止坐標]
?
EMG.XAxis.Visible='off';EMG.YAxis.Visible='off';
%隱藏XY軸
?
end
%對應開頭if logical的結束語
?
?
?
%%%%%%%%%%第二部分 繪制EEG時頻圖%%%%%%%%%%
?
if logical(1)
%選擇是否運行這部分代碼,1為運行,0為不運行
?
n=1;
%自定義熱圖的平滑倍數(shù),1為原圖
?
[filename,pathname] = uigetfile({'*.txt'},'選擇要打開的時頻文件');
?
if pathname==0
return;
end
%若未讀取文件,則直接結束代碼避免報錯
?
tic;disp('正在繪制時頻熱圖,請稍后...');
%開始計時,n越大耗時越長
?
freq=importdata(fullfile(pathname,filename),' ',20);
%從選定txt文件中讀取數(shù)據(jù)(文件路徑,列分隔符,從第20行后開始讀取)
?
freq.data(:,1)=[];
%刪除freq第一列
?
axes('position',[0.15,0.6,0.7,0.12]);
%設置坐標軸位置[與figure左側間距百分比,與figure下側間距百分比,長占figure百分比,寬占figure百分比]
?
freq.data(freq.data==0)=min(min(freq.data));
%將freq.data中的0值修改為非0的最小值,在減少結果變動的前提下避免報錯
?
dB=10*log10(freq.data);
%將功率數(shù)據(jù)換算為分貝(dB)
?
f=1:1:size(dB,1);
%列出原文件導出的頻率段數(shù),記為表f
?
F=1:1/n:size(dB,1);
%列出平滑后的頻率段數(shù),記為表F
?
t=1:1:size(dB,2);
%列出原文件導出的時間段數(shù),記為表t
?
T=1:1/n:size(dB,2);
%列出平滑后的時間段數(shù),記為表T
?
A=zeros(0,0);
%創(chuàng)建空白數(shù)值矩陣A
?
for n=1:size(dB,2)
%開始循環(huán),循環(huán)次數(shù)為dB的時間段數(shù)
?
An=spline(f,dB(:,n),F);
%計算平滑頻率后每段時頻對應的分貝,記為An
?
A=[A;An];
%將得到的n行An合成到矩陣A
?
end
%結束循環(huán)
?
B=zeros(0,0);
%創(chuàng)建空白數(shù)值矩陣B
?
for n=1:size(A,2)
%開始循環(huán),循環(huán)次數(shù)為A的頻率段數(shù)
?
Bn=spline(t,A(:,n),T);
%在A的基礎上,計算平滑時間后每段時頻對應的分貝,記為Bn
?
B=[B;Bn];
%將得到的n行Bn合成到矩陣B
?
end
%結束循環(huán)
?
dB=B;disp(['擬合完畢,耗時',num2str(toc),'秒']);
%將最終的擬合結果覆蓋到矩陣dB;顯示耗時
?
tfgraph=flipud(dB);imagesc(tfgraph);
%垂直翻轉矩陣dB,記為tfgraph(time frequency graph);繪制時頻圖
?
xlabel('Times (s)','FontSize',16,'FontName','Arial');
%設置x軸標題,字號,字體
?
ylabel('Freq (Hz)','FontSize',16,'FontName','Arial');
%設置y軸標題,字號,字體
?
set(gca,'xtick',[1,0.25*size(tfgraph,2),0.5*size(tfgraph,2),0.75*size(tfgraph,2),size(tfgraph,2)],'xticklabel',["0","600","1200","1800","2400","3000","3600"]);
%設置部分x軸刻度對應顯示指定文字
?
set(gca,'ytick',[1,0.5*size(tfgraph,1),size(tfgraph,1)],'yticklabel',["30","15","0"]);
%設置部分y軸刻度對應顯示指定文字
?
set(gca,'FontSize',14,'FontName','Arial','ticklength',[0,0],'box','off','colormap',(jet));
%設置坐標字號,字體,隱藏刻度線,關閉邊框,使用jet顏色圖
?
set(colorbar,'position',[0.865,0.6,0.02,0.12],'FontSize',12,'FontName','Arial','ticklength',0,'box','off');
%設置垂直顏色欄的位置,字號,字體,隱藏刻度線,關閉邊框
?
end
%對應開頭if logical的結束語
?