点击上面"脑机接口社区"关注我们

更多技术干货第一时间送达

本文是由CSDN用户[frostime]授权分享。主要介绍了脑电信号提取PSD功率谱密度特征,包括:功率谱密度理论基础、matlab中PSD函数的使用介绍以及实验示例。感谢 frostime!1. 序言

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3. Matlab 中 PSD 函数的使用

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

在这里插入图片描述

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

3.1 传统非参数方法估计 PSD

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

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

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

3.2 参数方法估计 PSD

包括 pconvpburgpyulear 等几个方法。

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

4. 实验示例

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

4.1 实验数据

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

实验使用的数据

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

在 matlab 中导入数据。

%% 导入数据% 1000 Hz 记录了 500 msload('sp1s_aa_1000Hz.mat');% 采样率 1000 Hzsrate = 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%

作者博客:https://blog.csdn.net/frostime/article/details/106967703

文章来源于网络,仅用于学术交流,不用于商业行为

若有侵权及疑问,请后台留言,管理员即时删侵!

更多阅读

EEG伪影类型详解和过滤工具的汇总(一)

你真的了解脑机接口技术吗?

清华张钹院士专刊文章:迈向第三代人工智能(全文收录)

脑机接口拼写器是否真的安全?华中科技大学研究团队对此做了相关研究

脑机接口和卷积神经网络的初学指南(一)

脑电数据处理分析教程汇总(eeglab, mne-python)

P300脑机接口及数据集处理

快速入门脑机接口:BCI基础(一)

如何快速找到脑机接口社区的历史文章?

脑机接口BCI学习交流QQ群:515148456

微信群请扫码添加,Rose拉你进群

(请务必填写备注,eg. 姓名+单位+专业/领域/行业)

长按关注我们

欢迎点个在看鼓励一下

tensorflow提取mel谱特征_【脑电信号分类】脑电信号提取PSD功率谱密度特征相关推荐

  1. 【脑电信号分类】脑电信号提取PSD功率谱密度特征

    本文是由CSDN用户[frostime]授权分享.主要介绍了脑电信号提取PSD功率谱密度特征,包括:功率谱密度理论基础.matlab中PSD函数的使用介绍以及实验示例.感谢 frostime! 1. ...

  2. 主成分分析法怎么提取图片中的字_在主成分分析里,如何提取主成分

    因子分析---选项中有一项是特征根植大于1 或者说是指定主成分个数,默认是提取的特征根植为1, 你改成 下面的指定主成分个数那一项就可以了 你想指定几项都可以 不过要小于所有变量个数 Fp = a1i ...

  3. python提取文件指定列_如何从csv文件中提取特定列并使用python绘图

    我有一个csv文件,其中包含以下几行数据:# Vertex X Y Z K_I K_II K_III J 0 2.100000e+00 2.000000e+00 -1.000000e-04 0.000 ...

  4. mysql数据库特征_如何掌握MySQL数据库中动态表的特征

    以下的文章主要介绍的是如何正确掌握MySQL数据库中动态表的特征,可以说动态表在MySQL数据库中使用频率还是很大的,所以MySQL数据库中动态表的掌握也是一件很重要的事情,以下就是文章的具体内容. ...

  5. 功率谱 幅值谱_语音合成中的Mel谱和MFCC谱无区别

    语音合成目前比较流行的方案是Tacotron(2) + WaveNet(WaveRNN, LPCNet)等神经网络声码器. 这些方案的流程大致相同,先由文本生成特征谱,再将特征谱重建为音频.在选择特征 ...

  6. python提取人物特征_基于图像人物面部表情识别的特征提取优化方法与流程

    本发明涉及一种基于图像人物面部表情识别的特征提取优化方法,主要利用基于统计特征提取的二维主成分分析法和改进的粒子群算法优化图像矩阵的解,属于图像处理.模式识别和计算机视觉交叉技术应用领域. 背景技术: ...

  7. 基于深度学习的音乐推荐系统(三)使用已训练的卷积神经网络提取语谱图特征并计算图像间相似度

    该模块包含几部分: 调用训练好的并且已经保存的CNN模型(仅四层卷积层部分) 逐个读取tfrecords文件中的元素,并送入已训练好的CNN中,给每个图片提取128个特征 每首歌包含11个图片,即11 ...

  8. 阅读笔记3:基于深度学习的运动想象脑电信号分类算法研究

    1.论文信息 题目:基于深度学习的运动想象脑电信号分类算法研究 作者佟歌 单位:哈尔滨工程大学控制科学与工程 发表时间:201803 2.笔记 2.1 脑电信号采集及预处理 2.1.1脑电信号分析方法 ...

  9. 『TensorFlow』函数查询列表_张量属性调整

    博客园 首页 新随笔 新文章 联系 订阅 管理 『TensorFlow』函数查询列表_张量属性调整 数据类型转换Casting 操作 描述 tf.string_to_number (string_te ...

最新文章

  1. codetyphon, Lazarus+FreePascal+Tools+Free Components packages+Free Libraries
  2. SparkSQL之thriftserver/beeline的使用
  3. Apache 配置域名入口路径
  4. EventBus设计与实现分析——特性介绍
  5. 【Python文件处理】递归批处理文件夹子目录内所有txt数据
  6. 深入单例模式 java,深入单例模式四
  7. 复联4里用到的方法论
  8. C#/ASP.NET完善的DBHelper,配套Model生成器
  9. Selenium之前世今生
  10. maven解决依赖冲突
  11. 3dmax2014 uv用法_3ds max uv展开教程
  12. PDF转高清图片怎么转?推荐这款PDF转高清图片软件!
  13. 零售3.0时代,国民品牌都市丽人一次成功的变革
  14. [图论] 平面图 平面性的判定
  15. 制作移动硬盘或U盘的MAC安装盘
  16. 马云接班人为什么是张勇?
  17. 破解58同城字体反爬
  18. YouTube图片幻灯片分享技巧
  19. 逐浪CMS后台代码编辑器单文件支持超大容量在线编辑
  20. AdvantEdge-刀具材料和涂层分析

热门文章

  1. SpringBoot2.x整合quartz定时任务 快速入门
  2. 动态执行shell脚本
  3. SpringBoot集成Flowable_Jsite待办任务菜单报500
  4. idea gblfy常用快捷键
  5. c语言gets和getchar区别,c语言中关于getchar()、getchar()和gets().......
  6. linux十字符木马,Linux系统随机10字符病毒的清除
  7. html5链接教程,关于html a、html超链接基础教程
  8. 基于实战开发垂直搜索引擎_基于DDD的微服务设计和开发实战
  9. Python isinstance函数 - Python零基础入门教程
  10. xcode+文字支持html元素,iOS使用UITextview实现富文本编辑