matlab emd功率谱密度,【脑电信号分类】脑电信号提取PSD功率谱密度特征

脑电信号是一种非平稳的随机信号,一般而言随机信号的持续时间是无限长的,因此随机信号的总能量是无限的,而随机过程的任意一个样本函数都不满足绝对可积条件,所以其傅里叶变换不存在。

不过,尽管随机信号的总能量是无限的,但其平均功率却是有限的,因此,要对随机信号的频域进行分析,应从功率谱出发进行研究才有意义。正因如此,在研究中经常使用功率谱密度(Power spectral density, PSD)来分析脑电信号的频域特性。

本文简单的演示了对脑电信号提取功率谱密度特征然后分类的基本流程。希望对那些尚未入门、面对 BCI 任务不知所措的新手能有一点启发。

2. 功率谱密度理论基础简述

功率谱密度描是对随机变量均方值的量度,是单位频率的平均功率量纲。对功率谱在频域上积分就可以得到信号的平均功率。

功率谱密度 是一个以频率 为自变量的映射, 反映了在频率成分 上信号有多少功率。

我们假定一个随机过程 ,并定义一个截断阈值 ,随机过程 的截断过程 就可以定义为

则该随机过程的能量可定义为

对能量函数求导,就可以获得平均功率。

根据 Parseval 定理(即能量从时域角度和频域角度来看都是相等的)可得:

这里 是 经过傅里叶变换后的形式。由于随机过程 被限定在了一个有限的时间区间 之间,所以对随机过程的傅里叶变换不再受限。另外我们还需要注意到, 是一个随机变量,因此为了得到最终总体的平均功率,还需要求取随机变量的期望值。

由此,通过求取 时的极限,就可以得到原始随机过程的平均功率 。

将式中被积函数单独提取出来,定义为 :

这样一来,平均功率 可以表示为 。通过这种定义方式,函数 可以表征每一个最小极限单位的频率分量所拥有的功率大小,因此我们把 称为功率谱密度。

3. Matlab 中 PSD 函数的使用

功率谱密度的估计方法有很多。总体来讲可以分为两大类:传统的非参数方法,和现代的参数方法。

7f1f0385b989a56e11f367bdb950db9a.png

在这里插入图片描述

本节不对理论知识做详细的叙述,感兴趣的可以深入查阅文献,这里只介绍一下有哪些方法,以及他们在 matlab 当中的使用。

3.1 传统非参数方法估计 PSD

最简单的方法是周期图法,先对信号做 FFT 变换,然后求平方,periodogram 函数实现了这个功能。不过周期图法估计的方差随采样点数N的增加而增加,不是很建议使用。

另一种自相关方法,基于维纳辛钦定律:信号的功率谱估计等于该信号自相关函数的离散DTFT,不过我没有在 matlab 里找到对应的函数,如果有知道的朋友请告诉我一下。

最常用的函数是 pwelch 函数,利用 welch 方法来求 PSD,这也是最推荐使用的。

3.2参数方法估计 PSD

包括 pconv、pburg、pyulear 等几个方法。

这些方法我没用过,所以也不敢随便乱说。

4. 实验示例

给出从 EEG 信号中提取功率谱特征并分类的简单范例。

4.1 实验数据

本文选用的实验数据为BCI Competition Ⅱ的任务四,使用的数据为 sp1s_aa_1000Hz.mat。

081f67437aaa15dc98e61befc1027562.png

实验使用的数据

这个数据集中,受试者坐在一张椅子上,手臂放在桌子上,手指放在电脑键盘的标准打字位置。被试需要用食指和小指依照自己选择的顺序按相应的键。实验的目标是预测按键前130毫秒手指运动的方向(左 OR 右)。

在 matlab 中导入数据。

%% 导入数据

% 1000 Hz 记录了 500 ms

load('sp1s_aa_1000Hz.mat');

% 采样率 1000 Hz

srate = 1000;

[frames, channels, epochs] = size(x_train);

rightwards = sum(y_train);

leftwards = length(y_train) - rightwards;

fprintf('一共有 %d 个训练样本,其中往左运动有 %d 个,往右运动有 %d 个\n',...

length(y_train), leftwards, rightwards);

一共有 316 个训练样本,其中往左运动有 159 个,往右运动有 157 个

4.2 提取特征

我们使用 welch 法来提取功率谱密度,利用 pwelch 函数计算功率谱,使用 bandpower 函数可以提取特定频段的功率信息,所以分别提取 、、、节律的功率。最后取各通道平均功率的前12个点(根据 f 来看,前 12 个点基本覆盖了 0到 40Hz 的频带)

%% 提取 PSD 特征

function [power_features] = ExtractPowerSpectralFeature(eeg_data, srate)

% 从 EEG 信号中提取功率谱特征

% Parameters:

% eeg_data: [channels, frames] 的 EEG 信号数据

% srate: int, 采样率

% Returns:

% eeg_segments: [1, n_features] vector

%% 计算各个节律频带的信号功率

[pxx, f] = pwelch(eeg_data, [], [], [], srate);

power_delta = bandpower(pxx, f, [0.5, 4], 'psd');

power_theta = bandpower(pxx, f, [4, 8], 'psd');

power_alpha = bandpower(pxx, f, [8, 14], 'psd');

power_beta = bandpower(pxx, f, [14, 30], 'psd');

% 求 pxx 在通道维度上的平均值

mean_pxx = mean(pxx, 2);

% 简单地堆叠起来构成特征(可以用更高级地方法,比如考虑通道之间的相关性的方法构成特征向量)

power_features = [

power_delta, power_theta, ...

power_alpha, power_beta, ...

mean_pxx(1:12)';

];

end

然后对每个样本都提取特征,构造一个二维矩阵 X_train_features。

X_train_features = [];

for i = 1:epochs

% 取出数据

eeg_data = squeeze(x_train(:, :, i));

feature = ExtractPowerSpectralFeature(eeg_data, srate);

X_train_features = [X_train_features; feature];

end

% 原始的 y_train 是行向量,展开成列向量

y_train = y_train(:);

4.3 分类

使用 SVM 进行简单的分类任务,由于只是简单演示,所以不划分训练集、交叉验证集。

% 由于只是简单演示,所以不划分训练集、交叉验证集

model = fitcsvm(X_train_features, y_train,...

'Standardize', true, 'KernelFunction', 'RBF', 'KernelScale', 'auto', 'verbose', 1);

y_pred = model.predict(X_train_features);

acc = sum(y_pred == y_train) / length(y_pred);

fprintf('Train Accuracy: %.2f%%\n', acc * 100);

结果如下:

|===================================================================================================================================|

|   Iteration  | Set  |   Set Size   |  Feasibility  |     Delta     |      KKT      |  Number of   |   Objective   |   Constraint  |

|              |      |              |      Gap      |    Gradient   |   Violation   |  Supp. Vec.  |               |   Violation   |

|===================================================================================================================================|

|            0 |active|          316 |  9.968454e-01 |  2.000000e+00 |  1.000000e+00 |            0 |  0.000000e+00 |  0.000000e+00 |

|          350 |active|          316 |  5.175246e-05 |  9.741516e-04 |  5.129944e-04 |          312 | -1.850933e+02 |  5.967449e-16 |

由于 DeltaGradient,收敛时退出活动集。

Train Accuracy: 94.62%

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552007.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

组装服务器配置清单_2020年组装电脑配置清单列表

随着电脑技术的不断革新,越来越多的家庭都有各式各样的电子设备。而电脑现在基本上是家家都有的物品,可是在购买电脑的时候新手小白需要注意那些事项呢?今天我们就给告诉小白如何组装电脑以小白组装电脑配置清单。1、购买电脑,您首…

oracle 关于归档的视图,oracle 与归档日志相关的几个视图

归档日志占据的数据库举足轻重的位置,以下系统视图来了解归档日志情况V$ARCHIVEV$ARCHIVED_LOG 已归档日志详单V$ARCHIVE_GAP 归档日志丢失V$ARCHIVE_PROCESSES 归档进程信息V$ARCHIVE_DEST 查看备份路径情况V$ARCHIVE_DEST_STATUSv$recovery_f…

count数据库优化oracle,迷惑性SQL性能问题排查与优化

:数据科学、人工智能从业者的在线大学。数据科学(Python/R/Julia)数据分析、机器学习、深度学习作者简介戴秋龙,拥有超过八年的电信、保险、税务行业核心系统ORACLE数据库优化,优化经验,具备丰富的行业服务背景。对Oracle数据库有…

swiper.js pagination指示点不变_电缆故障点的四种实用测定方法

一、电缆故障的种类与判断无论是高压电缆或低压电缆,在施工安装、运行过程中经常因短路、过负荷运行、绝缘老化或外力作用等原因造成故障。电缆故障可概括为接地、短路、断线三类,其故障类型主要有以下几方面:①三芯电缆一芯或两芯接地。②二…

wampserver php扩展openssl 不可用_PHP基础及WAMP集成基础

PHP语言编写的基础框架 PHP语言的编写框架与HTML5的一致&#xff0c;都是一下框架&#xff1a;<!DOCTYPE html> <html><head></head><body> </body> </html>PHP的主要表达语句在body里面&#xff0c;主题内容在<?p ?>标签中…

python expect模块_Python尚学堂高淇|第二季0408P119P123with上常见的异常的解决tryexcept...else结构,...

P119 04&#xff1a;try ...except...else结构try..except...else结构增加了"else快"如果try快当中没有抛出异常&#xff0c;则执行else快&#xff0c;如果try快当中抛出异常&#xff0c;则执行except快&#xff0c;不执行【实例】try....except...else结构执行测试…

用c语言简单办法做一个字典_幼儿园手工,用废纸筒做一个简单的小蝴蝶,有教程...

幼儿园的手工&#xff0c;除了用卡纸做各种简单的小制作外&#xff0c;纸筒也是常用的手工材料。下面用纸筒做一个简单的小蝴蝶&#xff0c;做法很简单。制作过程&#xff1a;准备材料废纸筒、剪刀、胶、水彩笔&#xff0c;纸板。在纸筒上剪下五个圈圈剪完的样子见下图把里面粘…

bing搜索引擎入口_互联网流量入口——头条的搜索计划

互联网时代&#xff0c;谁掌控了用户流量&#xff0c;那它就基本上胜出了一半&#xff1a;只有大量的用户和海量的数据才是信息化时代的主要要素。这些大数据信息和火热的深度学习算法的结合&#xff0c;能够催生无数的应用场景&#xff0c;通过不断的扩展和调整业务来保证自身…

python图形化编程工具哪个好_mPython(图形化编程软件) V0.5.0 官方版

mPython 是一款针对Python 3编程语言的图形化编辑工具。支持函数&#xff0c;仿真、hex、python、blockly三种代码读写等功能。并可以与TPYBoard系类开发板配合使用&#xff0c;直接连接PC端进行编程。【功能特点】 1、不依赖网络&#xff0c;可离线安装使用 2、支持hex、pytho…

linux更新系统内核,如何更新Linux内核来提升系统性能?

Linux内核的开发速度是前所未有的&#xff0c;大概每二三个月就会有一个新的主要版本发布。每次发布都带来了几项新的功能和改进&#xff0c;许多人可以充分利用它们&#xff0c;让计算体验更快、更高效或者有其他方面的提升。可问题是&#xff0c;你通常无法充分利用这些刚发布…

php对接V免签支付教程_【全网首发】最新版影视小程序搭建教程完整版

大家好&#xff0c;这里是深海网络&#xff0c;今天给大家讲解一下新版影视小程序搭建。  首先给大家看一下新版影视小程序是什么样子的&#xff0c;它有黑夜和白天两种观影模式&#xff0c;而且搜索精准&#xff0c;播放速度快。01第一步&#xff0c;开始正式搭建。新版区小…

linux编译代码命令,Linux下使用GCC命令编译代码

Linux下初学时最好从命令行入手&#xff0c;这样可以熟悉从编写程序、编译、调试和执行的整个过程。编写程序可以用vi/vim(个人觉得vim比vi好用)或其它编辑器编写。编译则使用gcc命令。要往下学习首先就得熟悉gcc命令的用法。gcc命令提供了非常多的命令选项&#xff0c;但并不是…

简要描述内部连接和外部连接之间的区别_sqlserver的几种常见连接方法

感谢本文几种描述方法&#xff0c;让我解决了最近的一段时间的疑问&#xff0c;转载下来&#xff0c;以供后面查血使用。本文链接&#xff1a;https://blog.csdn.net/huanghanqian/article/details/52847835四种join的区别已老生常谈&#xff1a;INNER JOIN(也可简写为JOIN): 如…

有两个python怎么停用其中一_python3.X 复学(2)-----开始了就不要停止

生命就是一种旅行&#xff0c;开始了就不要停止&#xff0c;无非就是眼前的苟且还有以后的苟且&#xff0c;只要还有一口气 ----------hashlinux 因为Python是跨平台的&#xff0c;它可以运行在Windows、Mac和各种Linux/Unix系统上。在Windows上写Python程序&#xff0c;放到Li…

react项目中的参数解构_一天入门React学习心得

一天入门React学习心得阅读前必读本文写的仓促&#xff0c;算是一个学习笔记吧&#xff0c;算是一个入门级的学习文章。如果你刚刚入门&#xff0c;那么可能一些入门的视频可能更加适合你。但如果具备一些知识&#xff0c;比如Vue&#xff0c;那么视频就不适合了。建议看完本篇…

python random函数_详细代码实战讲解:如何用 Python让自己变成天选之子

今天为大家带来的内容是&#xff1a;详细代码讲解&#xff1a;如何用 Python让自己变成天选之子话不多说直接上代码&#xff1a;请大家猜一猜下面这段代码的运行效果&#xff1a;你是不是以为这段代码运行以后&#xff0c;结果如下图所示&#xff1f;但实际上&#xff0c;我可以…

安卓图标_干货 | 安卓界面系统规范

众所周知&#xff0c;安卓系统是开源的&#xff0c;国内又有超多的手机厂商&#xff0c;小米、魅族、华为、oppo、三星等&#xff0c;每一个品牌有属于自己的UI设计规范&#xff0c;但是我们主要分析UI界面尺寸规范。1、字体安卓系统中文采用的是思源黑体&#xff0c;英文字体为…

pyqt安装_Win10下安装LabelImg以及使用(绝对是全网最简单的教程)

labelImg是图片标注软件&#xff0c;用于数据集的制作、标注等等。下面介绍labelImg的安装过程。我用的是anaconda&#xff0c;所以以anaconda prompt作为终端&#xff1a;在Anaconda Prompt中依次运行以下命令&#xff08;注意大小写&#xff09;&#xff1a;pip install PyQt…

delphi listview 添加数据 慢_ListView 的缓存机制

一.前言ListView 作为一个 Android 5.x 之前的一个用于显示数据列表的控件&#xff0c;或许在今天都已经被 RecyclerView 完全替代&#xff0c;但是其中的缓存机制仍然值得我们去了解&#xff0c;对后面学习 RecyclerView 的缓存机制有很大的帮助。下面将根据 ListView 的三个过…

c++ 显示三维散点图_【无机纳米材料科研制图——OriginLab 0210】Origin多组柱状图3D柱状图及3D散点图...

此篇&#xff0c;我们来分享Origin绘制多组柱状图、立体柱状图和三维散点图。一、多组柱状图1&#xff09;准备数据。准备数据&#xff0c;并点击Plot——》Column/Bar/Pie——》Column进行绘制。结果如下。2&#xff09;带有误差棒的绘图。如果想绘制带有误差棒的直方图&#…