tensorflow提取mel譜特征_【腦電信號分類】腦電信號提取PSD功率譜密度特征

點擊上面"腦機接口社區"關注我們

更多技術干貨第一時間送達

25e5b84dc39dfc55909c17ead3c3884c.gif

本文是由CSDN用戶[frostime]授權分享。主要介紹了腦電信號提取PSD功率譜密度特征,包括:功率譜密度理論基礎、matlab中PSD函數的使用介紹以及實驗示例。感謝 frostime!1. 序言

腦電信號是一種非平穩的隨機信號,一般而言隨機信號的持續時間是無限長的,因此隨機信號的總能量是無限的,而隨機過程的任意一個樣本函數都不滿足絕對可積條件,所以其傅里葉變換不存在。

不過,盡管隨機信號的總能量是無限的,但其平均功率卻是有限的,因此,要對隨機信號的頻域進行分析,應從功率譜出發進行研究才有意義。正因如此,在研究中經常使用功率譜密度(Power spectral density, PSD)來分析腦電信號的頻域特性。

本文簡單的演示了對腦電信號提取功率譜密度特征然后分類的基本流程。希望對那些尚未入門、面對 BCI 任務不知所措的新手能有一點啟發。

2. 功率譜密度理論基礎簡述

功率譜密度描是對隨機變量均方值的量度,是單位頻率的平均功率量綱。對功率譜在頻域上積分就可以得到信號的平均功率。

功率譜密度 是一個以頻率 為自變量的映射, 反映了在頻率成分 上信號有多少功率。

我們假定一個隨機過程 ,并定義一個截斷閾值 ,隨機過程 的截斷過程 就可以定義為

則該隨機過程的能量可定義為

對能量函數求導,就可以獲得平均功率。

根據 Parseval 定理(即能量從時域角度和頻域角度來看都是相等的)可得:

這里 是 經過傅里葉變換后的形式。由于隨機過程 被限定在了一個有限的時間區間 之間,所以對隨機過程的傅里葉變換不再受限。另外我們還需要注意到, 是一個隨機變量,因此為了得到最終總體的平均功率,還需要求取隨機變量的期望值。

由此,通過求取 時的極限,就可以得到原始隨機過程的平均功率 。

將式中被積函數單獨提取出來,定義為 :

這樣一來,平均功率 可以表示為 。通過這種定義方式,函數 可以表征每一個最小極限單位的頻率分量所擁有的功率大小,因此我們把 稱為功率譜密度。

3. Matlab 中?PSD 函數的使用

功率譜密度的估計方法有很多。總體來講可以分為兩大類:傳統的非參數方法,和現代的參數方法。

698486e383c562daa8205704e7bcf18e.png
在這里插入圖片描述

本節不對理論知識做詳細的敘述,感興趣的可以深入查閱文獻,這里只介紹一下有哪些方法,以及他們在 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

0ef3cc242a9ec66cc82389445ace2098.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%
作者博客:https://blog.csdn.net/frostime/article/details/106967703

文章來源于網絡,僅用于學術交流,不用于商業行為

若有侵權及疑問,請后臺留言,管理員即時刪侵!

更多閱讀

EEG偽影類型詳解和過濾工具的匯總(一)

你真的了解腦機接口技術嗎?

清華張鈸院士專刊文章:邁向第三代人工智能(全文收錄)

腦機接口拼寫器是否真的安全?華中科技大學研究團隊對此做了相關研究

腦機接口和卷積神經網絡的初學指南(一)

腦電數據處理分析教程匯總(eeglab, mne-python)

P300腦機接口及數據集處理

快速入門腦機接口:BCI基礎(一)

如何快速找到腦機接口社區的歷史文章?

腦機接口BCI學習交流QQ群:515148456

微信群請掃碼添加,Rose拉你進群

(請務必填寫備注,eg. 姓名+單位+專業/領域/行業)

9325e8c6fbab1e4aa844f27d2ee0396b.png

長按關注我們

2d79b4589ee805ee44f781092b7e9471.png

歡迎點個在看鼓勵一下

6accddcbacefb1aa9774c24689a62aea.gif

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533069.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533069.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533069.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql用戶可以localhost登陸_【單選題】登陸MySQL服務器,默認的用戶名為 A. user B. pwd C. root D. localhost...

功能清利濕熱、利膽退黃的藥物是A、茵陳蒿B、豬苓C、澤瀉D、滑石E、關木通舌尖上對酸味特別敏感的部位是_____。EDI的中文名稱是什么?什么維生素能促進血液的凝固?當輸油噴射泵故障時,Ⅱ組油箱是如何向Ⅲ組油箱供油的?A.通過溢油口…

從mysql中取出代理ip_GitHub - lican09/IPProxyTool: 抓取大量免費代理 ip,提取有效 ip 使用...

IPProxyTool使用 scrapy 爬蟲抓取代理網站,獲取大量的免費代理 ip。過濾出所有可用的 ip,存入數據庫以備使用。可以訪問我的個人站點,查看我的更多有趣項目 awolfly9個人項目歡迎加微信吐槽如果在使用中有任何疑問,或者項目中有任…

docker卸載 windows版本_DevOps系列 006 - Docker安裝

這是DevOps系列的第六節,我們開始安裝DockerDebian 上安裝可以基于最新debian10的發行版,我現在還用著debian9,不過隨后,我會發出Windows / macOs / Ubuntu的參考。安裝如果您已經是root用戶,則無需使用sudo1、卸載任何…

mysql設置success信息_【原創】MySQL Cluster安裝部署(Success)

參考:http://www.cnblogs.com/zhoulf/archive/2013/01/30/2883207.html安裝要求安裝環境:centos6.3(X64)軟件名稱 :mysql-cluster-gpl-7.3.8-linux-glibc2.5-x86_64.tar.gz (通用版)管理節點IP:10.61.5.51數據節點-SQL節點IP:10.61.5.52數據節…

tab vue 豎排_vue 實現tab切換保持數據狀態

頁面做tab切換,由于組件每一次切換都會重新實例化組件,我們想要頁面不論怎么切換都仍然保持tab里面的內容不會刷新,減少頁面重新渲染以及減少請求實現方法:使用包裹組件 列表頁面跳轉詳情 ,列表頁面保持上一次操作狀態…

multisim連接MySQL_首次使用Multisim軟件進行電路仿真設計

第一次接觸使用Multisim進行電路仿真設計,通過使用這款軟件,從中也學習到了很多東西,在這里想簡單介紹一下這款軟件的最主要也是最重要的功能和特點。創建電路,必定要放置元器件,這就需要用到元器件工具欄,…

mysql到pg怎么高效_干貨 | Debezium實現Mysql到Elasticsearch高效實時同步(示例代碼)

題記來自Elasticsearch中文社區的問題——MySQL中表無唯一遞增字段,也無唯一遞增時間字段,該怎么使用logstash實現MySQL實時增量導數據到es中?logstash和kafka_connector都僅支持基于自增id或者時間戳更新的方式增量同步數據。回到問題本身&a…

mysql怎么復制信息_mysql關于復制的一些信息參考

1.主庫的復制用戶密碼修改后,在備庫修改復制:stop slave;change master to master_user‘username‘, master_password‘password‘;start slave;2.創建復制子用戶及其授權:GRANT REPLICATION SLAVE, REPLICATION CLIENT ON . TO ‘repl‘‘%…

java swing web_Java-JFrame-swing嵌套瀏覽器步驟

Java-JFrame-swing嵌套瀏覽器步驟一、使用swing嵌套瀏覽器要實現的功能:通過java的swing實現在一個窗體中嵌套一個瀏覽器,可以在這個瀏覽器中將另一個項目的內容顯示出來,只需要回去另一個項目首頁的url即可,這樣另一個項目就可以…

java thread safe_Java 線程安全 Thread-Safety

在 Java 的線程安全是老生常談的問題。經常是各種寫法說法一大堆,感覺很多的來源都是在面試的時候,很多考官都喜歡問線程安全的問題。起源這個問題的起源就是 Java 是支持多線程的。如果對進程和線程是什么不太清楚的話,可以惡補下大學課程《…

java 對象復制字段_利用Java反射機制實現對象相同字段的復制

一。如何實現不同類型對象之間的復制問題?1、為什么會有這個問題?近來在進行一個項目開發的時候,為了隱藏后端數據庫表結構、同時也為了配合給前端一個更友好的API接口文檔(swagger API文檔),我采用POJO來對應數據表結構&#xff…

java 類確定運行時間_java回調函數實例:實現一個測試函數運行時間的工具類

下面使用java回調函數來實現一個測試函數運行時間的工具類:如果我們要測試一個類的方法的執行時間,通常我們會這樣做:public class TestObject {/*** 一個用來被測試的方法,進行了一個比較耗時的循環*/public static void testMet…

java socket調用接口_Java中socket接口調用

最近一個項目中接口通訊這一塊主要是調用銀聯系統的socket接口,我方是客戶端,即發送請求接收返回報文的一方。在貼代碼之前,還是要了解一下關于socket的基礎知識。Socket的基本概念1.建立連接當需要建立網絡連接時,必須…

protobuf java 編譯_Maven項目中,編譯proto文件成Java類

新建Maven項目新建一個 Maven 項目:pom定義了最小的maven2元素,即:groupId,artifactId,version。 groupId:項目或者組織的唯一標志,并且配置時生成的路徑也是由此生成,如org.codehaus.mojo生成的相對路徑為&#xff1a…

java 結構體數組初始化_C數組結構體聯合體快速初始化

背景C89標準規定初始化語句的元素以固定順序出現,該順序即待初始化數組或結構體元素的定義順序。C99標準新增指定初始化(Designated Initializer),即可按照任意順序對數組某些元素或結構體某些成員進行選擇性初始化,只需指明它們所對應的數組…

java override 訪問權限_java基礎之——訪問修飾符(private/default/protected/public)

1. 訪問修飾符介紹java中的訪問修飾符包含了四種:private、default(沒有對應的保留字)、protected和public。它們的含義如下:private:如果一個元素聲明為private,那么只有同一個類下的元素才可以訪問它。default:如果一…

python中scrapy可以爬取多少數據_python中scrapy框架爬取攜程景點數據

———————————————————————————————[版權申明:本文系作者原創,轉載請注明出處]文章出處:https://blog.csdn.net/sdksdk0/article/details/82381198作者:朱培 ID:sdksdk0——————…

python灰色關聯度分析代碼_灰色關聯分析法步驟 - osc_uwnmtz9n的個人空間 - OSCHINA - 中文開源技術交流社區...

https://wenku.baidu.com/view/dc356290af1ffc4fff47ac0d.html?rec_flagdefault&sxts1538121950212利用灰色關聯分析的步驟是:1.根據分析目的確定分析指標體系,收集分析數據。設n個數據序列形成如下矩陣:其中m為指標的個數&a…

aio 系統原理 Java_Java新一代網絡編程模型AIO原理及Linux系統AIO介紹

從JDK 7版本開始,Java新加入的文件和網絡io特性稱為nio2(new io 2, 因為jdk1.4中已經有過一個nio了),包含了眾多性能和功能上的改進,其中最重要的部分,就是對異步io的支持,稱為Java AIO(asynchronous IO)。因為AIO的實…

centos mysql 5.5 art_Linux?CentOS6.5下編譯安裝MySQL?5.5.51''''

一、編譯安裝MySQL前的準備工作安裝編譯源碼所需的工具和庫yum install gcc gcc-c ncurses-devel perl安裝cmake,從http://www.cmake.org下載源碼并編譯安裝wget http://www.cmake.org/files/v2.8/cmake-2.8.10.2.tar.gztar -xzvf cmake-2.8.10.2.tar.gzcd cmake-2.…