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

news/2024/11/25 17:59:15/

本文是由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 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%

作者博客:

https://blog.csdn.net/frostime/article/details/106967703

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

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

更多阅读

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

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

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

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

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

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

P300脑机接口及数据集处理

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

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

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


http://www.ppmy.cn/news/694927.html

相关文章

(一)信号及脉冲电信号

目录 #电磁波回顾#信号 分类按照幅值是否连续分类 模拟信号数字信号 按信号载体分类(用什么来表述信号的信息) 电信号 电压信号电流信号(直流电、交流电、脉冲电)电磁波中的无线电信号 波信号(机械波、电磁波) 按传输介质分类(传输的都是电磁波) 有线信号(电线传输的电信号、光…

基于MATLAB的心电信号预处理

这是前段时间做的一个课程设计,做的比较简单,没有考虑到太细,只是初步地达到了想要的效果。这次设计主要是对心电信号进行预处理,将其信号中包含的一些干扰滤除或者抑制掉。 一、心电信号 (1)心电信号的特性…

心电信号去噪(part1)--心电信号简介

开一个坑总结一下最近学的ECG滤波算法,先对心电图和心电信号做一下简要介绍 注:这里是以小型手持心电图机为研究对象的(单导联)。 心电图介绍 心电图(electrocardiogram,ECG)能反映心脏兴奋的电活动过程,它在心脏基本功能及病理研究方面具有重要的参…

二、生理信号处理 ——1.心电信号(含Matlab代码及数据)

本文适合快速了解心电信号,并能够进行数据的滤波处理。 一. 心电数据预处理(消除工频干扰、基线漂移) * 心电数据及rdmat函数见文章底部 1. 导入心电数据 ## 心电图导入及读取 clc; [TIME,M,Fs,siginfo]rdmat(100m);# 通过读取函数ramat对心电图进行处理 Fs1500;…

Matlab心电信号预处理

Matlab心电信号预处理 一、内容 在网上下载心电信号的公开数据库,实现对心电信号的预处理,包括噪声去除、肌电干扰的去除、工频干扰的抑制、基线漂移的纠正等。 二、实验原理 1、肌电干扰的滤除 肌电干扰由人体肌肉颤动引起,发生率具有随机性…

肌电信号采集电路分析

最近在开发肌电信号的采集,表面肌电信号是非常微弱的生物信号,正常人体表面肌电信号赋值为0--1.5mV,主要能量频段集中在10--150Hz。电路主要是根据原始信号,设计相应的放大电路、滤波电路,下面直接放原理图说明。 一级…

肌电信号的数据理解

目录 一、基于自采肌电数据的理解 二、基于Ninapro肌电数据的理解 本文主要是解释说明肌电数据,只有理解了数据的格式和意义,才能更进一步的去处理数据,从自采的肌电数据角度和Ninapro公共数据集的角度来理解数据。 一、基于自采肌电数据的…

表面肌电信号(sEMG)介绍

表面肌电信号(Surface Electromyography)是众多生物电信号中的一种,也是相对来说最容易获取的一种电生理信号。将电极片放置在人体的皮肤表面,可以记录到皮肤表面因肌肉收缩而产生的微弱的电位差,而这个微弱的电位信号…