(备份)MATLAB脑波绘图(基于SleepSign2.0)
本教程中SleepSign的FFT导出参数设置为:
total time = 60min
time division = epoch time = 4 s
display range = 0.0 - 29.75 Hz
(参数不一致也没事)
1、使用SleepSign的text output和FFT功能,分别导出电压与频率的txt文件
2、将附件中的代码根据自身需要调整后,全选复制进MATLAB命令行窗口,回车运行
选择刚才导出的txt文件即可
时频图可根据实际情况选择绘制原图或拟合后的平滑图,详见代码黄底字内容。参考效果如下
原图(n=1)
平滑图(n=10)
3、时频图颜色深度可在坐标区属性中自行修改
4、点击“文件”→“另存为”,保存为svg矢量图
可以先在MATLAB里画好草图,再根据需求将svg图片导入Adobe Illustrator进一步修补美化
附件
EEG、EMG信号图+时频热图代码
注:
1. “%”后为此串代码的中文注释,黄底字为通常需要改动的参数
2. 软件版本为MATLAB R2019b
close all;
clear;
%清空所有图窗;清空工作区数据
figure('position',[300,20,800,800]);
%创建图窗,设置位置和大小[与屏幕左侧间距,与屏幕下侧间距,长,宽]。默认单位为像素,尺寸会受屏幕缩放影响
%%%%%%%%%%第一部分 绘制EEG与EMG信号图%%%%%%%%%%
if logical(1)
%选择是否运行这部分代码,1为运行,0为不运行
[filename,pathname] = uigetfile({'*.txt'},'选择要打开的信号文件');
if pathname==0
return;
end
%保存选定文件的名称和路径,若未选取文件,则直接结束代码避免报错
signal=importdata(fullfile(pathname,filename),' ',18);
%从该文件中读取数据(文件路径,列分隔符,从第18行后开始读取)
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;
%自定义热图的平滑倍数,1为原图
[filename,pathname] = uigetfile({'*.txt'},'选择要打开的时频文件');
if pathname==0
return;
end
%若未读取文件,则直接结束代码避免报错
tic;disp('正在绘制时频热图,请稍后...');
%开始计时,n越大耗时越长
freq=importdata(fullfile(pathname,filename),' ',20);
%从选定txt文件中读取数据(文件路径,列分隔符,从第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);
%将功率数据换算为分贝(dB)
f=1:1:size(dB,1);
%列出原文件导出的频率段数,记为表f
F=1:1/n:size(dB,1);
%列出平滑后的频率段数,记为表F
t=1:1:size(dB,2);
%列出原文件导出的时间段数,记为表t
T=1:1/n:size(dB,2);
%列出平滑后的时间段数,记为表T
A=zeros(0,0);
%创建空白数值矩阵A
for n=1:size(dB,2)
%开始循环,循环次数为dB的时间段数
An=spline(f,dB(:,n),F);
%计算平滑频率后每段时频对应的分贝,记为An
A=[A;An];
%将得到的n行An合成到矩阵A
end
%结束循环
B=zeros(0,0);
%创建空白数值矩阵B
for n=1:size(A,2)
%开始循环,循环次数为A的频率段数
Bn=spline(t,A(:,n),T);
%在A的基础上,计算平滑时间后每段时频对应的分贝,记为Bn
B=[B;Bn];
%将得到的n行Bn合成到矩阵B
end
%结束循环
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的结束语