2019年 7月29日--8月4日 周报

本文介绍了使用MATLAB处理脑电数据的技巧,包括数据截取、带通滤波器设计、归一化频谱分析,以及Python上位机串口通信的常见问题。通过实际案例展示了静息态和癫痫态小鼠脑电数据的处理过程。

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发送.

附录

常用希腊字母英文

在这里插入图片描述

内容概要:本文介绍了一个基于MATLAB实现的无人机三维路径规划项目,采用蚁群算法(ACO)与多层感知机(MLP)相结合的混合模型(ACO-MLP)。该模型通过三维环境离散化建模,利用ACO进行全局路径搜索,并引入MLP对环境特征进行自适应学习与启发因子优化,实现路径的动态调整与多目标优化。项目解决了高维空间建模、动态障碍规避、局部最优陷阱、算法实时性及多目标权衡等关键技术难题,结合并行计算与参数自适应机制,提升了路径规划的智能性、安全性和工程适用性。文中提供了详细的模型架构、核心算法流程及MATLAB代码示例,涵盖空间建模、信息素更新、MLP训练与融合优化等关键步骤。; 适合人群:具备一定MATLAB编程基础,熟悉智能优化算法与神经网络的高校学生、科研人员及从事无人机路径规划相关工作的工程师;适合从事智能无人系统、自动驾驶、机器人导航等领域的研究人员; 使用场景及目标:①应用于复杂三维环境下的无人机路径规划,如城市物流、灾害救援、军事侦察等场景;②实现飞行安全、能耗优化、路径平滑与实时避障等多目标协同优化;③为智能无人系统的自主决策与环境适应能力提供算法支持; 阅读建议:此资源结合理论模型与MATLAB实践,建议读者在理解ACO与MLP基本原理的基础上,结合代码示例进行仿真调试,重点关注ACO-MLP融合机制、多目标优化函数设计及参数自适应策略的实现,以深入掌握混合智能算法在工程中的应用方法。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值