2019年 7月29日--8月4日 课题组周汇报_目录
8月4日 周报
(一)本周进展及下周计划
本周进展:
1.学习直接用MATALB对原始脑电数据进行处理,而不依赖于EEGLAB工具箱;
2.学习python及串口通信,想办法解决python上位机存在的bug.
存在的问题:
1.超声课题组的各位都放假回家了,实验进度停滞,日报无材料可写;
2.python上位机的bug找到了,正在想办法解决.
下周计划:
1.把python上位机的问题解决掉;
2.开始抽时间去推进PLADRC论文的工作。
(二)具体进展情况
1. 从脑电数据中截取某一段的方法
环境需求:画图用MATLAB R2018a,查看eeg用MATALB R2013b中的EEGLAB,EEGLAB版本为v13.0.1
方法:在EEGLAB中遍历脑电数据,找到自己感兴趣的eeg片段,记下它的时间节点,然后在MATLAB R2018a中画图
(1) 在EEGLAB中遍历脑电数据,找到自己感兴趣的某一段
745~750s出现癫痫放电,我们对这段eeg很感兴趣,接下来要在MATLAB R2018a中将它画出来,并且分析它.
(2)在MATLAB R2018a中将745~750s的脑电数据画出来(无刺激时的癫痫状放电,文件夹1-1的数据)
clc;
clear;
close all;
openNSx('read');
t=745:(1/2000):750;
eega=double(NS3.Data);
eegn=eega(745*2000:750*2000);
figure(1)
plot(t,eegn,'k','linewidth',1.5);
l1=legend('原始小鼠癫痫放电');
set(l1,'linewidth',1.6,'fontsize',12,'fontweight','bold');
xlabel('Time(s)','fontsize',16,'fontweight','bold');
ylabel('\muV','fontsize',16,'fontweight','bold');
set(gca, 'linewidth',1.6,'fontsize',14,'fontweight','bold')
axis([745 750 -2000 3000]);
(3) 同理,现在画有刺激时的癫痫状放电及其刺激信号(文件夹2-2的数据)
注:这里打开的显然是降频滞后的刺激信号,原数据是30000Hz的方波,现在在EEGLAB中将其以采样率2000Hz打开,所以才变成了类似三角波的信号.
clc;
clear;
close all;
warning('选择脑电数据的ns5数据,文件夹2-2');
openNSx('read');
warning('选择脑电数据的ns3数据,文件夹2-2');
openNSx('read');
t=541:(1/2000):576;
eega=double(NS3.Data);
eegn=eega(541*2000:576*2000);
tusa=double(NS5.Data);
tusp=resample(tusa,2000,30000);
tusn=tusp(541*2000:576*2000);
figure(1)
subplot(2,1,1)
plot(t,tusn,'k','linewidth',1.5);
l1=legend('超声刺激触发脉冲');
set(l1,'linewidth',1.6,'fontsize',12,'fontweight','bold');
xlabel('Time(s)','fontsize',16,'fontweight','bold');
ylabel('\muV','fontsize',16,'fontweight','bold');
set(gca, 'linewidth',1.6,'fontsize',14,'fontweight','bold');
axis([541 576 -4e4 4e4]);
subplot(2,1,2)
plot(t,eegn,'k','linewidth',1.5);
l2=legend('超声刺激下的小鼠脑电');
set(l2,'linewidth',1.6,'fontsize',12,'fontweight','bold');
xlabel('Time(s)','fontsize',16,'fontweight','bold');
ylabel('\muV','fontsize',16,'fontweight','bold');
set(gca, 'linewidth',1.6,'fontsize',14,'fontweight','bold')
axis([541 576 -4000 4000]);
(4)没有经过resample(tusp,2000,30000)改变采样率时的超声刺激信号(文件2-2)
arun_waveform 源码:
clear all
close all
clc%是否以超声开始点作为0时刻点,false为超声结束点
%一般以超声开始点为0时刻点,但画图的时候记得标注超声结束点
is_use_start=true;
%运行的时候会要求依次打开数据
warning('选择脑电数据的ns3数据');
openNSx('read');
warning('选择超声数据的ns5数据');
openNSx('read');
%%%%%%%%%%%画波形图
eega=double(NS3.Data);
eeg_srate=NS3.MetaTags.SamplingFreq;
clear NS3;
tusa=double(NS5.Data);
tus_srate=NS5.MetaTags.SamplingFreq;
clear NS5;
sample_rate_1=2000;
sample_rate_2=30000;
tus=resample(tusa,sample_rate_1,sample_rate_2);
eegn=eega(1:end);
tus_p=tus(1:end);
figure;
subplot(2,1,1)
plot(eegn);
subplot(2,1,2)
plot(tus_p);
从源码中可以开出tusa是未经改变采样率之前的超声刺激触发信号,从MATLAB的workplace中将其另存为出来,然后导入EEGLAB 中查看.
所以说之前我们采集到的根本不是什么超声刺激信号,只是触发信号而已.
2. (1~50Hz)带通滤波器的设计
设计环境:MATLAB R2018a—fdatool
EEGLAB中1~50Hz的FIR滤波器
fdatool生成的滤波器函数:
function Hd = filter1_50
%FILTER_1-50 Returns a discrete-time filter object.
% MATLAB Code
% Generated by MATLAB(R) 9.4 and Signal Processing Toolbox 8.0.
% Generated on: 04-Aug-2019 20:18:11
% FIR Window Bandpass filter designed using the FIR1 function.
% All frequency values are in Hz.
Fs = 2000; % Sampling Frequency
N = 30; % Order
Fc1 = 1; % First Cutoff Frequency
Fc2 = 50; % Second Cutoff Frequency
flag = 'scale'; % Sampling Flag
% Create the window vector for the design algorithm.
win = hamming(N+1);
% Calculate the coefficients using the FIR1 function.
b = fir1(N, [Fc1 Fc2]/(Fs/2), 'bandpass', win, flag);
Hd = dfilt.dffir(b);
% [EOF]
然后只要在MATALB中直接调用这个函数就可以实现滤波了
eegn_filter=filter(filter1_50,eegn);
接下来我们来试试看效果如何.
clc;
clear;
close all;
warning('文件夹1-1的eeg');
openNSx('read');
t=745:(1/2000):750;
eega=double(NS3.Data);
eegn=eega(745*2000:750*2000);
% 1-50Hz带通滤波
eegn_filter=filter(filter1_50,eegn);
% 绘图
figure(1)
subplot(2,1,1)
plot(t,eegn,'k','linewidth',1.5);
l1=legend('原始小鼠癫痫放电');
set(l1,'linewidth',1.6,'fontsize',12,'fontweight','bold');
xlabel('Time(s)','fontsize',16,'fontweight','bold');
ylabel('\muV','fontsize',16,'fontweight','bold');
set(gca, 'linewidth',1.6,'fontsize',14,'fontweight','bold')
axis([745 750 -2000 3000]);
subplot(2,1,2)
plot(t,eegn_filter,'k','linewidth',1.5);
l2=legend('滤波后小鼠癫痫放电');
set(l2,'linewidth',1.6,'fontsize',12,'fontweight','bold');
xlabel('Time(s)','fontsize',16,'fontweight','bold');
ylabel('\muV','fontsize',16,'fontweight','bold');
set(gca, 'linewidth',1.6,'fontsize',14,'fontweight','bold')
axis([745 750 -2000 3000]);
就按照这种方式,我们试着画出静息态的eeg并且滤波
clc;
clear;
close all;
warning('文件夹1-2的eeg');
openNSx('read');
t=0:(1/2000):5-1/2000;
eega=double(NS3.Data);
eegn=eega(1:5*2000);
% 1-50Hz带通滤波
eegn_filter=filter(filter1_50,eegn);
% 绘图
figure(1)
subplot(2,1,1)
plot(t,eegn,'k','linewidth',1.5);
l1=legend('原始小鼠静息态脑电');
set(l1,'linewidth',1.6,'fontsize',12,'fontweight','bold');
xlabel('Time(s)','fontsize',16,'fontweight','bold');
ylabel('\muV','fontsize',16,'fontweight','bold');
set(gca, 'linewidth',1.6,'fontsize',14,'fontweight','bold')
axis([0 5 -2000 3000]);
subplot(2,1,2)
plot(t,eegn_filter,'k','linewidth',1.5);
l2=legend('滤波后小鼠静息态脑电');
set(l2,'linewidth',1.6,'fontsize',12,'fontweight','bold');
xlabel('Time(s)','fontsize',16,'fontweight','bold');
ylabel('\muV','fontsize',16,'fontweight','bold');
set(gca, 'linewidth',1.6,'fontsize',14,'fontweight','bold')
axis([0 5 -2000 3000]);
3. 归一化频谱分析方法
李小俚老师文章中的归一化频谱分析实例
(1)静息态小鼠脑电滤波前后的归一化频谱分析
滤波前 的小鼠 静息态 脑电归一化频谱:
clc;
clear;
close all;
warning('文件夹1-2的eeg');
openNSx('read');
t=0:(1/2000):5-1/2000;
eega=double(NS3.Data);
eegn=eega(1:5*2000);
% 1-50Hz带通滤波
eegn_filter=filter(filter1_50,eegn);
% 归一化频谱分析
t1=0:1/500:1;%采样步长
y= eegn;
N=length(t1); %样点个数
fs=200;%采样频率
df=fs/(N-1);%分辨率
f=(0:N-1)*df;%其中每点的频率
Y=fft(y(1:N))/N*2;%真实的幅值
Y_gui1=mapminmax(Y,0,1); %幅值归一化
%Y=fftshift(Y);
% 绘图1(滤波前后的脑电)
figure(1)
subplot(2,1,1)
plot(t,eegn,'k','linewidth',1.5);
l1=legend('原始小鼠静息态脑电');
set(l1,'linewidth',1.6,'fontsize',12,'fontweight','bold');
xlabel('Time(s)','fontsize',16,'fontweight','bold');
ylabel('\muV','fontsize',16,'fontweight','bold');
set(gca, 'linewidth',1.6,'fontsize',14,'fontweight','bold')
axis([0 5 -2000 3000]);
subplot(2,1,2)
plot(t,eegn_filter,'k','linewidth',1.5);
l2=legend('滤波后小鼠静息态脑电');
set(l2,'linewidth',1.6,'fontsize',12,'fontweight','bold');
xlabel('Time(s)','fontsize',16,'fontweight','bold');
ylabel('\muV','fontsize',16,'fontweight','bold');
set(gca, 'linewidth',1.6,'fontsize',14,'fontweight','bold')
axis([0 5 -2000 3000]);
% 绘图2(归一化频谱)
figure(2)
plot(f(1:N/2),abs(Y_gui1(1:N/2)),'r','linewidth',1.5);
l3=legend('滤波前小鼠静息态脑电归一化频谱');
set(l3,'linewidth',1.6,'fontsize',12,'fontweight','bold');
xlabel('Frequency(Hz)','fontsize',16,'fontweight','bold');
set(gca, 'linewidth',1.6,'fontsize',14,'fontweight','bold')
滤波后的归一化频谱只需将
y=eegn;
l3=legend('滤波前小鼠静息态脑电归一化频谱');
改为
y=eegn_filter
l3=legend('滤波后小鼠静息态脑电归一化频谱');
就可以了
(2)癫痫态小鼠脑电滤波前后的归一化频谱分析
滤波前 的小鼠 癫痫态 脑电归一化频谱:
clc;
clear;
close all;
warning('文件夹1-1的eeg');
openNSx('read');
t=745:(1/2000):750;
eega=double(NS3.Data);
eegn=eega(745*2000:750*2000);
% 1-50Hz带通滤波
eegn_filter=filter(filter1_50,eegn);
% 归一化频谱分析
t1=0:1/500:1;%采样步长
y= eegn;
N=length(t1); %样点个数
fs=200;%采样频率
df=fs/(N-1);%分辨率
f=(0:N-1)*df;%其中每点的频率
Y=fft(y(1:N))/N*2;%真实的幅值
Y_gui1=mapminmax(Y,0,1); %幅值归一化
%Y=fftshift(Y);
% 绘图1(滤波前后的脑电)
figure(1)
subplot(2,1,1)
plot(t,eegn,'k','linewidth',1.5);
l1=legend('原始小鼠癫痫态脑电');
set(l1,'linewidth',1.6,'fontsize',12,'fontweight','bold');
xlabel('Time(s)','fontsize',16,'fontweight','bold');
ylabel('\muV','fontsize',16,'fontweight','bold');
set(gca, 'linewidth',1.6,'fontsize',14,'fontweight','bold')
axis([745 750 -2000 3000]);
subplot(2,1,2)
plot(t,eegn_filter,'k','linewidth',1.5);
l2=legend('滤波后小鼠癫痫态脑电');
set(l2,'linewidth',1.6,'fontsize',12,'fontweight','bold');
xlabel('Time(s)','fontsize',16,'fontweight','bold');
ylabel('\muV','fontsize',16,'fontweight','bold');
set(gca, 'linewidth',1.6,'fontsize',14,'fontweight','bold')
axis([745 750 -2000 3000]);
% 绘图2(归一化频谱)
figure(2)
plot(f(1:N/2),abs(Y_gui1(1:N/2)),'r','linewidth',1.5);
l3=legend('滤波前小鼠癫痫态脑电归一化频谱');
set(l3,'linewidth',1.6,'fontsize',12,'fontweight','bold');
xlabel('Frequency(Hz)','fontsize',16,'fontweight','bold');
set(gca, 'linewidth',1.6,'fontsize',14,'fontweight','bold')
滤波后的归一化频谱只需将
y=eegn;
l3=legend('滤波前小鼠静息态脑电归一化频谱');
改为
y=eegn_filter
l3=legend('滤波后小鼠静息态脑电归一化频谱');
就可以了
4. 关于python上位机串口通信的若干问题
我试了试,把03E8、0032等中的0去掉也是无法成功通信的,不过加空格是可以的,如:
连这样也是可以的:
python上位机之所以发送无效可能是因为它发送的只是字符串而非hex发送.