EEG信號解碼及結果可視化---自編MATLAB函數

該函數用於對一段原始EEG信號進行分解,得到醫學上認定的9個頻段的時域、頻域信息。
(1)總頻段:0.5-45Hz;
(2)low-Delta:0.5-2Hz;
(3)high-Delta:2-4Hz;
(4)Theta:4-7Hz;
(5)Alpha:8-13Hz;
(6)low-Beta:13-20Hz;
(7)high-Beta:20-30Hz;
(8)low-Gamma:30-40Hz;
(9)high-Gamma:40-45Hz。
該函數不考慮FFT的採樣點數小於信號的採樣頻率的情況,即N<Fs。

function [Time_domain, Freq_domain] = EEG_decoding(signal, Fs, N)
% % 輸入 signal:待解碼原始信號
% %         Fs: 信號的採樣頻率
% %         N:  FFT的採樣點數
% % 輸出   Time:時域信息
% %        Freq:頻域信息

% 信號預處理
signal_nodc = signal-mean(signal);% 通過減去平均值來消除直流分量

%利用FFT進行濾波
frequency = Fs*(0:N-1)/N;  %頻率
EEG_FFT = fft(signal_nodc, N); %對無直流分量的信號進行FFT
time = (1:length(EEG_FFT))/Fs; 
%濾波截止頻率
%   截止頻率 =  [總頻段; low-Delta; high-Delta; Theta; Alpha; low-Beta; high-Beta; low-Gamma, high-Gamma];
Cut_off_freq = [0.5,45; 0.5,2;     2,4;        4,7;   8,13;  13,20;    20,30;     30,40;     40,45];
Cut_off_freq0 = Cut_off_freq;
Time_domain = [];     Freq_domain = [];
Str ={'總頻段', 'low-Delta', 'high-Delta', 'Theta', 'Alpha', 'low-Beta', 'high-Beta', 'low-Gamma', 'high-Gamma'};
[m,n] = size(Cut_off_freq0);
for i = 1:m
    
   for j = 1:n
       index = find(abs(frequency - Cut_off_freq0(i,j)) == min(abs(frequency - Cut_off_freq0(i,j))));
       Cut_off_freq0(i,j) = frequency(index(1));
   end
   
   index1 = find(frequency == Cut_off_freq0(i,1));   
   index2 = find(frequency == Cut_off_freq0(i,2));
   index3 = find(frequency == Fs-Cut_off_freq0(i,2));
   index4 = find(frequency == Fs-Cut_off_freq0(i,1));
   data = [zeros(1,index1-1),EEG_FFT(index1:index2),zeros(1,index3-index2-1),EEG_FFT(index3:index4),zeros(1,N-index4)];
   EEG_IFFT = ifft(data,N); %選取特定頻段的數據進行IFFT
   
   Time_domain = [Time_domain; abs(data)];      %信號的時域信息
   Freq_domain = [Freq_domain; real(EEG_IFFT)]; %信號的頻域信息
   
   %分解結果可視化
   subplot(size(Cut_off_freq0,1),2,2*i-1);
   plot(time, EEG_IFFT);  
   title([Str{i},'(',num2str(Cut_off_freq(i,1)),'-',num2str(Cut_off_freq(i,2)),'Hz',')','時域圖']);  %子標題
   
   subplot(size(Cut_off_freq0,1),2,2*i); 
   stem(frequency(1:N/2),abs(data(1:N/2)*2/N)); 
   title([Str{i},'(',num2str(Cut_off_freq(i,1)),'-',num2str(Cut_off_freq(i,2)),'Hz',')','頻域圖']);  %子標題
end

suptitle('FFT濾波結果')  %總標題
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章