欢迎光临散文网 会员登陆 & 注册

(备份)MATLAB脑波绘图(基于SleepSign2.0)

2023-03-09 22:35 作者:锕天霸动霸羽  | 我要投稿

本教程中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的结束

 


(备份)MATLAB脑波绘图(基于SleepSign2.0)的评论 (共 条)

分享到微博请遵守国家法律