ssvep采集脑电信号的FFT分析

时间:2022-12-31 14:42:35

SSVEP脑电数据的特征提取与处理

有neuroscan设备采集的数据格式为.cnt格式,使用下面的函数可以将其需要的导联数据提取出来,

将其提取出来为.mat格式数据,

function [Edata] = Extract(Sdata)
% 将.cnt文件文件转为成MATLAB能分析的.mat数据格式
% author:陈威2017.1.9
% .cnt数据格式来自与ssvep范式的neuroscan脑电数据

%有关于neuroscan的数据将.cnt格式的数据加载到MATLAB中进行分析,
%可以先参考下面这个网址的内容然后在进行下面的程序的处理
%http://52brain.com/thread-17770-1-1.html

%此函数旨在将Neuroscan采集的cnt数据集中data数据提取相应的导联数据
%以便后续做特征提取与分类
%Neuroscan采集 LCD刺激显示 60hz刷新 暗光环境
%共65个channel
%数据提取14个channel:
%1 P1 47
%2 PZ 48
%3 P2 49
%4 PO7 53
%5 PO5 54
%6 PO3 55
%7 POZ 56
%8 PO4 57
%9 PO6 58
%10 PO8 59
%11 O1 61
%12 OZ 62
%13 O2 63
%14 M2 65 参考电极(左耳垂)

A=loadcnt(Sdata); %加载外部cnt文件
a=A.data;
ka=1;
kb=[47,48,49,53,54,55,56,57,58,59,61,62,63,65];%选择需要的导联数
b=zeros(length(kb),length(a));
for i=1:length(kb)
b(ka,:)=a(kb(i),:);
ka=ka+1;
end
Edata=b'; %取转置
save filename.mat Edata
end

得到可以由MATLAB处理的.mat数据后,然后进行FFT变换,已提取频率特征,在进行FFT变换之前,先进行滤波处理,代码如下

function [f,sy,peak,i]=FFT_detection(data,Fs);
%data-- 要处理的数据
%Fs--- 采样率
%y---- 返回峰值最大的x
data=data(:,7)'; %信号选取单个通道的采样数据,这里选择为(7-->POZ-->56)
L1=length(data);
NFFT = 2^nextpow2(L1); %确定需要进行处理的数据点数
[B A]=butter(2,[4/(Fs/2) 20/(Fs/2)]); %butter:2阶的巴特沃斯滤波器 后为上下截止频率
eegx=filter(B,A,data); %filter:一维数字滤波器, x1是滤波前序列,B为分子,A为分母
Y1 = fft(eegx,NFFT); %进行fft变换
sy=abs(Y1(1:NFFT)); %去模
sy=sy/(NFFT/2); %求实际幅值
sy(1)=sy(1)/2;
f=([1:NFFT]-1)*Fs/NFFT; %求实际频率
[qy,qx]=max(sy);
peak=(qx-1)/(NFFT/Fs); %最大峰值处的频率值 peak=(qx-1)*Fs/NFFT
i=qx-1;
fprintf(['fft spectrum max is [x=',num2str(peak),', y=',num2str(qy*2),'] \n'])
plot(f,2*sy,'r');
text(peak,qy*2,['(',num2str(peak),',',num2str(qy*2),')']); %在坐标系中显示顶点
title('幅度-频率曲线图');
axis([0 30 0 3]);
ylabel('幅值');xlabel('频率(hz)');